Bring AIS-visa-auto extension v2.4.1.2
No files matched your search
|
After Width: | Height: | Size: 106 KiB |
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 145 KiB |
@@ -0,0 +1,7 @@
|
||||
@charset "UTF-8";/*!
|
||||
* Bootstrap v5.2.3 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2022 The Bootstrap Authors
|
||||
* Copyright 2011-2022 Twitter, Inc.
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
*/:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0d6efd;--bs-link-hover-color:#0a58ca;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:underline}a:hover{color:var(--bs-link-hover-color)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):noLine truncated
|
||||
/*# sourceMappingURL=bootstrap.min.css.map */
|
||||
@@ -0,0 +1,39 @@
|
||||
@font-face {
|
||||
font-family: Quicksand;
|
||||
src: url(../fonts/Quicksand.ttf);
|
||||
}
|
||||
|
||||
:root {
|
||||
--font-fallback: BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-sans;
|
||||
}
|
||||
|
||||
* {
|
||||
font-family: "Quicksand", var(--font-fallback);
|
||||
}
|
||||
|
||||
html {
|
||||
width: 250px;
|
||||
}
|
||||
|
||||
body {
|
||||
background: #fdf8ea;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h2 span {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
p {
|
||||
text-align: justify;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 558 B |
|
After Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1,66 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>AIS Visa Auto Rescheduler</title>
|
||||
<link rel="stylesheet" href="css/bootstrap.min.css"></link>
|
||||
<link rel="stylesheet" href="css/styles.css"></link>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<h4 class="mt-2 mb-0">AIS Visa Auto Rescheduler<br><span id="version"></span></h4>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<h3 class="my-2" id="credits">50</h3>
|
||||
<p class="my-2 text-center">Credits left.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="mt-2">
|
||||
<div class="form-check form-switch" style="text-align: left;">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="activate">
|
||||
<label class="form-check-label" for="activate">Activate the script</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="my-2">
|
||||
<div class="form-check form-switch" style="text-align: left;">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="autobook">
|
||||
<label class="form-check-label" for="autobook">Enable Autobook</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="my-2">
|
||||
<input type="range" id="frequency" name="frequency" min="1" max="10" step="0.5">
|
||||
<label for="frequency">Frequency of checks<br>(every <span id="checkfrequency">1</span> minutes)</label>
|
||||
</div>
|
||||
<div class="my-2">
|
||||
<input type="range" id="gap" name="gap" min="0" value="3" max="30" step="1">
|
||||
<label for="gap">Check availability from <span id="daygap">3</span> days from today. [0 = today]</label>
|
||||
</div>
|
||||
<p class="my-2 text-center">Changes are autosaved.</p>
|
||||
<form class="my-2" name="ais_visa_info" id="ais_visa_info">
|
||||
<div class="d-grid">
|
||||
<button id="reset_info" type="submit" class="btn btn-danger btn-sm">Configure / Reset</button>
|
||||
</div>
|
||||
</form>
|
||||
<p class="my-2 text-center">
|
||||
<button id=read_faqs form=null class="btn btn-info btn-sm">Read FAQs</button>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<a href="https://www.buymeacoffee.com/hymnz" target="_blank">
|
||||
<img style="width: 250px;background: #5F7FFF;" src="https://img.buymeacoffee.com/button-api/?text=Help me run the extension&emoji=🙂&slug=hymnz&button_colour=5F7FFF&font_colour=ffffff&font_family=Comic&outline_colour=000000&coffee_colour=FFDD00" />
|
||||
</a>
|
||||
<script src="js/content.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,79 @@
|
||||
chrome.runtime.onConnect.addListener(function(port) {
|
||||
port.onMessage.addListener(async function(def) {
|
||||
let response = new Object();
|
||||
response.action = def.action;
|
||||
if (def.action == "fetch_info") {
|
||||
let { __un } = await chrome.storage.local.get("__un");
|
||||
let { __pw } = await chrome.storage.local.get("__pw");
|
||||
let { __id } = await chrome.storage.local.get("__id");
|
||||
let { __ap } = await chrome.storage.local.get("__ap");
|
||||
let { __il } = await chrome.storage.local.get("__il");
|
||||
let { __ad } = await chrome.storage.local.get("__ad");
|
||||
let { __al } = await chrome.storage.local.get("__al");
|
||||
let { __ar } = await chrome.storage.local.get("__ar");
|
||||
let $version = await new Promise(r => chrome.management.getSelf(self => r(self.version)));
|
||||
response.data = {
|
||||
$username: __un,
|
||||
$password: __pw,
|
||||
$appid: __id,
|
||||
$active: __ap,
|
||||
$apptCenter: __il,
|
||||
$apptDate: __ad,
|
||||
$ascCenter: __al,
|
||||
$ascReverse: __ar,
|
||||
$version
|
||||
}
|
||||
}
|
||||
port.postMessage(response);
|
||||
});
|
||||
});
|
||||
|
||||
chrome.runtime.onInstalled.addListener(async({ reason }) => {
|
||||
chrome.action.disable();
|
||||
chrome.declarativeContent.onPageChanged.removeRules(undefined, () => {
|
||||
let exampleRule = {
|
||||
conditions: [
|
||||
new chrome.declarativeContent.PageStateMatcher({
|
||||
pageUrl: { hostEquals: 'ais.usvisa-info.com' },
|
||||
})
|
||||
],
|
||||
actions: [new chrome.declarativeContent.ShowAction()],
|
||||
};
|
||||
|
||||
let rules = [exampleRule];
|
||||
chrome.declarativeContent.onPageChanged.addRules(rules);
|
||||
});
|
||||
if (reason === 'install') {
|
||||
await chrome.storage.local.set({ __ab: false, __ap: true, __cr: 0, __fq: 1, __gp: 3 });
|
||||
chrome.tabs.create({
|
||||
url: "https://ais.usvisa-info.com/en-us/countries_list/niv"
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
var myNotificationID = null,
|
||||
senderId = null,
|
||||
ensureSendMessage = (tabId, message, callback) => {
|
||||
chrome.tabs.sendMessage(tabId, { ping: true }, function(response) {
|
||||
if (response && response.pong) {
|
||||
chrome.tabs.sendMessage(tabId, message, callback);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
chrome.notifications.onButtonClicked.addListener(function(notifId, btnId) {
|
||||
if (notifId === myNotificationID) {
|
||||
chrome.tabs.get(senderId, function(tab) {
|
||||
chrome.tabs.highlight({ 'tabs': tab.index }, function() {});
|
||||
});
|
||||
ensureSendMessage(senderId, { bookNow: btnId === 0 });
|
||||
}
|
||||
});
|
||||
|
||||
chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
|
||||
chrome.notifications.create(req.options, function(id) {
|
||||
myNotificationID = id;
|
||||
senderId = sender.tab.id;
|
||||
});
|
||||
sendResponse(true);
|
||||
});
|
||||
@@ -0,0 +1,665 @@
|
||||
/*!
|
||||
* Bootstrap v5.3.3 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
*/
|
||||
! function(t, e) { "object" == typeof exports && "undefined" != typeof module ? module.exports = e(require("@popperjs/core")) : "function" == typeof define && define.amd ? define(["@popperjs/core"], e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).bootstrap = e(t.Popper) }(this, (function(t) { "use strict";
|
||||
|
||||
function e(t) { const e = Object.create(null, {
|
||||
[Symbol.toStringTag]: { value: "Module" } }); if (t)
|
||||
for (const i in t)
|
||||
if ("default" !== i) { const s = Object.getOwnPropertyDescriptor(t, i);
|
||||
Object.defineProperty(e, i, s.get ? s : { enumerable: !0, get: () => t[i] }) }
|
||||
return e.default = t, Object.freeze(e) } const i = e(t),
|
||||
s = new Map,
|
||||
n = {set(t, e, i) { s.has(t) || s.set(t, new Map); const n = s.get(t);
|
||||
n.has(e) || 0 === n.size ? n.set(e, i) : console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`) }, get: (t, e) => s.has(t) && s.get(t).get(e) || null, remove(t, e) { if (!s.has(t)) return; const i = s.get(t);
|
||||
i.delete(e), 0 === i.size && s.delete(t) } },
|
||||
o = "transitionend",
|
||||
r = t => (t && window.CSS && window.CSS.escape && (t = t.replace(/#([^\s"#']+)/g, ((t, e) => `#${CSS.escape(e)}`))), t),
|
||||
a = t => { t.dispatchEvent(new Event(o)) },
|
||||
l = t => !(!t || "object" != typeof t) && (void 0 !== t.jquery && (t = t[0]), void 0 !== t.nodeType),
|
||||
c = t => l(t) ? t.jquery ? t[0] : t : "string" == typeof t && t.length > 0 ? document.querySelector(r(t)) : null,
|
||||
h = t => { if (!l(t) || 0 === t.getClientRects().length) return !1; const e = "visible" === getComputedStyle(t).getPropertyValue("visibility"),
|
||||
i = t.closest("details:not([open])"); if (!i) return e; if (i !== t) { const e = t.closest("summary"); if (e && e.parentNode !== i) return !1; if (null === e) return !1 } return e },
|
||||
d = t => !t || t.nodeType !== Node.ELEMENT_NODE || !!t.classList.contains("disabled") || (void 0 !== t.disabled ? t.disabled : t.hasAttribute("disabled") && "false" !== t.getAttribute("disabled")),
|
||||
u = t => { if (!document.documentElement.attachShadow) return null; if ("function" == typeof t.getRootNode) { const e = t.getRootNode(); return e instanceof ShadowRoot ? e : null } return t instanceof ShadowRoot ? t : t.parentNode ? u(t.parentNode) : null },
|
||||
_ = () => {},
|
||||
g = t => { t.offsetHeight },
|
||||
f = () => window.jQuery && !document.body.hasAttribute("data-bs-no-jquery") ? window.jQuery : null,
|
||||
m = [],
|
||||
p = () => "rtl" === document.documentElement.dir,
|
||||
b = t => { var e;
|
||||
e = () => { const e = f(); if (e) { const i = t.NAME,
|
||||
s = e.fn[i];
|
||||
e.fn[i] = t.jQueryInterface, e.fn[i].Constructor = t, e.fn[i].noConflict = () => (e.fn[i] = s, t.jQueryInterface) } }, "loading" === document.readyState ? (m.length || document.addEventListener("DOMContentLoaded", (() => { for (const t of m) t() })), m.push(e)) : e() },
|
||||
v = (t, e = [], i = t) => "function" == typeof t ? t(...e) : i,
|
||||
y = (t, e, i = !0) => { if (!i) return void v(t); const s = (t => { if (!t) return 0; let { transitionDuration: e, transitionDelay: i } = window.getComputedStyle(t); const s = Number.parseFloat(e),
|
||||
n = Number.parseFloat(i); return s || n ? (e = e.split(",")[0], i = i.split(",")[0], 1e3 * (Number.parseFloat(e) + Number.parseFloat(i))) : 0 })(e) + 5; let n = !1; const r = ({ target: i }) => { i === e && (n = !0, e.removeEventListener(o, r), v(t)) };
|
||||
e.addEventListener(o, r), setTimeout((() => { n || a(e) }), s) },
|
||||
w = (t, e, i, s) => { const n = t.length; let o = t.indexOf(e); return -1 === o ? !i && s ? t[n - 1] : t[0] : (o += i ? 1 : -1, s && (o = (o + n) % n), t[Math.max(0, Math.min(o, n - 1))]) },
|
||||
A = /[^.]*(?=\..*)\.|.*/,
|
||||
E = /\..*/,
|
||||
C = /::\d+$/,
|
||||
T = {}; let k = 1; const $ = { mouseenter: "mouseover", mouseleave: "mouseout" },
|
||||
S = new Set(["click", "dblclick", "mouseup", "mousedown", "contextmenu", "mousewheel", "DOMMouseScroll", "mouseover", "mouseout", "mousemove", "selectstart", "selectend", "keydown", "keypress", "keyup", "orientationchange", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup", "pointerleave", "pointercancel", "gesturestart", "gesturechange", "gestureend", "focus", "blur", "change", "reset", "select", "submit", "focusin", "focusout", "load", "unload", "beforeunload", "resize", "move", "DOMContentLoaded", "readystatechange", "error", "abort", "scroll"]);
|
||||
|
||||
function L(t, e) { return e && `${e}::${k++}` || t.uidEvent || k++ }
|
||||
|
||||
function O(t) { const e = L(t); return t.uidEvent = e, T[e] = T[e] || {}, T[e] }
|
||||
|
||||
function I(t, e, i = null) { return Object.values(t).find((t => t.callable === e && t.delegationSelector === i)) }
|
||||
|
||||
function D(t, e, i) { const s = "string" == typeof e,
|
||||
n = s ? i : e || i; let o = M(t); return S.has(o) || (o = t), [s, n, o] }
|
||||
|
||||
function N(t, e, i, s, n) { if ("string" != typeof e || !t) return; let [o, r, a] = D(e, i, s); if (e in $) { const t = t => function(e) { if (!e.relatedTarget || e.relatedTarget !== e.delegateTarget && !e.delegateTarget.contains(e.relatedTarget)) return t.call(this, e) };
|
||||
r = t(r) } const l = O(t),
|
||||
c = l[a] || (l[a] = {}),
|
||||
h = I(c, r, o ? i : null); if (h) return void(h.oneOff = h.oneOff && n); const d = L(r, e.replace(A, "")),
|
||||
u = o ? function(t, e, i) { return function s(n) { const o = t.querySelectorAll(e); for (let { target: r } = n; r && r !== this; r = r.parentNode)
|
||||
for (const a of o)
|
||||
if (a === r) return F(n, { delegateTarget: r }), s.oneOff && j.off(t, n.type, e, i), i.apply(r, [n]) } }(t, i, r) : function(t, e) { return function i(s) { return F(s, { delegateTarget: t }), i.oneOff && j.off(t, s.type, e), e.apply(t, [s]) } }(t, r);
|
||||
u.delegationSelector = o ? i : null, u.callable = r, u.oneOff = n, u.uidEvent = d, c[d] = u, t.addEventListener(a, u, o) }
|
||||
|
||||
function P(t, e, i, s, n) { const o = I(e[i], s, n);
|
||||
o && (t.removeEventListener(i, o, Boolean(n)), delete e[i][o.uidEvent]) }
|
||||
|
||||
function x(t, e, i, s) { const n = e[i] || {}; for (const [o, r] of Object.entries(n)) o.includes(s) && P(t, e, i, r.callable, r.delegationSelector) }
|
||||
|
||||
function M(t) { return t = t.replace(E, ""), $[t] || t } const j = { on(t, e, i, s) { N(t, e, i, s, !1) }, one(t, e, i, s) { N(t, e, i, s, !0) }, off(t, e, i, s) { if ("string" != typeof e || !t) return; const [n, o, r] = D(e, i, s), a = r !== e, l = O(t), c = l[r] || {}, h = e.startsWith("."); if (void 0 === o) { if (h)
|
||||
for (const i of Object.keys(l)) x(t, l, i, e.slice(1)); for (const [i, s] of Object.entries(c)) { const n = i.replace(C, "");
|
||||
a && !e.includes(n) || P(t, l, r, s.callable, s.delegationSelector) } } else { if (!Object.keys(c).length) return;
|
||||
P(t, l, r, o, n ? i : null) } }, trigger(t, e, i) { if ("string" != typeof e || !t) return null; const s = f(); let n = null,
|
||||
o = !0,
|
||||
r = !0,
|
||||
a = !1;
|
||||
e !== M(e) && s && (n = s.Event(e, i), s(t).trigger(n), o = !n.isPropagationStopped(), r = !n.isImmediatePropagationStopped(), a = n.isDefaultPrevented()); const l = F(new Event(e, { bubbles: o, cancelable: !0 }), i); return a && l.preventDefault(), r && t.dispatchEvent(l), l.defaultPrevented && n && n.preventDefault(), l } };
|
||||
|
||||
function F(t, e = {}) { for (const [i, s] of Object.entries(e)) try { t[i] = s } catch (e) { Object.defineProperty(t, i, { configurable: !0, get: () => s }) }
|
||||
return t }
|
||||
|
||||
function z(t) { if ("true" === t) return !0; if ("false" === t) return !1; if (t === Number(t).toString()) return Number(t); if ("" === t || "null" === t) return null; if ("string" != typeof t) return t; try { return JSON.parse(decodeURIComponent(t)) } catch (e) { return t } }
|
||||
|
||||
function H(t) { return t.replace(/[A-Z]/g, (t => `-${t.toLowerCase()}`)) } const B = { setDataAttribute(t, e, i) { t.setAttribute(`data-bs-${H(e)}`, i) }, removeDataAttribute(t, e) { t.removeAttribute(`data-bs-${H(e)}`) }, getDataAttributes(t) { if (!t) return {}; const e = {},
|
||||
i = Object.keys(t.dataset).filter((t => t.startsWith("bs") && !t.startsWith("bsConfig"))); for (const s of i) { let i = s.replace(/^bs/, "");
|
||||
i = i.charAt(0).toLowerCase() + i.slice(1, i.length), e[i] = z(t.dataset[s]) } return e }, getDataAttribute: (t, e) => z(t.getAttribute(`data-bs-${H(e)}`)) };
|
||||
class q { static get Default() { return {} }
|
||||
static get DefaultType() { return {} }
|
||||
static get NAME() { throw new Error('You have to implement the static method "NAME", for each component!') }
|
||||
_getConfig(t) { return t = this._mergeConfigObj(t), t = this._configAfterMerge(t), this._typeCheckConfig(t), t }
|
||||
_configAfterMerge(t) { return t }
|
||||
_mergeConfigObj(t, e) { const i = l(e) ? B.getDataAttribute(e, "config") : {}; return {...this.constructor.Default, ... "object" == typeof i ? i : {}, ...l(e) ? B.getDataAttributes(e) : {}, ... "object" == typeof t ? t : {} } }
|
||||
_typeCheckConfig(t, e = this.constructor.DefaultType) { for (const [s, n] of Object.entries(e)) { const e = t[s],
|
||||
o = l(e) ? "element" : null == (i = e) ? `${i}` : Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase(); if (!new RegExp(n).test(o)) throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${s}" provided type "${o}" but expected type "${n}".`) } var i } }
|
||||
class W extends q { constructor(t, e) { super(), (t = c(t)) && (this._element = t, this._config = this._getConfig(e), n.set(this._element, this.constructor.DATA_KEY, this)) }
|
||||
dispose() { n.remove(this._element, this.constructor.DATA_KEY), j.off(this._element, this.constructor.EVENT_KEY); for (const t of Object.getOwnPropertyNames(this)) this[t] = null }
|
||||
_queueCallback(t, e, i = !0) { y(t, e, i) }
|
||||
_getConfig(t) { return t = this._mergeConfigObj(t, this._element), t = this._configAfterMerge(t), this._typeCheckConfig(t), t }
|
||||
static getInstance(t) { return n.get(c(t), this.DATA_KEY) }
|
||||
static getOrCreateInstance(t, e = {}) { return this.getInstance(t) || new this(t, "object" == typeof e ? e : null) }
|
||||
static get VERSION() { return "5.3.3" }
|
||||
static get DATA_KEY() { return `bs.${this.NAME}` }
|
||||
static get EVENT_KEY() { return `.${this.DATA_KEY}` }
|
||||
static eventName(t) { return `${t}${this.EVENT_KEY}` } } const R = t => { let e = t.getAttribute("data-bs-target"); if (!e || "#" === e) { let i = t.getAttribute("href"); if (!i || !i.includes("#") && !i.startsWith(".")) return null;
|
||||
i.includes("#") && !i.startsWith("#") && (i = `#${i.split("#")[1]}`), e = i && "#" !== i ? i.trim() : null } return e ? e.split(",").map((t => r(t))).join(",") : null },
|
||||
K = { find: (t, e = document.documentElement) => [].concat(...Element.prototype.querySelectorAll.call(e, t)), findOne: (t, e = document.documentElement) => Element.prototype.querySelector.call(e, t), children: (t, e) => [].concat(...t.children).filter((t => t.matches(e))), parents(t, e) { const i = []; let s = t.parentNode.closest(e); for (; s;) i.push(s), s = s.parentNode.closest(e); return i }, prev(t, e) { let i = t.previousElementSibling; for (; i;) { if (i.matches(e)) return [i];
|
||||
i = i.previousElementSibling } return [] }, next(t, e) { let i = t.nextElementSibling; for (; i;) { if (i.matches(e)) return [i];
|
||||
i = i.nextElementSibling } return [] }, focusableChildren(t) { const e = ["a", "button", "input", "textarea", "select", "details", "[tabindex]", '[contenteditable="true"]'].map((t => `${t}:not([tabindex^="-"])`)).join(","); return this.find(e, t).filter((t => !d(t) && h(t))) }, getSelectorFromElement(t) { const e = R(t); return e && K.findOne(e) ? e : null }, getElementFromSelector(t) { const e = R(t); return e ? K.findOne(e) : null }, getMultipleElementsFromSelector(t) { const e = R(t); return e ? K.find(e) : [] } },
|
||||
V = (t, e = "hide") => { const i = `click.dismiss${t.EVENT_KEY}`,
|
||||
s = t.NAME;
|
||||
j.on(document, i, `[data-bs-dismiss="${s}"]`, (function(i) { if (["A", "AREA"].includes(this.tagName) && i.preventDefault(), d(this)) return; const n = K.getElementFromSelector(this) || this.closest(`.${s}`);
|
||||
t.getOrCreateInstance(n)[e]() })) },
|
||||
Q = ".bs.alert",
|
||||
X = `close${Q}`,
|
||||
Y = `closed${Q}`;
|
||||
class U extends W { static get NAME() { return "alert" }
|
||||
close() { if (j.trigger(this._element, X).defaultPrevented) return;
|
||||
this._element.classList.remove("show"); const t = this._element.classList.contains("fade");
|
||||
this._queueCallback((() => this._destroyElement()), this._element, t) }
|
||||
_destroyElement() { this._element.remove(), j.trigger(this._element, Y), this.dispose() }
|
||||
static jQueryInterface(t) { return this.each((function() { const e = U.getOrCreateInstance(this); if ("string" == typeof t) { if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`);
|
||||
e[t](this) } })) } }
|
||||
V(U, "close"), b(U); const G = '[data-bs-toggle="button"]';
|
||||
class J extends W { static get NAME() { return "button" }
|
||||
toggle() { this._element.setAttribute("aria-pressed", this._element.classList.toggle("active")) }
|
||||
static jQueryInterface(t) { return this.each((function() { const e = J.getOrCreateInstance(this); "toggle" === t && e[t]() })) } }
|
||||
j.on(document, "click.bs.button.data-api", G, (t => { t.preventDefault(); const e = t.target.closest(G);
|
||||
J.getOrCreateInstance(e).toggle() })), b(J); const Z = ".bs.swipe",
|
||||
tt = `touchstart${Z}`,
|
||||
et = `touchmove${Z}`,
|
||||
it = `touchend${Z}`,
|
||||
st = `pointerdown${Z}`,
|
||||
nt = `pointerup${Z}`,
|
||||
ot = { endCallback: null, leftCallback: null, rightCallback: null },
|
||||
rt = { endCallback: "(function|null)", leftCallback: "(function|null)", rightCallback: "(function|null)" };
|
||||
class at extends q { constructor(t, e) { super(), this._element = t, t && at.isSupported() && (this._config = this._getConfig(e), this._deltaX = 0, this._supportPointerEvents = Boolean(window.PointerEvent), this._initEvents()) }
|
||||
static get Default() { return ot }
|
||||
static get DefaultType() { return rt }
|
||||
static get NAME() { return "swipe" }
|
||||
dispose() { j.off(this._element, Z) }
|
||||
_start(t) { this._supportPointerEvents ? this._eventIsPointerPenTouch(t) && (this._deltaX = t.clientX) : this._deltaX = t.touches[0].clientX }
|
||||
_end(t) { this._eventIsPointerPenTouch(t) && (this._deltaX = t.clientX - this._deltaX), this._handleSwipe(), v(this._config.endCallback) }
|
||||
_move(t) { this._deltaX = t.touches && t.touches.length > 1 ? 0 : t.touches[0].clientX - this._deltaX }
|
||||
_handleSwipe() { const t = Math.abs(this._deltaX); if (t <= 40) return; const e = t / this._deltaX;
|
||||
this._deltaX = 0, e && v(e > 0 ? this._config.rightCallback : this._config.leftCallback) }
|
||||
_initEvents() { this._supportPointerEvents ? (j.on(this._element, st, (t => this._start(t))), j.on(this._element, nt, (t => this._end(t))), this._element.classList.add("pointer-event")) : (j.on(this._element, tt, (t => this._start(t))), j.on(this._element, et, (t => this._move(t))), j.on(this._element, it, (t => this._end(t)))) }
|
||||
_eventIsPointerPenTouch(t) { return this._supportPointerEvents && ("pen" === t.pointerType || "touch" === t.pointerType) }
|
||||
static isSupported() { return "ontouchstart" in document.documentElement || navigator.maxTouchPoints > 0 } } const lt = ".bs.carousel",
|
||||
ct = ".data-api",
|
||||
ht = "next",
|
||||
dt = "prev",
|
||||
ut = "left",
|
||||
_t = "right",
|
||||
gt = `slide${lt}`,
|
||||
ft = `slid${lt}`,
|
||||
mt = `keydown${lt}`,
|
||||
pt = `mouseenter${lt}`,
|
||||
bt = `mouseleave${lt}`,
|
||||
vt = `dragstart${lt}`,
|
||||
yt = `load${lt}${ct}`,
|
||||
wt = `click${lt}${ct}`,
|
||||
At = "carousel",
|
||||
Et = "active",
|
||||
Ct = ".active",
|
||||
Tt = ".carousel-item",
|
||||
kt = Ct + Tt,
|
||||
$t = { ArrowLeft: _t, ArrowRight: ut },
|
||||
St = { interval: 5e3, keyboard: !0, pause: "hover", ride: !1, touch: !0, wrap: !0 },
|
||||
Lt = { interval: "(number|boolean)", keyboard: "boolean", pause: "(string|boolean)", ride: "(boolean|string)", touch: "boolean", wrap: "boolean" };
|
||||
class Ot extends W { constructor(t, e) { super(t, e), this._interval = null, this._activeElement = null, this._isSliding = !1, this.touchTimeout = null, this._swipeHelper = null, this._indicatorsElement = K.findOne(".carousel-indicators", this._element), this._addEventListeners(), this._config.ride === At && this.cycle() }
|
||||
static get Default() { return St }
|
||||
static get DefaultType() { return Lt }
|
||||
static get NAME() { return "carousel" }
|
||||
next() { this._slide(ht) }
|
||||
nextWhenVisible() {!document.hidden && h(this._element) && this.next() }
|
||||
prev() { this._slide(dt) }
|
||||
pause() { this._isSliding && a(this._element), this._clearInterval() }
|
||||
cycle() { this._clearInterval(), this._updateInterval(), this._interval = setInterval((() => this.nextWhenVisible()), this._config.interval) }
|
||||
_maybeEnableCycle() { this._config.ride && (this._isSliding ? j.one(this._element, ft, (() => this.cycle())) : this.cycle()) }
|
||||
to(t) { const e = this._getItems(); if (t > e.length - 1 || t < 0) return; if (this._isSliding) return void j.one(this._element, ft, (() => this.to(t))); const i = this._getItemIndex(this._getActive()); if (i === t) return; const s = t > i ? ht : dt;
|
||||
this._slide(s, e[t]) }
|
||||
dispose() { this._swipeHelper && this._swipeHelper.dispose(), super.dispose() }
|
||||
_configAfterMerge(t) { return t.defaultInterval = t.interval, t }
|
||||
_addEventListeners() { this._config.keyboard && j.on(this._element, mt, (t => this._keydown(t))), "hover" === this._config.pause && (j.on(this._element, pt, (() => this.pause())), j.on(this._element, bt, (() => this._maybeEnableCycle()))), this._config.touch && at.isSupported() && this._addTouchEventListeners() }
|
||||
_addTouchEventListeners() { for (const t of K.find(".carousel-item img", this._element)) j.on(t, vt, (t => t.preventDefault())); const t = { leftCallback: () => this._slide(this._directionToOrder(ut)), rightCallback: () => this._slide(this._directionToOrder(_t)), endCallback: () => { "hover" === this._config.pause && (this.pause(), this.touchTimeout && clearTimeout(this.touchTimeout), this.touchTimeout = setTimeout((() => this._maybeEnableCycle()), 500 + this._config.interval)) } };
|
||||
this._swipeHelper = new at(this._element, t) }
|
||||
_keydown(t) { if (/input|textarea/i.test(t.target.tagName)) return; const e = $t[t.key];
|
||||
e && (t.preventDefault(), this._slide(this._directionToOrder(e))) }
|
||||
_getItemIndex(t) { return this._getItems().indexOf(t) }
|
||||
_setActiveIndicatorElement(t) { if (!this._indicatorsElement) return; const e = K.findOne(Ct, this._indicatorsElement);
|
||||
e.classList.remove(Et), e.removeAttribute("aria-current"); const i = K.findOne(`[data-bs-slide-to="${t}"]`, this._indicatorsElement);
|
||||
i && (i.classList.add(Et), i.setAttribute("aria-current", "true")) }
|
||||
_updateInterval() { const t = this._activeElement || this._getActive(); if (!t) return; const e = Number.parseInt(t.getAttribute("data-bs-interval"), 10);
|
||||
this._config.interval = e || this._config.defaultInterval }
|
||||
_slide(t, e = null) { if (this._isSliding) return; const i = this._getActive(),
|
||||
s = t === ht,
|
||||
n = e || w(this._getItems(), i, s, this._config.wrap); if (n === i) return; const o = this._getItemIndex(n),
|
||||
r = e => j.trigger(this._element, e, { relatedTarget: n, direction: this._orderToDirection(t), from: this._getItemIndex(i), to: o }); if (r(gt).defaultPrevented) return; if (!i || !n) return; const a = Boolean(this._interval);
|
||||
this.pause(), this._isSliding = !0, this._setActiveIndicatorElement(o), this._activeElement = n; const l = s ? "carousel-item-start" : "carousel-item-end",
|
||||
c = s ? "carousel-item-next" : "carousel-item-prev";
|
||||
n.classList.add(c), g(n), i.classList.add(l), n.classList.add(l), this._queueCallback((() => { n.classList.remove(l, c), n.classList.add(Et), i.classList.remove(Et, c, l), this._isSliding = !1, r(ft) }), i, this._isAnimated()), a && this.cycle() }
|
||||
_isAnimated() { return this._element.classList.contains("slide") }
|
||||
_getActive() { return K.findOne(kt, this._element) }
|
||||
_getItems() { return K.find(Tt, this._element) }
|
||||
_clearInterval() { this._interval && (clearInterval(this._interval), this._interval = null) }
|
||||
_directionToOrder(t) { return p() ? t === ut ? dt : ht : t === ut ? ht : dt }
|
||||
_orderToDirection(t) { return p() ? t === dt ? ut : _t : t === dt ? _t : ut }
|
||||
static jQueryInterface(t) { return this.each((function() { const e = Ot.getOrCreateInstance(this, t); if ("number" != typeof t) { if ("string" == typeof t) { if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`);
|
||||
e[t]() } } else e.to(t) })) } }
|
||||
j.on(document, wt, "[data-bs-slide], [data-bs-slide-to]", (function(t) { const e = K.getElementFromSelector(this); if (!e || !e.classList.contains(At)) return;
|
||||
t.preventDefault(); const i = Ot.getOrCreateInstance(e),
|
||||
s = this.getAttribute("data-bs-slide-to"); return s ? (i.to(s), void i._maybeEnableCycle()) : "next" === B.getDataAttribute(this, "slide") ? (i.next(), void i._maybeEnableCycle()) : (i.prev(), void i._maybeEnableCycle()) })), j.on(window, yt, (() => { const t = K.find('[data-bs-ride="carousel"]'); for (const e of t) Ot.getOrCreateInstance(e) })), b(Ot); const It = ".bs.collapse",
|
||||
Dt = `show${It}`,
|
||||
Nt = `shown${It}`,
|
||||
Pt = `hide${It}`,
|
||||
xt = `hidden${It}`,
|
||||
Mt = `click${It}.data-api`,
|
||||
jt = "show",
|
||||
Ft = "collapse",
|
||||
zt = "collapsing",
|
||||
Ht = `:scope .${Ft} .${Ft}`,
|
||||
Bt = '[data-bs-toggle="collapse"]',
|
||||
qt = { parent: null, toggle: !0 },
|
||||
Wt = { parent: "(null|element)", toggle: "boolean" };
|
||||
class Rt extends W { constructor(t, e) { super(t, e), this._isTransitioning = !1, this._triggerArray = []; const i = K.find(Bt); for (const t of i) { const e = K.getSelectorFromElement(t),
|
||||
i = K.find(e).filter((t => t === this._element));
|
||||
null !== e && i.length && this._triggerArray.push(t) }
|
||||
this._initializeChildren(), this._config.parent || this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()), this._config.toggle && this.toggle() }
|
||||
static get Default() { return qt }
|
||||
static get DefaultType() { return Wt }
|
||||
static get NAME() { return "collapse" }
|
||||
toggle() { this._isShown() ? this.hide() : this.show() }
|
||||
show() { if (this._isTransitioning || this._isShown()) return; let t = []; if (this._config.parent && (t = this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t => t !== this._element)).map((t => Rt.getOrCreateInstance(t, { toggle: !1 })))), t.length && t[0]._isTransitioning) return; if (j.trigger(this._element, Dt).defaultPrevented) return; for (const e of t) e.hide(); const e = this._getDimension();
|
||||
this._element.classList.remove(Ft), this._element.classList.add(zt), this._element.style[e] = 0, this._addAriaAndCollapsedClass(this._triggerArray, !0), this._isTransitioning = !0; const i = `scroll${e[0].toUpperCase()+e.slice(1)}`;
|
||||
this._queueCallback((() => { this._isTransitioning = !1, this._element.classList.remove(zt), this._element.classList.add(Ft, jt), this._element.style[e] = "", j.trigger(this._element, Nt) }), this._element, !0), this._element.style[e] = `${this._element[i]}px` }
|
||||
hide() { if (this._isTransitioning || !this._isShown()) return; if (j.trigger(this._element, Pt).defaultPrevented) return; const t = this._getDimension();
|
||||
this._element.style[t] = `${this._element.getBoundingClientRect()[t]}px`, g(this._element), this._element.classList.add(zt), this._element.classList.remove(Ft, jt); for (const t of this._triggerArray) { const e = K.getElementFromSelector(t);
|
||||
e && !this._isShown(e) && this._addAriaAndCollapsedClass([t], !1) }
|
||||
this._isTransitioning = !0, this._element.style[t] = "", this._queueCallback((() => { this._isTransitioning = !1, this._element.classList.remove(zt), this._element.classList.add(Ft), j.trigger(this._element, xt) }), this._element, !0) }
|
||||
_isShown(t = this._element) { return t.classList.contains(jt) }
|
||||
_configAfterMerge(t) { return t.toggle = Boolean(t.toggle), t.parent = c(t.parent), t }
|
||||
_getDimension() { return this._element.classList.contains("collapse-horizontal") ? "width" : "height" }
|
||||
_initializeChildren() { if (!this._config.parent) return; const t = this._getFirstLevelChildren(Bt); for (const e of t) { const t = K.getElementFromSelector(e);
|
||||
t && this._addAriaAndCollapsedClass([e], this._isShown(t)) } }
|
||||
_getFirstLevelChildren(t) { const e = K.find(Ht, this._config.parent); return K.find(t, this._config.parent).filter((t => !e.includes(t))) }
|
||||
_addAriaAndCollapsedClass(t, e) { if (t.length)
|
||||
for (const i of t) i.classList.toggle("collapsed", !e), i.setAttribute("aria-expanded", e) }
|
||||
static jQueryInterface(t) { const e = {}; return "string" == typeof t && /show|hide/.test(t) && (e.toggle = !1), this.each((function() { const i = Rt.getOrCreateInstance(this, e); if ("string" == typeof t) { if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`);
|
||||
i[t]() } })) } }
|
||||
j.on(document, Mt, Bt, (function(t) {
|
||||
("A" === t.target.tagName || t.delegateTarget && "A" === t.delegateTarget.tagName) && t.preventDefault(); for (const t of K.getMultipleElementsFromSelector(this)) Rt.getOrCreateInstance(t, { toggle: !1 }).toggle() })), b(Rt); const Kt = "dropdown",
|
||||
Vt = ".bs.dropdown",
|
||||
Qt = ".data-api",
|
||||
Xt = "ArrowUp",
|
||||
Yt = "ArrowDown",
|
||||
Ut = `hide${Vt}`,
|
||||
Gt = `hidden${Vt}`,
|
||||
Jt = `show${Vt}`,
|
||||
Zt = `shown${Vt}`,
|
||||
te = `click${Vt}${Qt}`,
|
||||
ee = `keydown${Vt}${Qt}`,
|
||||
ie = `keyup${Vt}${Qt}`,
|
||||
se = "show",
|
||||
ne = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',
|
||||
oe = `${ne}.${se}`,
|
||||
re = ".dropdown-menu",
|
||||
ae = p() ? "top-end" : "top-start",
|
||||
le = p() ? "top-start" : "top-end",
|
||||
ce = p() ? "bottom-end" : "bottom-start",
|
||||
he = p() ? "bottom-start" : "bottom-end",
|
||||
de = p() ? "left-start" : "right-start",
|
||||
ue = p() ? "right-start" : "left-start",
|
||||
_e = { autoClose: !0, boundary: "clippingParents", display: "dynamic", offset: [0, 2], popperConfig: null, reference: "toggle" },
|
||||
ge = { autoClose: "(boolean|string)", boundary: "(string|element)", display: "string", offset: "(array|string|function)", popperConfig: "(null|object|function)", reference: "(string|element|object)" };
|
||||
class fe extends W { constructor(t, e) { super(t, e), this._popper = null, this._parent = this._element.parentNode, this._menu = K.next(this._element, re)[0] || K.prev(this._element, re)[0] || K.findOne(re, this._parent), this._inNavbar = this._detectNavbar() }
|
||||
static get Default() { return _e }
|
||||
static get DefaultType() { return ge }
|
||||
static get NAME() { return Kt }
|
||||
toggle() { return this._isShown() ? this.hide() : this.show() }
|
||||
show() { if (d(this._element) || this._isShown()) return; const t = { relatedTarget: this._element }; if (!j.trigger(this._element, Jt, t).defaultPrevented) { if (this._createPopper(), "ontouchstart" in document.documentElement && !this._parent.closest(".navbar-nav"))
|
||||
for (const t of[].concat(...document.body.children)) j.on(t, "mouseover", _);
|
||||
this._element.focus(), this._element.setAttribute("aria-expanded", !0), this._menu.classList.add(se), this._element.classList.add(se), j.trigger(this._element, Zt, t) } }
|
||||
hide() { if (d(this._element) || !this._isShown()) return; const t = { relatedTarget: this._element };
|
||||
this._completeHide(t) }
|
||||
dispose() { this._popper && this._popper.destroy(), super.dispose() }
|
||||
update() { this._inNavbar = this._detectNavbar(), this._popper && this._popper.update() }
|
||||
_completeHide(t) { if (!j.trigger(this._element, Ut, t).defaultPrevented) { if ("ontouchstart" in document.documentElement)
|
||||
for (const t of[].concat(...document.body.children)) j.off(t, "mouseover", _);
|
||||
this._popper && this._popper.destroy(), this._menu.classList.remove(se), this._element.classList.remove(se), this._element.setAttribute("aria-expanded", "false"), B.removeDataAttribute(this._menu, "popper"), j.trigger(this._element, Gt, t) } }
|
||||
_getConfig(t) { if ("object" == typeof(t = super._getConfig(t)).reference && !l(t.reference) && "function" != typeof t.reference.getBoundingClientRect) throw new TypeError(`${Kt.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`); return t }
|
||||
_createPopper() { if (void 0 === i) throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)"); let t = this._element; "parent" === this._config.reference ? t = this._parent : l(this._config.reference) ? t = c(this._config.reference) : "object" == typeof this._config.reference && (t = this._config.reference); const e = this._getPopperConfig();
|
||||
this._popper = i.createPopper(t, this._menu, e) }
|
||||
_isShown() { return this._menu.classList.contains(se) }
|
||||
_getPlacement() { const t = this._parent; if (t.classList.contains("dropend")) return de; if (t.classList.contains("dropstart")) return ue; if (t.classList.contains("dropup-center")) return "top"; if (t.classList.contains("dropdown-center")) return "bottom"; const e = "end" === getComputedStyle(this._menu).getPropertyValue("--bs-position").trim(); return t.classList.contains("dropup") ? e ? le : ae : e ? he : ce }
|
||||
_detectNavbar() { return null !== this._element.closest(".navbar") }
|
||||
_getOffset() { const { offset: t } = this._config; return "string" == typeof t ? t.split(",").map((t => Number.parseInt(t, 10))) : "function" == typeof t ? e => t(e, this._element) : t }
|
||||
_getPopperConfig() { const t = { placement: this._getPlacement(), modifiers: [{ name: "preventOverflow", options: { boundary: this._config.boundary } }, { name: "offset", options: { offset: this._getOffset() } }] }; return (this._inNavbar || "static" === this._config.display) && (B.setDataAttribute(this._menu, "popper", "static"), t.modifiers = [{ name: "applyStyles", enabled: !1 }]), {...t, ...v(this._config.popperConfig, [t]) } }
|
||||
_selectMenuItem({ key: t, target: e }) { const i = K.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)", this._menu).filter((t => h(t)));
|
||||
i.length && w(i, e, t === Yt, !i.includes(e)).focus() }
|
||||
static jQueryInterface(t) { return this.each((function() { const e = fe.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`);
|
||||
e[t]() } })) }
|
||||
static clearMenus(t) { if (2 === t.button || "keyup" === t.type && "Tab" !== t.key) return; const e = K.find(oe); for (const i of e) { const e = fe.getInstance(i); if (!e || !1 === e._config.autoClose) continue; const s = t.composedPath(),
|
||||
n = s.includes(e._menu); if (s.includes(e._element) || "inside" === e._config.autoClose && !n || "outside" === e._config.autoClose && n) continue; if (e._menu.contains(t.target) && ("keyup" === t.type && "Tab" === t.key || /input|select|option|textarea|form/i.test(t.target.tagName))) continue; const o = { relatedTarget: e._element }; "click" === t.type && (o.clickEvent = t), e._completeHide(o) } }
|
||||
static dataApiKeydownHandler(t) { const e = /input|textarea/i.test(t.target.tagName),
|
||||
i = "Escape" === t.key,
|
||||
s = [Xt, Yt].includes(t.key); if (!s && !i) return; if (e && !i) return;
|
||||
t.preventDefault(); const n = this.matches(ne) ? this : K.prev(this, ne)[0] || K.next(this, ne)[0] || K.findOne(ne, t.delegateTarget.parentNode),
|
||||
o = fe.getOrCreateInstance(n); if (s) return t.stopPropagation(), o.show(), void o._selectMenuItem(t);
|
||||
o._isShown() && (t.stopPropagation(), o.hide(), n.focus()) } }
|
||||
j.on(document, ee, ne, fe.dataApiKeydownHandler), j.on(document, ee, re, fe.dataApiKeydownHandler), j.on(document, te, fe.clearMenus), j.on(document, ie, fe.clearMenus), j.on(document, te, ne, (function(t) { t.preventDefault(), fe.getOrCreateInstance(this).toggle() })), b(fe); const me = "backdrop",
|
||||
pe = "show",
|
||||
be = `mousedown.bs.${me}`,
|
||||
ve = { className: "modal-backdrop", clickCallback: null, isAnimated: !1, isVisible: !0, rootElement: "body" },
|
||||
ye = { className: "string", clickCallback: "(function|null)", isAnimated: "boolean", isVisible: "boolean", rootElement: "(element|string)" };
|
||||
class we extends q { constructor(t) { super(), this._config = this._getConfig(t), this._isAppended = !1, this._element = null }
|
||||
static get Default() { return ve }
|
||||
static get DefaultType() { return ye }
|
||||
static get NAME() { return me }
|
||||
show(t) { if (!this._config.isVisible) return void v(t);
|
||||
this._append(); const e = this._getElement();
|
||||
this._config.isAnimated && g(e), e.classList.add(pe), this._emulateAnimation((() => { v(t) })) }
|
||||
hide(t) { this._config.isVisible ? (this._getElement().classList.remove(pe), this._emulateAnimation((() => { this.dispose(), v(t) }))) : v(t) }
|
||||
dispose() { this._isAppended && (j.off(this._element, be), this._element.remove(), this._isAppended = !1) }
|
||||
_getElement() { if (!this._element) { const t = document.createElement("div");
|
||||
t.className = this._config.className, this._config.isAnimated && t.classList.add("fade"), this._element = t } return this._element }
|
||||
_configAfterMerge(t) { return t.rootElement = c(t.rootElement), t }
|
||||
_append() { if (this._isAppended) return; const t = this._getElement();
|
||||
this._config.rootElement.append(t), j.on(t, be, (() => { v(this._config.clickCallback) })), this._isAppended = !0 }
|
||||
_emulateAnimation(t) { y(t, this._getElement(), this._config.isAnimated) } } const Ae = ".bs.focustrap",
|
||||
Ee = `focusin${Ae}`,
|
||||
Ce = `keydown.tab${Ae}`,
|
||||
Te = "backward",
|
||||
ke = { autofocus: !0, trapElement: null },
|
||||
$e = { autofocus: "boolean", trapElement: "element" };
|
||||
class Se extends q { constructor(t) { super(), this._config = this._getConfig(t), this._isActive = !1, this._lastTabNavDirection = null }
|
||||
static get Default() { return ke }
|
||||
static get DefaultType() { return $e }
|
||||
static get NAME() { return "focustrap" }
|
||||
activate() { this._isActive || (this._config.autofocus && this._config.trapElement.focus(), j.off(document, Ae), j.on(document, Ee, (t => this._handleFocusin(t))), j.on(document, Ce, (t => this._handleKeydown(t))), this._isActive = !0) }
|
||||
deactivate() { this._isActive && (this._isActive = !1, j.off(document, Ae)) }
|
||||
_handleFocusin(t) { const { trapElement: e } = this._config; if (t.target === document || t.target === e || e.contains(t.target)) return; const i = K.focusableChildren(e);
|
||||
0 === i.length ? e.focus() : this._lastTabNavDirection === Te ? i[i.length - 1].focus() : i[0].focus() }
|
||||
_handleKeydown(t) { "Tab" === t.key && (this._lastTabNavDirection = t.shiftKey ? Te : "forward") } } const Le = ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",
|
||||
Oe = ".sticky-top",
|
||||
Ie = "padding-right",
|
||||
De = "margin-right";
|
||||
class Ne { constructor() { this._element = document.body }
|
||||
getWidth() { const t = document.documentElement.clientWidth; return Math.abs(window.innerWidth - t) }
|
||||
hide() { const t = this.getWidth();
|
||||
this._disableOverFlow(), this._setElementAttributes(this._element, Ie, (e => e + t)), this._setElementAttributes(Le, Ie, (e => e + t)), this._setElementAttributes(Oe, De, (e => e - t)) }
|
||||
reset() { this._resetElementAttributes(this._element, "overflow"), this._resetElementAttributes(this._element, Ie), this._resetElementAttributes(Le, Ie), this._resetElementAttributes(Oe, De) }
|
||||
isOverflowing() { return this.getWidth() > 0 }
|
||||
_disableOverFlow() { this._saveInitialAttribute(this._element, "overflow"), this._element.style.overflow = "hidden" }
|
||||
_setElementAttributes(t, e, i) { const s = this.getWidth();
|
||||
this._applyManipulationCallback(t, (t => { if (t !== this._element && window.innerWidth > t.clientWidth + s) return;
|
||||
this._saveInitialAttribute(t, e); const n = window.getComputedStyle(t).getPropertyValue(e);
|
||||
t.style.setProperty(e, `${i(Number.parseFloat(n))}px`) })) }
|
||||
_saveInitialAttribute(t, e) { const i = t.style.getPropertyValue(e);
|
||||
i && B.setDataAttribute(t, e, i) }
|
||||
_resetElementAttributes(t, e) { this._applyManipulationCallback(t, (t => { const i = B.getDataAttribute(t, e);
|
||||
null !== i ? (B.removeDataAttribute(t, e), t.style.setProperty(e, i)) : t.style.removeProperty(e) })) }
|
||||
_applyManipulationCallback(t, e) { if (l(t)) e(t);
|
||||
else
|
||||
for (const i of K.find(t, this._element)) e(i) } } const Pe = ".bs.modal",
|
||||
xe = `hide${Pe}`,
|
||||
Me = `hidePrevented${Pe}`,
|
||||
je = `hidden${Pe}`,
|
||||
Fe = `show${Pe}`,
|
||||
ze = `shown${Pe}`,
|
||||
He = `resize${Pe}`,
|
||||
Be = `click.dismiss${Pe}`,
|
||||
qe = `mousedown.dismiss${Pe}`,
|
||||
We = `keydown.dismiss${Pe}`,
|
||||
Re = `click${Pe}.data-api`,
|
||||
Ke = "modal-open",
|
||||
Ve = "show",
|
||||
Qe = "modal-static",
|
||||
Xe = { backdrop: !0, focus: !0, keyboard: !0 },
|
||||
Ye = { backdrop: "(boolean|string)", focus: "boolean", keyboard: "boolean" };
|
||||
class Ue extends W { constructor(t, e) { super(t, e), this._dialog = K.findOne(".modal-dialog", this._element), this._backdrop = this._initializeBackDrop(), this._focustrap = this._initializeFocusTrap(), this._isShown = !1, this._isTransitioning = !1, this._scrollBar = new Ne, this._addEventListeners() }
|
||||
static get Default() { return Xe }
|
||||
static get DefaultType() { return Ye }
|
||||
static get NAME() { return "modal" }
|
||||
toggle(t) { return this._isShown ? this.hide() : this.show(t) }
|
||||
show(t) { this._isShown || this._isTransitioning || j.trigger(this._element, Fe, { relatedTarget: t }).defaultPrevented || (this._isShown = !0, this._isTransitioning = !0, this._scrollBar.hide(), document.body.classList.add(Ke), this._adjustDialog(), this._backdrop.show((() => this._showElement(t)))) }
|
||||
hide() { this._isShown && !this._isTransitioning && (j.trigger(this._element, xe).defaultPrevented || (this._isShown = !1, this._isTransitioning = !0, this._focustrap.deactivate(), this._element.classList.remove(Ve), this._queueCallback((() => this._hideModal()), this._element, this._isAnimated()))) }
|
||||
dispose() { j.off(window, Pe), j.off(this._dialog, Pe), this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose() }
|
||||
handleUpdate() { this._adjustDialog() }
|
||||
_initializeBackDrop() { return new we({ isVisible: Boolean(this._config.backdrop), isAnimated: this._isAnimated() }) }
|
||||
_initializeFocusTrap() { return new Se({ trapElement: this._element }) }
|
||||
_showElement(t) { document.body.contains(this._element) || document.body.append(this._element), this._element.style.display = "block", this._element.removeAttribute("aria-hidden"), this._element.setAttribute("aria-modal", !0), this._element.setAttribute("role", "dialog"), this._element.scrollTop = 0; const e = K.findOne(".modal-body", this._dialog);
|
||||
e && (e.scrollTop = 0), g(this._element), this._element.classList.add(Ve), this._queueCallback((() => { this._config.focus && this._focustrap.activate(), this._isTransitioning = !1, j.trigger(this._element, ze, { relatedTarget: t }) }), this._dialog, this._isAnimated()) }
|
||||
_addEventListeners() { j.on(this._element, We, (t => { "Escape" === t.key && (this._config.keyboard ? this.hide() : this._triggerBackdropTransition()) })), j.on(window, He, (() => { this._isShown && !this._isTransitioning && this._adjustDialog() })), j.on(this._element, qe, (t => { j.one(this._element, Be, (e => { this._element === t.target && this._element === e.target && ("static" !== this._config.backdrop ? this._config.backdrop && this.hide() : this._triggerBackdropTransition()) })) })) }
|
||||
_hideModal() { this._element.style.display = "none", this._element.setAttribute("aria-hidden", !0), this._element.removeAttribute("aria-modal"), this._element.removeAttribute("role"), this._isTransitioning = !1, this._backdrop.hide((() => { document.body.classList.remove(Ke), this._resetAdjustments(), this._scrollBar.reset(), j.trigger(this._element, je) })) }
|
||||
_isAnimated() { return this._element.classList.contains("fade") }
|
||||
_triggerBackdropTransition() { if (j.trigger(this._element, Me).defaultPrevented) return; const t = this._element.scrollHeight > document.documentElement.clientHeight,
|
||||
e = this._element.style.overflowY; "hidden" === e || this._element.classList.contains(Qe) || (t || (this._element.style.overflowY = "hidden"), this._element.classList.add(Qe), this._queueCallback((() => { this._element.classList.remove(Qe), this._queueCallback((() => { this._element.style.overflowY = e }), this._dialog) }), this._dialog), this._element.focus()) }
|
||||
_adjustDialog() { const t = this._element.scrollHeight > document.documentElement.clientHeight,
|
||||
e = this._scrollBar.getWidth(),
|
||||
i = e > 0; if (i && !t) { const t = p() ? "paddingLeft" : "paddingRight";
|
||||
this._element.style[t] = `${e}px` } if (!i && t) { const t = p() ? "paddingRight" : "paddingLeft";
|
||||
this._element.style[t] = `${e}px` } }
|
||||
_resetAdjustments() { this._element.style.paddingLeft = "", this._element.style.paddingRight = "" }
|
||||
static jQueryInterface(t, e) { return this.each((function() { const i = Ue.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`);
|
||||
i[t](e) } })) } }
|
||||
j.on(document, Re, '[data-bs-toggle="modal"]', (function(t) { const e = K.getElementFromSelector(this);
|
||||
["A", "AREA"].includes(this.tagName) && t.preventDefault(), j.one(e, Fe, (t => { t.defaultPrevented || j.one(e, je, (() => { h(this) && this.focus() })) })); const i = K.findOne(".modal.show");
|
||||
i && Ue.getInstance(i).hide(), Ue.getOrCreateInstance(e).toggle(this) })), V(Ue), b(Ue); const Ge = ".bs.offcanvas",
|
||||
Je = ".data-api",
|
||||
Ze = `load${Ge}${Je}`,
|
||||
ti = "show",
|
||||
ei = "showing",
|
||||
ii = "hiding",
|
||||
si = ".offcanvas.show",
|
||||
ni = `show${Ge}`,
|
||||
oi = `shown${Ge}`,
|
||||
ri = `hide${Ge}`,
|
||||
ai = `hidePrevented${Ge}`,
|
||||
li = `hidden${Ge}`,
|
||||
ci = `resize${Ge}`,
|
||||
hi = `click${Ge}${Je}`,
|
||||
di = `keydown.dismiss${Ge}`,
|
||||
ui = { backdrop: !0, keyboard: !0, scroll: !1 },
|
||||
_i = { backdrop: "(boolean|string)", keyboard: "boolean", scroll: "boolean" };
|
||||
class gi extends W { constructor(t, e) { super(t, e), this._isShown = !1, this._backdrop = this._initializeBackDrop(), this._focustrap = this._initializeFocusTrap(), this._addEventListeners() }
|
||||
static get Default() { return ui }
|
||||
static get DefaultType() { return _i }
|
||||
static get NAME() { return "offcanvas" }
|
||||
toggle(t) { return this._isShown ? this.hide() : this.show(t) }
|
||||
show(t) { this._isShown || j.trigger(this._element, ni, { relatedTarget: t }).defaultPrevented || (this._isShown = !0, this._backdrop.show(), this._config.scroll || (new Ne).hide(), this._element.setAttribute("aria-modal", !0), this._element.setAttribute("role", "dialog"), this._element.classList.add(ei), this._queueCallback((() => { this._config.scroll && !this._config.backdrop || this._focustrap.activate(), this._element.classList.add(ti), this._element.classList.remove(ei), j.trigger(this._element, oi, { relatedTarget: t }) }), this._element, !0)) }
|
||||
hide() { this._isShown && (j.trigger(this._element, ri).defaultPrevented || (this._focustrap.deactivate(), this._element.blur(), this._isShown = !1, this._element.classList.add(ii), this._backdrop.hide(), this._queueCallback((() => { this._element.classList.remove(ti, ii), this._element.removeAttribute("aria-modal"), this._element.removeAttribute("role"), this._config.scroll || (new Ne).reset(), j.trigger(this._element, li) }), this._element, !0))) }
|
||||
dispose() { this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose() }
|
||||
_initializeBackDrop() { const t = Boolean(this._config.backdrop); return new we({ className: "offcanvas-backdrop", isVisible: t, isAnimated: !0, rootElement: this._element.parentNode, clickCallback: t ? () => { "static" !== this._config.backdrop ? this.hide() : j.trigger(this._element, ai) } : null }) }
|
||||
_initializeFocusTrap() { return new Se({ trapElement: this._element }) }
|
||||
_addEventListeners() { j.on(this._element, di, (t => { "Escape" === t.key && (this._config.keyboard ? this.hide() : j.trigger(this._element, ai)) })) }
|
||||
static jQueryInterface(t) { return this.each((function() { const e = gi.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`);
|
||||
e[t](this) } })) } }
|
||||
j.on(document, hi, '[data-bs-toggle="offcanvas"]', (function(t) { const e = K.getElementFromSelector(this); if (["A", "AREA"].includes(this.tagName) && t.preventDefault(), d(this)) return;
|
||||
j.one(e, li, (() => { h(this) && this.focus() })); const i = K.findOne(si);
|
||||
i && i !== e && gi.getInstance(i).hide(), gi.getOrCreateInstance(e).toggle(this) })), j.on(window, Ze, (() => { for (const t of K.find(si)) gi.getOrCreateInstance(t).show() })), j.on(window, ci, (() => { for (const t of K.find("[aria-modal][class*=show][class*=offcanvas-]")) "fixed" !== getComputedStyle(t).position && gi.getOrCreateInstance(t).hide() })), V(gi), b(gi); const fi = { "*": ["class", "dir", "id", "lang", "role", /^aria-[\w-]*$/i], a: ["target", "href", "title", "rel"], area: [], b: [], br: [], col: [], code: [], dd: [], div: [], dl: [], dt: [], em: [], hr: [], h1: [], h2: [], h3: [], h4: [], h5: [], h6: [], i: [], img: ["src", "srcset", "alt", "title", "width", "height"], li: [], ol: [], p: [], pre: [], s: [], small: [], span: [], sub: [], sup: [], strong: [], u: [], ul: [] },
|
||||
mi = new Set(["background", "cite", "href", "itemtype", "longdesc", "poster", "src", "xlink:href"]),
|
||||
pi = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,
|
||||
bi = (t, e) => { const i = t.nodeName.toLowerCase(); return e.includes(i) ? !mi.has(i) || Boolean(pi.test(t.nodeValue)) : e.filter((t => t instanceof RegExp)).some((t => t.test(i))) },
|
||||
vi = { allowList: fi, content: {}, extraClass: "", html: !1, sanitize: !0, sanitizeFn: null, template: "<div></div>" },
|
||||
yi = { allowList: "object", content: "object", extraClass: "(string|function)", html: "boolean", sanitize: "boolean", sanitizeFn: "(null|function)", template: "string" },
|
||||
wi = { entry: "(string|element|function|null)", selector: "(string|element)" };
|
||||
class Ai extends q { constructor(t) { super(), this._config = this._getConfig(t) }
|
||||
static get Default() { return vi }
|
||||
static get DefaultType() { return yi }
|
||||
static get NAME() { return "TemplateFactory" }
|
||||
getContent() { return Object.values(this._config.content).map((t => this._resolvePossibleFunction(t))).filter(Boolean) }
|
||||
hasContent() { return this.getContent().length > 0 }
|
||||
changeContent(t) { return this._checkContent(t), this._config.content = {...this._config.content, ...t }, this }
|
||||
toHtml() { const t = document.createElement("div");
|
||||
t.innerHTML = this._maybeSanitize(this._config.template); for (const [e, i] of Object.entries(this._config.content)) this._setContent(t, i, e); const e = t.children[0],
|
||||
i = this._resolvePossibleFunction(this._config.extraClass); return i && e.classList.add(...i.split(" ")), e }
|
||||
_typeCheckConfig(t) { super._typeCheckConfig(t), this._checkContent(t.content) }
|
||||
_checkContent(t) { for (const [e, i] of Object.entries(t)) super._typeCheckConfig({ selector: e, entry: i }, wi) }
|
||||
_setContent(t, e, i) { const s = K.findOne(i, t);
|
||||
s && ((e = this._resolvePossibleFunction(e)) ? l(e) ? this._putElementInTemplate(c(e), s) : this._config.html ? s.innerHTML = this._maybeSanitize(e) : s.textContent = e : s.remove()) }
|
||||
_maybeSanitize(t) { return this._config.sanitize ? function(t, e, i) { if (!t.length) return t; if (i && "function" == typeof i) return i(t); const s = (new window.DOMParser).parseFromString(t, "text/html"),
|
||||
n = [].concat(...s.body.querySelectorAll("*")); for (const t of n) { const i = t.nodeName.toLowerCase(); if (!Object.keys(e).includes(i)) { t.remove(); continue } const s = [].concat(...t.attributes),
|
||||
n = [].concat(e["*"] || [], e[i] || []); for (const e of s) bi(e, n) || t.removeAttribute(e.nodeName) } return s.body.innerHTML }(t, this._config.allowList, this._config.sanitizeFn) : t }
|
||||
_resolvePossibleFunction(t) { return v(t, [this]) }
|
||||
_putElementInTemplate(t, e) { if (this._config.html) return e.innerHTML = "", void e.append(t);
|
||||
e.textContent = t.textContent } } const Ei = new Set(["sanitize", "allowList", "sanitizeFn"]),
|
||||
Ci = "fade",
|
||||
Ti = "show",
|
||||
ki = ".modal",
|
||||
$i = "hide.bs.modal",
|
||||
Si = "hover",
|
||||
Li = "focus",
|
||||
Oi = { AUTO: "auto", TOP: "top", RIGHT: p() ? "left" : "right", BOTTOM: "bottom", LEFT: p() ? "right" : "left" },
|
||||
Ii = { allowList: fi, animation: !0, boundary: "clippingParents", container: !1, customClass: "", delay: 0, fallbackPlacements: ["top", "right", "bottom", "left"], html: !1, offset: [0, 6], placement: "top", popperConfig: null, sanitize: !0, sanitizeFn: null, selector: !1, template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', title: "", trigger: "hover focus" },
|
||||
Di = { allowList: "object", animation: "boolean", boundary: "(string|element)", container: "(string|element|boolean)", customClass: "(string|function)", delay: "(number|object)", fallbackPlacements: "array", html: "boolean", offset: "(array|string|function)", placement: "(string|function)", popperConfig: "(null|object|function)", sanitize: "boolean", sanitizeFn: "(null|function)", selector: "(string|boolean)", template: "string", title: "(string|element|function)", trigger: "string" };
|
||||
class Ni extends W { constructor(t, e) { if (void 0 === i) throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");
|
||||
super(t, e), this._isEnabled = !0, this._timeout = 0, this._isHovered = null, this._activeTrigger = {}, this._popper = null, this._templateFactory = null, this._newContent = null, this.tip = null, this._setListeners(), this._config.selector || this._fixTitle() }
|
||||
static get Default() { return Ii }
|
||||
static get DefaultType() { return Di }
|
||||
static get NAME() { return "tooltip" }
|
||||
enable() { this._isEnabled = !0 }
|
||||
disable() { this._isEnabled = !1 }
|
||||
toggleEnabled() { this._isEnabled = !this._isEnabled }
|
||||
toggle() { this._isEnabled && (this._activeTrigger.click = !this._activeTrigger.click, this._isShown() ? this._leave() : this._enter()) }
|
||||
dispose() { clearTimeout(this._timeout), j.off(this._element.closest(ki), $i, this._hideModalHandler), this._element.getAttribute("data-bs-original-title") && this._element.setAttribute("title", this._element.getAttribute("data-bs-original-title")), this._disposePopper(), super.dispose() }
|
||||
show() { if ("none" === this._element.style.display) throw new Error("Please use show on visible elements"); if (!this._isWithContent() || !this._isEnabled) return; const t = j.trigger(this._element, this.constructor.eventName("show")),
|
||||
e = (u(this._element) || this._element.ownerDocument.documentElement).contains(this._element); if (t.defaultPrevented || !e) return;
|
||||
this._disposePopper(); const i = this._getTipElement();
|
||||
this._element.setAttribute("aria-describedby", i.getAttribute("id")); const { container: s } = this._config; if (this._element.ownerDocument.documentElement.contains(this.tip) || (s.append(i), j.trigger(this._element, this.constructor.eventName("inserted"))), this._popper = this._createPopper(i), i.classList.add(Ti), "ontouchstart" in document.documentElement)
|
||||
for (const t of[].concat(...document.body.children)) j.on(t, "mouseover", _);
|
||||
this._queueCallback((() => { j.trigger(this._element, this.constructor.eventName("shown")), !1 === this._isHovered && this._leave(), this._isHovered = !1 }), this.tip, this._isAnimated()) }
|
||||
hide() { if (this._isShown() && !j.trigger(this._element, this.constructor.eventName("hide")).defaultPrevented) { if (this._getTipElement().classList.remove(Ti), "ontouchstart" in document.documentElement)
|
||||
for (const t of[].concat(...document.body.children)) j.off(t, "mouseover", _);
|
||||
this._activeTrigger.click = !1, this._activeTrigger[Li] = !1, this._activeTrigger[Si] = !1, this._isHovered = null, this._queueCallback((() => { this._isWithActiveTrigger() || (this._isHovered || this._disposePopper(), this._element.removeAttribute("aria-describedby"), j.trigger(this._element, this.constructor.eventName("hidden"))) }), this.tip, this._isAnimated()) } }
|
||||
update() { this._popper && this._popper.update() }
|
||||
_isWithContent() { return Boolean(this._getTitle()) }
|
||||
_getTipElement() { return this.tip || (this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())), this.tip }
|
||||
_createTipElement(t) { const e = this._getTemplateFactory(t).toHtml(); if (!e) return null;
|
||||
e.classList.remove(Ci, Ti), e.classList.add(`bs-${this.constructor.NAME}-auto`); const i = (t => { do { t += Math.floor(1e6 * Math.random()) } while (document.getElementById(t)); return t })(this.constructor.NAME).toString(); return e.setAttribute("id", i), this._isAnimated() && e.classList.add(Ci), e }
|
||||
setContent(t) { this._newContent = t, this._isShown() && (this._disposePopper(), this.show()) }
|
||||
_getTemplateFactory(t) { return this._templateFactory ? this._templateFactory.changeContent(t) : this._templateFactory = new Ai({...this._config, content: t, extraClass: this._resolvePossibleFunction(this._config.customClass) }), this._templateFactory }
|
||||
_getContentForTemplate() { return { ".tooltip-inner": this._getTitle() } }
|
||||
_getTitle() { return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute("data-bs-original-title") }
|
||||
_initializeOnDelegatedTarget(t) { return this.constructor.getOrCreateInstance(t.delegateTarget, this._getDelegateConfig()) }
|
||||
_isAnimated() { return this._config.animation || this.tip && this.tip.classList.contains(Ci) }
|
||||
_isShown() { return this.tip && this.tip.classList.contains(Ti) }
|
||||
_createPopper(t) { const e = v(this._config.placement, [this, t, this._element]),
|
||||
s = Oi[e.toUpperCase()]; return i.createPopper(this._element, t, this._getPopperConfig(s)) }
|
||||
_getOffset() { const { offset: t } = this._config; return "string" == typeof t ? t.split(",").map((t => Number.parseInt(t, 10))) : "function" == typeof t ? e => t(e, this._element) : t }
|
||||
_resolvePossibleFunction(t) { return v(t, [this._element]) }
|
||||
_getPopperConfig(t) { const e = { placement: t, modifiers: [{ name: "flip", options: { fallbackPlacements: this._config.fallbackPlacements } }, { name: "offset", options: { offset: this._getOffset() } }, { name: "preventOverflow", options: { boundary: this._config.boundary } }, { name: "arrow", options: { element: `.${this.constructor.NAME}-arrow` } }, { name: "preSetPlacement", enabled: !0, phase: "beforeMain", fn: t => { this._getTipElement().setAttribute("data-popper-placement", t.state.placement) } }] }; return {...e, ...v(this._config.popperConfig, [e]) } }
|
||||
_setListeners() { const t = this._config.trigger.split(" "); for (const e of t)
|
||||
if ("click" === e) j.on(this._element, this.constructor.eventName("click"), this._config.selector, (t => { this._initializeOnDelegatedTarget(t).toggle() }));
|
||||
else if ("manual" !== e) { const t = e === Si ? this.constructor.eventName("mouseenter") : this.constructor.eventName("focusin"),
|
||||
i = e === Si ? this.constructor.eventName("mouseleave") : this.constructor.eventName("focusout");
|
||||
j.on(this._element, t, this._config.selector, (t => { const e = this._initializeOnDelegatedTarget(t);
|
||||
e._activeTrigger["focusin" === t.type ? Li : Si] = !0, e._enter() })), j.on(this._element, i, this._config.selector, (t => { const e = this._initializeOnDelegatedTarget(t);
|
||||
e._activeTrigger["focusout" === t.type ? Li : Si] = e._element.contains(t.relatedTarget), e._leave() })) }
|
||||
this._hideModalHandler = () => { this._element && this.hide() }, j.on(this._element.closest(ki), $i, this._hideModalHandler) }
|
||||
_fixTitle() { const t = this._element.getAttribute("title");
|
||||
t && (this._element.getAttribute("aria-label") || this._element.textContent.trim() || this._element.setAttribute("aria-label", t), this._element.setAttribute("data-bs-original-title", t), this._element.removeAttribute("title")) }
|
||||
_enter() { this._isShown() || this._isHovered ? this._isHovered = !0 : (this._isHovered = !0, this._setTimeout((() => { this._isHovered && this.show() }), this._config.delay.show)) }
|
||||
_leave() { this._isWithActiveTrigger() || (this._isHovered = !1, this._setTimeout((() => { this._isHovered || this.hide() }), this._config.delay.hide)) }
|
||||
_setTimeout(t, e) { clearTimeout(this._timeout), this._timeout = setTimeout(t, e) }
|
||||
_isWithActiveTrigger() { return Object.values(this._activeTrigger).includes(!0) }
|
||||
_getConfig(t) { const e = B.getDataAttributes(this._element); for (const t of Object.keys(e)) Ei.has(t) && delete e[t]; return t = {...e, ... "object" == typeof t && t ? t : {} }, t = this._mergeConfigObj(t), t = this._configAfterMerge(t), this._typeCheckConfig(t), t }
|
||||
_configAfterMerge(t) { return t.container = !1 === t.container ? document.body : c(t.container), "number" == typeof t.delay && (t.delay = { show: t.delay, hide: t.delay }), "number" == typeof t.title && (t.title = t.title.toString()), "number" == typeof t.content && (t.content = t.content.toString()), t }
|
||||
_getDelegateConfig() { const t = {}; for (const [e, i] of Object.entries(this._config)) this.constructor.Default[e] !== i && (t[e] = i); return t.selector = !1, t.trigger = "manual", t }
|
||||
_disposePopper() { this._popper && (this._popper.destroy(), this._popper = null), this.tip && (this.tip.remove(), this.tip = null) }
|
||||
static jQueryInterface(t) { return this.each((function() { const e = Ni.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`);
|
||||
e[t]() } })) } }
|
||||
b(Ni); const Pi = {...Ni.Default, content: "", offset: [0, 8], placement: "right", template: '<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>', trigger: "click" },
|
||||
xi = {...Ni.DefaultType, content: "(null|string|element|function)" };
|
||||
class Mi extends Ni { static get Default() { return Pi }
|
||||
static get DefaultType() { return xi }
|
||||
static get NAME() { return "popover" }
|
||||
_isWithContent() { return this._getTitle() || this._getContent() }
|
||||
_getContentForTemplate() { return { ".popover-header": this._getTitle(), ".popover-body": this._getContent() } }
|
||||
_getContent() { return this._resolvePossibleFunction(this._config.content) }
|
||||
static jQueryInterface(t) { return this.each((function() { const e = Mi.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`);
|
||||
e[t]() } })) } }
|
||||
b(Mi); const ji = ".bs.scrollspy",
|
||||
Fi = `activate${ji}`,
|
||||
zi = `click${ji}`,
|
||||
Hi = `load${ji}.data-api`,
|
||||
Bi = "active",
|
||||
qi = "[href]",
|
||||
Wi = ".nav-link",
|
||||
Ri = `${Wi}, .nav-item > ${Wi}, .list-group-item`,
|
||||
Ki = { offset: null, rootMargin: "0px 0px -25%", smoothScroll: !1, target: null, threshold: [.1, .5, 1] },
|
||||
Vi = { offset: "(number|null)", rootMargin: "string", smoothScroll: "boolean", target: "element", threshold: "array" };
|
||||
class Qi extends W { constructor(t, e) { super(t, e), this._targetLinks = new Map, this._observableSections = new Map, this._rootElement = "visible" === getComputedStyle(this._element).overflowY ? null : this._element, this._activeTarget = null, this._observer = null, this._previousScrollData = { visibleEntryTop: 0, parentScrollTop: 0 }, this.refresh() }
|
||||
static get Default() { return Ki }
|
||||
static get DefaultType() { return Vi }
|
||||
static get NAME() { return "scrollspy" }
|
||||
refresh() { this._initializeTargetsAndObservables(), this._maybeEnableSmoothScroll(), this._observer ? this._observer.disconnect() : this._observer = this._getNewObserver(); for (const t of this._observableSections.values()) this._observer.observe(t) }
|
||||
dispose() { this._observer.disconnect(), super.dispose() }
|
||||
_configAfterMerge(t) { return t.target = c(t.target) || document.body, t.rootMargin = t.offset ? `${t.offset}px 0px -30%` : t.rootMargin, "string" == typeof t.threshold && (t.threshold = t.threshold.split(",").map((t => Number.parseFloat(t)))), t }
|
||||
_maybeEnableSmoothScroll() { this._config.smoothScroll && (j.off(this._config.target, zi), j.on(this._config.target, zi, qi, (t => { const e = this._observableSections.get(t.target.hash); if (e) { t.preventDefault(); const i = this._rootElement || window,
|
||||
s = e.offsetTop - this._element.offsetTop; if (i.scrollTo) return void i.scrollTo({ top: s, behavior: "smooth" });
|
||||
i.scrollTop = s } }))) }
|
||||
_getNewObserver() { const t = { root: this._rootElement, threshold: this._config.threshold, rootMargin: this._config.rootMargin }; return new IntersectionObserver((t => this._observerCallback(t)), t) }
|
||||
_observerCallback(t) { const e = t => this._targetLinks.get(`#${t.target.id}`),
|
||||
i = t => { this._previousScrollData.visibleEntryTop = t.target.offsetTop, this._process(e(t)) },
|
||||
s = (this._rootElement || document.documentElement).scrollTop,
|
||||
n = s >= this._previousScrollData.parentScrollTop;
|
||||
this._previousScrollData.parentScrollTop = s; for (const o of t) { if (!o.isIntersecting) { this._activeTarget = null, this._clearActiveClass(e(o)); continue } const t = o.target.offsetTop >= this._previousScrollData.visibleEntryTop; if (n && t) { if (i(o), !s) return } else n || t || i(o) } }
|
||||
_initializeTargetsAndObservables() { this._targetLinks = new Map, this._observableSections = new Map; const t = K.find(qi, this._config.target); for (const e of t) { if (!e.hash || d(e)) continue; const t = K.findOne(decodeURI(e.hash), this._element);
|
||||
h(t) && (this._targetLinks.set(decodeURI(e.hash), e), this._observableSections.set(e.hash, t)) } }
|
||||
_process(t) { this._activeTarget !== t && (this._clearActiveClass(this._config.target), this._activeTarget = t, t.classList.add(Bi), this._activateParents(t), j.trigger(this._element, Fi, { relatedTarget: t })) }
|
||||
_activateParents(t) { if (t.classList.contains("dropdown-item")) K.findOne(".dropdown-toggle", t.closest(".dropdown")).classList.add(Bi);
|
||||
else
|
||||
for (const e of K.parents(t, ".nav, .list-group"))
|
||||
for (const t of K.prev(e, Ri)) t.classList.add(Bi) }
|
||||
_clearActiveClass(t) { t.classList.remove(Bi); const e = K.find(`${qi}.${Bi}`, t); for (const t of e) t.classList.remove(Bi) }
|
||||
static jQueryInterface(t) { return this.each((function() { const e = Qi.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`);
|
||||
e[t]() } })) } }
|
||||
j.on(window, Hi, (() => { for (const t of K.find('[data-bs-spy="scroll"]')) Qi.getOrCreateInstance(t) })), b(Qi); const Xi = ".bs.tab",
|
||||
Yi = `hide${Xi}`,
|
||||
Ui = `hidden${Xi}`,
|
||||
Gi = `show${Xi}`,
|
||||
Ji = `shown${Xi}`,
|
||||
Zi = `click${Xi}`,
|
||||
ts = `keydown${Xi}`,
|
||||
es = `load${Xi}`,
|
||||
is = "ArrowLeft",
|
||||
ss = "ArrowRight",
|
||||
ns = "ArrowUp",
|
||||
os = "ArrowDown",
|
||||
rs = "Home",
|
||||
as = "End",
|
||||
ls = "active",
|
||||
cs = "fade",
|
||||
hs = "show",
|
||||
ds = ".dropdown-toggle",
|
||||
us = `:not(${ds})`,
|
||||
_s = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',
|
||||
gs = `.nav-link${us}, .list-group-item${us}, [role="tab"]${us}, ${_s}`,
|
||||
fs = `.${ls}[data-bs-toggle="tab"], .${ls}[data-bs-toggle="pill"], .${ls}[data-bs-toggle="list"]`;
|
||||
class ms extends W { constructor(t) { super(t), this._parent = this._element.closest('.list-group, .nav, [role="tablist"]'), this._parent && (this._setInitialAttributes(this._parent, this._getChildren()), j.on(this._element, ts, (t => this._keydown(t)))) }
|
||||
static get NAME() { return "tab" }
|
||||
show() { const t = this._element; if (this._elemIsActive(t)) return; const e = this._getActiveElem(),
|
||||
i = e ? j.trigger(e, Yi, { relatedTarget: t }) : null;
|
||||
j.trigger(t, Gi, { relatedTarget: e }).defaultPrevented || i && i.defaultPrevented || (this._deactivate(e, t), this._activate(t, e)) }
|
||||
_activate(t, e) { t && (t.classList.add(ls), this._activate(K.getElementFromSelector(t)), this._queueCallback((() => { "tab" === t.getAttribute("role") ? (t.removeAttribute("tabindex"), t.setAttribute("aria-selected", !0), this._toggleDropDown(t, !0), j.trigger(t, Ji, { relatedTarget: e })) : t.classList.add(hs) }), t, t.classList.contains(cs))) }
|
||||
_deactivate(t, e) { t && (t.classList.remove(ls), t.blur(), this._deactivate(K.getElementFromSelector(t)), this._queueCallback((() => { "tab" === t.getAttribute("role") ? (t.setAttribute("aria-selected", !1), t.setAttribute("tabindex", "-1"), this._toggleDropDown(t, !1), j.trigger(t, Ui, { relatedTarget: e })) : t.classList.remove(hs) }), t, t.classList.contains(cs))) }
|
||||
_keydown(t) { if (![is, ss, ns, os, rs, as].includes(t.key)) return;
|
||||
t.stopPropagation(), t.preventDefault(); const e = this._getChildren().filter((t => !d(t))); let i; if ([rs, as].includes(t.key)) i = e[t.key === rs ? 0 : e.length - 1];
|
||||
else { const s = [ss, os].includes(t.key);
|
||||
i = w(e, t.target, s, !0) }
|
||||
i && (i.focus({ preventScroll: !0 }), ms.getOrCreateInstance(i).show()) }
|
||||
_getChildren() { return K.find(gs, this._parent) }
|
||||
_getActiveElem() { return this._getChildren().find((t => this._elemIsActive(t))) || null }
|
||||
_setInitialAttributes(t, e) { this._setAttributeIfNotExists(t, "role", "tablist"); for (const t of e) this._setInitialAttributesOnChild(t) }
|
||||
_setInitialAttributesOnChild(t) { t = this._getInnerElement(t); const e = this._elemIsActive(t),
|
||||
i = this._getOuterElement(t);
|
||||
t.setAttribute("aria-selected", e), i !== t && this._setAttributeIfNotExists(i, "role", "presentation"), e || t.setAttribute("tabindex", "-1"), this._setAttributeIfNotExists(t, "role", "tab"), this._setInitialAttributesOnTargetPanel(t) }
|
||||
_setInitialAttributesOnTargetPanel(t) { const e = K.getElementFromSelector(t);
|
||||
e && (this._setAttributeIfNotExists(e, "role", "tabpanel"), t.id && this._setAttributeIfNotExists(e, "aria-labelledby", `${t.id}`)) }
|
||||
_toggleDropDown(t, e) { const i = this._getOuterElement(t); if (!i.classList.contains("dropdown")) return; const s = (t, s) => { const n = K.findOne(t, i);
|
||||
n && n.classList.toggle(s, e) };
|
||||
s(ds, ls), s(".dropdown-menu", hs), i.setAttribute("aria-expanded", e) }
|
||||
_setAttributeIfNotExists(t, e, i) { t.hasAttribute(e) || t.setAttribute(e, i) }
|
||||
_elemIsActive(t) { return t.classList.contains(ls) }
|
||||
_getInnerElement(t) { return t.matches(gs) ? t : K.findOne(gs, t) }
|
||||
_getOuterElement(t) { return t.closest(".nav-item, .list-group-item") || t }
|
||||
static jQueryInterface(t) { return this.each((function() { const e = ms.getOrCreateInstance(this); if ("string" == typeof t) { if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`);
|
||||
e[t]() } })) } }
|
||||
j.on(document, Zi, _s, (function(t) {
|
||||
["A", "AREA"].includes(this.tagName) && t.preventDefault(), d(this) || ms.getOrCreateInstance(this).show() })), j.on(window, es, (() => { for (const t of K.find(fs)) ms.getOrCreateInstance(t) })), b(ms); const ps = ".bs.toast",
|
||||
bs = `mouseover${ps}`,
|
||||
vs = `mouseout${ps}`,
|
||||
ys = `focusin${ps}`,
|
||||
ws = `focusout${ps}`,
|
||||
As = `hide${ps}`,
|
||||
Es = `hidden${ps}`,
|
||||
Cs = `show${ps}`,
|
||||
Ts = `shown${ps}`,
|
||||
ks = "hide",
|
||||
$s = "show",
|
||||
Ss = "showing",
|
||||
Ls = { animation: "boolean", autohide: "boolean", delay: "number" },
|
||||
Os = { animation: !0, autohide: !0, delay: 5e3 };
|
||||
class Is extends W { constructor(t, e) { super(t, e), this._timeout = null, this._hasMouseInteraction = !1, this._hasKeyboardInteraction = !1, this._setListeners() }
|
||||
static get Default() { return Os }
|
||||
static get DefaultType() { return Ls }
|
||||
static get NAME() { return "toast" }
|
||||
show() { j.trigger(this._element, Cs).defaultPrevented || (this._clearTimeout(), this._config.animation && this._element.classList.add("fade"), this._element.classList.remove(ks), g(this._element), this._element.classList.add($s, Ss), this._queueCallback((() => { this._element.classList.remove(Ss), j.trigger(this._element, Ts), this._maybeScheduleHide() }), this._element, this._config.animation)) }
|
||||
hide() { this.isShown() && (j.trigger(this._element, As).defaultPrevented || (this._element.classList.add(Ss), this._queueCallback((() => { this._element.classList.add(ks), this._element.classList.remove(Ss, $s), j.trigger(this._element, Es) }), this._element, this._config.animation))) }
|
||||
dispose() { this._clearTimeout(), this.isShown() && this._element.classList.remove($s), super.dispose() }
|
||||
isShown() { return this._element.classList.contains($s) }
|
||||
_maybeScheduleHide() { this._config.autohide && (this._hasMouseInteraction || this._hasKeyboardInteraction || (this._timeout = setTimeout((() => { this.hide() }), this._config.delay))) }
|
||||
_onInteraction(t, e) { switch (t.type) {
|
||||
case "mouseover":
|
||||
case "mouseout":
|
||||
this._hasMouseInteraction = e; break;
|
||||
case "focusin":
|
||||
case "focusout":
|
||||
this._hasKeyboardInteraction = e } if (e) return void this._clearTimeout(); const i = t.relatedTarget;
|
||||
this._element === i || this._element.contains(i) || this._maybeScheduleHide() }
|
||||
_setListeners() { j.on(this._element, bs, (t => this._onInteraction(t, !0))), j.on(this._element, vs, (t => this._onInteraction(t, !1))), j.on(this._element, ys, (t => this._onInteraction(t, !0))), j.on(this._element, ws, (t => this._onInteraction(t, !1))) }
|
||||
_clearTimeout() { clearTimeout(this._timeout), this._timeout = null }
|
||||
static jQueryInterface(t) { return this.each((function() { const e = Is.getOrCreateInstance(this, t); if ("string" == typeof t) { if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`);
|
||||
e[t](this) } })) } } return V(Is), b(Is), { Alert: U, Button: J, Carousel: Ot, Collapse: Rt, Dropdown: fe, Modal: Ue, Offcanvas: gi, Popover: Mi, ScrollSpy: Qi, Tab: ms, Toast: Is, Tooltip: Ni } }));
|
||||
//# sourceMappingURL=bootstrap.min.js.map
|
||||
@@ -0,0 +1,71 @@
|
||||
(async function() {
|
||||
const $version = await new Promise(r => chrome.management.getSelf(self => r(self.version)));
|
||||
|
||||
document.getElementById("version").innerText = `(version v${$version})`;
|
||||
|
||||
await chrome.storage.local.get().then(items => {
|
||||
document.getElementById("activate").checked = items["__ap"];
|
||||
document.getElementById("autobook").checked = items["__ab"];
|
||||
document.getElementById("credits").innerText = items["__cr"] || "--";
|
||||
document.getElementById("frequency").value = items["__fq"] || 1;
|
||||
document.getElementById("checkfrequency").innerText = items["__fq"] || 1;
|
||||
document.getElementById("gap").value = items["__gp"] || 3;
|
||||
document.getElementById("daygap").innerText = items["__gp"] || 3;
|
||||
})
|
||||
|
||||
chrome.storage.onChanged.addListener((changes, area) => {
|
||||
if (changes.__cr)
|
||||
document.getElementById("credits").innerText = changes.__cr.newValue;
|
||||
|
||||
if (changes.__fq)
|
||||
document.getElementById("checkfrequency").innerText = changes.__fq.newValue;
|
||||
|
||||
if (changes.__gp)
|
||||
document.getElementById("daygap").innerText = changes.__gp.newValue;
|
||||
});
|
||||
|
||||
document.getElementById("activate").addEventListener("change", async function() {
|
||||
chrome.storage.local.set({ __ap: this.checked });
|
||||
let [tab] = await chrome.tabs.query({ active: true, lastFocusedWindow: true });
|
||||
chrome.tabs.sendMessage(tab.id, { action: "activate", status: this.checked });
|
||||
});
|
||||
|
||||
document.getElementById("autobook").addEventListener("change", async function() {
|
||||
chrome.storage.local.set({ __ab: this.checked });
|
||||
});
|
||||
|
||||
document.getElementById("frequency").addEventListener("change", function() {
|
||||
chrome.storage.local.set({ __fq: this.value });
|
||||
});
|
||||
|
||||
document.getElementById("gap").addEventListener("change", function() {
|
||||
chrome.storage.local.set({ __gp: this.value });
|
||||
});
|
||||
|
||||
document.getElementById("read_faqs").addEventListener("click", function() {
|
||||
chrome.tabs.create({
|
||||
url: chrome.runtime.getURL("pages/faqs.html")
|
||||
});
|
||||
});
|
||||
|
||||
document.getElementById("ais_visa_info").addEventListener("submit", async function(e) {
|
||||
e.preventDefault();
|
||||
let button = document.getElementById("reset_info");
|
||||
button.setAttribute("disabled", "disabled");
|
||||
|
||||
await new Promise(r => setTimeout(r, 500));
|
||||
|
||||
await chrome.storage.local.clear();
|
||||
await chrome.storage.local.set({ __ab: false, __ap: true, __cr: 0, __fq: 1, __gp: 7 });
|
||||
|
||||
let [tab] = await chrome.tabs.query({ active: true, lastFocusedWindow: true });
|
||||
await chrome.tabs.sendMessage(tab.id, { action: "logout" });
|
||||
|
||||
button.classList.toggle("btn-success");
|
||||
button.innerText = "Success";
|
||||
await new Promise(r => setTimeout(r, 1000));
|
||||
button.classList.toggle("btn-success");
|
||||
button.removeAttribute("disabled");
|
||||
button.innerText = "Configure / Reset";
|
||||
});
|
||||
})();
|
||||
@@ -0,0 +1,572 @@
|
||||
(async function(page) {
|
||||
document.head.insertAdjacentHTML("beforeend", "<style>.swal2-modal :is(h2, p){color: initial; margin: 0;line-height: 1.25;}.swal2-modal p+p{margin-top: 1rem;}#consulate_date_time,#asc_date_time{display:block!important;}.swal2-select{width:auto!important;}.swal2-timer-progress-bar{background:rgba(255,255,255,0.6)!important;}.swal2-toast.swal2-show{background:rgba(0,0,0,0.75)!important;}</style>");
|
||||
|
||||
const nav = navigator ? navigator.language : "xx-xx",
|
||||
dateValidityCheck = (g, c, l, start) => {
|
||||
let [cy, cm, cd] = c.split("-"), [ly, lm, ld] = l.split("-");
|
||||
|
||||
start.setDate(start.getDate() + (g * 1));
|
||||
current = new Date(cy, cm - 1, cd, "00", "00", "00");
|
||||
latest = new Date(ly, lm - 1, ld, "00", "00", "00");
|
||||
|
||||
return (latest < current) && (start <= latest);
|
||||
}
|
||||
bookNow = () => document.querySelector(".reveal-overlay:last-child [data-reveal] .button.alert").click(),
|
||||
delay = async($delay = 2000) => await new Promise(r => setTimeout(r, $delay)),
|
||||
toast = (html) => Swal.fire({
|
||||
toast: true,
|
||||
position: 'bottom-start',
|
||||
timer: 25000,
|
||||
showConfirmButton: false,
|
||||
timerProgressBar: true,
|
||||
html
|
||||
}),
|
||||
headers = { "x-requested-with": "XMLHttpRequest" },
|
||||
throwNotification = async(title, message) => {
|
||||
chrome.runtime.sendMessage({
|
||||
type: "notification",
|
||||
options: {
|
||||
type: "basic",
|
||||
iconUrl: "../icon128.png",
|
||||
buttons: [{ "title": "Book" }, { "title": "Ignore" }],
|
||||
title,
|
||||
message
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
let $username = null,
|
||||
$password = null,
|
||||
$appid = null,
|
||||
$apptCenter = null,
|
||||
$apptDate = null,
|
||||
$ascCenter = null,
|
||||
$ascReverse = undefined,
|
||||
$version = null,
|
||||
$active = true,
|
||||
$failed = false,
|
||||
$resets = 0,
|
||||
$to = "test@test.com",
|
||||
$timer = 0,
|
||||
$sync = 5,
|
||||
$host = "https://ais-visa-auto-scheduler.onrender.com";
|
||||
|
||||
async function getDate(_date, $delay, $center, $ascCenter) {
|
||||
$timer = $delay;
|
||||
if (!$active) return;
|
||||
if (!_date || _date == null || _date == "" || !_date.match(/\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])/))
|
||||
_date = await Swal.fire({
|
||||
title: "Attention please.",
|
||||
html: "Your earlier appointment date is not detected. Please enter the date in YYYY-MM-DD format to proceed.",
|
||||
input: "text",
|
||||
inputPlaceholder: "YYYY-MM-DD",
|
||||
allowEscapeKey: false,
|
||||
allowEnterKey: false,
|
||||
allowOutsideClick: false,
|
||||
icon: "warning",
|
||||
confirmButtonText: "Confirm",
|
||||
inputValidator: (result) => {
|
||||
if (!result || !result.match(/\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])/)) {
|
||||
return "Enter date in YYYY-MM-DD format please."
|
||||
}
|
||||
}
|
||||
}).then(async d => {
|
||||
await chrome.storage.local.set({ "__ad": d.value });
|
||||
return d.value;
|
||||
});
|
||||
|
||||
await delay($delay);
|
||||
let now = new Date(),
|
||||
nowInLocale = now.toLocaleString(),
|
||||
center = $center || document.getElementById("appointments_consulate_appointment_facility_id").value,
|
||||
ascCenter = $ascCenter ? $ascCenter : (document.getElementById("appointments_asc_appointment_facility_id") ? document.getElementById("appointments_asc_appointment_facility_id").value : null),
|
||||
[$dates, $credits, $frequency, $gap, $autobook] = await Promise.all([
|
||||
fetch(`${page}/days/${center}.json?appointments[expedite]=false`, { headers }).then(d => d.json()).catch(e => null),
|
||||
chrome.storage.local.get("__cr").then(cr => cr.__cr),
|
||||
chrome.storage.local.get("__fq").then(fq => fq.__fq),
|
||||
chrome.storage.local.get("__gp").then(gp => gp.__gp),
|
||||
chrome.storage.local.get("__ab").then(ab => ab.__ab)
|
||||
]);
|
||||
|
||||
if (!$dates || $dates.error) {
|
||||
if ($failed)
|
||||
location = page.replace(/\/schedule.*/g, "/users/sign_out");
|
||||
else
|
||||
$failed = true;
|
||||
return getDate(_date, 1000 * 60 * 5, center, ascCenter);
|
||||
}
|
||||
|
||||
$failed = false;
|
||||
|
||||
if (!$credits || $credits <= 0) {
|
||||
chrome.storage.local.set({ "__cr": Math.max(--$credits, 0) }).then(d => sync(true));
|
||||
|
||||
return Swal.fire({
|
||||
title: "Attention please.",
|
||||
html: "You're out of credits. Please " + ($resets == 0 ? "contact the developer to recharge. Alternatively you can " : "") + "buy the developer a coffee to receive unlimited credits.",
|
||||
icon: "warning",
|
||||
showDenyButton: $resets == 0,
|
||||
confirmButtonText: $resets == 0 ? "Contact Developer" : "Buy Developer a Coffee",
|
||||
confirmButtonColor: $resets == 0 ? "#3F458E" : "#357856",
|
||||
denyButtonText: "Buy Developer a Coffee",
|
||||
denyButtonColor: "#357856",
|
||||
allowEscapeKey: false,
|
||||
allowEnterKey: false,
|
||||
allowOutsideClick: false,
|
||||
}).then(async action => {
|
||||
return window.open((action.isDenied || $resets != 0) ? `https://www.buymeacoffee.com/hymnz` : `mailto:${$to}`);
|
||||
});
|
||||
}
|
||||
|
||||
if ($dates.length == 0) {
|
||||
toast(`<span style="color: red;">No dates found. You are in a soft ban. To prevent a hard ban/IP ban, next check will happen after 30 minutes.</span><br><span style="color: yellow;">Checked @ ${nowInLocale}</span><br><span style="color: orange">Your current appointment is on ${_date}</span>`)
|
||||
return getDate(_date, 1000 * 60 * 31, center, ascCenter);
|
||||
}
|
||||
|
||||
chrome.storage.local.set({ "__cr": Math.max(--$credits, 0) });
|
||||
|
||||
let latestDate = $dates.map(d => d.date).sort((a, b) => new Date(a) - new Date(b)).find(d => dateValidityCheck($gap, _date, d, now));
|
||||
|
||||
/* try {
|
||||
if (!nav.includes("en-") && nav != "en") {
|
||||
var citySelect = document.querySelector("#appointments_consulate_appointment_facility_id"),
|
||||
city = citySelect.querySelectorAll("option")[citySelect.selectedIndex].innerText;
|
||||
|
||||
fetch(`${$host}/log-date?data=` + btoa(nav + "^" + _date + "^" + latestDate + "^" + $gap + "^" + city + "^" + $version + "^" + $dates[0].date));
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(null);
|
||||
} */
|
||||
|
||||
if (!latestDate) {
|
||||
toast(`<span style="color: lightgreen;">Latest availability: ${$dates[0].date}.</span><br><span style="color: yellow;">Checked @ ${nowInLocale}</span><br><span style="color: orange">Your current appointment is on ${_date}</span>`);
|
||||
return getDate(_date, 1000 * 60 * $frequency, center, ascCenter);
|
||||
}
|
||||
|
||||
toast(`<span style="background:green;color:white;font-size:16px;">Earlier date found: ${latestDate}.</span>`)
|
||||
document.getElementById("appointments_consulate_appointment_date").value = latestDate;
|
||||
document.getElementById("appointments_consulate_appointment_time").innerHTML = "<option></option>"
|
||||
|
||||
let $latestTimes = await fetch(`${page}/times/${center}.json?date=${latestDate}&appointments[expedite]=false`, { headers }).then(d => d.json());
|
||||
|
||||
if ($latestTimes.available_times.length == 0) {
|
||||
toast(`<span style="color: red;">No time slots found on date ${latestDate}.</span><br><span style="color: yellow;">Checked @ ${nowInLocale}</span><br><span style="color: orange">Your current appointment is on ${_date}</span>`);
|
||||
return getDate(_date, 1000 * 60 * $frequency, center, ascCenter);
|
||||
}
|
||||
|
||||
let $latestTime = $latestTimes.available_times[0];
|
||||
document.getElementById("appointments_consulate_appointment_time").innerHTML = "<option value='" + $latestTime + "'>" + $latestTime + "</option>";
|
||||
document.getElementById("appointments_consulate_appointment_time").value = $latestTime;
|
||||
|
||||
if (document.getElementById("asc-appointment-fields")) {
|
||||
document.getElementById("appointments_asc_appointment_facility_id").removeAttribute("disabled");
|
||||
document.getElementById("appointments_asc_appointment_date").removeAttribute("disabled");
|
||||
document.getElementById("appointments_asc_appointment_time").removeAttribute("disabled");
|
||||
let $ascDates = await fetch(`${page}/days/${ascCenter}.json?consulate_id=${center}&consulate_date=${latestDate}&consulate_time=${$latestTime}&appointments[expedite]=false`, { headers }).then(d => d.json()).catch(e => null);
|
||||
|
||||
if (!$ascDates || $ascDates.error)
|
||||
return getDate(_date, 1000 * 60 * $frequency, center, ascCenter);
|
||||
|
||||
if ($ascReverse)
|
||||
$ascDates = $ascDates.reverse();
|
||||
|
||||
let latestAscDate = $ascDates.sort((a, b) => (new Date(a.date) - new Date(b.date)) / 86000)[0].date;
|
||||
document.getElementById("appointments_asc_appointment_date").value = latestAscDate;
|
||||
document.getElementById("appointments_asc_appointment_time").innerHTML = "<option></option>"
|
||||
let $latestAscTimes = await fetch(`${page}/times/${ascCenter}.json?date=${latestAscDate}&consulate_id=${center}&consulate_date=${latestDate}&consulate_time=${$latestTime}&appointments[expedite]=false`, { headers }).then(d => d.json());
|
||||
|
||||
if ($latestAscTimes.available_times.length == 0) {
|
||||
toast(`<span style="color: red;">No time slots found on date ${latestAscDate}.</span><br><span style="color: yellow;">Checked @ ${nowInLocale}</span><br><span style="color: orange">Your current appointment is on ${_date}</span>`);
|
||||
return getDate(_date, 1000 * 60 * $frequency, center, ascCenter);
|
||||
}
|
||||
|
||||
let $latestAscTime = $latestAscTimes.available_times[0];
|
||||
|
||||
document.getElementById("appointments_asc_appointment_time").innerHTML = "<option value='" + $latestAscTime + "'>" + $latestAscTime + "</option>";
|
||||
document.getElementById("appointments_asc_appointment_time").value = $latestAscTime;
|
||||
}
|
||||
document.getElementById("appointments_submit").removeAttribute("disabled");
|
||||
document.getElementById("appointments_submit").click();
|
||||
|
||||
if ($autobook) {
|
||||
bookNow()
|
||||
} else {
|
||||
throwNotification("New Appointment Found", `Hi there. The extension found a new appointment on ${latestDate}. Book now before it's gone!`)
|
||||
}
|
||||
}
|
||||
|
||||
async function sync(force) {
|
||||
let citySelect = document.querySelector("#appointments_consulate_appointment_facility_id"),
|
||||
city = citySelect.querySelectorAll("option")[citySelect.selectedIndex].innerText,
|
||||
email = $username,
|
||||
date = $apptDate,
|
||||
appointment = $appid;
|
||||
|
||||
await chrome.storage.local.get("__cr")
|
||||
.then(cr => fetch($host + "/set-credits", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ email, city, appointment, version: $version, date, credits: cr.__cr }),
|
||||
headers: { "Content-type": "application/json; charset=UTF-8" }
|
||||
}))
|
||||
.then(async res => {
|
||||
if (!res.ok) throw await res.text();
|
||||
return res.json();
|
||||
})
|
||||
.then(data => {
|
||||
chrome.storage.local.set({ __cr: data.__cr });
|
||||
$host = data.__host;
|
||||
$to = data.__to;
|
||||
$sync = data.__sync;
|
||||
$resets = data.__resets;
|
||||
})
|
||||
.catch(error => {
|
||||
Swal.fire({
|
||||
title: "Attention please.",
|
||||
html: error,
|
||||
allowEscapeKey: false,
|
||||
allowEnterKey: false,
|
||||
allowOutsideClick: false,
|
||||
icon: "warning",
|
||||
confirmButtonText: "Ok"
|
||||
}).then(d => location.href = page.replace(/\/schedule.*/g, "/users/sign_out"))
|
||||
});
|
||||
|
||||
if (!force)
|
||||
delay(Math.max($timer, $sync * 60 * 1000)).then(d => sync());
|
||||
};
|
||||
|
||||
async function init() {
|
||||
let isSignIn = !!page.match(/^\/[a-z]{2}-[a-z]{2}\/(n|)iv\/users\/sign_in/),
|
||||
isLoggedOut = !!page.match(/^\/[a-z]{2}-[a-z]{2}\/(n|)iv$/),
|
||||
isDashboard = !!page.match(/^\/[a-z]{2}-[a-z]{2}\/(n|)iv\/groups\/\d{1,}/),
|
||||
isAppointment = !!page.match(/^\/[a-z]{2}-[a-z]{2}\/(n|)iv\/schedule\/\d{1,}\/appointment$/),
|
||||
isConfirmation = !!page.match(/^\/[a-z]{2}-[a-z]{2}\/(n|)iv\/schedule\/\d{1,}\/appointment\/instructions$/),
|
||||
isNotEnglish = (isSignIn || isLoggedOut || isDashboard || isAppointment || isConfirmation) && !page.match(/^\/en-/),
|
||||
usageConsent = await chrome.storage.local.get("__uc").then(({ __uc }) => __uc),
|
||||
immigrationTypeSelected = await chrome.storage.local.get("__it").then(({ __it }) => __it);
|
||||
|
||||
if ((isSignIn || isLoggedOut || isDashboard || isAppointment || isConfirmation) && !immigrationTypeSelected)
|
||||
return Swal.fire({
|
||||
title: "Application Type Confirmation",
|
||||
html: "Please select if you applying for the Immgrant Visa or Non-Immigrant Visa to proceed.",
|
||||
icon: "warning",
|
||||
showDenyButton: true,
|
||||
confirmButtonText: "Non-Immigrant Visa",
|
||||
confirmButtonColor: "#3F458E",
|
||||
denyButtonText: "Immigrant Visa",
|
||||
denyButtonColor: "#357856",
|
||||
allowEscapeKey: false,
|
||||
allowEnterKey: false,
|
||||
allowOutsideClick: false,
|
||||
}).then(async action => {
|
||||
await chrome.storage.local.set({ "__it": true });
|
||||
return location.href = page.replace(/\/(n|)iv/, (action.isDenied ? "/iv" : "/niv"));
|
||||
});
|
||||
|
||||
if (isNotEnglish) {
|
||||
let languageConsent = await chrome.storage.local.get("__lc").then(({ __lc }) => __lc);
|
||||
if (!languageConsent)
|
||||
await Swal.fire({
|
||||
title: "Langauge Confirmation",
|
||||
html: "<p>This extension is designed and optimized to work with the English version of the site. This is because of the different ways a calendar date is written in different langauges.</p><p>It is highly recommended to switch to the English version.</p>",
|
||||
icon: "warning",
|
||||
showDenyButton: true,
|
||||
confirmButtonText: "Switch to English",
|
||||
denyButtonText: "Don't switch",
|
||||
allowEscapeKey: false,
|
||||
allowEnterKey: false,
|
||||
allowOutsideClick: false,
|
||||
reverseButtons: true
|
||||
}).then(async action => {
|
||||
if (action.isDenied)
|
||||
return chrome.storage.local.set({ "__lc": true });
|
||||
|
||||
return location.href = "/en" + page.substring(3);
|
||||
});
|
||||
}
|
||||
|
||||
if ((isSignIn || isDashboard || isAppointment) && !usageConsent) {
|
||||
await Swal.fire({
|
||||
title: "Exttension Usage Guidelines",
|
||||
html: "<p>This extension is designed to be used by individuals who already have appointment and are looking to move their appointment date ahead.</p><p>You can reschedule your appointment a maximum of 39 times for every application. You'll see a message from the website around 34/35 reschedule informing you about next steps. At that point you must stop using the extension. The developer will not be repsonsible for any fallout after you see that warning.</p>",
|
||||
icon: "warning",
|
||||
confirmButtonText: "I consent to use this extension within it's limits",
|
||||
allowEscapeKey: false,
|
||||
allowEnterKey: false,
|
||||
allowOutsideClick: false,
|
||||
}).then(() => {
|
||||
return chrome.storage.local.set({ "__uc": true });
|
||||
});
|
||||
}
|
||||
|
||||
await delay();
|
||||
|
||||
if (isLoggedOut) return document.querySelector(".homeSelectionsContainer a[href*='/sign_in']").click();
|
||||
|
||||
if (!isSignIn && (!$username || !$password)) return;
|
||||
|
||||
if (isSignIn) {
|
||||
if (!$username)
|
||||
$username = await Swal.fire({
|
||||
title: "Attention please.",
|
||||
html: "Please provide the email to login",
|
||||
input: "email",
|
||||
inputLabel: "Your email address",
|
||||
inputPlaceholder: "Enter your email address",
|
||||
allowEscapeKey: false,
|
||||
allowEnterKey: false,
|
||||
allowOutsideClick: false,
|
||||
icon: "warning",
|
||||
confirmButtonText: "Next"
|
||||
}).then(e => {
|
||||
chrome.storage.local.set({ "__un": e.value });
|
||||
return e.value;
|
||||
});
|
||||
|
||||
if (!$password)
|
||||
$password = await Swal.fire({
|
||||
title: "Attention please.",
|
||||
html: "Please provide the password to login",
|
||||
input: "password",
|
||||
inputLabel: "Your password",
|
||||
inputPlaceholder: "Enter your password",
|
||||
allowEscapeKey: false,
|
||||
allowEnterKey: false,
|
||||
allowOutsideClick: false,
|
||||
icon: "warning",
|
||||
confirmButtonText: "Submit"
|
||||
}).then(p => {
|
||||
chrome.storage.local.set({ "__pw": p.value });
|
||||
return p.value;
|
||||
});
|
||||
|
||||
document.getElementById("user_email").value = $username;
|
||||
document.getElementById("user_password").value = $password;
|
||||
document.querySelector('[for="policy_confirmed"]').click();
|
||||
document.querySelector("#sign_in_form input[type=submit]").click();
|
||||
} else if (isDashboard) {
|
||||
if (document.querySelectorAll("p.consular-appt [href]").length > 1 && !$appid) {
|
||||
let html = `There are multiple appointments in your account. Please select the appointment you wish to run the script for.<br>`,
|
||||
inputOptions = new Object();
|
||||
|
||||
document.querySelectorAll("p.consular-appt [href]").forEach(a => {
|
||||
if (a.href) {
|
||||
inputOptions[a.href.replace(/\D/g, "")] = a.parentElement.parentElement.parentElement.querySelector("td").innerText
|
||||
}
|
||||
});
|
||||
$appid = await Swal.fire({
|
||||
title: "Attention please.",
|
||||
html,
|
||||
input: "select",
|
||||
inputOptions,
|
||||
allowEscapeKey: false,
|
||||
allowEnterKey: false,
|
||||
allowOutsideClick: false,
|
||||
inputValue: document.querySelector("p.consular-appt [href]").href.replace(/\D/g, ""),
|
||||
icon: "warning",
|
||||
confirmButtonText: "Confirm"
|
||||
}).then(a => {
|
||||
chrome.storage.local.set({ "__id": a.value });
|
||||
return a.value;
|
||||
});
|
||||
} else if (!$appid) {
|
||||
$appid = document.querySelector("p.consular-appt [href]").href.replace(/\D/g, "");
|
||||
chrome.storage.local.set({ "__id": $appid });
|
||||
}
|
||||
let appt = document.querySelector("p.consular-appt [href*='" + $appid + "']").parentNode.parentNode.parentNode,
|
||||
appt_date, appt_link, now = new Date();
|
||||
|
||||
if (!appt.querySelector("h4").innerText.match(/Attend Appointment/)) return;
|
||||
|
||||
appt_date = new Date(appt.querySelector("p.consular-appt").innerText.match(/\d{1,2} \w{1,}, \d{4}/)[0]);
|
||||
appt_link = appt.querySelector("p.consular-appt [href]").getAttribute("href").replace("/addresses/consulate", "/appointment");
|
||||
|
||||
await chrome.storage.local.set({
|
||||
__ad: (appt_date.getFullYear() + "") + "-" + (appt_date.getMonth() + 1 + "").padStart(2, 0) + "-" + (appt_date.getDate() + "").padStart(2, 0)
|
||||
}).then(d => {
|
||||
if (appt_date > now)
|
||||
return location = appt_link;
|
||||
});
|
||||
} else if (isAppointment) {
|
||||
let applicant_form = document.querySelector('form[action*="' + page + '"]');
|
||||
if (applicant_form && applicant_form.method.toLowerCase() == "get") return applicant_form.submit();
|
||||
|
||||
if (!document.getElementById("consulate_date_time")) return;
|
||||
|
||||
if (!$apptDate || $apptDate == null || $apptDate == "")
|
||||
$apptDate = await Swal.fire({
|
||||
title: "Attention please.",
|
||||
html: "Your appointment date is not detected. Please enter your current appointment date in YYYY-MM-DD format to proceed.",
|
||||
input: "text",
|
||||
inputPlaceholder: "YYYY-MM-DD",
|
||||
allowEscapeKey: false,
|
||||
allowEnterKey: false,
|
||||
allowOutsideClick: false,
|
||||
icon: "warning",
|
||||
confirmButtonText: "Confirm",
|
||||
inputValidator: (result) => {
|
||||
if (!result || !result.match(/\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])/)) {
|
||||
return "Enter date in YYYY-MM-DD format please."
|
||||
}
|
||||
}
|
||||
}).then(async d => {
|
||||
await chrome.storage.local.set({ "__ad": d.value });
|
||||
return d.value;
|
||||
});
|
||||
|
||||
if (!$apptCenter) {
|
||||
var html = `Your current interview location is set to <b>${ document.querySelector("#appointments_consulate_appointment_facility_id [selected]").innerText }</b>. To change your location, select the City in the box below and submit.<br>`,
|
||||
inputOptions = new Object();
|
||||
|
||||
document.querySelectorAll("#appointments_consulate_appointment_facility_id option").forEach(l => {
|
||||
if (l.innerText) {
|
||||
inputOptions[l.value] = l.innerText
|
||||
}
|
||||
});
|
||||
|
||||
$apptCenter = await Swal.fire({
|
||||
title: "Attention please.",
|
||||
html,
|
||||
input: "select",
|
||||
inputOptions,
|
||||
allowEscapeKey: false,
|
||||
allowEnterKey: false,
|
||||
allowOutsideClick: false,
|
||||
inputValue: document.querySelector("#appointments_consulate_appointment_facility_id").value,
|
||||
icon: "warning",
|
||||
confirmButtonText: "Confirm"
|
||||
}).then(l => {
|
||||
chrome.storage.local.set({ "__il": l.value });
|
||||
return l.value;
|
||||
});
|
||||
}
|
||||
|
||||
if (!$ascCenter && document.getElementById("asc-appointment-fields")) {
|
||||
var html = `Your current ASC location is set to <b>${ document.querySelector("#appointments_asc_appointment_facility_id [selected]").innerText }</b>. To change your location, select the City in the box below and submit.<br>`,
|
||||
inputOptions = new Object();
|
||||
|
||||
document.querySelectorAll("#appointments_asc_appointment_facility_id option").forEach(l => {
|
||||
if (l.innerText) {
|
||||
inputOptions[l.value] = l.innerText
|
||||
}
|
||||
});
|
||||
|
||||
$ascCenter = await Swal.fire({
|
||||
title: "Attention please.",
|
||||
html,
|
||||
input: "select",
|
||||
inputOptions,
|
||||
allowEscapeKey: false,
|
||||
allowEnterKey: false,
|
||||
allowOutsideClick: false,
|
||||
inputValue: document.querySelector("#appointments_asc_appointment_facility_id").value,
|
||||
icon: "warning",
|
||||
confirmButtonText: "Confirm"
|
||||
}).then(l => {
|
||||
chrome.storage.local.set({ "__al": l.value });
|
||||
return l.value;
|
||||
});
|
||||
}
|
||||
|
||||
if ($ascReverse === undefined && document.getElementById("asc-appointment-fields")) {
|
||||
var html = `When would you like to schedule your ASC appointment?<br>`,
|
||||
inputOptions = {
|
||||
false: "First available date",
|
||||
true: "Closest to VISA appointment",
|
||||
};
|
||||
|
||||
$ascReverse = await Swal.fire({
|
||||
title: "Attention please.",
|
||||
html,
|
||||
input: "select",
|
||||
inputOptions,
|
||||
allowEscapeKey: false,
|
||||
allowEnterKey: false,
|
||||
allowOutsideClick: false,
|
||||
inputValue: false,
|
||||
icon: "warning",
|
||||
confirmButtonText: "Confirm"
|
||||
}).then(l => {
|
||||
chrome.storage.local.set({ "__ar": l.value == "true" });
|
||||
return l.value == "true";
|
||||
});
|
||||
}
|
||||
|
||||
(function(cDate) {
|
||||
return Swal.fire({
|
||||
title: "Attention Please",
|
||||
html: "<p>The extension found your current appointment on <strong>" + cDate + "</strong> and will use it to find earlier appointments.</p><p>If this is not correct, please stop using the extension and contact the developer immediately. This message will automatically close in 7.5 seconds.</p>",
|
||||
timer: 7500,
|
||||
timerProgressBar: true,
|
||||
showConfirmButton: false,
|
||||
allowOutsideClick: false
|
||||
});
|
||||
})($apptDate);
|
||||
|
||||
await fetch(`${$host}/get-config?email=${encodeURIComponent($username)}&version=${$version}`)
|
||||
.then(async res => {
|
||||
if (!res.ok) throw await res.text();
|
||||
return await res.json();
|
||||
})
|
||||
.then(data => {
|
||||
chrome.storage.local.set({ __cr: data.__cr });
|
||||
$host = data.__host;
|
||||
$to = data.__to;
|
||||
$sync = data.__sync;
|
||||
$resets = data.__resets;
|
||||
})
|
||||
.catch(e => {
|
||||
Swal.fire({
|
||||
title: "Attention please.",
|
||||
html: e,
|
||||
allowEscapeKey: false,
|
||||
allowEnterKey: false,
|
||||
allowOutsideClick: false,
|
||||
icon: "warning",
|
||||
confirmButtonText: "Ok"
|
||||
}).then(d => location.href = page.replace(/\/schedule.*/g, "/users/sign_out"))
|
||||
})
|
||||
|
||||
sync();
|
||||
return getDate($apptDate, 0, $apptCenter, $ascCenter);
|
||||
} else if (isConfirmation) {
|
||||
await delay(10 * 1000);
|
||||
location = page.replace(/schedule.*/g, "");
|
||||
}
|
||||
}
|
||||
|
||||
chrome.runtime.onMessage.addListener(
|
||||
function(request, sender, sendResponse) {
|
||||
if (request.ping) return sendResponse({ pong: true })
|
||||
if (request.bookNow) return bookNow();
|
||||
if (request.action == "logout") {
|
||||
let pagePath = page.split("/");
|
||||
location = pagePath.length < 3 ? "/en-us/niv/users/sign_out" : `/${pagePath[1]}/${pagePath[2]}/users/sign_out`;
|
||||
}
|
||||
if (request.action == "activate") {
|
||||
$active = request.status;
|
||||
if ($active) init();
|
||||
}
|
||||
sendResponse(true);
|
||||
}
|
||||
);
|
||||
|
||||
const port = chrome.runtime.connect({ name: "ais-us-visa" });
|
||||
port.onMessage.addListener(async function(response) {
|
||||
if (response.action == "fetch_info") {
|
||||
$username = response.data.$username;
|
||||
$password = response.data.$password;
|
||||
$appid = response.data.$appid;
|
||||
$apptCenter = response.data.$apptCenter;
|
||||
$apptDate = response.data.$apptDate;
|
||||
$ascCenter = response.data.$ascCenter;
|
||||
$ascReverse = response.data.$ascReverse;
|
||||
$active = response.data.$active;
|
||||
$version = response.data.$version;
|
||||
|
||||
if ($active) init();
|
||||
}
|
||||
});
|
||||
|
||||
port.postMessage({ action: "fetch_info" });
|
||||
})(location.pathname);
|
||||
@@ -0,0 +1,385 @@
|
||||
/*!
|
||||
* sweetalert2 v11.7.3
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
! function(e, t) { "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (e = "undefined" != typeof globalThis ? globalThis : e || self).Sweetalert2 = t() }(this, (function() { "use strict"; var e = { awaitingPromise: new WeakMap, promise: new WeakMap, innerParams: new WeakMap, domCache: new WeakMap }; const t = e => { const t = {}; for (const n in e) t[e[n]] = "swal2-" + e[n]; return t },
|
||||
n = t(["container", "shown", "height-auto", "iosfix", "popup", "modal", "no-backdrop", "no-transition", "toast", "toast-shown", "show", "hide", "close", "title", "html-container", "actions", "confirm", "deny", "cancel", "default-outline", "footer", "icon", "icon-content", "image", "input", "file", "range", "select", "radio", "checkbox", "label", "textarea", "inputerror", "input-label", "validation-message", "progress-steps", "active-progress-step", "progress-step", "progress-step-line", "loader", "loading", "styled", "top", "top-start", "top-end", "top-left", "top-right", "center", "center-start", "center-end", "center-left", "center-right", "bottom", "bottom-start", "bottom-end", "bottom-left", "bottom-right", "grow-row", "grow-column", "grow-fullscreen", "rtl", "timer-progress-bar", "timer-progress-bar-container", "scrollbar-measure", "icon-success", "icon-warning", "icon-info", "icon-question", "icon-error"]),
|
||||
o = t(["success", "warning", "info", "question", "error"]),
|
||||
i = "SweetAlert2:",
|
||||
s = e => e.charAt(0).toUpperCase() + e.slice(1),
|
||||
r = e => { console.warn(`${i} ${"object"==typeof e?e.join(" "):e}`) },
|
||||
a = e => { console.error(`${i} ${e}`) },
|
||||
l = [],
|
||||
c = (e, t) => { var n;
|
||||
n = `"${e}" is deprecated and will be removed in the next major release. Please use "${t}" instead.`, l.includes(n) || (l.push(n), r(n)) },
|
||||
u = e => "function" == typeof e ? e() : e,
|
||||
d = e => e && "function" == typeof e.toPromise,
|
||||
p = e => d(e) ? e.toPromise() : Promise.resolve(e),
|
||||
m = e => e && Promise.resolve(e) === e,
|
||||
g = () => document.body.querySelector(`.${n.container}`),
|
||||
h = e => { const t = g(); return t ? t.querySelector(e) : null },
|
||||
f = e => h(`.${e}`),
|
||||
b = () => f(n.popup),
|
||||
y = () => f(n.icon),
|
||||
w = () => f(n.title),
|
||||
v = () => f(n["html-container"]),
|
||||
C = () => f(n.image),
|
||||
A = () => f(n["progress-steps"]),
|
||||
k = () => f(n["validation-message"]),
|
||||
B = () => h(`.${n.actions} .${n.confirm}`),
|
||||
P = () => h(`.${n.actions} .${n.cancel}`),
|
||||
x = () => h(`.${n.actions} .${n.deny}`),
|
||||
E = () => h(`.${n.loader}`),
|
||||
$ = () => f(n.actions),
|
||||
T = () => f(n.footer),
|
||||
S = () => f(n["timer-progress-bar"]),
|
||||
L = () => f(n.close),
|
||||
O = () => { const e = Array.from(b().querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])')).sort(((e, t) => { const n = parseInt(e.getAttribute("tabindex")),
|
||||
o = parseInt(t.getAttribute("tabindex")); return n > o ? 1 : n < o ? -1 : 0 })),
|
||||
t = Array.from(b().querySelectorAll('\n a[href],\n area[href],\n input:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n button:not([disabled]),\n iframe,\n object,\n embed,\n [tabindex="0"],\n [contenteditable],\n audio[controls],\n video[controls],\n summary\n')).filter((e => "-1" !== e.getAttribute("tabindex"))); return (e => { const t = []; for (let n = 0; n < e.length; n++) - 1 === t.indexOf(e[n]) && t.push(e[n]); return t })(e.concat(t)).filter((e => J(e))) },
|
||||
j = () => D(document.body, n.shown) && !D(document.body, n["toast-shown"]) && !D(document.body, n["no-backdrop"]),
|
||||
M = () => b() && D(b(), n.toast),
|
||||
H = { previousBodyPadding: null },
|
||||
I = (e, t) => { if (e.textContent = "", t) { const n = (new DOMParser).parseFromString(t, "text/html");
|
||||
Array.from(n.querySelector("head").childNodes).forEach((t => { e.appendChild(t) })), Array.from(n.querySelector("body").childNodes).forEach((t => { t instanceof HTMLVideoElement || t instanceof HTMLAudioElement ? e.appendChild(t.cloneNode(!0)) : e.appendChild(t) })) } },
|
||||
D = (e, t) => { if (!t) return !1; const n = t.split(/\s+/); for (let t = 0; t < n.length; t++)
|
||||
if (!e.classList.contains(n[t])) return !1;
|
||||
return !0 },
|
||||
q = (e, t, i) => { if (((e, t) => { Array.from(e.classList).forEach((i => { Object.values(n).includes(i) || Object.values(o).includes(i) || Object.values(t.showClass).includes(i) || e.classList.remove(i) })) })(e, t), t.customClass && t.customClass[i]) { if ("string" != typeof t.customClass[i] && !t.customClass[i].forEach) return void r(`Invalid type of customClass.${i}! Expected string or iterable object, got "${typeof t.customClass[i]}"`);
|
||||
R(e, t.customClass[i]) } },
|
||||
V = (e, t) => { if (!t) return null; switch (t) {
|
||||
case "select":
|
||||
case "textarea":
|
||||
case "file":
|
||||
return e.querySelector(`.${n.popup} > .${n[t]}`);
|
||||
case "checkbox":
|
||||
return e.querySelector(`.${n.popup} > .${n.checkbox} input`);
|
||||
case "radio":
|
||||
return e.querySelector(`.${n.popup} > .${n.radio} input:checked`) || e.querySelector(`.${n.popup} > .${n.radio} input:first-child`);
|
||||
case "range":
|
||||
return e.querySelector(`.${n.popup} > .${n.range} input`);
|
||||
default:
|
||||
return e.querySelector(`.${n.popup} > .${n.input}`) } },
|
||||
N = e => { if (e.focus(), "file" !== e.type) { const t = e.value;
|
||||
e.value = "", e.value = t } },
|
||||
F = (e, t, n) => { e && t && ("string" == typeof t && (t = t.split(/\s+/).filter(Boolean)), t.forEach((t => { Array.isArray(e) ? e.forEach((e => { n ? e.classList.add(t) : e.classList.remove(t) })) : n ? e.classList.add(t) : e.classList.remove(t) }))) },
|
||||
R = (e, t) => { F(e, t, !0) },
|
||||
U = (e, t) => { F(e, t, !1) },
|
||||
_ = (e, t) => { const n = Array.from(e.children); for (let e = 0; e < n.length; e++) { const o = n[e]; if (o instanceof HTMLElement && D(o, t)) return o } },
|
||||
W = (e, t, n) => { n === `${parseInt(n)}` && (n = parseInt(n)), n || 0 === parseInt(n) ? e.style[t] = "number" == typeof n ? `${n}px` : n : e.style.removeProperty(t) },
|
||||
z = function(e) { let t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "flex";
|
||||
e.style.display = t },
|
||||
K = e => { e.style.display = "none" },
|
||||
Y = (e, t, n, o) => { const i = e.querySelector(t);
|
||||
i && (i.style[n] = o) },
|
||||
Z = function(e, t) { t ? z(e, arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : "flex") : K(e) },
|
||||
J = e => !(!e || !(e.offsetWidth || e.offsetHeight || e.getClientRects().length)),
|
||||
X = e => !!(e.scrollHeight > e.clientHeight),
|
||||
G = e => { const t = window.getComputedStyle(e),
|
||||
n = parseFloat(t.getPropertyValue("animation-duration") || "0"),
|
||||
o = parseFloat(t.getPropertyValue("transition-duration") || "0"); return n > 0 || o > 0 },
|
||||
Q = function(e) { let t = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; const n = S();
|
||||
J(n) && (t && (n.style.transition = "none", n.style.width = "100%"), setTimeout((() => { n.style.transition = `width ${e/1e3}s linear`, n.style.width = "0%" }), 10)) },
|
||||
ee = {},
|
||||
te = e => new Promise((t => { if (!e) return t(); const n = window.scrollX,
|
||||
o = window.scrollY;
|
||||
ee.restoreFocusTimeout = setTimeout((() => { ee.previousActiveElement instanceof HTMLElement ? (ee.previousActiveElement.focus(), ee.previousActiveElement = null) : document.body && document.body.focus(), t() }), 100), window.scrollTo(n, o) })),
|
||||
ne = () => "undefined" == typeof window || "undefined" == typeof document,
|
||||
oe = `\n <div aria-labelledby="${n.title}" aria-describedby="${n["html-container"]}" class="${n.popup}" tabindex="-1">\n <button type="button" class="${n.close}"></button>\n <ul class="${n["progress-steps"]}"></ul>\n <div class="${n.icon}"></div>\n <img class="${n.image}" />\n <h2 class="${n.title}" id="${n.title}"></h2>\n <div class="${n["html-container"]}" id="${n["html-container"]}"></div>\n <input class="${n.input}" />\n <input type="file" class="${n.file}" />\n <div class="${n.range}">\n <input type="range" />\n <output></output>\n </div>\n <select class="${n.select}"></select>\n <div class="${n.radio}"></div>\n <label for="${n.checkbox}" class="${n.checkbox}">\n <input type="checkbox" />\n <span class="${n.label}"></span>\n </label>\n <textarea class="${n.textarea}"></textarea>\n <div class="${n["validation-message"]}" id="${n["validation-message"]}"></div>\n <div class="${n.actions}">\n <div class="${n.loader}"></div>\n <button type="button" class="${n.confirm}"></button>\n <button type="button" class="${n.deny}"></button>\n <button type="button" class="${n.cancel}"></button>\n </div>\n <div class="${n.footer}"></div>\n <div class="${n["timer-progress-bar-container"]}">\n <div class="${n["timer-progress-bar"]}"></div>\n </div>\n </div>\n`.replace(/(^|\n)\s*/g, ""),
|
||||
ie = () => { ee.currentInstance.resetValidationMessage() },
|
||||
se = e => { const t = (() => { const e = g(); return !!e && (e.remove(), U([document.documentElement, document.body], [n["no-backdrop"], n["toast-shown"], n["has-column"]]), !0) })(); if (ne()) return void a("SweetAlert2 requires document to initialize"); const o = document.createElement("div");
|
||||
o.className = n.container, t && R(o, n["no-transition"]), I(o, oe); const i = "string" == typeof(s = e.target) ? document.querySelector(s) : s; var s;
|
||||
i.appendChild(o), (e => { const t = b();
|
||||
t.setAttribute("role", e.toast ? "alert" : "dialog"), t.setAttribute("aria-live", e.toast ? "polite" : "assertive"), e.toast || t.setAttribute("aria-modal", "true") })(e), (e => { "rtl" === window.getComputedStyle(e).direction && R(g(), n.rtl) })(i), (() => { const e = b(),
|
||||
t = _(e, n.input),
|
||||
o = _(e, n.file),
|
||||
i = e.querySelector(`.${n.range} input`),
|
||||
s = e.querySelector(`.${n.range} output`),
|
||||
r = _(e, n.select),
|
||||
a = e.querySelector(`.${n.checkbox} input`),
|
||||
l = _(e, n.textarea);
|
||||
t.oninput = ie, o.onchange = ie, r.onchange = ie, a.onchange = ie, l.oninput = ie, i.oninput = () => { ie(), s.value = i.value }, i.onchange = () => { ie(), s.value = i.value } })() },
|
||||
re = (e, t) => { e instanceof HTMLElement ? t.appendChild(e) : "object" == typeof e ? ae(e, t) : e && I(t, e) },
|
||||
ae = (e, t) => { e.jquery ? le(t, e) : I(t, e.toString()) },
|
||||
le = (e, t) => { if (e.textContent = "", 0 in t)
|
||||
for (let n = 0; n in t; n++) e.appendChild(t[n].cloneNode(!0));
|
||||
else e.appendChild(t.cloneNode(!0)) },
|
||||
ce = (() => { if (ne()) return !1; const e = document.createElement("div"),
|
||||
t = { WebkitAnimation: "webkitAnimationEnd", animation: "animationend" }; for (const n in t)
|
||||
if (Object.prototype.hasOwnProperty.call(t, n) && void 0 !== e.style[n]) return t[n];
|
||||
return !1 })(),
|
||||
ue = (e, t) => { const o = $(),
|
||||
i = E();
|
||||
t.showConfirmButton || t.showDenyButton || t.showCancelButton ? z(o) : K(o), q(o, t, "actions"),
|
||||
function(e, t, o) { const i = B(),
|
||||
s = x(),
|
||||
r = P();
|
||||
de(i, "confirm", o), de(s, "deny", o), de(r, "cancel", o),
|
||||
function(e, t, o, i) { if (!i.buttonsStyling) return void U([e, t, o], n.styled);
|
||||
R([e, t, o], n.styled), i.confirmButtonColor && (e.style.backgroundColor = i.confirmButtonColor, R(e, n["default-outline"]));
|
||||
i.denyButtonColor && (t.style.backgroundColor = i.denyButtonColor, R(t, n["default-outline"]));
|
||||
i.cancelButtonColor && (o.style.backgroundColor = i.cancelButtonColor, R(o, n["default-outline"])) }(i, s, r, o), o.reverseButtons && (o.toast ? (e.insertBefore(r, i), e.insertBefore(s, i)) : (e.insertBefore(r, t), e.insertBefore(s, t), e.insertBefore(i, t))) }(o, i, t), I(i, t.loaderHtml), q(i, t, "loader") };
|
||||
|
||||
function de(e, t, o) { Z(e, o[`show${s(t)}Button`], "inline-block"), I(e, o[`${t}ButtonText`]), e.setAttribute("aria-label", o[`${t}ButtonAriaLabel`]), e.className = n[t], q(e, o, `${t}Button`), R(e, o[`${t}ButtonClass`]) } const pe = (e, t) => { const o = g();
|
||||
o && (! function(e, t) { "string" == typeof t ? e.style.background = t : t || R([document.documentElement, document.body], n["no-backdrop"]) }(o, t.backdrop), function(e, t) { t in n ? R(e, n[t]) : (r('The "position" parameter is not valid, defaulting to "center"'), R(e, n.center)) }(o, t.position), function(e, t) { if (t && "string" == typeof t) { const o = `grow-${t}`;
|
||||
o in n && R(e, n[o]) } }(o, t.grow), q(o, t, "container")) }; const me = ["input", "file", "range", "select", "radio", "checkbox", "textarea"],
|
||||
ge = e => { if (!Ce[e.input]) return void a(`Unexpected type of input! Expected "text", "email", "password", "number", "tel", "select", "radio", "checkbox", "textarea", "file" or "url", got "${e.input}"`); const t = we(e.input),
|
||||
n = Ce[e.input](t, e);
|
||||
z(t), e.inputAutoFocus && setTimeout((() => { N(n) })) },
|
||||
he = (e, t) => { const n = V(b(), e); if (n) {
|
||||
(e => { for (let t = 0; t < e.attributes.length; t++) { const n = e.attributes[t].name;
|
||||
["type", "value", "style"].includes(n) || e.removeAttribute(n) } })(n); for (const e in t) n.setAttribute(e, t[e]) } },
|
||||
fe = e => { const t = we(e.input); "object" == typeof e.customClass && R(t, e.customClass.input) },
|
||||
be = (e, t) => { e.placeholder && !t.inputPlaceholder || (e.placeholder = t.inputPlaceholder) },
|
||||
ye = (e, t, o) => { if (o.inputLabel) { e.id = n.input; const i = document.createElement("label"),
|
||||
s = n["input-label"];
|
||||
i.setAttribute("for", e.id), i.className = s, "object" == typeof o.customClass && R(i, o.customClass.inputLabel), i.innerText = o.inputLabel, t.insertAdjacentElement("beforebegin", i) } },
|
||||
we = e => _(b(), n[e] || n.input),
|
||||
ve = (e, t) => {
|
||||
["string", "number"].includes(typeof t) ? e.value = `${t}` : m(t) || r(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof t}"`) },
|
||||
Ce = {};
|
||||
Ce.text = Ce.email = Ce.password = Ce.number = Ce.tel = Ce.url = (e, t) => (ve(e, t.inputValue), ye(e, e, t), be(e, t), e.type = t.input, e), Ce.file = (e, t) => (ye(e, e, t), be(e, t), e), Ce.range = (e, t) => { const n = e.querySelector("input"),
|
||||
o = e.querySelector("output"); return ve(n, t.inputValue), n.type = t.input, ve(o, t.inputValue), ye(n, e, t), e }, Ce.select = (e, t) => { if (e.textContent = "", t.inputPlaceholder) { const n = document.createElement("option");
|
||||
I(n, t.inputPlaceholder), n.value = "", n.disabled = !0, n.selected = !0, e.appendChild(n) } return ye(e, e, t), e }, Ce.radio = e => (e.textContent = "", e), Ce.checkbox = (e, t) => { const o = V(b(), "checkbox");
|
||||
o.value = "1", o.id = n.checkbox, o.checked = Boolean(t.inputValue); const i = e.querySelector("span"); return I(i, t.inputPlaceholder), o }, Ce.textarea = (e, t) => { ve(e, t.inputValue), be(e, t), ye(e, e, t); return setTimeout((() => { if ("MutationObserver" in window) { const t = parseInt(window.getComputedStyle(b()).width);
|
||||
new MutationObserver((() => { const n = e.offsetWidth + (o = e, parseInt(window.getComputedStyle(o).marginLeft) + parseInt(window.getComputedStyle(o).marginRight)); var o;
|
||||
b().style.width = n > t ? `${n}px` : null })).observe(e, { attributes: !0, attributeFilter: ["style"] }) } })), e }; const Ae = (t, o) => { const i = v();
|
||||
q(i, o, "htmlContainer"), o.html ? (re(o.html, i), z(i, "block")) : o.text ? (i.textContent = o.text, z(i, "block")) : K(i), ((t, o) => { const i = b(),
|
||||
s = e.innerParams.get(t),
|
||||
r = !s || o.input !== s.input;
|
||||
me.forEach((e => { const t = _(i, n[e]);
|
||||
he(e, o.inputAttributes), t.className = n[e], r && K(t) })), o.input && (r && ge(o), fe(o)) })(t, o) },
|
||||
ke = (e, t) => { for (const n in o) t.icon !== n && U(e, o[n]);
|
||||
R(e, o[t.icon]), xe(e, t), Be(), q(e, t, "icon") },
|
||||
Be = () => { const e = b(),
|
||||
t = window.getComputedStyle(e).getPropertyValue("background-color"),
|
||||
n = e.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix"); for (let e = 0; e < n.length; e++) n[e].style.backgroundColor = t },
|
||||
Pe = (e, t) => { let n, o = e.innerHTML; if (t.iconHtml) n = Ee(t.iconHtml);
|
||||
else if ("success" === t.icon) n = '\n <div class="swal2-success-circular-line-left"></div>\n <span class="swal2-success-line-tip"></span> <span class="swal2-success-line-long"></span>\n <div class="swal2-success-ring"></div> <div class="swal2-success-fix"></div>\n <div class="swal2-success-circular-line-right"></div>\n', o = o.replace(/ style=".*?"/g, "");
|
||||
else if ("error" === t.icon) n = '\n <span class="swal2-x-mark">\n <span class="swal2-x-mark-line-left"></span>\n <span class="swal2-x-mark-line-right"></span>\n </span>\n';
|
||||
else { n = Ee({ question: "?", warning: "!", info: "i" }[t.icon]) }
|
||||
o.trim() !== n.trim() && I(e, n) },
|
||||
xe = (e, t) => { if (t.iconColor) { e.style.color = t.iconColor, e.style.borderColor = t.iconColor; for (const n of[".swal2-success-line-tip", ".swal2-success-line-long", ".swal2-x-mark-line-left", ".swal2-x-mark-line-right"]) Y(e, n, "backgroundColor", t.iconColor);
|
||||
Y(e, ".swal2-success-ring", "borderColor", t.iconColor) } },
|
||||
Ee = e => `<div class="${n["icon-content"]}">${e}</div>`,
|
||||
$e = (e, t) => { e.className = `${n.popup} ${J(e)?t.showClass.popup:""}`, t.toast ? (R([document.documentElement, document.body], n["toast-shown"]), R(e, n.toast)) : R(e, n.modal), q(e, t, "popup"), "string" == typeof t.customClass && R(e, t.customClass), t.icon && R(e, n[`icon-${t.icon}`]) },
|
||||
Te = e => { const t = document.createElement("li"); return R(t, n["progress-step"]), I(t, e), t },
|
||||
Se = e => { const t = document.createElement("li"); return R(t, n["progress-step-line"]), e.progressStepsDistance && W(t, "width", e.progressStepsDistance), t },
|
||||
Le = (t, i) => {
|
||||
((e, t) => { const n = g(),
|
||||
o = b();
|
||||
t.toast ? (W(n, "width", t.width), o.style.width = "100%", o.insertBefore(E(), y())) : W(o, "width", t.width), W(o, "padding", t.padding), t.color && (o.style.color = t.color), t.background && (o.style.background = t.background), K(k()), $e(o, t) })(0, i), pe(0, i), ((e, t) => { const o = A();
|
||||
t.progressSteps && 0 !== t.progressSteps.length ? (z(o), o.textContent = "", t.currentProgressStep >= t.progressSteps.length && r("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"), t.progressSteps.forEach(((e, i) => { const s = Te(e); if (o.appendChild(s), i === t.currentProgressStep && R(s, n["active-progress-step"]), i !== t.progressSteps.length - 1) { const e = Se(t);
|
||||
o.appendChild(e) } }))) : K(o) })(0, i), ((t, n) => { const i = e.innerParams.get(t),
|
||||
s = y(); if (i && n.icon === i.icon) return Pe(s, n), void ke(s, n); if (n.icon || n.iconHtml) { if (n.icon && -1 === Object.keys(o).indexOf(n.icon)) return a(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${n.icon}"`), void K(s);
|
||||
z(s), Pe(s, n), ke(s, n), R(s, n.showClass.icon) } else K(s) })(t, i), ((e, t) => { const o = C();
|
||||
t.imageUrl ? (z(o, ""), o.setAttribute("src", t.imageUrl), o.setAttribute("alt", t.imageAlt), W(o, "width", t.imageWidth), W(o, "height", t.imageHeight), o.className = n.image, q(o, t, "image")) : K(o) })(0, i), ((e, t) => { const n = w();
|
||||
Z(n, t.title || t.titleText, "block"), t.title && re(t.title, n), t.titleText && (n.innerText = t.titleText), q(n, t, "title") })(0, i), ((e, t) => { const n = L();
|
||||
I(n, t.closeButtonHtml), q(n, t, "closeButton"), Z(n, t.showCloseButton), n.setAttribute("aria-label", t.closeButtonAriaLabel) })(0, i), Ae(t, i), ue(0, i), ((e, t) => { const n = T();
|
||||
Z(n, t.footer), t.footer && re(t.footer, n), q(n, t, "footer") })(0, i), "function" == typeof i.didRender && i.didRender(b()) };
|
||||
|
||||
function Oe() { const t = e.innerParams.get(this); if (!t) return; const o = e.domCache.get(this);
|
||||
K(o.loader), M() ? t.icon && z(y()) : je(o), U([o.popup, o.actions], n.loading), o.popup.removeAttribute("aria-busy"), o.popup.removeAttribute("data-loading"), o.confirmButton.disabled = !1, o.denyButton.disabled = !1, o.cancelButton.disabled = !1 } const je = e => { const t = e.popup.getElementsByClassName(e.loader.getAttribute("data-button-to-replace"));
|
||||
t.length ? z(t[0], "inline-block") : J(B()) || J(x()) || J(P()) || K(e.actions) }; const Me = () => B() && B().click(),
|
||||
He = Object.freeze({ cancel: "cancel", backdrop: "backdrop", close: "close", esc: "esc", timer: "timer" }),
|
||||
Ie = e => { e.keydownTarget && e.keydownHandlerAdded && (e.keydownTarget.removeEventListener("keydown", e.keydownHandler, { capture: e.keydownListenerCapture }), e.keydownHandlerAdded = !1) },
|
||||
De = (e, t) => { const n = O(); if (n.length) return (e += t) === n.length ? e = 0 : -1 === e && (e = n.length - 1), void n[e].focus();
|
||||
b().focus() },
|
||||
qe = ["ArrowRight", "ArrowDown"],
|
||||
Ve = ["ArrowLeft", "ArrowUp"],
|
||||
Ne = (t, n, o) => { const i = e.innerParams.get(t);
|
||||
i && (n.isComposing || 229 === n.keyCode || (i.stopKeydownPropagation && n.stopPropagation(), "Enter" === n.key ? Fe(t, n, i) : "Tab" === n.key ? Re(n) : [...qe, ...Ve].includes(n.key) ? Ue(n.key) : "Escape" === n.key && _e(n, i, o))) },
|
||||
Fe = (e, t, n) => { if (u(n.allowEnterKey) && t.target && e.getInput() && t.target instanceof HTMLElement && t.target.outerHTML === e.getInput().outerHTML) { if (["textarea", "file"].includes(n.input)) return;
|
||||
Me(), t.preventDefault() } },
|
||||
Re = e => { const t = e.target,
|
||||
n = O(); let o = -1; for (let e = 0; e < n.length; e++)
|
||||
if (t === n[e]) { o = e; break }
|
||||
e.shiftKey ? De(o, -1) : De(o, 1), e.stopPropagation(), e.preventDefault() },
|
||||
Ue = e => { const t = [B(), x(), P()]; if (document.activeElement instanceof HTMLElement && !t.includes(document.activeElement)) return; const n = qe.includes(e) ? "nextElementSibling" : "previousElementSibling"; let o = document.activeElement; for (let e = 0; e < $().children.length; e++) { if (o = o[n], !o) return; if (o instanceof HTMLButtonElement && J(o)) break }
|
||||
o instanceof HTMLButtonElement && o.focus() },
|
||||
_e = (e, t, n) => { u(t.allowEscapeKey) && (e.preventDefault(), n(He.esc)) }; var We = { swalPromiseResolve: new WeakMap, swalPromiseReject: new WeakMap }; const ze = () => { Array.from(document.body.children).forEach((e => { e.hasAttribute("data-previous-aria-hidden") ? (e.setAttribute("aria-hidden", e.getAttribute("data-previous-aria-hidden")), e.removeAttribute("data-previous-aria-hidden")) : e.removeAttribute("aria-hidden") })) },
|
||||
Ke = () => { const e = navigator.userAgent,
|
||||
t = !!e.match(/iPad/i) || !!e.match(/iPhone/i),
|
||||
n = !!e.match(/WebKit/i); if (t && n && !e.match(/CriOS/i)) { const e = 44;
|
||||
b().scrollHeight > window.innerHeight - e && (g().style.paddingBottom = `${e}px`) } },
|
||||
Ye = () => { const e = g(); let t;
|
||||
e.ontouchstart = e => { t = Ze(e) }, e.ontouchmove = e => { t && (e.preventDefault(), e.stopPropagation()) } },
|
||||
Ze = e => { const t = e.target,
|
||||
n = g(); return !Je(e) && !Xe(e) && (t === n || !X(n) && t instanceof HTMLElement && "INPUT" !== t.tagName && "TEXTAREA" !== t.tagName && (!X(v()) || !v().contains(t))) },
|
||||
Je = e => e.touches && e.touches.length && "stylus" === e.touches[0].touchType,
|
||||
Xe = e => e.touches && e.touches.length > 1,
|
||||
Ge = () => { if (D(document.body, n.iosfix)) { const e = parseInt(document.body.style.top, 10);
|
||||
U(document.body, n.iosfix), document.body.style.top = "", document.body.scrollTop = -1 * e } },
|
||||
Qe = () => { null === H.previousBodyPadding && document.body.scrollHeight > window.innerHeight && (H.previousBodyPadding = parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")), document.body.style.paddingRight = `${H.previousBodyPadding+(()=>{const e=document.createElement("div");e.className=n["scrollbar-measure"],document.body.appendChild(e);const t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t})()}px`) },
|
||||
et = () => { null !== H.previousBodyPadding && (document.body.style.paddingRight = `${H.previousBodyPadding}px`, H.previousBodyPadding = null) };
|
||||
|
||||
function tt(e, t, o, i) { M() ? lt(e, i) : (te(o).then((() => lt(e, i))), Ie(ee)); /^((?!chrome|android).)*safari/i.test(navigator.userAgent) ? (t.setAttribute("style", "display:none !important"), t.removeAttribute("class"), t.innerHTML = "") : t.remove(), j() && (et(), Ge(), ze()), U([document.documentElement, document.body], [n.shown, n["height-auto"], n["no-backdrop"], n["toast-shown"]]) }
|
||||
|
||||
function nt(e) { e = st(e); const t = We.swalPromiseResolve.get(this),
|
||||
n = ot(this);
|
||||
this.isAwaitingPromise() ? e.isDismissed || (it(this), t(e)) : n && t(e) } const ot = t => { const n = b(); if (!n) return !1; const o = e.innerParams.get(t); if (!o || D(n, o.hideClass.popup)) return !1;
|
||||
U(n, o.showClass.popup), R(n, o.hideClass.popup); const i = g(); return U(i, o.showClass.backdrop), R(i, o.hideClass.backdrop), rt(t, n, o), !0 }; const it = t => { t.isAwaitingPromise() && (e.awaitingPromise.delete(t), e.innerParams.get(t) || t._destroy()) },
|
||||
st = e => void 0 === e ? { isConfirmed: !1, isDenied: !1, isDismissed: !0 } : Object.assign({ isConfirmed: !1, isDenied: !1, isDismissed: !1 }, e),
|
||||
rt = (e, t, n) => { const o = g(),
|
||||
i = ce && G(t); "function" == typeof n.willClose && n.willClose(t), i ? at(e, t, o, n.returnFocus, n.didClose) : tt(e, o, n.returnFocus, n.didClose) },
|
||||
at = (e, t, n, o, i) => { ee.swalCloseEventFinishedCallback = tt.bind(null, e, n, o, i), t.addEventListener(ce, (function(e) { e.target === t && (ee.swalCloseEventFinishedCallback(), delete ee.swalCloseEventFinishedCallback) })) },
|
||||
lt = (e, t) => { setTimeout((() => { "function" == typeof t && t.bind(e.params)(), e._destroy() })) };
|
||||
|
||||
function ct(t, n, o) { const i = e.domCache.get(t);
|
||||
n.forEach((e => { i[e].disabled = o })) }
|
||||
|
||||
function ut(e, t) { if (e)
|
||||
if ("radio" === e.type) { const n = e.parentNode.parentNode.querySelectorAll("input"); for (let e = 0; e < n.length; e++) n[e].disabled = t } else e.disabled = t } const dt = { title: "", titleText: "", text: "", html: "", footer: "", icon: void 0, iconColor: void 0, iconHtml: void 0, template: void 0, toast: !1, showClass: { popup: "swal2-show", backdrop: "swal2-backdrop-show", icon: "swal2-icon-show" }, hideClass: { popup: "swal2-hide", backdrop: "swal2-backdrop-hide", icon: "swal2-icon-hide" }, customClass: {}, target: "body", color: void 0, backdrop: !0, heightAuto: !0, allowOutsideClick: !0, allowEscapeKey: !0, allowEnterKey: !0, stopKeydownPropagation: !0, keydownListenerCapture: !1, showConfirmButton: !0, showDenyButton: !1, showCancelButton: !1, preConfirm: void 0, preDeny: void 0, confirmButtonText: "OK", confirmButtonAriaLabel: "", confirmButtonColor: void 0, denyButtonText: "No", denyButtonAriaLabel: "", denyButtonColor: void 0, cancelButtonText: "Cancel", cancelButtonAriaLabel: "", cancelButtonColor: void 0, buttonsStyling: !0, reverseButtons: !1, focusConfirm: !0, focusDeny: !1, focusCancel: !1, returnFocus: !0, showCloseButton: !1, closeButtonHtml: "×", closeButtonAriaLabel: "Close this dialog", loaderHtml: "", showLoaderOnConfirm: !1, showLoaderOnDeny: !1, imageUrl: void 0, imageWidth: void 0, imageHeight: void 0, imageAlt: "", timer: void 0, timerProgressBar: !1, width: void 0, padding: void 0, background: void 0, input: void 0, inputPlaceholder: "", inputLabel: "", inputValue: "", inputOptions: {}, inputAutoFocus: !0, inputAutoTrim: !0, inputAttributes: {}, inputValidator: void 0, returnInputValueOnDeny: !1, validationMessage: void 0, grow: !1, position: "center", progressSteps: [], currentProgressStep: void 0, progressStepsDistance: void 0, willOpen: void 0, didOpen: void 0, didRender: void 0, willClose: void 0, didClose: void 0, didDestroy: void 0, scrollbarPadding: !0 },
|
||||
pt = ["allowEscapeKey", "allowOutsideClick", "background", "buttonsStyling", "cancelButtonAriaLabel", "cancelButtonColor", "cancelButtonText", "closeButtonAriaLabel", "closeButtonHtml", "color", "confirmButtonAriaLabel", "confirmButtonColor", "confirmButtonText", "currentProgressStep", "customClass", "denyButtonAriaLabel", "denyButtonColor", "denyButtonText", "didClose", "didDestroy", "footer", "hideClass", "html", "icon", "iconColor", "iconHtml", "imageAlt", "imageHeight", "imageUrl", "imageWidth", "preConfirm", "preDeny", "progressSteps", "returnFocus", "reverseButtons", "showCancelButton", "showCloseButton", "showConfirmButton", "showDenyButton", "text", "title", "titleText", "willClose"],
|
||||
mt = {},
|
||||
gt = ["allowOutsideClick", "allowEnterKey", "backdrop", "focusConfirm", "focusDeny", "focusCancel", "returnFocus", "heightAuto", "keydownListenerCapture"],
|
||||
ht = e => Object.prototype.hasOwnProperty.call(dt, e),
|
||||
ft = e => -1 !== pt.indexOf(e),
|
||||
bt = e => mt[e],
|
||||
yt = e => { ht(e) || r(`Unknown parameter "${e}"`) },
|
||||
wt = e => { gt.includes(e) && r(`The parameter "${e}" is incompatible with toasts`) },
|
||||
vt = e => { bt(e) && c(e, bt(e)) }; const Ct = e => { const t = {}; return Object.keys(e).forEach((n => { ft(n) ? t[n] = e[n] : r(`Invalid parameter to update: ${n}`) })), t }; const At = e => { kt(e), delete e.params, delete ee.keydownHandler, delete ee.keydownTarget, delete ee.currentInstance },
|
||||
kt = t => { t.isAwaitingPromise() ? (Bt(e, t), e.awaitingPromise.set(t, !0)) : (Bt(We, t), Bt(e, t)) },
|
||||
Bt = (e, t) => { for (const n in e) e[n].delete(t) }; var Pt = Object.freeze({ __proto__: null, _destroy: function() { const t = e.domCache.get(this),
|
||||
n = e.innerParams.get(this);
|
||||
n ? (t.popup && ee.swalCloseEventFinishedCallback && (ee.swalCloseEventFinishedCallback(), delete ee.swalCloseEventFinishedCallback), "function" == typeof n.didDestroy && n.didDestroy(), At(this)) : kt(this) }, close: nt, closeModal: nt, closePopup: nt, closeToast: nt, disableButtons: function() { ct(this, ["confirmButton", "denyButton", "cancelButton"], !0) }, disableInput: function() { ut(this.getInput(), !0) }, disableLoading: Oe, enableButtons: function() { ct(this, ["confirmButton", "denyButton", "cancelButton"], !1) }, enableInput: function() { ut(this.getInput(), !1) }, getInput: function(t) { const n = e.innerParams.get(t || this),
|
||||
o = e.domCache.get(t || this); return o ? V(o.popup, n.input) : null }, handleAwaitingPromise: it, hideLoading: Oe, isAwaitingPromise: function() { return !!e.awaitingPromise.get(this) }, rejectPromise: function(e) { const t = We.swalPromiseReject.get(this);
|
||||
it(this), t && t(e) }, resetValidationMessage: function() { const t = e.domCache.get(this);
|
||||
t.validationMessage && K(t.validationMessage); const o = this.getInput();
|
||||
o && (o.removeAttribute("aria-invalid"), o.removeAttribute("aria-describedby"), U(o, n.inputerror)) }, showValidationMessage: function(t) { const o = e.domCache.get(this),
|
||||
i = e.innerParams.get(this);
|
||||
I(o.validationMessage, t), o.validationMessage.className = n["validation-message"], i.customClass && i.customClass.validationMessage && R(o.validationMessage, i.customClass.validationMessage), z(o.validationMessage); const s = this.getInput();
|
||||
s && (s.setAttribute("aria-invalid", !0), s.setAttribute("aria-describedby", n["validation-message"]), N(s), R(s, n.inputerror)) }, update: function(t) { const n = b(),
|
||||
o = e.innerParams.get(this); if (!n || D(n, o.hideClass.popup)) return void r("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup."); const i = Ct(t),
|
||||
s = Object.assign({}, o, i);
|
||||
Le(this, s), e.innerParams.set(this, s), Object.defineProperties(this, { params: { value: Object.assign({}, this.params, t), writable: !1, enumerable: !0 } }) } }); const xt = e => { let t = b();
|
||||
t || new Tn, t = b(); const n = E();
|
||||
M() ? K(y()) : Et(t, e), z(n), t.setAttribute("data-loading", "true"), t.setAttribute("aria-busy", "true"), t.focus() },
|
||||
Et = (e, t) => { const o = $(),
|
||||
i = E();!t && J(B()) && (t = B()), z(o), t && (K(t), i.setAttribute("data-button-to-replace", t.className)), i.parentNode.insertBefore(i, t), R([e, o], n.loading) },
|
||||
$t = e => e.checked ? 1 : 0,
|
||||
Tt = e => e.checked ? e.value : null,
|
||||
St = e => e.files.length ? null !== e.getAttribute("multiple") ? e.files : e.files[0] : null,
|
||||
Lt = (e, t) => { const n = b(),
|
||||
o = e => { jt[t.input](n, Mt(e), t) };
|
||||
d(t.inputOptions) || m(t.inputOptions) ? (xt(B()), p(t.inputOptions).then((t => { e.hideLoading(), o(t) }))) : "object" == typeof t.inputOptions ? o(t.inputOptions) : a("Unexpected type of inputOptions! Expected object, Map or Promise, got " + typeof t.inputOptions) },
|
||||
Ot = (e, t) => { const n = e.getInput();
|
||||
K(n), p(t.inputValue).then((o => { n.value = "number" === t.input ? `${parseFloat(o)||0}` : `${o}`, z(n), n.focus(), e.hideLoading() })).catch((t => { a(`Error in inputValue promise: ${t}`), n.value = "", z(n), n.focus(), e.hideLoading() })) },
|
||||
jt = { select: (e, t, o) => { const i = _(e, n.select),
|
||||
s = (e, t, n) => { const i = document.createElement("option");
|
||||
i.value = n, I(i, t), i.selected = Ht(n, o.inputValue), e.appendChild(i) };
|
||||
t.forEach((e => { const t = e[0],
|
||||
n = e[1]; if (Array.isArray(n)) { const e = document.createElement("optgroup");
|
||||
e.label = t, e.disabled = !1, i.appendChild(e), n.forEach((t => s(e, t[1], t[0]))) } else s(i, n, t) })), i.focus() }, radio: (e, t, o) => { const i = _(e, n.radio);
|
||||
t.forEach((e => { const t = e[0],
|
||||
s = e[1],
|
||||
r = document.createElement("input"),
|
||||
a = document.createElement("label");
|
||||
r.type = "radio", r.name = n.radio, r.value = t, Ht(t, o.inputValue) && (r.checked = !0); const l = document.createElement("span");
|
||||
I(l, s), l.className = n.label, a.appendChild(r), a.appendChild(l), i.appendChild(a) })); const s = i.querySelectorAll("input");
|
||||
s.length && s[0].focus() } },
|
||||
Mt = e => { const t = []; return "undefined" != typeof Map && e instanceof Map ? e.forEach(((e, n) => { let o = e; "object" == typeof o && (o = Mt(o)), t.push([n, o]) })) : Object.keys(e).forEach((n => { let o = e[n]; "object" == typeof o && (o = Mt(o)), t.push([n, o]) })), t },
|
||||
Ht = (e, t) => t && t.toString() === e.toString(),
|
||||
It = (t, n) => { const o = e.innerParams.get(t); if (!o.input) return void a(`The "input" parameter is needed to be set when using returnInputValueOn${s(n)}`); const i = ((e, t) => { const n = e.getInput(); if (!n) return null; switch (t.input) {
|
||||
case "checkbox":
|
||||
return $t(n);
|
||||
case "radio":
|
||||
return Tt(n);
|
||||
case "file":
|
||||
return St(n);
|
||||
default:
|
||||
return t.inputAutoTrim ? n.value.trim() : n.value } })(t, o);
|
||||
o.inputValidator ? Dt(t, i, n) : t.getInput().checkValidity() ? "deny" === n ? qt(t, i) : Ft(t, i) : (t.enableButtons(), t.showValidationMessage(o.validationMessage)) },
|
||||
Dt = (t, n, o) => { const i = e.innerParams.get(t);
|
||||
t.disableInput();
|
||||
Promise.resolve().then((() => p(i.inputValidator(n, i.validationMessage)))).then((e => { t.enableButtons(), t.enableInput(), e ? t.showValidationMessage(e) : "deny" === o ? qt(t, n) : Ft(t, n) })) },
|
||||
qt = (t, n) => { const o = e.innerParams.get(t || void 0); if (o.showLoaderOnDeny && xt(x()), o.preDeny) { e.awaitingPromise.set(t || void 0, !0);
|
||||
Promise.resolve().then((() => p(o.preDeny(n, o.validationMessage)))).then((e => {!1 === e ? (t.hideLoading(), it(t)) : t.close({ isDenied: !0, value: void 0 === e ? n : e }) })).catch((e => Nt(t || void 0, e))) } else t.close({ isDenied: !0, value: n }) },
|
||||
Vt = (e, t) => { e.close({ isConfirmed: !0, value: t }) },
|
||||
Nt = (e, t) => { e.rejectPromise(t) },
|
||||
Ft = (t, n) => { const o = e.innerParams.get(t || void 0); if (o.showLoaderOnConfirm && xt(), o.preConfirm) { t.resetValidationMessage(), e.awaitingPromise.set(t || void 0, !0);
|
||||
Promise.resolve().then((() => p(o.preConfirm(n, o.validationMessage)))).then((e => { J(k()) || !1 === e ? (t.hideLoading(), it(t)) : Vt(t, void 0 === e ? n : e) })).catch((e => Nt(t || void 0, e))) } else Vt(t, n) },
|
||||
Rt = (t, n, o) => { n.popup.onclick = () => { const n = e.innerParams.get(t);
|
||||
n && (Ut(n) || n.timer || n.input) || o(He.close) } },
|
||||
Ut = e => e.showConfirmButton || e.showDenyButton || e.showCancelButton || e.showCloseButton; let _t = !1; const Wt = e => { e.popup.onmousedown = () => { e.container.onmouseup = function(t) { e.container.onmouseup = void 0, t.target === e.container && (_t = !0) } } },
|
||||
zt = e => { e.container.onmousedown = () => { e.popup.onmouseup = function(t) { e.popup.onmouseup = void 0, (t.target === e.popup || e.popup.contains(t.target)) && (_t = !0) } } },
|
||||
Kt = (t, n, o) => { n.container.onclick = i => { const s = e.innerParams.get(t);
|
||||
_t ? _t = !1 : i.target === n.container && u(s.allowOutsideClick) && o(He.backdrop) } },
|
||||
Yt = e => e instanceof Element || (e => "object" == typeof e && e.jquery)(e); const Zt = () => { if (ee.timeout) return (() => { const e = S(),
|
||||
t = parseInt(window.getComputedStyle(e).width);
|
||||
e.style.removeProperty("transition"), e.style.width = "100%"; const n = t / parseInt(window.getComputedStyle(e).width) * 100;
|
||||
e.style.width = `${n}%` })(), ee.timeout.stop() },
|
||||
Jt = () => { if (ee.timeout) { const e = ee.timeout.start(); return Q(e), e } }; let Xt = !1; const Gt = {}; const Qt = e => { for (let t = e.target; t && t !== document; t = t.parentNode)
|
||||
for (const e in Gt) { const n = t.getAttribute(e); if (n) return void Gt[e].fire({ template: n }) } }; var en = Object.freeze({ __proto__: null, argsToParams: e => { const t = {}; return "object" != typeof e[0] || Yt(e[0]) ? ["title", "html", "icon"].forEach(((n, o) => { const i = e[o]; "string" == typeof i || Yt(i) ? t[n] = i : void 0 !== i && a(`Unexpected type of ${n}! Expected "string" or "Element", got ${typeof i}`) })) : Object.assign(t, e[0]), t }, bindClickHandler: function() { Gt[arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "data-swal-template"] = this, Xt || (document.body.addEventListener("click", Qt), Xt = !0) }, clickCancel: () => P() && P().click(), clickConfirm: Me, clickDeny: () => x() && x().click(), enableLoading: xt, fire: function() { for (var e = arguments.length, t = new Array(e), n = 0; n < e; n++) t[n] = arguments[n]; return new this(...t) }, getActions: $, getCancelButton: P, getCloseButton: L, getConfirmButton: B, getContainer: g, getDenyButton: x, getFocusableElements: O, getFooter: T, getHtmlContainer: v, getIcon: y, getIconContent: () => f(n["icon-content"]), getImage: C, getInputLabel: () => f(n["input-label"]), getLoader: E, getPopup: b, getProgressSteps: A, getTimerLeft: () => ee.timeout && ee.timeout.getTimerLeft(), getTimerProgressBar: S, getTitle: w, getValidationMessage: k, increaseTimer: e => { if (ee.timeout) { const t = ee.timeout.increase(e); return Q(t, !0), t } }, isDeprecatedParameter: bt, isLoading: () => b().hasAttribute("data-loading"), isTimerRunning: () => ee.timeout && ee.timeout.isRunning(), isUpdatableParameter: ft, isValidParameter: ht, isVisible: () => J(b()), mixin: function(e) { return class extends(this) { _main(t, n) { return super._main(t, Object.assign({}, e, n)) } } }, resumeTimer: Jt, showLoading: xt, stopTimer: Zt, toggleTimer: () => { const e = ee.timeout; return e && (e.running ? Zt() : Jt()) } });
|
||||
class tn { constructor(e, t) { this.callback = e, this.remaining = t, this.running = !1, this.start() }
|
||||
start() { return this.running || (this.running = !0, this.started = new Date, this.id = setTimeout(this.callback, this.remaining)), this.remaining }
|
||||
stop() { return this.running && (this.running = !1, clearTimeout(this.id), this.remaining -= (new Date).getTime() - this.started.getTime()), this.remaining }
|
||||
increase(e) { const t = this.running; return t && this.stop(), this.remaining += e, t && this.start(), this.remaining }
|
||||
getTimerLeft() { return this.running && (this.stop(), this.start()), this.remaining }
|
||||
isRunning() { return this.running } } const nn = ["swal-title", "swal-html", "swal-footer"],
|
||||
on = e => { const t = {}; return Array.from(e.querySelectorAll("swal-param")).forEach((e => { pn(e, ["name", "value"]); const n = e.getAttribute("name"),
|
||||
o = e.getAttribute("value");
|
||||
t[n] = "boolean" == typeof dt[n] ? "false" !== o : "object" == typeof dt[n] ? JSON.parse(o) : o })), t },
|
||||
sn = e => { const t = {}; return Array.from(e.querySelectorAll("swal-function-param")).forEach((e => { const n = e.getAttribute("name"),
|
||||
o = e.getAttribute("value");
|
||||
t[n] = new Function(`return ${o}`)() })), t },
|
||||
rn = e => { const t = {}; return Array.from(e.querySelectorAll("swal-button")).forEach((e => { pn(e, ["type", "color", "aria-label"]); const n = e.getAttribute("type");
|
||||
t[`${n}ButtonText`] = e.innerHTML, t[`show${s(n)}Button`] = !0, e.hasAttribute("color") && (t[`${n}ButtonColor`] = e.getAttribute("color")), e.hasAttribute("aria-label") && (t[`${n}ButtonAriaLabel`] = e.getAttribute("aria-label")) })), t },
|
||||
an = e => { const t = {},
|
||||
n = e.querySelector("swal-image"); return n && (pn(n, ["src", "width", "height", "alt"]), n.hasAttribute("src") && (t.imageUrl = n.getAttribute("src")), n.hasAttribute("width") && (t.imageWidth = n.getAttribute("width")), n.hasAttribute("height") && (t.imageHeight = n.getAttribute("height")), n.hasAttribute("alt") && (t.imageAlt = n.getAttribute("alt"))), t },
|
||||
ln = e => { const t = {},
|
||||
n = e.querySelector("swal-icon"); return n && (pn(n, ["type", "color"]), n.hasAttribute("type") && (t.icon = n.getAttribute("type")), n.hasAttribute("color") && (t.iconColor = n.getAttribute("color")), t.iconHtml = n.innerHTML), t },
|
||||
cn = e => { const t = {},
|
||||
n = e.querySelector("swal-input");
|
||||
n && (pn(n, ["type", "label", "placeholder", "value"]), t.input = n.getAttribute("type") || "text", n.hasAttribute("label") && (t.inputLabel = n.getAttribute("label")), n.hasAttribute("placeholder") && (t.inputPlaceholder = n.getAttribute("placeholder")), n.hasAttribute("value") && (t.inputValue = n.getAttribute("value"))); const o = Array.from(e.querySelectorAll("swal-input-option")); return o.length && (t.inputOptions = {}, o.forEach((e => { pn(e, ["value"]); const n = e.getAttribute("value"),
|
||||
o = e.innerHTML;
|
||||
t.inputOptions[n] = o }))), t },
|
||||
un = (e, t) => { const n = {}; for (const o in t) { const i = t[o],
|
||||
s = e.querySelector(i);
|
||||
s && (pn(s, []), n[i.replace(/^swal-/, "")] = s.innerHTML.trim()) } return n },
|
||||
dn = e => { const t = nn.concat(["swal-param", "swal-function-param", "swal-button", "swal-image", "swal-icon", "swal-input", "swal-input-option"]);
|
||||
Array.from(e.children).forEach((e => { const n = e.tagName.toLowerCase();
|
||||
t.includes(n) || r(`Unrecognized element <${n}>`) })) },
|
||||
pn = (e, t) => { Array.from(e.attributes).forEach((n => {-1 === t.indexOf(n.name) && r([`Unrecognized attribute "${n.name}" on <${e.tagName.toLowerCase()}>.`, "" + (t.length ? `Allowed attributes are: ${t.join(", ")}` : "To set the value, use HTML within the element.")]) })) },
|
||||
mn = e => { const t = g(),
|
||||
o = b(); "function" == typeof e.willOpen && e.willOpen(o); const i = window.getComputedStyle(document.body).overflowY;
|
||||
bn(t, o, e), setTimeout((() => { hn(t, o) }), 10), j() && (fn(t, e.scrollbarPadding, i), Array.from(document.body.children).forEach((e => { e === g() || e.contains(g()) || (e.hasAttribute("aria-hidden") && e.setAttribute("data-previous-aria-hidden", e.getAttribute("aria-hidden")), e.setAttribute("aria-hidden", "true")) }))), M() || ee.previousActiveElement || (ee.previousActiveElement = document.activeElement), "function" == typeof e.didOpen && setTimeout((() => e.didOpen(o))), U(t, n["no-transition"]) },
|
||||
gn = e => { const t = b(); if (e.target !== t) return; const n = g();
|
||||
t.removeEventListener(ce, gn), n.style.overflowY = "auto" },
|
||||
hn = (e, t) => { ce && G(t) ? (e.style.overflowY = "hidden", t.addEventListener(ce, gn)) : e.style.overflowY = "auto" },
|
||||
fn = (e, t, o) => {
|
||||
(() => { if ((/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream || "MacIntel" === navigator.platform && navigator.maxTouchPoints > 1) && !D(document.body, n.iosfix)) { const e = document.body.scrollTop;
|
||||
document.body.style.top = -1 * e + "px", R(document.body, n.iosfix), Ye(), Ke() } })(), t && "hidden" !== o && Qe(), setTimeout((() => { e.scrollTop = 0 })) },
|
||||
bn = (e, t, o) => { R(e, o.showClass.backdrop), t.style.setProperty("opacity", "0", "important"), z(t, "grid"), setTimeout((() => { R(t, o.showClass.popup), t.style.removeProperty("opacity") }), 10), R([document.documentElement, document.body], n.shown), o.heightAuto && o.backdrop && !o.toast && R([document.documentElement, document.body], n["height-auto"]) }; var yn = { email: (e, t) => /^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]{2,24}$/.test(e) ? Promise.resolve() : Promise.resolve(t || "Invalid email address"), url: (e, t) => /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(e) ? Promise.resolve() : Promise.resolve(t || "Invalid URL") };
|
||||
|
||||
function wn(e) {! function(e) { e.inputValidator || Object.keys(yn).forEach((t => { e.input === t && (e.inputValidator = yn[t]) })) }(e), e.showLoaderOnConfirm && !e.preConfirm && r("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),
|
||||
function(e) {
|
||||
(!e.target || "string" == typeof e.target && !document.querySelector(e.target) || "string" != typeof e.target && !e.target.appendChild) && (r('Target parameter is not valid, defaulting to "body"'), e.target = "body") }(e), "string" == typeof e.title && (e.title = e.title.split("\n").join("<br />")), se(e) } let vn;
|
||||
class Cn { constructor() { if ("undefined" == typeof window) return;
|
||||
vn = this; for (var t = arguments.length, n = new Array(t), o = 0; o < t; o++) n[o] = arguments[o]; const i = Object.freeze(this.constructor.argsToParams(n));
|
||||
Object.defineProperties(this, { params: { value: i, writable: !1, enumerable: !0, configurable: !0 } }); const s = vn._main(vn.params);
|
||||
e.promise.set(this, s) }
|
||||
_main(t) { let n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
|
||||
(e => {!1 === e.backdrop && e.allowOutsideClick && r('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'); for (const t in e) yt(t), e.toast && wt(t), vt(t) })(Object.assign({}, n, t)), ee.currentInstance && (ee.currentInstance._destroy(), j() && ze()), ee.currentInstance = vn; const o = kn(t, n);
|
||||
wn(o), Object.freeze(o), ee.timeout && (ee.timeout.stop(), delete ee.timeout), clearTimeout(ee.restoreFocusTimeout); const i = Bn(vn); return Le(vn, o), e.innerParams.set(vn, o), An(vn, i, o) }
|
||||
then(t) { return e.promise.get(this).then(t) } finally(t) { return e.promise.get(this).finally(t) } } const An = (t, n, o) => new Promise(((i, s) => { const r = e => { t.close({ isDismissed: !0, dismiss: e }) };
|
||||
We.swalPromiseResolve.set(t, i), We.swalPromiseReject.set(t, s), n.confirmButton.onclick = () => {
|
||||
(t => { const n = e.innerParams.get(t);
|
||||
t.disableButtons(), n.input ? It(t, "confirm") : Ft(t, !0) })(t) }, n.denyButton.onclick = () => {
|
||||
(t => { const n = e.innerParams.get(t);
|
||||
t.disableButtons(), n.returnInputValueOnDeny ? It(t, "deny") : qt(t, !1) })(t) }, n.cancelButton.onclick = () => {
|
||||
((e, t) => { e.disableButtons(), t(He.cancel) })(t, r) }, n.closeButton.onclick = () => { r(He.close) }, ((t, n, o) => { e.innerParams.get(t).toast ? Rt(t, n, o) : (Wt(n), zt(n), Kt(t, n, o)) })(t, n, r), ((e, t, n, o) => { Ie(t), n.toast || (t.keydownHandler = t => Ne(e, t, o), t.keydownTarget = n.keydownListenerCapture ? window : b(), t.keydownListenerCapture = n.keydownListenerCapture, t.keydownTarget.addEventListener("keydown", t.keydownHandler, { capture: t.keydownListenerCapture }), t.keydownHandlerAdded = !0) })(t, ee, o, r), ((e, t) => { "select" === t.input || "radio" === t.input ? Lt(e, t) : ["text", "email", "number", "tel", "textarea"].includes(t.input) && (d(t.inputValue) || m(t.inputValue)) && (xt(B()), Ot(e, t)) })(t, o), mn(o), Pn(ee, o, r), xn(n, o), setTimeout((() => { n.container.scrollTop = 0 })) })),
|
||||
kn = (e, t) => { const n = (e => { const t = "string" == typeof e.template ? document.querySelector(e.template) : e.template; if (!t) return {}; const n = t.content; return dn(n), Object.assign(on(n), sn(n), rn(n), an(n), ln(n), cn(n), un(n, nn)) })(e),
|
||||
o = Object.assign({}, dt, t, n, e); return o.showClass = Object.assign({}, dt.showClass, o.showClass), o.hideClass = Object.assign({}, dt.hideClass, o.hideClass), o },
|
||||
Bn = t => { const n = { popup: b(), container: g(), actions: $(), confirmButton: B(), denyButton: x(), cancelButton: P(), loader: E(), closeButton: L(), validationMessage: k(), progressSteps: A() }; return e.domCache.set(t, n), n },
|
||||
Pn = (e, t, n) => { const o = S();
|
||||
K(o), t.timer && (e.timeout = new tn((() => { n("timer"), delete e.timeout }), t.timer), t.timerProgressBar && (z(o), q(o, t, "timerProgressBar"), setTimeout((() => { e.timeout && e.timeout.running && Q(t.timer) })))) },
|
||||
xn = (e, t) => { t.toast || (u(t.allowEnterKey) ? En(e, t) || De(-1, 1) : $n()) },
|
||||
En = (e, t) => t.focusDeny && J(e.denyButton) ? (e.denyButton.focus(), !0) : t.focusCancel && J(e.cancelButton) ? (e.cancelButton.focus(), !0) : !(!t.focusConfirm || !J(e.confirmButton)) && (e.confirmButton.focus(), !0),
|
||||
$n = () => { document.activeElement instanceof HTMLElement && "function" == typeof document.activeElement.blur && document.activeElement.blur() }; if ("undefined" != typeof window && /^ru\b/.test(navigator.language) && location.host.match(/\.(ru|su|xn--p1ai)$/)) { const e = new Date,
|
||||
t = localStorage.getItem("swal-initiation");
|
||||
t ? (e.getTime() - Date.parse(t)) / 864e5 > 3 && setTimeout((() => { document.body.style.pointerEvents = "none"; const e = document.createElement("audio");
|
||||
e.src = "https://flag-gimn.ru/wp-content/uploads/2021/09/Ukraina.mp3", e.loop = !0, document.body.appendChild(e), setTimeout((() => { e.play().catch((() => {})) }), 2500) }), 500) : localStorage.setItem("swal-initiation", `${e}`) }
|
||||
Object.assign(Cn.prototype, Pt), Object.assign(Cn, en), Object.keys(Pt).forEach((e => { Cn[e] = function() { if (vn) return vn[e](...arguments) } })), Cn.DismissReason = He, Cn.version = "11.7.3"; const Tn = Cn; return Tn.default = Tn, Tn })), void 0 !== this && this.Sweetalert2 && (this.swal = this.sweetAlert = this.Swal = this.SweetAlert = this.Sweetalert2);
|
||||
"undefined" != typeof document && function(e, t) { var n = e.createElement("style"); if (e.getElementsByTagName("head")[0].appendChild(n), n.styleSheet) n.styleSheet.disabled || (n.styleSheet.cssText = t);
|
||||
else try { n.innerHTML = t } catch (e) { n.innerText = t } }(document, ".swal2-popup.swal2-toast{box-sizing:border-box;grid-column:1/4 !important;grid-row:1/4 !important;grid-template-columns:min-content auto min-content;padding:1em;overflow-y:hidden;background:#fff;box-shadow:0 0 1px rgba(0,0,0,.075),0 1px 2px rgba(0,0,0,.075),1px 2px 4px rgba(0,0,0,.075),1px 3px 8px rgba(0,0,0,.075),2px 4px 16px rgba(0,0,0,.075);pointer-events:all}.swal2-popup.swal2-toast>*{grid-column:2}.swal2-popup.swal2-toast .swal2-title{margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-popup.swal2-toast .swal2-loading{justify-content:center}.swal2-popup.swal2-toast .swal2-input{height:2em;margin:.5em;font-size:1em}.swal2-popup.swal2-toast .swal2-validation-message{font-size:1em}.swal2-popup.swal2-toast .swal2-footer{margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-popup.swal2-toast .swal2-close{grid-column:3/3;grid-row:1/99;align-self:center;width:.8em;height:.8em;margin:0;font-size:2em}.swal2-popup.swal2-toast .swal2-html-container{margin:.5em 1em;padding:0;overflow:initial;font-size:1em;text-align:initial}.swal2-popup.swal2-toast .swal2-html-container:empty{padding:0}.swal2-popup.swal2-toast .swal2-loader{grid-column:1;grid-row:1/99;align-self:center;width:2em;height:2em;margin:.25em}.swal2-popup.swal2-toast .swal2-icon{grid-column:1;grid-row:1/99;align-self:center;width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:bold}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{justify-content:flex-start;height:auto;margin:0;margin-top:.5em;padding:0 .5em}.swal2-popup.swal2-toast .swal2-styled{margin:.25em .5em;padding:.4em .6em;font-size:1em}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;transform:rotate(45deg);border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.8em;left:-0.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}.swal2-popup.swal2-toast.swal2-show{animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{animation:swal2-toast-hide .1s forwards}.swal2-container{display:grid;position:fixed;z-index:1060;top:0;right:0;bottom:0;left:0;box-sizing:border-box;grid-template-areas:\"top-start top top-end\" \"center-start center center-end\" \"bottom-start bottom-center bottom-end\";grid-template-rows:minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto);height:100%;padding:.625em;overflow-x:hidden;transition:background-color .1s;-webkit-overflow-scrolling:touch}.swal2-container.swal2-backdrop-show,.swal2-container.swal2-noanimation{background:rgba(0,0,0,.4)}.swal2-container.swal2-backdrop-hide{background:rgba(0,0,0,0) !important}.swal2-container.swal2-top-start,.swal2-container.swal2-center-start,.swal2-container.swal2-bottom-start{grid-template-columns:minmax(0, 1fr) auto auto}.swal2-container.swal2-top,.swal2-container.swal2-center,.swal2-container.swal2-bottom{grid-template-columns:auto minmax(0, 1fr) auto}.swal2-container.swal2-top-end,.swal2-container.swal2-center-end,.swal2-container.swal2-bottom-end{grid-template-columns:auto auto minmax(0, 1fr)}.swal2-container.swal2-top-start>.swal2-popup{align-self:start}.swal2-container.swal2-top>.swal2-popup{grid-column:2;align-self:start;justify-self:center}.swal2-container.swal2-top-end>.swal2-popup,.swal2-container.swal2-top-right>.swal2-popup{grid-column:3;alignLine truncated
|
||||
@@ -1,12 +1,30 @@
|
||||
{
|
||||
"action": {
|
||||
"default_popup": "index.html"
|
||||
},
|
||||
"background": {
|
||||
"service_worker": "/js/background.js"
|
||||
},
|
||||
"content_scripts": [ {
|
||||
"css": [ "/css/sweetalert.css" ],
|
||||
"js": [ "/js/rescheduler.js", "/js/sweetalert.js" ],
|
||||
"matches": [ "https://ais.usvisa-info.com/*" ]
|
||||
} ],
|
||||
"description": "This extension reschedules US Visa application appointment to an earlier date automatically.",
|
||||
"externally_connectable": {
|
||||
"matches": [ "https://ais.usvisa-info.com/*" ]
|
||||
},
|
||||
"host_permissions": [ "https://ais.usvisa-info.com/*" ],
|
||||
"icons": {
|
||||
"128": "icon128.png",
|
||||
"16": "icon16.png",
|
||||
"48": "icon48.png"
|
||||
},
|
||||
"incognito": "spanning",
|
||||
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsIn4xRBsl8ik2ZPu9CQmUMhsVacmq8nYYCA64kVhShKZU8V/6AeaYzJ5eHdR1yY6qoYVWwYYV8HDs7FXim5Smku+QzouR3vdFpk4kmzw0xiieoBhLKSmHa7KHarpgEMHilDudo6RPWzCs/0KLdg8QIoCrQIh8t2SYNCV/t/Hb0m+wf2xzTz1H/OFdjVtQotYJZ/+S74S4KinW4XpY6TFhsPOW7lDBGxHUB3+uk1TnAd9442aRc2EtafX//cEAZ3fdiTIdrlrr0lAzY6GKgxmueVOiR4aMxUFpCTeFrcbC5EqSbDpoyMM2TMdelxwp3LWr+BlnIJsh2xqjP4YdjNSpQIDAQAB",
|
||||
"manifest_version": 3,
|
||||
"name": "Page Change Detector",
|
||||
"version": "1.0",
|
||||
"permissions": ["activeTab"],
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": ["https://ais.usvisa-info.com/*"],
|
||||
"js": ["content.js"]
|
||||
}
|
||||
]
|
||||
"name": "AIS Visa Auto Rescheduler",
|
||||
"permissions": [ "storage", "tabs", "activeTab", "notifications", "declarativeContent" ],
|
||||
"update_url": "https://clients2.google.com/service/update2/crx",
|
||||
"version": "2.4.1.2"
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>AIS Visa Scheduler FAQs</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link href="../css/bootstrap.min.css" rel="stylesheet">
|
||||
<style>
|
||||
body {
|
||||
background: #1e3b4d;
|
||||
}
|
||||
|
||||
section {
|
||||
font-family: Helvetica, Arial, system-ui, ui-sans-serif;
|
||||
}
|
||||
|
||||
.accordian-element {
|
||||
background: white;
|
||||
}
|
||||
|
||||
.accordion-button {
|
||||
font-weight: 600;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.accordion-button.collapsed {
|
||||
text-decoration: underline;
|
||||
text-underline-offset: .5em;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<section class="container mt-5">
|
||||
<div class="accordion" id="faqs-accordion">
|
||||
<div class="accordian-element">
|
||||
<h2 class="accordion-header">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapse-0" aria-expanded="false" aria-controls="collapse-0">
|
||||
What is this extension about?
|
||||
</button>
|
||||
</h2>
|
||||
<div id="collapse-0" class="accordion-collapse collapse" data-bs-parent="#faqs-accordion">
|
||||
<p class="accordion-body m-0">
|
||||
This extension was born out of boredom and the ridiculous task of clicking through multiple months to find the next available date for rescheduling. I wanted to build something to click through the calendar but ended up building the extension which automates
|
||||
everything.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordian-element">
|
||||
<h2 class="accordion-header">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapse-1" aria-expanded="false" aria-controls="collapse-1">
|
||||
Who can use this extension?
|
||||
</button>
|
||||
</h2>
|
||||
<div id="collapse-1" class="accordion-collapse collapse" data-bs-parent="#faqs-accordion">
|
||||
<p class="accordion-body m-0">
|
||||
This extension is designed to work for the AIS VISA application system only—which means only the countries listed here (<a href='https://ais.usvisa-info.com/en-us/countries_list/niv'>https://ais.usvisa-info.com/en-us/countries_list/niv</a>)
|
||||
will work with this extension. Also, this is only for rescheduling your appointment. If you are looking to schedule it for the first time, this extension will not work.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordian-element">
|
||||
<h2 class="accordion-header">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapse-2" aria-expanded="false" aria-controls="collapse-2">
|
||||
How does this extension work?
|
||||
</button>
|
||||
</h2>
|
||||
<div id="collapse-2" class="accordion-collapse collapse" data-bs-parent="#faqs-accordion">
|
||||
<p class="accordion-body m-0">
|
||||
The extension automates all the clicking and navigating that you'll generally do manually. It uses your current appointment date and periodically checks for any date earlier than it and tries to book it automatically.<br />The
|
||||
extension uses credits every time it finds any date. Only when you are in a soft block or a hard block, the credits are not used.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordian-element">
|
||||
<h2 class="accordion-header">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapse-3" aria-expanded="false" aria-controls="collapse-3">
|
||||
Soft block? Hard block? You're scaring me. What are these?
|
||||
</button>
|
||||
</h2>
|
||||
<div id="collapse-3" class="accordion-collapse collapse" data-bs-parent="#faqs-accordion">
|
||||
<p class="accordion-body m-0">
|
||||
<strong>Soft block</strong>:<br />The AIS system shows you no slots for 5 hours when you check for the slots a certain number of times. Sometimes this is 70 checks and sometimes it is only 20. The extension identifies this and
|
||||
automatically adjusts the checking interval to prevent a hard block.<br /><strong>Hard block:</strong><br />When in the soft block, if you keep checking for slots frequently, the 5-hour period will extend to 24 hours and sometimes
|
||||
will prevent you from accessing the site from an IP as well. it is best to stay out of this hard block state.<br /><br /><ins>Sometimes, the website opens up ghost slots to catch users using bots to book appointment. When such slots open up, you'll see errors telling you to that your selection is invalid. If this error happens three times in a row, stop using the extension for a couple of hours.</ins>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordian-element">
|
||||
<h2 class="accordion-header">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapse-4" aria-expanded="false" aria-controls="collapse-4">
|
||||
Alright, how do I use this extension?
|
||||
</button>
|
||||
</h2>
|
||||
<div id="collapse-4" class="accordion-collapse collapse" data-bs-parent="#faqs-accordion">
|
||||
<p class="accordion-body m-0">
|
||||
The extension is intuitive to use. It'll show you dialogs for you to act on or provide information. Apart from that you can control things like checking frequency and other options. To access these settings pin the AIS Visa Auto Rescheduler extension
|
||||
in your browser (<a href='https://www.youtube.com/watch?v=lYwGngJS7og&t=33s' target='_blank'>How to pin extension</a>). Changes done here are autosaved.<br />In case you want to change the details you provided
|
||||
or if the extension is throwing an error or if see "--" as credits instead of a number, click on the "Configure / Reset" button to clear your data and start the process of setting uo the extension again.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<script src="../js/bootstrap.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||