From 50543da1aa4454e195cfbb49bb8ae8a774e84da6 Mon Sep 17 00:00:00 2001 From: Akromjon <152626511+RustamovAkrom@users.noreply.github.com> Date: Mon, 11 Nov 2024 14:03:44 +0500 Subject: [PATCH 1/2] full commit --- apps/users/forms.py | 15 +++++++++++++-- apps/users/views.py | 7 ++++--- core/config/apps.py | 1 + db.sqlite3 | Bin 356352 -> 356352 bytes templates/auth/login.html | 17 +++++++++++------ templates/auth/register.html | 30 +++++++++++++++++++++++++++++- templates/base.html | 15 +++++++++++---- 7 files changed, 69 insertions(+), 16 deletions(-) diff --git a/apps/users/forms.py b/apps/users/forms.py index 5ef801b..9abcbc4 100644 --- a/apps/users/forms.py +++ b/apps/users/forms.py @@ -6,25 +6,36 @@ class LoginForm(forms.Form): username = forms.CharField( - max_length=28, + max_length=150, widget=forms.TextInput( attrs={"placeholder": "Username...", "class": "form-control rounded-4"} ), + error_messages={ + "required": "Username is required!", + 'max_length': "Username is too lang, max length is 150 charecters." + } ) password = forms.CharField( max_length=60, widget=forms.PasswordInput( attrs={"placeholder": "Password...", "class": "form-control rounded-4"} ), + error_messages={ + "required": "Password is required!", + "max_length": "Password is to long, max length is 60 charecters." + } ) class RegisterForm(forms.ModelForm): password1 = forms.CharField( + label="Password", max_length=28, widget=forms.PasswordInput(attrs={"id": "password", "type": "password"}), + ) password2 = forms.CharField( + label="Password (Confirm)", max_length=28, widget=forms.PasswordInput(attrs={"id": "password", "type": "password"}), ) @@ -39,7 +50,7 @@ def save(self, commit=True): user.set_password(password1) user.save() else: - raise ValidationError("Password must be match") + return ValidationError("Passwords must be match!") def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/apps/users/views.py b/apps/users/views.py index 17648dd..208f1d8 100644 --- a/apps/users/views.py +++ b/apps/users/views.py @@ -20,14 +20,14 @@ def get(self, request): def post(self, request): - form = RegisterForm(request.POST, request.FILES) + form = RegisterForm(request.POST) if form.is_valid(): form.save() messages.success(request, "User succesfully registered") return redirect(reverse("users:login")) - messages.warning(request, "Error registered!") + messages.warning(request, "Invalid registration fields!") return render(request, "auth/register.html", {"form": form}) @@ -43,6 +43,7 @@ def post(self, request): if form.is_valid(): username = form.cleaned_data.get("username") password = form.cleaned_data.get("password") + user = authenticate(username=username, password=password) if user is not None: @@ -58,7 +59,7 @@ def post(self, request): response.set_cookie("access_token", access_token, httponly=True) response.set_cookie("refresh_token", refresh_token, httponly=True) - messages.info(request, f"You are logged in as { username }") + messages.success(request, f"You are logged in as { username }") return response else: diff --git a/core/config/apps.py b/core/config/apps.py index 3040d7e..c127e9e 100644 --- a/core/config/apps.py +++ b/core/config/apps.py @@ -21,4 +21,5 @@ "rest_framework", "rest_framework_simplejwt", "rest_framework_simplejwt.token_blacklist", + ] \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 index a3bb520c42deca6a798dca028aa680ac785996a2..177f47fe1b1bec5fac6d04e2a40d26e7ce47d00d 100644 GIT binary patch delta 4102 zcmaJ^Ym6IL6`omdlC{0|%`RCoq6s@@7*3YaqeEk-_;YI)ZHl9DJKeMEx z@mr$lV|O2JoFev?_wfhdmFDud47!y!Fw-}T#L63YN#aKr>EfXhb( zrM@JlJcO^(7z9UwL15%2gRTs<<@C1--l`Om{M%VqVLKR4%0X{}4!I&kz~zuKag`sT zLh-~fL#gA5ekkVa`0B|~HtjEosfZM+cm(T}c06n84xt$6x7%)}lok9nFDtPMjfH;jd*El|_0Grz&yTC+8w4-<5Q~H>^S_R#bXSFum<;l;9>=-fA>j-T()k!=9JT zRkE3_bdK)0QbiA4<1Fn8or&dAWP5YKyRZ3J|CMAc#SN(LR?6w>GGxvLL!AOGI+=We z^H-9->{g#k4M$PGzsk$yU?*9M#L{w-8FW)oHw?I1rEXDSs?KX2XN=8LmU7k2_)DX7 zl<^mm{4lkXjT1q)+g|rDtcQtuqQQ8mOUqQx5(o!;^>CMw+Cq;k)O<`j=dm>9R;W;I z52#VPTH}iKnjrg;d)T&#u9dc+GgCDki9M`K7X?p^JIFCbk*S& zT8XMZvN_sGySPd>z?1Gq(MK05+fr-T8M0wGV%<)X$VCz?tkgU^VQH=`DBec1R)J&% zNX?eT7%3GYBf`AEv9JV5PRJG33VE0liaCzvc&b>uQCv~W;`4j|`UGxVdJH$ekD1?J zb>{s>jUufAK~mJjt8#b}G?4xnx66y%k~T}(RKrsb?|%e zEASuiPw*c23HTwn3%(2PfZO1C@Z8KsRY=BjCF@2W}n zZR#-`7%*Tkv}PZ)iz$QhC8NQNnXnbwWLnYN?RNKk92915OAk6HOQ4&2F~Sk(n9hC% zOgJji9%rmm5Yh5W$~bkOE6bu(v*sHzhAkUaIhQ7Ko|=_2=XKmtd5&S`TLN={@GJ%A zySoNKN))tt>Ncnws8yl+G7@oqB7!**F(=@l`;w%_GIRIB6ya%>Sz6&UU zrsi)-I6(x8(v+>Deu`=#t&oWdq(_?(yrC81J=~qybx&>&5`DvJ!l}_F2t|+#N7-hQ zrG*v<(W=1S-MbLf?Vm@7`vVMo09vyT>i;RAoIyXnj%ruUtBAI^W56)1Iy4F|cp`GdQ7rkia+1 z$~m1IZ)^L(+(A^8{&qTH{*@=bUaXR@L$Y6ch|1Ja_~`b*`TiLvR+-pg%wrhCr_y=9zUsu zSwEq=Lbo=uC-?sSO`YM~;|B9h4E)agj`_b}6MWr#6MP!TV9)$2N^!>=yr2u8b@rs> zKYJv2>KBW(cXt2) diff --git a/templates/auth/login.html b/templates/auth/login.html index a05f3c3..932e6f6 100644 --- a/templates/auth/login.html +++ b/templates/auth/login.html @@ -4,11 +4,6 @@ {% block title %} Login {% endblock %} {% block content %} -{% for message in massages %} -
-
{{ message }}
-
-{% endfor %}
@@ -23,7 +18,17 @@

Login

enctype="multipart/form-data" > {% csrf_token %} - {{ form.as_p }} +

+ + {{ form.username.errors }} + {{ form.username }} +

+

+ + {{ form.username.errors }} + {{ form.password }} +

+

You have an create account? Register

diff --git a/templates/auth/register.html b/templates/auth/register.html index 8cc91cf..a94e387 100644 --- a/templates/auth/register.html +++ b/templates/auth/register.html @@ -6,12 +6,40 @@

Register

+
{% csrf_token %} - {{ form.as_p }} +

+ +

+ {{ form.username.errors }} +
+ {{ form.username }} +

+

+ +

+ {{ form.email.errors }} +
+ {{ form.email }} +

+

+ +

+ {{ form.password1.errors }} +
+ {{ form.password1 }} +

+

+ +

+ {{ form.password2.errors }} +
+ {{ form.password2 }} +

Already have an account? diff --git a/templates/base.html b/templates/base.html index 7ff8aef..8e59f30 100644 --- a/templates/base.html +++ b/templates/base.html @@ -24,10 +24,17 @@ {% if messages %} {% for message in messages %} -

+ {% if message.tags == 'error' %} + + {% else %} + + {% endif %} {% endfor %} {% endif %} From cfb193825e7e4b08a10ddc0c1cd9abe133ddbe22 Mon Sep 17 00:00:00 2001 From: Akromjon <152626511+RustamovAkrom@users.noreply.github.com> Date: Tue, 12 Nov 2024 14:24:18 +0500 Subject: [PATCH 2/2] test docker and configure security --- .gitignore | 2 + apps/blog/views.py | 2 +- .../shared/management/__init__.py | 0 apps/shared/management/commands/__init__.py | 0 .../shared/management/commands/createadmin.py | 28 + apps/users/middleware.py | 29 +- core/config/jwt.py | 8 +- core/settings/base.py | 103 + core/settings/development.py | 3 + core/settings/production.py | 28 + core/{settings.py => settings_example.py} | 0 core/urls.py | 2 +- db.sqlite3 | Bin 356352 -> 0 bytes manage.py | 8 +- ...ence_room_setting_with_modern_lightin.webp | Bin 278250 -> 0 bytes requirements.dev.txt | 33 +- requirements.txt | 15 +- security/.gitignore | 2 + security_settings/private_key.pem | 28 - security_settings/public_key.pem | 9 - staticfiles/admin/css/autocomplete.css | 279 - staticfiles/admin/css/base.css | 1179 -- staticfiles/admin/css/changelists.css | 343 - staticfiles/admin/css/dark_mode.css | 130 - staticfiles/admin/css/dashboard.css | 29 - staticfiles/admin/css/forms.css | 508 - staticfiles/admin/css/login.css | 61 - staticfiles/admin/css/nav_sidebar.css | 150 - staticfiles/admin/css/responsive.css | 967 -- staticfiles/admin/css/responsive_rtl.css | 111 - staticfiles/admin/css/rtl.css | 291 - .../admin/css/unusable_password_field.css | 19 - .../css/vendor/select2/LICENSE-SELECT2.md | 21 - .../admin/css/vendor/select2/select2.css | 481 - .../admin/css/vendor/select2/select2.min.css | 1 - staticfiles/admin/css/widgets.css | 593 - staticfiles/admin/img/LICENSE | 20 - staticfiles/admin/img/README.txt | 7 - staticfiles/admin/img/calendar-icons.svg | 63 - staticfiles/admin/img/gis/move_vertex_off.svg | 1 - staticfiles/admin/img/gis/move_vertex_on.svg | 1 - staticfiles/admin/img/icon-addlink.svg | 3 - staticfiles/admin/img/icon-alert.svg | 3 - staticfiles/admin/img/icon-calendar.svg | 9 - staticfiles/admin/img/icon-changelink.svg | 3 - staticfiles/admin/img/icon-clock.svg | 9 - staticfiles/admin/img/icon-deletelink.svg | 3 - staticfiles/admin/img/icon-hidelink.svg | 3 - staticfiles/admin/img/icon-no.svg | 3 - staticfiles/admin/img/icon-unknown-alt.svg | 3 - staticfiles/admin/img/icon-unknown.svg | 3 - staticfiles/admin/img/icon-viewlink.svg | 3 - staticfiles/admin/img/icon-yes.svg | 3 - staticfiles/admin/img/inline-delete.svg | 3 - staticfiles/admin/img/search.svg | 3 - staticfiles/admin/img/selector-icons.svg | 34 - staticfiles/admin/img/sorting-icons.svg | 19 - staticfiles/admin/img/tooltag-add.svg | 3 - staticfiles/admin/img/tooltag-arrowright.svg | 3 - staticfiles/admin/js/SelectBox.js | 116 - staticfiles/admin/js/SelectFilter2.js | 286 - staticfiles/admin/js/actions.js | 204 - .../admin/js/admin/DateTimeShortcuts.js | 408 - .../admin/js/admin/RelatedObjectLookups.js | 240 - staticfiles/admin/js/autocomplete.js | 33 - staticfiles/admin/js/calendar.js | 239 - staticfiles/admin/js/cancel.js | 29 - staticfiles/admin/js/change_form.js | 16 - staticfiles/admin/js/core.js | 184 - staticfiles/admin/js/filters.js | 30 - staticfiles/admin/js/inlines.js | 359 - staticfiles/admin/js/jquery.init.js | 8 - staticfiles/admin/js/nav_sidebar.js | 79 - staticfiles/admin/js/popup_response.js | 15 - staticfiles/admin/js/prepopulate.js | 43 - staticfiles/admin/js/prepopulate_init.js | 15 - staticfiles/admin/js/theme.js | 51 - .../admin/js/unusable_password_field.js | 29 - staticfiles/admin/js/urlify.js | 169 - .../admin/js/vendor/jquery/LICENSE.txt | 20 - staticfiles/admin/js/vendor/jquery/jquery.js | 10716 ---------------- .../admin/js/vendor/jquery/jquery.min.js | 2 - .../admin/js/vendor/select2/LICENSE.md | 21 - .../admin/js/vendor/select2/i18n/af.js | 3 - .../admin/js/vendor/select2/i18n/ar.js | 3 - .../admin/js/vendor/select2/i18n/az.js | 3 - .../admin/js/vendor/select2/i18n/bg.js | 3 - .../admin/js/vendor/select2/i18n/bn.js | 3 - .../admin/js/vendor/select2/i18n/bs.js | 3 - .../admin/js/vendor/select2/i18n/ca.js | 3 - .../admin/js/vendor/select2/i18n/cs.js | 3 - .../admin/js/vendor/select2/i18n/da.js | 3 - .../admin/js/vendor/select2/i18n/de.js | 3 - .../admin/js/vendor/select2/i18n/dsb.js | 3 - .../admin/js/vendor/select2/i18n/el.js | 3 - .../admin/js/vendor/select2/i18n/en.js | 3 - .../admin/js/vendor/select2/i18n/es.js | 3 - .../admin/js/vendor/select2/i18n/et.js | 3 - .../admin/js/vendor/select2/i18n/eu.js | 3 - .../admin/js/vendor/select2/i18n/fa.js | 3 - .../admin/js/vendor/select2/i18n/fi.js | 3 - .../admin/js/vendor/select2/i18n/fr.js | 3 - .../admin/js/vendor/select2/i18n/gl.js | 3 - .../admin/js/vendor/select2/i18n/he.js | 3 - .../admin/js/vendor/select2/i18n/hi.js | 3 - .../admin/js/vendor/select2/i18n/hr.js | 3 - .../admin/js/vendor/select2/i18n/hsb.js | 3 - .../admin/js/vendor/select2/i18n/hu.js | 3 - .../admin/js/vendor/select2/i18n/hy.js | 3 - .../admin/js/vendor/select2/i18n/id.js | 3 - .../admin/js/vendor/select2/i18n/is.js | 3 - .../admin/js/vendor/select2/i18n/it.js | 3 - .../admin/js/vendor/select2/i18n/ja.js | 3 - .../admin/js/vendor/select2/i18n/ka.js | 3 - .../admin/js/vendor/select2/i18n/km.js | 3 - .../admin/js/vendor/select2/i18n/ko.js | 3 - .../admin/js/vendor/select2/i18n/lt.js | 3 - .../admin/js/vendor/select2/i18n/lv.js | 3 - .../admin/js/vendor/select2/i18n/mk.js | 3 - .../admin/js/vendor/select2/i18n/ms.js | 3 - .../admin/js/vendor/select2/i18n/nb.js | 3 - .../admin/js/vendor/select2/i18n/ne.js | 3 - .../admin/js/vendor/select2/i18n/nl.js | 3 - .../admin/js/vendor/select2/i18n/pl.js | 3 - .../admin/js/vendor/select2/i18n/ps.js | 3 - .../admin/js/vendor/select2/i18n/pt-BR.js | 3 - .../admin/js/vendor/select2/i18n/pt.js | 3 - .../admin/js/vendor/select2/i18n/ro.js | 3 - .../admin/js/vendor/select2/i18n/ru.js | 3 - .../admin/js/vendor/select2/i18n/sk.js | 3 - .../admin/js/vendor/select2/i18n/sl.js | 3 - .../admin/js/vendor/select2/i18n/sq.js | 3 - .../admin/js/vendor/select2/i18n/sr-Cyrl.js | 3 - .../admin/js/vendor/select2/i18n/sr.js | 3 - .../admin/js/vendor/select2/i18n/sv.js | 3 - .../admin/js/vendor/select2/i18n/th.js | 3 - .../admin/js/vendor/select2/i18n/tk.js | 3 - .../admin/js/vendor/select2/i18n/tr.js | 3 - .../admin/js/vendor/select2/i18n/uk.js | 3 - .../admin/js/vendor/select2/i18n/vi.js | 3 - .../admin/js/vendor/select2/i18n/zh-CN.js | 3 - .../admin/js/vendor/select2/i18n/zh-TW.js | 3 - .../admin/js/vendor/select2/select2.full.js | 6820 ---------- .../js/vendor/select2/select2.full.min.js | 2 - .../admin/js/vendor/xregexp/LICENSE.txt | 21 - .../admin/js/vendor/xregexp/xregexp.js | 6126 --------- .../admin/js/vendor/xregexp/xregexp.min.js | 17 - staticfiles/bootstrap/css/bootstrap.min.css | 7 - staticfiles/bootstrap/js/bootstrap.min.js | 7 - .../js/icons/bootstrap-icons.min.css | 5 - .../js/icons/fonts/bootstrap-icons.woff | Bin 176032 -> 0 bytes .../js/icons/fonts/bootstrap-icons.woff2 | Bin 130396 -> 0 bytes staticfiles/htmx/htmx.min.js | 1 - 153 files changed, 219 insertions(+), 31944 deletions(-) rename security_settings/.gitignore => apps/shared/management/__init__.py (100%) create mode 100644 apps/shared/management/commands/__init__.py create mode 100644 apps/shared/management/commands/createadmin.py create mode 100644 core/settings/base.py create mode 100644 core/settings/development.py create mode 100644 core/settings/production.py rename core/{settings.py => settings_example.py} (100%) delete mode 100644 db.sqlite3 delete mode 100644 media/avatars/DALLE_2024-09-27_14.30.15_-_A_young_man_with_short_hair_and_glasses_wearing_a_formal_business_suit._The_background_is_a_professional_conference_room_setting_with_modern_lightin.webp create mode 100644 security/.gitignore delete mode 100644 security_settings/private_key.pem delete mode 100644 security_settings/public_key.pem delete mode 100644 staticfiles/admin/css/autocomplete.css delete mode 100644 staticfiles/admin/css/base.css delete mode 100644 staticfiles/admin/css/changelists.css delete mode 100644 staticfiles/admin/css/dark_mode.css delete mode 100644 staticfiles/admin/css/dashboard.css delete mode 100644 staticfiles/admin/css/forms.css delete mode 100644 staticfiles/admin/css/login.css delete mode 100644 staticfiles/admin/css/nav_sidebar.css delete mode 100644 staticfiles/admin/css/responsive.css delete mode 100644 staticfiles/admin/css/responsive_rtl.css delete mode 100644 staticfiles/admin/css/rtl.css delete mode 100644 staticfiles/admin/css/unusable_password_field.css delete mode 100644 staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md delete mode 100644 staticfiles/admin/css/vendor/select2/select2.css delete mode 100644 staticfiles/admin/css/vendor/select2/select2.min.css delete mode 100644 staticfiles/admin/css/widgets.css delete mode 100644 staticfiles/admin/img/LICENSE delete mode 100644 staticfiles/admin/img/README.txt delete mode 100644 staticfiles/admin/img/calendar-icons.svg delete mode 100644 staticfiles/admin/img/gis/move_vertex_off.svg delete mode 100644 staticfiles/admin/img/gis/move_vertex_on.svg delete mode 100644 staticfiles/admin/img/icon-addlink.svg delete mode 100644 staticfiles/admin/img/icon-alert.svg delete mode 100644 staticfiles/admin/img/icon-calendar.svg delete mode 100644 staticfiles/admin/img/icon-changelink.svg delete mode 100644 staticfiles/admin/img/icon-clock.svg delete mode 100644 staticfiles/admin/img/icon-deletelink.svg delete mode 100644 staticfiles/admin/img/icon-hidelink.svg delete mode 100644 staticfiles/admin/img/icon-no.svg delete mode 100644 staticfiles/admin/img/icon-unknown-alt.svg delete mode 100644 staticfiles/admin/img/icon-unknown.svg delete mode 100644 staticfiles/admin/img/icon-viewlink.svg delete mode 100644 staticfiles/admin/img/icon-yes.svg delete mode 100644 staticfiles/admin/img/inline-delete.svg delete mode 100644 staticfiles/admin/img/search.svg delete mode 100644 staticfiles/admin/img/selector-icons.svg delete mode 100644 staticfiles/admin/img/sorting-icons.svg delete mode 100644 staticfiles/admin/img/tooltag-add.svg delete mode 100644 staticfiles/admin/img/tooltag-arrowright.svg delete mode 100644 staticfiles/admin/js/SelectBox.js delete mode 100644 staticfiles/admin/js/SelectFilter2.js delete mode 100644 staticfiles/admin/js/actions.js delete mode 100644 staticfiles/admin/js/admin/DateTimeShortcuts.js delete mode 100644 staticfiles/admin/js/admin/RelatedObjectLookups.js delete mode 100644 staticfiles/admin/js/autocomplete.js delete mode 100644 staticfiles/admin/js/calendar.js delete mode 100644 staticfiles/admin/js/cancel.js delete mode 100644 staticfiles/admin/js/change_form.js delete mode 100644 staticfiles/admin/js/core.js delete mode 100644 staticfiles/admin/js/filters.js delete mode 100644 staticfiles/admin/js/inlines.js delete mode 100644 staticfiles/admin/js/jquery.init.js delete mode 100644 staticfiles/admin/js/nav_sidebar.js delete mode 100644 staticfiles/admin/js/popup_response.js delete mode 100644 staticfiles/admin/js/prepopulate.js delete mode 100644 staticfiles/admin/js/prepopulate_init.js delete mode 100644 staticfiles/admin/js/theme.js delete mode 100644 staticfiles/admin/js/unusable_password_field.js delete mode 100644 staticfiles/admin/js/urlify.js delete mode 100644 staticfiles/admin/js/vendor/jquery/LICENSE.txt delete mode 100644 staticfiles/admin/js/vendor/jquery/jquery.js delete mode 100644 staticfiles/admin/js/vendor/jquery/jquery.min.js delete mode 100644 staticfiles/admin/js/vendor/select2/LICENSE.md delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/af.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/ar.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/az.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/bg.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/bn.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/bs.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/ca.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/cs.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/da.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/de.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/dsb.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/el.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/en.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/es.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/et.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/eu.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/fa.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/fi.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/fr.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/gl.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/he.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/hi.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/hr.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/hsb.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/hu.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/hy.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/id.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/is.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/it.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/ja.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/ka.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/km.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/ko.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/lt.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/lv.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/mk.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/ms.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/nb.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/ne.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/nl.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/pl.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/ps.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/pt-BR.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/pt.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/ro.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/ru.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/sk.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/sl.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/sq.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/sr-Cyrl.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/sr.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/sv.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/th.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/tk.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/tr.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/uk.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/vi.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/zh-CN.js delete mode 100644 staticfiles/admin/js/vendor/select2/i18n/zh-TW.js delete mode 100644 staticfiles/admin/js/vendor/select2/select2.full.js delete mode 100644 staticfiles/admin/js/vendor/select2/select2.full.min.js delete mode 100644 staticfiles/admin/js/vendor/xregexp/LICENSE.txt delete mode 100644 staticfiles/admin/js/vendor/xregexp/xregexp.js delete mode 100644 staticfiles/admin/js/vendor/xregexp/xregexp.min.js delete mode 100644 staticfiles/bootstrap/css/bootstrap.min.css delete mode 100644 staticfiles/bootstrap/js/bootstrap.min.js delete mode 100644 staticfiles/bootstrap/js/icons/bootstrap-icons.min.css delete mode 100644 staticfiles/bootstrap/js/icons/fonts/bootstrap-icons.woff delete mode 100644 staticfiles/bootstrap/js/icons/fonts/bootstrap-icons.woff2 delete mode 100644 staticfiles/htmx/htmx.min.js diff --git a/.gitignore b/.gitignore index 3d8b1d0..2835a86 100644 --- a/.gitignore +++ b/.gitignore @@ -139,3 +139,5 @@ GitHub.sublime-settings # private_key.pem # public_key.pem + +db.sqlite3 \ No newline at end of file diff --git a/apps/blog/views.py b/apps/blog/views.py index 2bb4e83..4d90e12 100644 --- a/apps/blog/views.py +++ b/apps/blog/views.py @@ -41,7 +41,7 @@ class HomePageView(TemplateView): template_name = "blog/home.html" def get(self, request): - if request.user and request.user.is_authenticated: + if request.user is not None and request.user.is_authenticated: posts = Post.objects.exclude(author=request.user) else: posts = Post.objects.all() diff --git a/security_settings/.gitignore b/apps/shared/management/__init__.py similarity index 100% rename from security_settings/.gitignore rename to apps/shared/management/__init__.py diff --git a/apps/shared/management/commands/__init__.py b/apps/shared/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/shared/management/commands/createadmin.py b/apps/shared/management/commands/createadmin.py new file mode 100644 index 0000000..c5fdfa9 --- /dev/null +++ b/apps/shared/management/commands/createadmin.py @@ -0,0 +1,28 @@ +import os + +from dotenv import load_dotenv +load_dotenv() + +from django.contrib.auth import get_user_model +from django.core.management.base import BaseCommand + + +ADMIN_USERNAME = str(os.getenv("ADMIN_USERNAME")) +ADMIN_PASSWORD = str(os.getenv("ADMIN_PASSWORD")) +ADMIN_EMAIL = str(os.getenv("ADMIN_PASSWORD")) + + +class Command(BaseCommand): + def handle(self, *args, **options): + User = get_user_model() + self.create_superuser(User, ADMIN_USERNAME, ADMIN_EMAIL, ADMIN_PASSWORD) + def create_superuser(self, User, username, email, password): + if not User.objects.filter(username=username).exists(): + User.objects.create_superuser(username, email, password) + self.stdout.write( + self.style.SUCCESS(f"Superuser {username} created successfully.") + ) + else: + self.stdout.write( + self.style.ERROR(f"Superuser {username} already exists.") + ) diff --git a/apps/users/middleware.py b/apps/users/middleware.py index c618c28..e87bb22 100644 --- a/apps/users/middleware.py +++ b/apps/users/middleware.py @@ -1,6 +1,8 @@ -from rest_framework_simplejwt.tokens import AccessToken +from rest_framework_simplejwt.tokens import AccessToken, TokenError from django.utils.deprecation import MiddlewareMixin from django.contrib.auth import get_user_model +from django.contrib.auth.models import AnonymousUser +from django.core.cache import cache User = get_user_model() @@ -10,11 +12,20 @@ class JWTAuthMiddleware(MiddlewareMixin): def process_request(self, request): access_token = request.COOKIES.get("access_token") - if access_token: - try: - token = AccessToken(access_token) - user_id = token['user_id'] - request.user = User.objects.get(id=user_id) - except Exception as e: - request.user = None - \ No newline at end of file + if not access_token: + request.user = AnonymousUser() + + cached_user = cache.get(access_token) + if cached_user: + request.user = cached_user + return + + try: + token = AccessToken(access_token) + user_id = token['user_id'] + user = User.objects.get(id=user_id) + + cache.set(access_token, user, timeout=60 * 15) + request.user = user + except (TokenError, User.DoesNotExist): + request.user = AnonymousUser() diff --git a/core/config/jwt.py b/core/config/jwt.py index 3256069..607f7ce 100644 --- a/core/config/jwt.py +++ b/core/config/jwt.py @@ -2,11 +2,13 @@ from datetime import timedelta +from dotenv import load_dotenv +load_dotenv() -with open(str(os.getenv("PRIVATE_KEY_PATH", "security_settings/private_key.pem")), "r") as f: +with open(str(os.getenv("PRIVATE_KEY_PATH")), "r") as f: PRIVATE_KEY = f.read() -with open(str(os.getenv("PUBLIC_KEY_PATH", "security_settings/public_key.pem")), "r") as f: +with open(str(os.getenv("PUBLIC_KEY_PATH")), "r") as f: PUBLIC_KEY = f.read() @@ -32,6 +34,6 @@ "TOKEN_TYPE_CLAIM": "token_type", "JTI_CLAIM": "jti", "SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp", - "SLIDING_TOKEN_LIFETIME": timedelta(minutes=5), + "SLIDING_TOKEN_LIFETIME": timedelta(seconds=1), "SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1), } \ No newline at end of file diff --git a/core/settings/base.py b/core/settings/base.py new file mode 100644 index 0000000..c71dadb --- /dev/null +++ b/core/settings/base.py @@ -0,0 +1,103 @@ +import os + +from pathlib import Path + +from core.config import * # noqa + +from dotenv import load_dotenv +load_dotenv() + +BASE_DIR = Path(__file__).resolve().parent.parent.parent + +SECRET_KEY = str(os.getenv("SECRET_KEY")) + +DEBUG = bool(os.getenv("DEBUG", True)) + +ALLOWED_HOSTS = str(os.getenv("ALLOWED_HOSTS")).split(",") + + +INSTALLED_APPS = DEFAULT_APPS + PROJECT_APPS + THIRD_PARTY_APPS + + +MIDDLEWARE = [ + "django.middleware.security.SecurityMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", + "apps.users.middleware.JWTAuthMiddleware", +] + +ROOT_URLCONF = "core.urls" + + +TEMPLATES_DIRS = ["templates"] + +TEMPLATES = [ + { + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": TEMPLATES_DIRS, + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + ], + }, + }, +] + + +WSGI_APPLICATION = "core.wsgi.application" + +DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": BASE_DIR / "db.sqlite3", + } +} + + +AUTH_PASSWORD_VALIDATORS = [ + { + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", + }, +] + +LANGUAGE_CODE = "en" + +TIME_ZONE = "Asia/Tashkent" + +USE_I18N = True +# USE_L10N = True + +USE_TZ = True + +LOGIN_URL = "/users/login/" +LOGIN_REDIRECT_URL = "/" + +STATIC_URL = "static/" +STATIC_ROOT = BASE_DIR / "staticfiles" +STATICFILES_DIRS = [BASE_DIR / "static"] + +MEDIA_URL = "media/" +MEDIA_ROOT = BASE_DIR / "media/" + +DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" + +AUTH_USER_MODEL = "users.User" + +SITE_ID = 1 diff --git a/core/settings/development.py b/core/settings/development.py new file mode 100644 index 0000000..405cc8a --- /dev/null +++ b/core/settings/development.py @@ -0,0 +1,3 @@ +from .base import * # noqa + +EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" diff --git a/core/settings/production.py b/core/settings/production.py new file mode 100644 index 0000000..b2474cd --- /dev/null +++ b/core/settings/production.py @@ -0,0 +1,28 @@ +import os + +from .base import * # noqa + +EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend" +EMAIL_HOST = "'smtp.google.com'" +EMAIL_PORT = 587 +EMAIL_HOST_USER = os.getenv("EMAIL_HOST_USER") +EMAIL_HOST_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD") +EMAIL_USE_TLS = True + +DATABASES = { + "default": { + "ENGINE": "django.db.backends.postgresql", + "NAME": str(os.getenv("POSTGRES_NAME")), + "USER": str(os.getenv("POSTGRES_USER")), + "PASSWORD": str(os.getenv("POSTGRES_PASSWORD")), + "HOST": str(os.getenv("POSTGRES_HOST")), + "PORT": int(os.getenv("POSTGRES_PORT")) + } +} + +# CACHES = { +# "default": { +# "BACKEND": "django.core.cache.backends.redis.RedisCache", +# "LOCATION": os.getenv("REDIS_CACHE_URL"), +# }, +# } diff --git a/core/settings.py b/core/settings_example.py similarity index 100% rename from core/settings.py rename to core/settings_example.py diff --git a/core/urls.py b/core/urls.py index 089ddc6..140dd64 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,6 +1,6 @@ from django.conf.urls import handler400, handler403, handler404, handler500 # noqa from django.conf.urls.static import static -from . import settings +from django.conf import settings from django.contrib import admin from django.urls import path, include diff --git a/db.sqlite3 b/db.sqlite3 deleted file mode 100644 index 177f47fe1b1bec5fac6d04e2a40d26e7ce47d00d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356352 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

r3f(%q_0l5Q{Yb!UGt4M_9?-ad~Jm)YfoC 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

>9? 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 diff --git a/requirements.dev.txt b/requirements.dev.txt index ffde0d8..12862d4 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -1,37 +1,26 @@ -aiohttp==3.7.4 asgiref==3.8.1 -async-timeout==3.0.1 -attrs==24.2.0 -bson==0.5.10 -certifi==2019.9.11 -chardet==3.0.4 -click==8.0.3 -colorama==0.4.6 -commonmark==0.9.1 +cffi==1.17.1 +cryptography==43.0.3 Django==5.1.1 django-appconf==1.0.6 -django-compressor==4.5.1 django_sitemaps==2.0.1 djangorestframework==3.15.2 djangorestframework-simplejwt==5.3.1 gunicorn==23.0.0 -idna==3.10 -jprq==2.1.0 +latex2mathml==3.77.0 lxml==5.3.0 markdown2==2.5.1 -multidict==6.1.0 -packaging==24.1 +packaging==24.2 pillow==10.4.0 -propcache==0.2.0 +psycopg2==2.9.10 +psycopg2-binary==2.9.10 +pycparser==2.22 Pygments==2.18.0 PyJWT==2.9.0 -python-dateutil==2.9.0.post0 -rcssmin==1.1.2 -rich==10.14.0 -rjsmin==1.2.2 +python-dotenv==1.0.1 +PyYAML==6.0.2 six==1.16.0 sqlparse==0.5.1 -typing_extensions==4.12.2 +svgwrite==1.4.3 tzdata==2024.2 -websockets==9.1 -yarl==1.17.1 +wavedrom==2.0.3.post3 diff --git a/requirements.txt b/requirements.txt index 92d1cbf..803907c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,11 @@ -djangorestframework==3.15.2 -djangorestframework-simplejwt==5.3.1 -Django +cryptography==43.0.3 +Django==5.1.1 django-appconf==1.0.6 django_sitemaps==2.0.1 +djangorestframework==3.15.2 +djangorestframework-simplejwt==5.3.1 gunicorn==23.0.0 -pillow -markdown2 -psycopg2 -python-dotenv \ No newline at end of file +markdown2==2.5.1 +pillow==10.4.0 +psycopg2-binary==2.9.10 +python-dotenv==1.0.1 diff --git a/security/.gitignore b/security/.gitignore new file mode 100644 index 0000000..965e610 --- /dev/null +++ b/security/.gitignore @@ -0,0 +1,2 @@ +private_key.pem +public_key.pem \ No newline at end of file diff --git a/security_settings/private_key.pem b/security_settings/private_key.pem deleted file mode 100644 index b0b66ca..0000000 --- a/security_settings/private_key.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDaOELJpHvAs1y1 -deYQa8LghmKyE0p8VcHPUUOmL9mGaBEGon1rAKvrjfR6MIP3GKgFHf2ICftmNpvU -Iu2ZhMc0UOsB++Dbo1L+B/ZYPs1nC7sRsQ2kckPRhg4tM+D7bAIMVATiU5+gtrTi -XxF/kh2v4kh9TRTEHYhnirX02Im8rfmt6nC+VrBpFHHIxf+97F7tgvJbnVr5EbXL -QrafsOR2GeYRzu7z69TGBgD4TkEFi8Qpb5uKeL2nmw/Lez8m/kvPVeu2DSA3nuwG -w4ohFMOGM3CGrep+1ULU8VKo6nqpCT3IcQo+xEcaMaqlhHjvT1mFoywCRuT3e2oL -RBicFmXzAgMBAAECggEABlQAV9GdxxpMc3SuTcaaOaGcBhb6H33rJ2RvZkfX8oZd -DAi1Q1+bHLMaplp20TkVUkSq4AGOGUo3HaE/q6aGklVQY1fXDvd/Bh/b/HYhxb24 -2Iv+Xcj0f4R4L8Zj3Val/o6HL7sGE4aI21Gvc7gchUe2G3AbTI6gsIP8v9Nxtxd0 -vOheEG7ElJ5lg1y88xduSTgEUU50tJetSZare1uJ/GNRyrX1zrLTDuB52cKQqkkq -9KWZYVZDDZ9aMNSfvvdaxy5t69gQ01ct+vVn3fvyfTWFasd8p8nUiTsgD2PxtiE4 -EfcCa6tt7VfOXJdrqDQrUpIyLmP+EgQDrNLHc0yjKQKBgQD7CoStKEdCN5fP9s9i -nrV8xPlfo9ZMFcW33U44XhgacLeKEBCVaWQfb2if8BGOVuDaIT3gqYLyoOPJTfSj -Frfmk5LVbj9h7sEZFWadtJ7Ltr3clj5s47axe/zEBizckVgMchT7AxTV2XiWvjXp -dwdGHmhPUV1dQ3q3Ts5TUhugGwKBgQDeh8UAbkdUacuMox7qMa9BcH6XDVftivLV -9G0tGE7b8jcp05MKczWBhL7SWgMfioXWujHcbZG5h9cFzxzKlztzpEMsmqWUVnh8 -Pm1yqx85UlH/7eOcr1OYrjMWNebBTpejzwqUoXjxUTFFa4uubzZtJjvn3A+FaYBe -kdVN7tefCQKBgFbz8bi4dtYsw1y5NGQIbPxmjane6d84u19QPEOx889Us34Symu2 -MYPh5u9fC/WtifyD/xbOIBlCOSQE6HOE7vXir71VjoaxWBkEHKMLaOVOyryZHc5B -oYogVBDhwrAzd7f32+SF0LWxud8cyzeujspuxdqTaC9hrCPKHBUoH4F5AoGAVaT9 -XhATZdqd24/ASzQ6Fj58ihg5mhPbKBs9lZiAaUhMkM18Dw6OLj3vzzeTciU3I5Bf -tk15Q2WTjQnMM/CGkhhLPjR6u5+YGYFRUEup5b7YDl75NgmIa//Ha6ntGMLtu77o -fJG04XN1OhmNFeJ5mQKZFcBtPNSA8mTAKpFc7TkCgYEAwCDim9j+XwD6Bds2bpGz -/b5mnGq7AQLZ0IN3u5l706OTHjXu9+vFUQmTbluaGeXxu+tklITKQhIvY+NtRFB9 -iJB08bVwuxl7GvNksMsBFgqbTDhohSGlT2GRtss4EcbXD4+oScI1XfdrMR6KuhrB -18brqPueqH8Y82uSiThIwUA= ------END PRIVATE KEY----- diff --git a/security_settings/public_key.pem b/security_settings/public_key.pem deleted file mode 100644 index 333bcb8..0000000 --- a/security_settings/public_key.pem +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2jhCyaR7wLNctXXmEGvC -4IZishNKfFXBz1FDpi/ZhmgRBqJ9awCr6430ejCD9xioBR39iAn7Zjab1CLtmYTH -NFDrAfvg26NS/gf2WD7NZwu7EbENpHJD0YYOLTPg+2wCDFQE4lOfoLa04l8Rf5Id -r+JIfU0UxB2IZ4q19NiJvK35repwvlawaRRxyMX/vexe7YLyW51a+RG1y0K2n7Dk -dhnmEc7u8+vUxgYA+E5BBYvEKW+bini9p5sPy3s/Jv5Lz1Xrtg0gN57sBsOKIRTD -hjNwhq3qftVC1PFSqOp6qQk9yHEKPsRHGjGqpYR4709ZhaMsAkbk93tqC0QYnBZl -8wIDAQAB ------END PUBLIC KEY----- diff --git a/staticfiles/admin/css/autocomplete.css b/staticfiles/admin/css/autocomplete.css deleted file mode 100644 index 7478c2c..0000000 --- a/staticfiles/admin/css/autocomplete.css +++ /dev/null @@ -1,279 +0,0 @@ -select.admin-autocomplete { - width: 20em; -} - -.select2-container--admin-autocomplete.select2-container { - min-height: 30px; -} - -.select2-container--admin-autocomplete .select2-selection--single, -.select2-container--admin-autocomplete .select2-selection--multiple { - min-height: 30px; - padding: 0; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection, -.select2-container--admin-autocomplete.select2-container--open .select2-selection { - border-color: var(--body-quiet-color); - min-height: 30px; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--single, -.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--single { - padding: 0; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--multiple, -.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--multiple { - padding: 0; -} - -.select2-container--admin-autocomplete .select2-selection--single { - background-color: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: 4px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered { - color: var(--body-fg); - line-height: 30px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder { - color: var(--body-quiet-color); -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow { - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__arrow { - left: 1px; - right: auto; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single { - background-color: var(--darkened-bg); - cursor: default; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single .select2-selection__clear { - display: none; -} - -.select2-container--admin-autocomplete.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple { - background-color: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: 4px; - cursor: text; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered { - box-sizing: border-box; - list-style: none; - margin: 0; - padding: 0 10px 5px 5px; - width: 100%; - display: flex; - flex-wrap: wrap; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li { - list-style: none; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder { - color: var(--body-quiet-color); - margin-top: 5px; - float: left; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin: 5px; - position: absolute; - right: 0; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice { - background-color: var(--darkened-bg); - border: 1px solid var(--border-color); - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove { - color: var(--body-quiet-color); - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover { - color: var(--body-fg); -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline { - float: right; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - margin-left: 5px; - margin-right: auto; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple { - border: solid var(--body-quiet-color) 1px; - outline: 0; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple { - background-color: var(--darkened-bg); - cursor: default; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection__choice__remove { - display: none; -} - -.select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--multiple { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} - -.select2-container--admin-autocomplete .select2-search--dropdown { - background: var(--darkened-bg); -} - -.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field { - background: var(--body-bg); - color: var(--body-fg); - border: 1px solid var(--border-color); - border-radius: 4px; -} - -.select2-container--admin-autocomplete .select2-search--inline .select2-search__field { - background: transparent; - color: var(--body-fg); - border: none; - outline: 0; - box-shadow: none; - -webkit-appearance: textfield; -} - -.select2-container--admin-autocomplete .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; - color: var(--body-fg); - background: var(--body-bg); -} - -.select2-container--admin-autocomplete .select2-results__option[role=group] { - padding: 0; -} - -.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] { - color: var(--body-quiet-color); -} - -.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] { - background-color: var(--selected-bg); - color: var(--body-fg); -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option { - padding-left: 1em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__group { - padding-left: 0; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option { - margin-left: -1em; - padding-left: 2em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -2em; - padding-left: 3em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -3em; - padding-left: 4em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -4em; - padding-left: 5em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -5em; - padding-left: 6em; -} - -.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] { - background-color: var(--primary); - color: var(--primary-fg); -} - -.select2-container--admin-autocomplete .select2-results__group { - cursor: default; - display: block; - padding: 6px; -} - -.errors .select2-selection { - border: 1px solid var(--error-fg); -} diff --git a/staticfiles/admin/css/base.css b/staticfiles/admin/css/base.css deleted file mode 100644 index ac28326..0000000 --- a/staticfiles/admin/css/base.css +++ /dev/null @@ -1,1179 +0,0 @@ -/* - DJANGO Admin styles -*/ - -/* VARIABLE DEFINITIONS */ -html[data-theme="light"], -:root { - --primary: #79aec8; - --secondary: #417690; - --accent: #f5dd5d; - --primary-fg: #fff; - - --body-fg: #333; - --body-bg: #fff; - --body-quiet-color: #666; - --body-medium-color: #444; - --body-loud-color: #000; - - --header-color: #ffc; - --header-branding-color: var(--accent); - --header-bg: var(--secondary); - --header-link-color: var(--primary-fg); - - --breadcrumbs-fg: #c4dce8; - --breadcrumbs-link-fg: var(--body-bg); - --breadcrumbs-bg: #264b5d; - - --link-fg: #417893; - --link-hover-color: #036; - --link-selected-fg: var(--secondary); - - --hairline-color: #e8e8e8; - --border-color: #ccc; - - --error-fg: #ba2121; - - --message-success-bg: #dfd; - --message-warning-bg: #ffc; - --message-error-bg: #ffefef; - - --darkened-bg: #f8f8f8; /* A bit darker than --body-bg */ - --selected-bg: #e4e4e4; /* E.g. selected table cells */ - --selected-row: #ffc; - - --button-fg: #fff; - --button-bg: var(--secondary); - --button-hover-bg: #205067; - --default-button-bg: #205067; - --default-button-hover-bg: var(--secondary); - --close-button-bg: #747474; - --close-button-hover-bg: #333; - --delete-button-bg: #ba2121; - --delete-button-hover-bg: #a41515; - - --object-tools-fg: var(--button-fg); - --object-tools-bg: var(--close-button-bg); - --object-tools-hover-bg: var(--close-button-hover-bg); - - --font-family-primary: - "Segoe UI", - system-ui, - Roboto, - "Helvetica Neue", - Arial, - sans-serif, - "Apple Color Emoji", - "Segoe UI Emoji", - "Segoe UI Symbol", - "Noto Color Emoji"; - --font-family-monospace: - ui-monospace, - Menlo, - Monaco, - "Cascadia Mono", - "Segoe UI Mono", - "Roboto Mono", - "Oxygen Mono", - "Ubuntu Monospace", - "Source Code Pro", - "Fira Mono", - "Droid Sans Mono", - "Courier New", - monospace, - "Apple Color Emoji", - "Segoe UI Emoji", - "Segoe UI Symbol", - "Noto Color Emoji"; - - color-scheme: light; -} - -html, body { - height: 100%; -} - -body { - margin: 0; - padding: 0; - font-size: 0.875rem; - font-family: var(--font-family-primary); - color: var(--body-fg); - background: var(--body-bg); -} - -/* LINKS */ - -a:link, a:visited { - color: var(--link-fg); - text-decoration: none; - transition: color 0.15s, background 0.15s; -} - -a:focus, a:hover { - color: var(--link-hover-color); -} - -a:focus { - text-decoration: underline; -} - -a img { - border: none; -} - -a.section:link, a.section:visited { - color: var(--header-link-color); - text-decoration: none; -} - -a.section:focus, a.section:hover { - text-decoration: underline; -} - -/* GLOBAL DEFAULTS */ - -p, ol, ul, dl { - margin: .2em 0 .8em 0; -} - -p { - padding: 0; - line-height: 140%; -} - -h1,h2,h3,h4,h5 { - font-weight: bold; -} - -h1 { - margin: 0 0 20px; - font-weight: 300; - font-size: 1.25rem; -} - -h2 { - font-size: 1rem; - margin: 1em 0 .5em 0; -} - -h2.subhead { - font-weight: normal; - margin-top: 0; -} - -h3 { - font-size: 0.875rem; - margin: .8em 0 .3em 0; - color: var(--body-medium-color); - font-weight: bold; -} - -h4 { - font-size: 0.75rem; - margin: 1em 0 .8em 0; - padding-bottom: 3px; - color: var(--body-medium-color); -} - -h5 { - font-size: 0.625rem; - margin: 1.5em 0 .5em 0; - color: var(--body-quiet-color); - text-transform: uppercase; - letter-spacing: 1px; -} - -ul > li { - list-style-type: square; - padding: 1px 0; -} - -li ul { - margin-bottom: 0; -} - -li, dt, dd { - font-size: 0.8125rem; - line-height: 1.25rem; -} - -dt { - font-weight: bold; - margin-top: 4px; -} - -dd { - margin-left: 0; -} - -form { - margin: 0; - padding: 0; -} - -fieldset { - margin: 0; - min-width: 0; - padding: 0; - border: none; - border-top: 1px solid var(--hairline-color); -} - -details summary { - cursor: pointer; -} - -blockquote { - font-size: 0.6875rem; - color: #777; - margin-left: 2px; - padding-left: 10px; - border-left: 5px solid #ddd; -} - -code, pre { - font-family: var(--font-family-monospace); - color: var(--body-quiet-color); - font-size: 0.75rem; - overflow-x: auto; -} - -pre.literal-block { - margin: 10px; - background: var(--darkened-bg); - padding: 6px 8px; -} - -code strong { - color: #930; -} - -hr { - clear: both; - color: var(--hairline-color); - background-color: var(--hairline-color); - height: 1px; - border: none; - margin: 0; - padding: 0; - line-height: 1px; -} - -/* TEXT STYLES & MODIFIERS */ - -.small { - font-size: 0.6875rem; -} - -.mini { - font-size: 0.625rem; -} - -.help, p.help, form p.help, div.help, form div.help, div.help li { - font-size: 0.6875rem; - color: var(--body-quiet-color); -} - -div.help ul { - margin-bottom: 0; -} - -.help-tooltip { - cursor: help; -} - -p img, h1 img, h2 img, h3 img, h4 img, td img { - vertical-align: middle; -} - -.quiet, a.quiet:link, a.quiet:visited { - color: var(--body-quiet-color); - font-weight: normal; -} - -.clear { - clear: both; -} - -.nowrap { - white-space: nowrap; -} - -.hidden { - display: none !important; -} - -/* TABLES */ - -table { - border-collapse: collapse; - border-color: var(--border-color); -} - -td, th { - font-size: 0.8125rem; - line-height: 1rem; - border-bottom: 1px solid var(--hairline-color); - vertical-align: top; - padding: 8px; -} - -th { - font-weight: 500; - text-align: left; -} - -thead th, -tfoot td { - color: var(--body-quiet-color); - padding: 5px 10px; - font-size: 0.6875rem; - background: var(--body-bg); - border: none; - border-top: 1px solid var(--hairline-color); - border-bottom: 1px solid var(--hairline-color); -} - -tfoot td { - border-bottom: none; - border-top: 1px solid var(--hairline-color); -} - -thead th.required { - font-weight: bold; -} - -tr.alt { - background: var(--darkened-bg); -} - -tr:nth-child(odd), .row-form-errors { - background: var(--body-bg); -} - -tr:nth-child(even), -tr:nth-child(even) .errorlist, -tr:nth-child(odd) + .row-form-errors, -tr:nth-child(odd) + .row-form-errors .errorlist { - background: var(--darkened-bg); -} - -/* SORTABLE TABLES */ - -thead th { - padding: 5px 10px; - line-height: normal; - text-transform: uppercase; - background: var(--darkened-bg); -} - -thead th a:link, thead th a:visited { - color: var(--body-quiet-color); -} - -thead th.sorted { - background: var(--selected-bg); -} - -thead th.sorted .text { - padding-right: 42px; -} - -table thead th .text span { - padding: 8px 10px; - display: block; -} - -table thead th .text a { - display: block; - cursor: pointer; - padding: 8px 10px; -} - -table thead th .text a:focus, table thead th .text a:hover { - background: var(--selected-bg); -} - -thead th.sorted a.sortremove { - visibility: hidden; -} - -table thead th.sorted:hover a.sortremove { - visibility: visible; -} - -table thead th.sorted .sortoptions { - display: block; - padding: 9px 5px 0 5px; - float: right; - text-align: right; -} - -table thead th.sorted .sortpriority { - font-size: .8em; - min-width: 12px; - text-align: center; - vertical-align: 3px; - margin-left: 2px; - margin-right: 2px; -} - -table thead th.sorted .sortoptions a { - position: relative; - width: 14px; - height: 14px; - display: inline-block; - background: url(../img/sorting-icons.svg) 0 0 no-repeat; - background-size: 14px auto; -} - -table thead th.sorted .sortoptions a.sortremove { - background-position: 0 0; -} - -table thead th.sorted .sortoptions a.sortremove:after { - content: '\\'; - position: absolute; - top: -6px; - left: 3px; - font-weight: 200; - font-size: 1.125rem; - color: var(--body-quiet-color); -} - -table thead th.sorted .sortoptions a.sortremove:focus:after, -table thead th.sorted .sortoptions a.sortremove:hover:after { - color: var(--link-fg); -} - -table thead th.sorted .sortoptions a.sortremove:focus, -table thead th.sorted .sortoptions a.sortremove:hover { - background-position: 0 -14px; -} - -table thead th.sorted .sortoptions a.ascending { - background-position: 0 -28px; -} - -table thead th.sorted .sortoptions a.ascending:focus, -table thead th.sorted .sortoptions a.ascending:hover { - background-position: 0 -42px; -} - -table thead th.sorted .sortoptions a.descending { - top: 1px; - background-position: 0 -56px; -} - -table thead th.sorted .sortoptions a.descending:focus, -table thead th.sorted .sortoptions a.descending:hover { - background-position: 0 -70px; -} - -/* FORM DEFAULTS */ - -input, textarea, select, .form-row p, form .button { - margin: 2px 0; - padding: 2px 3px; - vertical-align: middle; - font-family: var(--font-family-primary); - font-weight: normal; - font-size: 0.8125rem; -} -.form-row div.help { - padding: 2px 3px; -} - -textarea { - vertical-align: top; -} - -/* -Minifiers remove the default (text) "type" attribute from "input" HTML tags. -Add input:not([type]) to make the CSS stylesheet work the same. -*/ -input:not([type]), input[type=text], input[type=password], input[type=email], -input[type=url], input[type=number], input[type=tel], textarea, select, -.vTextField { - border: 1px solid var(--border-color); - border-radius: 4px; - padding: 5px 6px; - margin-top: 0; - color: var(--body-fg); - background-color: var(--body-bg); -} - -/* -Minifiers remove the default (text) "type" attribute from "input" HTML tags. -Add input:not([type]) to make the CSS stylesheet work the same. -*/ -input:not([type]):focus, input[type=text]:focus, input[type=password]:focus, -input[type=email]:focus, input[type=url]:focus, input[type=number]:focus, -input[type=tel]:focus, textarea:focus, select:focus, .vTextField:focus { - border-color: var(--body-quiet-color); -} - -select { - height: 1.875rem; -} - -select[multiple] { - /* Allow HTML size attribute to override the height in the rule above. */ - height: auto; - min-height: 150px; -} - -/* FORM BUTTONS */ - -.button, input[type=submit], input[type=button], .submit-row input, a.button { - background: var(--button-bg); - padding: 10px 15px; - border: none; - border-radius: 4px; - color: var(--button-fg); - cursor: pointer; - transition: background 0.15s; -} - -a.button { - padding: 4px 5px; -} - -.button:active, input[type=submit]:active, input[type=button]:active, -.button:focus, input[type=submit]:focus, input[type=button]:focus, -.button:hover, input[type=submit]:hover, input[type=button]:hover { - background: var(--button-hover-bg); -} - -.button[disabled], input[type=submit][disabled], input[type=button][disabled] { - opacity: 0.4; -} - -.button.default, input[type=submit].default, .submit-row input.default { - border: none; - font-weight: 400; - background: var(--default-button-bg); -} - -.button.default:active, input[type=submit].default:active, -.button.default:focus, input[type=submit].default:focus, -.button.default:hover, input[type=submit].default:hover { - background: var(--default-button-hover-bg); -} - -.button[disabled].default, -input[type=submit][disabled].default, -input[type=button][disabled].default { - opacity: 0.4; -} - - -/* MODULES */ - -.module { - border: none; - margin-bottom: 30px; - background: var(--body-bg); -} - -.module p, .module ul, .module h3, .module h4, .module dl, .module pre { - padding-left: 10px; - padding-right: 10px; -} - -.module blockquote { - margin-left: 12px; -} - -.module ul, .module ol { - margin-left: 1.5em; -} - -.module h3 { - margin-top: .6em; -} - -.module h2, .module caption, .inline-group h2 { - margin: 0; - padding: 8px; - font-weight: 400; - font-size: 0.8125rem; - text-align: left; - background: var(--header-bg); - color: var(--header-link-color); -} - -.module caption, -.inline-group h2 { - font-size: 0.75rem; - letter-spacing: 0.5px; - text-transform: uppercase; -} - -.module table { - border-collapse: collapse; -} - -/* MESSAGES & ERRORS */ - -ul.messagelist { - padding: 0; - margin: 0; -} - -ul.messagelist li { - display: block; - font-weight: 400; - font-size: 0.8125rem; - padding: 10px 10px 10px 65px; - margin: 0 0 10px 0; - background: var(--message-success-bg) url(../img/icon-yes.svg) 40px 12px no-repeat; - background-size: 16px auto; - color: var(--body-fg); - word-break: break-word; -} - -ul.messagelist li.warning { - background: var(--message-warning-bg) url(../img/icon-alert.svg) 40px 14px no-repeat; - background-size: 14px auto; -} - -ul.messagelist li.error { - background: var(--message-error-bg) url(../img/icon-no.svg) 40px 12px no-repeat; - background-size: 16px auto; -} - -.errornote { - font-size: 0.875rem; - font-weight: 700; - display: block; - padding: 10px 12px; - margin: 0 0 10px 0; - color: var(--error-fg); - border: 1px solid var(--error-fg); - border-radius: 4px; - background-color: var(--body-bg); - background-position: 5px 12px; - overflow-wrap: break-word; -} - -ul.errorlist { - margin: 0 0 4px; - padding: 0; - color: var(--error-fg); - background: var(--body-bg); -} - -ul.errorlist li { - font-size: 0.8125rem; - display: block; - margin-bottom: 4px; - overflow-wrap: break-word; -} - -ul.errorlist li:first-child { - margin-top: 0; -} - -ul.errorlist li a { - color: inherit; - text-decoration: underline; -} - -td ul.errorlist { - margin: 0; - padding: 0; -} - -td ul.errorlist li { - margin: 0; -} - -.form-row.errors { - margin: 0; - border: none; - border-bottom: 1px solid var(--hairline-color); - background: none; -} - -.form-row.errors ul.errorlist li { - padding-left: 0; -} - -.errors input, .errors select, .errors textarea, -td ul.errorlist + input, td ul.errorlist + select, td ul.errorlist + textarea { - border: 1px solid var(--error-fg); -} - -.description { - font-size: 0.75rem; - padding: 5px 0 0 12px; -} - -/* BREADCRUMBS */ - -div.breadcrumbs { - background: var(--breadcrumbs-bg); - padding: 10px 40px; - border: none; - color: var(--breadcrumbs-fg); - text-align: left; -} - -div.breadcrumbs a { - color: var(--breadcrumbs-link-fg); -} - -div.breadcrumbs a:focus, div.breadcrumbs a:hover { - color: var(--breadcrumbs-fg); -} - -/* ACTION ICONS */ - -.viewlink, .inlineviewlink { - padding-left: 16px; - background: url(../img/icon-viewlink.svg) 0 1px no-repeat; -} - -.hidelink { - padding-left: 16px; - background: url(../img/icon-hidelink.svg) 0 1px no-repeat; -} - -.addlink { - padding-left: 16px; - background: url(../img/icon-addlink.svg) 0 1px no-repeat; -} - -.changelink, .inlinechangelink { - padding-left: 16px; - background: url(../img/icon-changelink.svg) 0 1px no-repeat; -} - -.deletelink { - padding-left: 16px; - background: url(../img/icon-deletelink.svg) 0 1px no-repeat; -} - -a.deletelink:link, a.deletelink:visited { - color: #CC3434; /* XXX Probably unused? */ -} - -a.deletelink:focus, a.deletelink:hover { - color: #993333; /* XXX Probably unused? */ - text-decoration: none; -} - -/* OBJECT TOOLS */ - -.object-tools { - font-size: 0.625rem; - font-weight: bold; - padding-left: 0; - float: right; - position: relative; - margin-top: -48px; -} - -.object-tools li { - display: block; - float: left; - margin-left: 5px; - height: 1rem; -} - -.object-tools a { - border-radius: 15px; -} - -.object-tools a:link, .object-tools a:visited { - display: block; - float: left; - padding: 3px 12px; - background: var(--object-tools-bg); - color: var(--object-tools-fg); - font-weight: 400; - font-size: 0.6875rem; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.object-tools a:focus, .object-tools a:hover { - background-color: var(--object-tools-hover-bg); -} - -.object-tools a:focus{ - text-decoration: none; -} - -.object-tools a.viewsitelink, .object-tools a.addlink { - background-repeat: no-repeat; - background-position: right 7px center; - padding-right: 26px; -} - -.object-tools a.viewsitelink { - background-image: url(../img/tooltag-arrowright.svg); -} - -.object-tools a.addlink { - background-image: url(../img/tooltag-add.svg); -} - -/* OBJECT HISTORY */ - -#change-history table { - width: 100%; -} - -#change-history table tbody th { - width: 16em; -} - -#change-history .paginator { - color: var(--body-quiet-color); - border-bottom: 1px solid var(--hairline-color); - background: var(--body-bg); - overflow: hidden; -} - -/* PAGE STRUCTURE */ - -#container { - position: relative; - width: 100%; - min-width: 980px; - padding: 0; - display: flex; - flex-direction: column; - height: 100%; -} - -#container > .main { - display: flex; - flex: 1 0 auto; -} - -.main > .content { - flex: 1 0; - max-width: 100%; -} - -.skip-to-content-link { - position: absolute; - top: -999px; - margin: 5px; - padding: 5px; - background: var(--body-bg); - z-index: 1; -} - -.skip-to-content-link:focus { - left: 0px; - top: 0px; -} - -#content { - padding: 20px 40px; -} - -.dashboard #content { - width: 600px; -} - -#content-main { - float: left; - width: 100%; -} - -#content-related { - float: right; - width: 260px; - position: relative; - margin-right: -300px; -} - -@media (forced-colors: active) { - #content-related { - border: 1px solid; - } -} - -/* COLUMN TYPES */ - -.colMS { - margin-right: 300px; -} - -.colSM { - margin-left: 300px; -} - -.colSM #content-related { - float: left; - margin-right: 0; - margin-left: -300px; -} - -.colSM #content-main { - float: right; -} - -.popup .colM { - width: auto; -} - -/* HEADER */ - -#header { - width: auto; - height: auto; - display: flex; - justify-content: space-between; - align-items: center; - padding: 10px 40px; - background: var(--header-bg); - color: var(--header-color); -} - -#header a:link, #header a:visited, #logout-form button { - color: var(--header-link-color); -} - -#header a:focus , #header a:hover { - text-decoration: underline; -} - -@media (forced-colors: active) { - #header { - border-bottom: 1px solid; - } -} - -#branding { - display: flex; -} - -#site-name { - padding: 0; - margin: 0; - margin-inline-end: 20px; - font-weight: 300; - font-size: 1.5rem; - color: var(--header-branding-color); -} - -#site-name a:link, #site-name a:visited { - color: var(--accent); -} - -#branding h2 { - padding: 0 10px; - font-size: 0.875rem; - margin: -8px 0 8px 0; - font-weight: normal; - color: var(--header-color); -} - -#branding a:hover { - text-decoration: none; -} - -#logout-form { - display: inline; -} - -#logout-form button { - background: none; - border: 0; - cursor: pointer; - font-family: var(--font-family-primary); -} - -#user-tools { - float: right; - margin: 0 0 0 20px; - text-align: right; -} - -#user-tools, #logout-form button{ - padding: 0; - font-weight: 300; - font-size: 0.6875rem; - letter-spacing: 0.5px; - text-transform: uppercase; -} - -#user-tools a, #logout-form button { - border-bottom: 1px solid rgba(255, 255, 255, 0.25); -} - -#user-tools a:focus, #user-tools a:hover, -#logout-form button:active, #logout-form button:hover { - text-decoration: none; - border-bottom: 0; -} - -#logout-form button:active, #logout-form button:hover { - margin-bottom: 1px; -} - -/* SIDEBAR */ - -#content-related { - background: var(--darkened-bg); -} - -#content-related .module { - background: none; -} - -#content-related h3 { - color: var(--body-quiet-color); - padding: 0 16px; - margin: 0 0 16px; -} - -#content-related h4 { - font-size: 0.8125rem; -} - -#content-related p { - padding-left: 16px; - padding-right: 16px; -} - -#content-related .actionlist { - padding: 0; - margin: 16px; -} - -#content-related .actionlist li { - line-height: 1.2; - margin-bottom: 10px; - padding-left: 18px; -} - -#content-related .module h2 { - background: none; - padding: 16px; - margin-bottom: 16px; - border-bottom: 1px solid var(--hairline-color); - font-size: 1.125rem; - color: var(--body-fg); -} - -.delete-confirmation form input[type="submit"] { - background: var(--delete-button-bg); - border-radius: 4px; - padding: 10px 15px; - color: var(--button-fg); -} - -.delete-confirmation form input[type="submit"]:active, -.delete-confirmation form input[type="submit"]:focus, -.delete-confirmation form input[type="submit"]:hover { - background: var(--delete-button-hover-bg); -} - -.delete-confirmation form .cancel-link { - display: inline-block; - vertical-align: middle; - height: 0.9375rem; - line-height: 0.9375rem; - border-radius: 4px; - padding: 10px 15px; - color: var(--button-fg); - background: var(--close-button-bg); - margin: 0 0 0 10px; -} - -.delete-confirmation form .cancel-link:active, -.delete-confirmation form .cancel-link:focus, -.delete-confirmation form .cancel-link:hover { - background: var(--close-button-hover-bg); -} - -/* POPUP */ -.popup #content { - padding: 20px; -} - -.popup #container { - min-width: 0; -} - -.popup #header { - padding: 10px 20px; -} - -/* PAGINATOR */ - -.paginator { - display: flex; - align-items: center; - gap: 4px; - font-size: 0.8125rem; - padding-top: 10px; - padding-bottom: 10px; - line-height: 22px; - margin: 0; - border-top: 1px solid var(--hairline-color); - width: 100%; -} - -.paginator a:link, .paginator a:visited { - padding: 2px 6px; - background: var(--button-bg); - text-decoration: none; - color: var(--button-fg); -} - -.paginator a.showall { - border: none; - background: none; - color: var(--link-fg); -} - -.paginator a.showall:focus, .paginator a.showall:hover { - background: none; - color: var(--link-hover-color); -} - -.paginator .end { - margin-right: 6px; -} - -.paginator .this-page { - padding: 2px 6px; - font-weight: bold; - font-size: 0.8125rem; - vertical-align: top; -} - -.paginator a:focus, .paginator a:hover { - color: white; - background: var(--link-hover-color); -} - -.paginator input { - margin-left: auto; -} - -.base-svgs { - display: none; -} - -.visually-hidden { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - overflow: hidden; - clip: rect(0,0,0,0); - white-space: nowrap; - border: 0; - color: var(--body-fg); - background-color: var(--body-bg); -} diff --git a/staticfiles/admin/css/changelists.css b/staticfiles/admin/css/changelists.css deleted file mode 100644 index 005b776..0000000 --- a/staticfiles/admin/css/changelists.css +++ /dev/null @@ -1,343 +0,0 @@ -/* CHANGELISTS */ - -#changelist { - display: flex; - align-items: flex-start; - justify-content: space-between; -} - -#changelist .changelist-form-container { - flex: 1 1 auto; - min-width: 0; -} - -#changelist table { - width: 100%; -} - -.change-list .hiddenfields { display:none; } - -.change-list .filtered table { - border-right: none; -} - -.change-list .filtered { - min-height: 400px; -} - -.change-list .filtered .results, .change-list .filtered .paginator, -.filtered #toolbar, .filtered div.xfull { - width: auto; -} - -.change-list .filtered table tbody th { - padding-right: 1em; -} - -#changelist-form .results { - overflow-x: auto; - width: 100%; -} - -#changelist .toplinks { - border-bottom: 1px solid var(--hairline-color); -} - -#changelist .paginator { - color: var(--body-quiet-color); - border-bottom: 1px solid var(--hairline-color); - background: var(--body-bg); - overflow: hidden; -} - -/* CHANGELIST TABLES */ - -#changelist table thead th { - padding: 0; - white-space: nowrap; - vertical-align: middle; -} - -#changelist table thead th.action-checkbox-column { - width: 1.5em; - text-align: center; -} - -#changelist table tbody td.action-checkbox { - text-align: center; -} - -#changelist table tfoot { - color: var(--body-quiet-color); -} - -/* TOOLBAR */ - -#toolbar { - padding: 8px 10px; - margin-bottom: 15px; - border-top: 1px solid var(--hairline-color); - border-bottom: 1px solid var(--hairline-color); - background: var(--darkened-bg); - color: var(--body-quiet-color); -} - -#toolbar form input { - border-radius: 4px; - font-size: 0.875rem; - padding: 5px; - color: var(--body-fg); -} - -#toolbar #searchbar { - height: 1.1875rem; - border: 1px solid var(--border-color); - padding: 2px 5px; - margin: 0; - vertical-align: top; - font-size: 0.8125rem; - max-width: 100%; -} - -#toolbar #searchbar:focus { - border-color: var(--body-quiet-color); -} - -#toolbar form input[type="submit"] { - border: 1px solid var(--border-color); - font-size: 0.8125rem; - padding: 4px 8px; - margin: 0; - vertical-align: middle; - background: var(--body-bg); - box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; - cursor: pointer; - color: var(--body-fg); -} - -#toolbar form input[type="submit"]:focus, -#toolbar form input[type="submit"]:hover { - border-color: var(--body-quiet-color); -} - -#changelist-search img { - vertical-align: middle; - margin-right: 4px; -} - -#changelist-search .help { - word-break: break-word; -} - -/* FILTER COLUMN */ - -#changelist-filter { - flex: 0 0 240px; - order: 1; - background: var(--darkened-bg); - border-left: none; - margin: 0 0 0 30px; -} - -@media (forced-colors: active) { - #changelist-filter { - border: 1px solid; - } -} - -#changelist-filter h2 { - font-size: 0.875rem; - text-transform: uppercase; - letter-spacing: 0.5px; - padding: 5px 15px; - margin-bottom: 12px; - border-bottom: none; -} - -#changelist-filter h3, -#changelist-filter details summary { - font-weight: 400; - padding: 0 15px; - margin-bottom: 10px; -} - -#changelist-filter details summary > * { - display: inline; -} - -#changelist-filter details > summary { - list-style-type: none; -} - -#changelist-filter details > summary::-webkit-details-marker { - display: none; -} - -#changelist-filter details > summary::before { - content: '→'; - font-weight: bold; - color: var(--link-hover-color); -} - -#changelist-filter details[open] > summary::before { - content: '↓'; -} - -#changelist-filter ul { - margin: 5px 0; - padding: 0 15px 15px; - border-bottom: 1px solid var(--hairline-color); -} - -#changelist-filter ul:last-child { - border-bottom: none; -} - -#changelist-filter li { - list-style-type: none; - margin-left: 0; - padding-left: 0; -} - -#changelist-filter a { - display: block; - color: var(--body-quiet-color); - word-break: break-word; -} - -#changelist-filter li.selected { - border-left: 5px solid var(--hairline-color); - padding-left: 10px; - margin-left: -15px; -} - -#changelist-filter li.selected a { - color: var(--link-selected-fg); -} - -#changelist-filter a:focus, #changelist-filter a:hover, -#changelist-filter li.selected a:focus, -#changelist-filter li.selected a:hover { - color: var(--link-hover-color); -} - -#changelist-filter #changelist-filter-extra-actions { - font-size: 0.8125rem; - margin-bottom: 10px; - border-bottom: 1px solid var(--hairline-color); -} - -/* DATE DRILLDOWN */ - -.change-list .toplinks { - display: flex; - padding-bottom: 5px; - flex-wrap: wrap; - gap: 3px 17px; - font-weight: bold; -} - -.change-list .toplinks a { - font-size: 0.8125rem; -} - -.change-list .toplinks .date-back { - color: var(--body-quiet-color); -} - -.change-list .toplinks .date-back:focus, -.change-list .toplinks .date-back:hover { - color: var(--link-hover-color); -} - -/* ACTIONS */ - -.filtered .actions { - border-right: none; -} - -#changelist table input { - margin: 0; - vertical-align: baseline; -} - -/* Once the :has() pseudo-class is supported by all browsers, the tr.selected - selector and the JS adding the class can be removed. */ -#changelist tbody tr.selected { - background-color: var(--selected-row); -} - -#changelist tbody tr:has(.action-select:checked) { - background-color: var(--selected-row); -} - -@media (forced-colors: active) { - #changelist tbody tr.selected { - background-color: SelectedItem; - } - #changelist tbody tr:has(.action-select:checked) { - background-color: SelectedItem; - } -} - -#changelist .actions { - padding: 10px; - background: var(--body-bg); - border-top: none; - border-bottom: none; - line-height: 1.5rem; - color: var(--body-quiet-color); - width: 100%; -} - -#changelist .actions span.all, -#changelist .actions span.action-counter, -#changelist .actions span.clear, -#changelist .actions span.question { - font-size: 0.8125rem; - margin: 0 0.5em; -} - -#changelist .actions:last-child { - border-bottom: none; -} - -#changelist .actions select { - vertical-align: top; - height: 1.5rem; - color: var(--body-fg); - border: 1px solid var(--border-color); - border-radius: 4px; - font-size: 0.875rem; - padding: 0 0 0 4px; - margin: 0; - margin-left: 10px; -} - -#changelist .actions select:focus { - border-color: var(--body-quiet-color); -} - -#changelist .actions label { - display: inline-block; - vertical-align: middle; - font-size: 0.8125rem; -} - -#changelist .actions .button { - font-size: 0.8125rem; - border: 1px solid var(--border-color); - border-radius: 4px; - background: var(--body-bg); - box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; - cursor: pointer; - height: 1.5rem; - line-height: 1; - padding: 4px 8px; - margin: 0; - color: var(--body-fg); -} - -#changelist .actions .button:focus, #changelist .actions .button:hover { - border-color: var(--body-quiet-color); -} diff --git a/staticfiles/admin/css/dark_mode.css b/staticfiles/admin/css/dark_mode.css deleted file mode 100644 index 7e12a81..0000000 --- a/staticfiles/admin/css/dark_mode.css +++ /dev/null @@ -1,130 +0,0 @@ -@media (prefers-color-scheme: dark) { - :root { - --primary: #264b5d; - --primary-fg: #f7f7f7; - - --body-fg: #eeeeee; - --body-bg: #121212; - --body-quiet-color: #d0d0d0; - --body-medium-color: #e0e0e0; - --body-loud-color: #ffffff; - - --breadcrumbs-link-fg: #e0e0e0; - --breadcrumbs-bg: var(--primary); - - --link-fg: #81d4fa; - --link-hover-color: #4ac1f7; - --link-selected-fg: #6f94c6; - - --hairline-color: #272727; - --border-color: #353535; - - --error-fg: #e35f5f; - --message-success-bg: #006b1b; - --message-warning-bg: #583305; - --message-error-bg: #570808; - - --darkened-bg: #212121; - --selected-bg: #1b1b1b; - --selected-row: #00363a; - - --close-button-bg: #333333; - --close-button-hover-bg: #666666; - - color-scheme: dark; - } - } - - -html[data-theme="dark"] { - --primary: #264b5d; - --primary-fg: #f7f7f7; - - --body-fg: #eeeeee; - --body-bg: #121212; - --body-quiet-color: #d0d0d0; - --body-medium-color: #e0e0e0; - --body-loud-color: #ffffff; - - --breadcrumbs-link-fg: #e0e0e0; - --breadcrumbs-bg: var(--primary); - - --link-fg: #81d4fa; - --link-hover-color: #4ac1f7; - --link-selected-fg: #6f94c6; - - --hairline-color: #272727; - --border-color: #353535; - - --error-fg: #e35f5f; - --message-success-bg: #006b1b; - --message-warning-bg: #583305; - --message-error-bg: #570808; - - --darkened-bg: #212121; - --selected-bg: #1b1b1b; - --selected-row: #00363a; - - --close-button-bg: #333333; - --close-button-hover-bg: #666666; - - color-scheme: dark; -} - -/* THEME SWITCH */ -.theme-toggle { - cursor: pointer; - border: none; - padding: 0; - background: transparent; - vertical-align: middle; - margin-inline-start: 5px; - margin-top: -1px; -} - -.theme-toggle svg { - vertical-align: middle; - height: 1rem; - width: 1rem; - display: none; -} - -/* -Fully hide screen reader text so we only show the one matching the current -theme. -*/ -.theme-toggle .visually-hidden { - display: none; -} - -html[data-theme="auto"] .theme-toggle .theme-label-when-auto { - display: block; -} - -html[data-theme="dark"] .theme-toggle .theme-label-when-dark { - display: block; -} - -html[data-theme="light"] .theme-toggle .theme-label-when-light { - display: block; -} - -/* ICONS */ -.theme-toggle svg.theme-icon-when-auto, -.theme-toggle svg.theme-icon-when-dark, -.theme-toggle svg.theme-icon-when-light { - fill: var(--header-link-color); - color: var(--header-bg); -} - -html[data-theme="auto"] .theme-toggle svg.theme-icon-when-auto { - display: block; -} - -html[data-theme="dark"] .theme-toggle svg.theme-icon-when-dark { - display: block; -} - -html[data-theme="light"] .theme-toggle svg.theme-icon-when-light { - display: block; -} diff --git a/staticfiles/admin/css/dashboard.css b/staticfiles/admin/css/dashboard.css deleted file mode 100644 index 242b81a..0000000 --- a/staticfiles/admin/css/dashboard.css +++ /dev/null @@ -1,29 +0,0 @@ -/* DASHBOARD */ -.dashboard td, .dashboard th { - word-break: break-word; -} - -.dashboard .module table th { - width: 100%; -} - -.dashboard .module table td { - white-space: nowrap; -} - -.dashboard .module table td a { - display: block; - padding-right: .6em; -} - -/* RECENT ACTIONS MODULE */ - -.module ul.actionlist { - margin-left: 0; -} - -ul.actionlist li { - list-style-type: none; - overflow: hidden; - text-overflow: ellipsis; -} diff --git a/staticfiles/admin/css/forms.css b/staticfiles/admin/css/forms.css deleted file mode 100644 index 776a920..0000000 --- a/staticfiles/admin/css/forms.css +++ /dev/null @@ -1,508 +0,0 @@ -@import url('widgets.css'); - -/* FORM ROWS */ - -.form-row { - overflow: hidden; - padding: 10px; - font-size: 0.8125rem; - border-bottom: 1px solid var(--hairline-color); -} - -.form-row img, .form-row input { - vertical-align: middle; -} - -.form-row label input[type="checkbox"] { - margin-top: 0; - vertical-align: 0; -} - -form .form-row p { - padding-left: 0; -} - -.flex-container { - display: flex; -} - -.form-multiline { - flex-wrap: wrap; -} - -.form-multiline > div { - padding-bottom: 10px; -} - -/* FORM LABELS */ - -label { - font-weight: normal; - color: var(--body-quiet-color); - font-size: 0.8125rem; -} - -.required label, label.required { - font-weight: bold; -} - -/* RADIO BUTTONS */ - -form div.radiolist div { - padding-right: 7px; -} - -form div.radiolist.inline div { - display: inline-block; -} - -form div.radiolist label { - width: auto; -} - -form div.radiolist input[type="radio"] { - margin: -2px 4px 0 0; - padding: 0; -} - -form ul.inline { - margin-left: 0; - padding: 0; -} - -form ul.inline li { - float: left; - padding-right: 7px; -} - -/* FIELDSETS */ - -fieldset .fieldset-heading, -fieldset .inline-heading, -:not(.inline-related) .collapse summary { - border: 1px solid var(--header-bg); - margin: 0; - padding: 8px; - font-weight: 400; - font-size: 0.8125rem; - background: var(--header-bg); - color: var(--header-link-color); -} - -/* ALIGNED FIELDSETS */ - -.aligned label { - display: block; - padding: 4px 10px 0 0; - min-width: 160px; - width: 160px; - word-wrap: break-word; -} - -.aligned label:not(.vCheckboxLabel):after { - content: ''; - display: inline-block; - vertical-align: middle; -} - -.aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly { - padding: 6px 0; - margin-top: 0; - margin-bottom: 0; - margin-left: 0; - overflow-wrap: break-word; -} - -.aligned ul label { - display: inline; - float: none; - width: auto; -} - -.aligned .form-row input { - margin-bottom: 0; -} - -.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField { - width: 350px; -} - -form .aligned ul { - margin-left: 160px; - padding-left: 10px; -} - -form .aligned div.radiolist { - display: inline-block; - margin: 0; - padding: 0; -} - -form .aligned p.help, -form .aligned div.help { - margin-top: 0; - margin-left: 160px; - padding-left: 10px; -} - -form .aligned p.date div.help.timezonewarning, -form .aligned p.datetime div.help.timezonewarning, -form .aligned p.time div.help.timezonewarning { - margin-left: 0; - padding-left: 0; - font-weight: normal; -} - -form .aligned p.help:last-child, -form .aligned div.help:last-child { - margin-bottom: 0; - padding-bottom: 0; -} - -form .aligned input + p.help, -form .aligned textarea + p.help, -form .aligned select + p.help, -form .aligned input + div.help, -form .aligned textarea + div.help, -form .aligned select + div.help { - margin-left: 160px; - padding-left: 10px; -} - -form .aligned ul li { - list-style: none; -} - -form .aligned table p { - margin-left: 0; - padding-left: 0; -} - -.aligned .vCheckboxLabel { - padding: 1px 0 0 5px; -} - -.aligned .vCheckboxLabel + p.help, -.aligned .vCheckboxLabel + div.help { - margin-top: -4px; -} - -.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { - width: 610px; -} - -fieldset .fieldBox { - margin-right: 20px; -} - -/* WIDE FIELDSETS */ - -.wide label { - width: 200px; -} - -form .wide p.help, -form .wide ul.errorlist, -form .wide div.help { - padding-left: 50px; -} - -form div.help ul { - padding-left: 0; - margin-left: 0; -} - -.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { - width: 450px; -} - -/* COLLAPSIBLE FIELDSETS */ - -.collapse summary .fieldset-heading, -.collapse summary .inline-heading { - background: transparent; - border: none; - color: currentColor; - display: inline; - margin: 0; - padding: 0; -} - -/* MONOSPACE TEXTAREAS */ - -fieldset.monospace textarea { - font-family: var(--font-family-monospace); -} - -/* SUBMIT ROW */ - -.submit-row { - padding: 12px 14px 12px; - margin: 0 0 20px; - background: var(--darkened-bg); - border: 1px solid var(--hairline-color); - border-radius: 4px; - overflow: hidden; - display: flex; - gap: 10px; - flex-wrap: wrap; -} - -body.popup .submit-row { - overflow: auto; -} - -.submit-row input { - height: 2.1875rem; - line-height: 0.9375rem; -} - -.submit-row input, .submit-row a { - margin: 0; -} - -.submit-row input.default { - text-transform: uppercase; -} - -.submit-row a.deletelink { - margin-left: auto; -} - -.submit-row a.deletelink { - display: block; - background: var(--delete-button-bg); - border-radius: 4px; - padding: 0.625rem 0.9375rem; - height: 0.9375rem; - line-height: 0.9375rem; - color: var(--button-fg); -} - -.submit-row a.closelink { - display: inline-block; - background: var(--close-button-bg); - border-radius: 4px; - padding: 10px 15px; - height: 0.9375rem; - line-height: 0.9375rem; - color: var(--button-fg); -} - -.submit-row a.deletelink:focus, -.submit-row a.deletelink:hover, -.submit-row a.deletelink:active { - background: var(--delete-button-hover-bg); - text-decoration: none; -} - -.submit-row a.closelink:focus, -.submit-row a.closelink:hover, -.submit-row a.closelink:active { - background: var(--close-button-hover-bg); - text-decoration: none; -} - -/* CUSTOM FORM FIELDS */ - -.vSelectMultipleField { - vertical-align: top; -} - -.vCheckboxField { - border: none; -} - -.vDateField, .vTimeField { - margin-right: 2px; - margin-bottom: 4px; -} - -.vDateField { - min-width: 6.85em; -} - -.vTimeField { - min-width: 4.7em; -} - -.vURLField { - width: 30em; -} - -.vLargeTextField, .vXMLLargeTextField { - width: 48em; -} - -.flatpages-flatpage #id_content { - height: 40.2em; -} - -.module table .vPositiveSmallIntegerField { - width: 2.2em; -} - -.vIntegerField { - width: 5em; -} - -.vBigIntegerField { - width: 10em; -} - -.vForeignKeyRawIdAdminField { - width: 5em; -} - -.vTextField, .vUUIDField { - width: 20em; -} - -/* INLINES */ - -.inline-group { - padding: 0; - margin: 0 0 30px; -} - -.inline-group thead th { - padding: 8px 10px; -} - -.inline-group .aligned label { - width: 160px; -} - -.inline-related { - position: relative; -} - -.inline-related h4, -.inline-related:not(.tabular) .collapse summary { - margin: 0; - color: var(--body-medium-color); - padding: 5px; - font-size: 0.8125rem; - background: var(--darkened-bg); - border: 1px solid var(--hairline-color); - border-left-color: var(--darkened-bg); - border-right-color: var(--darkened-bg); -} - -.inline-related h3 span.delete { - float: right; -} - -.inline-related h3 span.delete label { - margin-left: 2px; - font-size: 0.6875rem; -} - -.inline-related fieldset { - margin: 0; - background: var(--body-bg); - border: none; - width: 100%; -} - -.inline-group .tabular fieldset.module { - border: none; -} - -.inline-related.tabular fieldset.module table { - width: 100%; - overflow-x: scroll; -} - -.last-related fieldset { - border: none; -} - -.inline-group .tabular tr.has_original td { - padding-top: 2em; -} - -.inline-group .tabular tr td.original { - padding: 2px 0 0 0; - width: 0; - _position: relative; -} - -.inline-group .tabular th.original { - width: 0px; - padding: 0; -} - -.inline-group .tabular td.original p { - position: absolute; - left: 0; - height: 1.1em; - padding: 2px 9px; - overflow: hidden; - font-size: 0.5625rem; - font-weight: bold; - color: var(--body-quiet-color); - _width: 700px; -} - -.inline-group ul.tools { - padding: 0; - margin: 0; - list-style: none; -} - -.inline-group ul.tools li { - display: inline; - padding: 0 5px; -} - -.inline-group div.add-row, -.inline-group .tabular tr.add-row td { - color: var(--body-quiet-color); - background: var(--darkened-bg); - padding: 8px 10px; - border-bottom: 1px solid var(--hairline-color); -} - -.inline-group .tabular tr.add-row td { - padding: 8px 10px; - border-bottom: 1px solid var(--hairline-color); -} - -.inline-group ul.tools a.add, -.inline-group div.add-row a, -.inline-group .tabular tr.add-row td a { - background: url(../img/icon-addlink.svg) 0 1px no-repeat; - padding-left: 16px; - font-size: 0.75rem; -} - -.empty-form { - display: none; -} - -/* RELATED FIELD ADD ONE / LOOKUP */ - -.related-lookup { - margin-left: 5px; - display: inline-block; - vertical-align: middle; - background-repeat: no-repeat; - background-size: 14px; -} - -.related-lookup { - width: 1rem; - height: 1rem; - background-image: url(../img/search.svg); -} - -form .related-widget-wrapper ul { - display: inline-block; - margin-left: 0; - padding-left: 0; -} - -.clearable-file-input input { - margin-top: 0; -} diff --git a/staticfiles/admin/css/login.css b/staticfiles/admin/css/login.css deleted file mode 100644 index 805a34b..0000000 --- a/staticfiles/admin/css/login.css +++ /dev/null @@ -1,61 +0,0 @@ -/* LOGIN FORM */ - -.login { - background: var(--darkened-bg); - height: auto; -} - -.login #header { - height: auto; - padding: 15px 16px; - justify-content: center; -} - -.login #header h1 { - font-size: 1.125rem; - margin: 0; -} - -.login #header h1 a { - color: var(--header-link-color); -} - -.login #content { - padding: 20px; -} - -.login #container { - background: var(--body-bg); - border: 1px solid var(--hairline-color); - border-radius: 4px; - overflow: hidden; - width: 28em; - min-width: 300px; - margin: 100px auto; - height: auto; -} - -.login .form-row { - padding: 4px 0; -} - -.login .form-row label { - display: block; - line-height: 2em; -} - -.login .form-row #id_username, .login .form-row #id_password { - padding: 8px; - width: 100%; - box-sizing: border-box; -} - -.login .submit-row { - padding: 1em 0 0 0; - margin: 0; - text-align: center; -} - -.login .password-reset-link { - text-align: center; -} diff --git a/staticfiles/admin/css/nav_sidebar.css b/staticfiles/admin/css/nav_sidebar.css deleted file mode 100644 index 7eb0de9..0000000 --- a/staticfiles/admin/css/nav_sidebar.css +++ /dev/null @@ -1,150 +0,0 @@ -.sticky { - position: sticky; - top: 0; - max-height: 100vh; -} - -.toggle-nav-sidebar { - z-index: 20; - left: 0; - display: flex; - align-items: center; - justify-content: center; - flex: 0 0 23px; - width: 23px; - border: 0; - border-right: 1px solid var(--hairline-color); - background-color: var(--body-bg); - cursor: pointer; - font-size: 1.25rem; - color: var(--link-fg); - padding: 0; -} - -[dir="rtl"] .toggle-nav-sidebar { - border-left: 1px solid var(--hairline-color); - border-right: 0; -} - -.toggle-nav-sidebar:hover, -.toggle-nav-sidebar:focus { - background-color: var(--darkened-bg); -} - -#nav-sidebar { - z-index: 15; - flex: 0 0 275px; - left: -276px; - margin-left: -276px; - border-top: 1px solid transparent; - border-right: 1px solid var(--hairline-color); - background-color: var(--body-bg); - overflow: auto; -} - -[dir="rtl"] #nav-sidebar { - border-left: 1px solid var(--hairline-color); - border-right: 0; - left: 0; - margin-left: 0; - right: -276px; - margin-right: -276px; -} - -.toggle-nav-sidebar::before { - content: '\00BB'; -} - -.main.shifted .toggle-nav-sidebar::before { - content: '\00AB'; -} - -.main > #nav-sidebar { - visibility: hidden; -} - -.main.shifted > #nav-sidebar { - margin-left: 0; - visibility: visible; -} - -[dir="rtl"] .main.shifted > #nav-sidebar { - margin-right: 0; -} - -#nav-sidebar .module th { - width: 100%; - overflow-wrap: anywhere; -} - -#nav-sidebar .module th, -#nav-sidebar .module caption { - padding-left: 16px; -} - -#nav-sidebar .module td { - white-space: nowrap; -} - -[dir="rtl"] #nav-sidebar .module th, -[dir="rtl"] #nav-sidebar .module caption { - padding-left: 8px; - padding-right: 16px; -} - -#nav-sidebar .current-app .section:link, -#nav-sidebar .current-app .section:visited { - color: var(--header-color); - font-weight: bold; -} - -#nav-sidebar .current-model { - background: var(--selected-row); -} - -@media (forced-colors: active) { - #nav-sidebar .current-model { - background-color: SelectedItem; - } -} - -.main > #nav-sidebar + .content { - max-width: calc(100% - 23px); -} - -.main.shifted > #nav-sidebar + .content { - max-width: calc(100% - 299px); -} - -@media (max-width: 767px) { - #nav-sidebar, #toggle-nav-sidebar { - display: none; - } - - .main > #nav-sidebar + .content, - .main.shifted > #nav-sidebar + .content { - max-width: 100%; - } -} - -#nav-filter { - width: 100%; - box-sizing: border-box; - padding: 2px 5px; - margin: 5px 0; - border: 1px solid var(--border-color); - background-color: var(--darkened-bg); - color: var(--body-fg); -} - -#nav-filter:focus { - border-color: var(--body-quiet-color); -} - -#nav-filter.no-results { - background: var(--message-error-bg); -} - -#nav-sidebar table { - width: 100%; -} diff --git a/staticfiles/admin/css/responsive.css b/staticfiles/admin/css/responsive.css deleted file mode 100644 index 932e824..0000000 --- a/staticfiles/admin/css/responsive.css +++ /dev/null @@ -1,967 +0,0 @@ -/* Tablets */ - -input[type="submit"], button { - -webkit-appearance: none; - appearance: none; -} - -@media (max-width: 1024px) { - /* Basic */ - - html { - -webkit-text-size-adjust: 100%; - } - - td, th { - padding: 10px; - font-size: 0.875rem; - } - - .small { - font-size: 0.75rem; - } - - /* Layout */ - - #container { - min-width: 0; - } - - #content { - padding: 15px 20px 20px; - } - - div.breadcrumbs { - padding: 10px 30px; - } - - /* Header */ - - #header { - flex-direction: column; - padding: 15px 30px; - justify-content: flex-start; - } - - #site-name { - margin: 0 0 8px; - line-height: 1.2; - } - - #user-tools { - margin: 0; - font-weight: 400; - line-height: 1.85; - text-align: left; - } - - #user-tools a { - display: inline-block; - line-height: 1.4; - } - - /* Dashboard */ - - .dashboard #content { - width: auto; - } - - #content-related { - margin-right: -290px; - } - - .colSM #content-related { - margin-left: -290px; - } - - .colMS { - margin-right: 290px; - } - - .colSM { - margin-left: 290px; - } - - .dashboard .module table td a { - padding-right: 0; - } - - td .changelink, td .addlink { - font-size: 0.8125rem; - } - - /* Changelist */ - - #toolbar { - border: none; - padding: 15px; - } - - #changelist-search > div { - display: flex; - flex-wrap: nowrap; - max-width: 480px; - } - - #changelist-search label { - line-height: 1.375rem; - } - - #toolbar form #searchbar { - flex: 1 0 auto; - width: 0; - height: 1.375rem; - margin: 0 10px 0 6px; - } - - #toolbar form input[type=submit] { - flex: 0 1 auto; - } - - #changelist-search .quiet { - width: 0; - flex: 1 0 auto; - margin: 5px 0 0 25px; - } - - #changelist .actions { - display: flex; - flex-wrap: wrap; - padding: 15px 0; - } - - #changelist .actions label { - display: flex; - } - - #changelist .actions select { - background: var(--body-bg); - } - - #changelist .actions .button { - min-width: 48px; - margin: 0 10px; - } - - #changelist .actions span.all, - #changelist .actions span.clear, - #changelist .actions span.question, - #changelist .actions span.action-counter { - font-size: 0.6875rem; - margin: 0 10px 0 0; - } - - #changelist-filter { - flex-basis: 200px; - } - - .change-list .filtered .results, - .change-list .filtered .paginator, - .filtered #toolbar, - .filtered .actions, - - #changelist .paginator { - border-top-color: var(--hairline-color); /* XXX Is this used at all? */ - } - - #changelist .results + .paginator { - border-top: none; - } - - /* Forms */ - - label { - font-size: 1rem; - } - - /* - Minifiers remove the default (text) "type" attribute from "input" HTML - tags. Add input:not([type]) to make the CSS stylesheet work the same. - */ - .form-row input:not([type]), - .form-row input[type=text], - .form-row input[type=password], - .form-row input[type=email], - .form-row input[type=url], - .form-row input[type=tel], - .form-row input[type=number], - .form-row textarea, - .form-row select, - .form-row .vTextField { - box-sizing: border-box; - margin: 0; - padding: 6px 8px; - min-height: 2.25rem; - font-size: 1rem; - } - - .form-row select { - height: 2.25rem; - } - - .form-row select[multiple] { - height: auto; - min-height: 0; - } - - fieldset .fieldBox + .fieldBox { - margin-top: 10px; - padding-top: 10px; - border-top: 1px solid var(--hairline-color); - } - - textarea { - max-width: 100%; - max-height: 120px; - } - - .aligned label { - padding-top: 6px; - } - - .aligned .related-lookup, - .aligned .datetimeshortcuts, - .aligned .related-lookup + strong { - align-self: center; - margin-left: 15px; - } - - form .aligned div.radiolist { - margin-left: 2px; - } - - .submit-row { - padding: 8px; - } - - .submit-row a.deletelink { - padding: 10px 7px; - } - - .button, input[type=submit], input[type=button], .submit-row input, a.button { - padding: 7px; - } - - /* Selector */ - - .selector { - display: flex; - width: 100%; - } - - .selector .selector-filter { - display: flex; - align-items: center; - } - - .selector .selector-filter label { - margin: 0 8px 0 0; - } - - .selector .selector-filter input { - width: 100%; - min-height: 0; - flex: 1 1; - } - - .selector-available, .selector-chosen { - width: auto; - flex: 1 1; - display: flex; - flex-direction: column; - } - - .selector select { - width: 100%; - flex: 1 0 auto; - margin-bottom: 5px; - } - - .selector ul.selector-chooser { - width: 26px; - height: 52px; - padding: 2px 0; - border-radius: 20px; - transform: translateY(-10px); - } - - .selector-add, .selector-remove { - width: 20px; - height: 20px; - background-size: 20px auto; - } - - .selector-add { - background-position: 0 -120px; - } - - .selector-remove { - background-position: 0 -80px; - } - - a.selector-chooseall, a.selector-clearall { - align-self: center; - } - - .stacked { - flex-direction: column; - max-width: 480px; - } - - .stacked > * { - flex: 0 1 auto; - } - - .stacked select { - margin-bottom: 0; - } - - .stacked .selector-available, .stacked .selector-chosen { - width: auto; - } - - .stacked ul.selector-chooser { - width: 52px; - height: 26px; - padding: 0 2px; - transform: none; - } - - .stacked .selector-chooser li { - padding: 3px; - } - - .stacked .selector-add, .stacked .selector-remove { - background-size: 20px auto; - } - - .stacked .selector-add { - background-position: 0 -40px; - } - - .stacked .active.selector-add { - background-position: 0 -40px; - } - - .active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -140px; - } - - .stacked .active.selector-add:focus, .stacked .active.selector-add:hover { - background-position: 0 -60px; - } - - .stacked .selector-remove { - background-position: 0 0; - } - - .stacked .active.selector-remove { - background-position: 0 0; - } - - .active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -100px; - } - - .stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover { - background-position: 0 -20px; - } - - .help-tooltip, .selector .help-icon { - display: none; - } - - .datetime input { - width: 50%; - max-width: 120px; - } - - .datetime span { - font-size: 0.8125rem; - } - - .datetime .timezonewarning { - display: block; - font-size: 0.6875rem; - color: var(--body-quiet-color); - } - - .datetimeshortcuts { - color: var(--border-color); /* XXX Redundant, .datetime span also sets #ccc */ - } - - .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { - width: 75%; - } - - .inline-group { - overflow: auto; - } - - /* Messages */ - - ul.messagelist li { - padding-left: 55px; - background-position: 30px 12px; - } - - ul.messagelist li.error { - background-position: 30px 12px; - } - - ul.messagelist li.warning { - background-position: 30px 14px; - } - - /* Login */ - - .login #header { - padding: 15px 20px; - } - - .login #site-name { - margin: 0; - } - - /* GIS */ - - div.olMap { - max-width: calc(100vw - 30px); - max-height: 300px; - } - - .olMap + .clear_features { - display: block; - margin-top: 10px; - } - - /* Docs */ - - .module table.xfull { - width: 100%; - } - - pre.literal-block { - overflow: auto; - } -} - -/* Mobile */ - -@media (max-width: 767px) { - /* Layout */ - - #header, #content { - padding: 15px; - } - - div.breadcrumbs { - padding: 10px 15px; - } - - /* Dashboard */ - - .colMS, .colSM { - margin: 0; - } - - #content-related, .colSM #content-related { - width: 100%; - margin: 0; - } - - #content-related .module { - margin-bottom: 0; - } - - #content-related .module h2 { - padding: 10px 15px; - font-size: 1rem; - } - - /* Changelist */ - - #changelist { - align-items: stretch; - flex-direction: column; - } - - #toolbar { - padding: 10px; - } - - #changelist-filter { - margin-left: 0; - } - - #changelist .actions label { - flex: 1 1; - } - - #changelist .actions select { - flex: 1 0; - width: 100%; - } - - #changelist .actions span { - flex: 1 0 100%; - } - - #changelist-filter { - position: static; - width: auto; - margin-top: 30px; - } - - .object-tools { - float: none; - margin: 0 0 15px; - padding: 0; - overflow: hidden; - } - - .object-tools li { - height: auto; - margin-left: 0; - } - - .object-tools li + li { - margin-left: 15px; - } - - /* Forms */ - - .form-row { - padding: 15px 0; - } - - .aligned .form-row, - .aligned .form-row > div { - max-width: 100vw; - } - - .aligned .form-row > div { - width: calc(100vw - 30px); - } - - .flex-container { - flex-flow: column; - } - - .flex-container.checkbox-row { - flex-flow: row; - } - - textarea { - max-width: none; - } - - .vURLField { - width: auto; - } - - fieldset .fieldBox + .fieldBox { - margin-top: 15px; - padding-top: 15px; - } - - .aligned label { - width: 100%; - min-width: auto; - padding: 0 0 10px; - } - - .aligned label:after { - max-height: 0; - } - - .aligned .form-row input, - .aligned .form-row select, - .aligned .form-row textarea { - flex: 1 1 auto; - max-width: 100%; - } - - .aligned .checkbox-row input { - flex: 0 1 auto; - margin: 0; - } - - .aligned .vCheckboxLabel { - flex: 1 0; - padding: 1px 0 0 5px; - } - - .aligned label + p, - .aligned label + div.help, - .aligned label + div.readonly { - padding: 0; - margin-left: 0; - } - - .aligned p.file-upload { - font-size: 0.8125rem; - } - - span.clearable-file-input { - margin-left: 15px; - } - - span.clearable-file-input label { - font-size: 0.8125rem; - padding-bottom: 0; - } - - .aligned .timezonewarning { - flex: 1 0 100%; - margin-top: 5px; - } - - form .aligned .form-row div.help { - width: 100%; - margin: 5px 0 0; - padding: 0; - } - - form .aligned ul, - form .aligned ul.errorlist { - margin-left: 0; - padding-left: 0; - } - - form .aligned div.radiolist { - margin-top: 5px; - margin-right: 15px; - margin-bottom: -3px; - } - - form .aligned div.radiolist:not(.inline) div + div { - margin-top: 5px; - } - - /* Related widget */ - - .related-widget-wrapper { - width: 100%; - display: flex; - align-items: flex-start; - } - - .related-widget-wrapper .selector { - order: 1; - } - - .related-widget-wrapper > a { - order: 2; - } - - .related-widget-wrapper .radiolist ~ a { - align-self: flex-end; - } - - .related-widget-wrapper > select ~ a { - align-self: center; - } - - /* Selector */ - - .selector { - flex-direction: column; - gap: 10px 0; - } - - .selector-available, .selector-chosen { - flex: 1 1 auto; - } - - .selector select { - max-height: 96px; - } - - .selector ul.selector-chooser { - display: block; - width: 52px; - height: 26px; - padding: 0 2px; - transform: none; - } - - .selector ul.selector-chooser li { - float: left; - } - - .selector-remove { - background-position: 0 0; - } - - .active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -20px; - } - - .selector-add { - background-position: 0 -40px; - } - - .active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -60px; - } - - /* Inlines */ - - .inline-group[data-inline-type="stacked"] .inline-related { - border: 1px solid var(--hairline-color); - border-radius: 4px; - margin-top: 15px; - overflow: auto; - } - - .inline-group[data-inline-type="stacked"] .inline-related > * { - box-sizing: border-box; - } - - .inline-group[data-inline-type="stacked"] .inline-related .module { - padding: 0 10px; - } - - .inline-group[data-inline-type="stacked"] .inline-related .module .form-row { - border-top: 1px solid var(--hairline-color); - border-bottom: none; - } - - .inline-group[data-inline-type="stacked"] .inline-related .module .form-row:first-child { - border-top: none; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 { - padding: 10px; - border-top-width: 0; - border-bottom-width: 2px; - display: flex; - flex-wrap: wrap; - align-items: center; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 .inline_label { - margin-right: auto; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 span.delete { - float: none; - flex: 1 1 100%; - margin-top: 5px; - } - - .inline-group[data-inline-type="stacked"] .aligned .form-row > div:not([class]) { - width: 100%; - } - - .inline-group[data-inline-type="stacked"] .aligned label { - width: 100%; - } - - .inline-group[data-inline-type="stacked"] div.add-row { - margin-top: 15px; - border: 1px solid var(--hairline-color); - border-radius: 4px; - } - - .inline-group div.add-row, - .inline-group .tabular tr.add-row td { - padding: 0; - } - - .inline-group div.add-row a, - .inline-group .tabular tr.add-row td a { - display: block; - padding: 8px 10px 8px 26px; - background-position: 8px 9px; - } - - /* Submit row */ - - .submit-row { - padding: 10px; - margin: 0 0 15px; - flex-direction: column; - gap: 8px; - } - - .submit-row input, .submit-row input.default, .submit-row a { - text-align: center; - } - - .submit-row a.closelink { - padding: 10px 0; - text-align: center; - } - - .submit-row a.deletelink { - margin: 0; - } - - /* Messages */ - - ul.messagelist li { - padding-left: 40px; - background-position: 15px 12px; - } - - ul.messagelist li.error { - background-position: 15px 12px; - } - - ul.messagelist li.warning { - background-position: 15px 14px; - } - - /* Paginator */ - - .paginator .this-page, .paginator a:link, .paginator a:visited { - padding: 4px 10px; - } - - /* Login */ - - body.login { - padding: 0 15px; - } - - .login #container { - width: auto; - max-width: 480px; - margin: 50px auto; - } - - .login #header, - .login #content { - padding: 15px; - } - - .login #content-main { - float: none; - } - - .login .form-row { - padding: 0; - } - - .login .form-row + .form-row { - margin-top: 15px; - } - - .login .form-row label { - margin: 0 0 5px; - line-height: 1.2; - } - - .login .submit-row { - padding: 15px 0 0; - } - - .login br { - display: none; - } - - .login .submit-row input { - margin: 0; - text-transform: uppercase; - } - - .errornote { - margin: 0 0 20px; - padding: 8px 12px; - font-size: 0.8125rem; - } - - /* Calendar and clock */ - - .calendarbox, .clockbox { - position: fixed !important; - top: 50% !important; - left: 50% !important; - transform: translate(-50%, -50%); - margin: 0; - border: none; - overflow: visible; - } - - .calendarbox:before, .clockbox:before { - content: ''; - position: fixed; - top: 50%; - left: 50%; - width: 100vw; - height: 100vh; - background: rgba(0, 0, 0, 0.75); - transform: translate(-50%, -50%); - } - - .calendarbox > *, .clockbox > * { - position: relative; - z-index: 1; - } - - .calendarbox > div:first-child { - z-index: 2; - } - - .calendarbox .calendar, .clockbox h2 { - border-radius: 4px 4px 0 0; - overflow: hidden; - } - - .calendarbox .calendar-cancel, .clockbox .calendar-cancel { - border-radius: 0 0 4px 4px; - overflow: hidden; - } - - .calendar-shortcuts { - padding: 10px 0; - font-size: 0.75rem; - line-height: 0.75rem; - } - - .calendar-shortcuts a { - margin: 0 4px; - } - - .timelist a { - background: var(--body-bg); - padding: 4px; - } - - .calendar-cancel { - padding: 8px 10px; - } - - .clockbox h2 { - padding: 8px 15px; - } - - .calendar caption { - padding: 10px; - } - - .calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { - z-index: 1; - top: 10px; - } - - /* History */ - - table#change-history tbody th, table#change-history tbody td { - font-size: 0.8125rem; - word-break: break-word; - } - - table#change-history tbody th { - width: auto; - } - - /* Docs */ - - table.model tbody th, table.model tbody td { - font-size: 0.8125rem; - word-break: break-word; - } -} diff --git a/staticfiles/admin/css/responsive_rtl.css b/staticfiles/admin/css/responsive_rtl.css deleted file mode 100644 index 33b5784..0000000 --- a/staticfiles/admin/css/responsive_rtl.css +++ /dev/null @@ -1,111 +0,0 @@ -/* TABLETS */ - -@media (max-width: 1024px) { - [dir="rtl"] .colMS { - margin-right: 0; - } - - [dir="rtl"] #user-tools { - text-align: right; - } - - [dir="rtl"] #changelist .actions label { - padding-left: 10px; - padding-right: 0; - } - - [dir="rtl"] #changelist .actions select { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .change-list .filtered .results, - [dir="rtl"] .change-list .filtered .paginator, - [dir="rtl"] .filtered #toolbar, - [dir="rtl"] .filtered div.xfull, - [dir="rtl"] .filtered .actions, - [dir="rtl"] #changelist-filter { - margin-left: 0; - } - - [dir="rtl"] .inline-group ul.tools a.add, - [dir="rtl"] .inline-group div.add-row a, - [dir="rtl"] .inline-group .tabular tr.add-row td a { - padding: 8px 26px 8px 10px; - background-position: calc(100% - 8px) 9px; - } - - [dir="rtl"] .selector .selector-filter label { - margin-right: 0; - margin-left: 8px; - } - - [dir="rtl"] .object-tools li { - float: right; - } - - [dir="rtl"] .object-tools li + li { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .dashboard .module table td a { - padding-left: 0; - padding-right: 16px; - } - - [dir="rtl"] .selector-add { - background-position: 0 -80px; - } - - [dir="rtl"] .selector-remove { - background-position: 0 -120px; - } - - [dir="rtl"] .active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -100px; - } - - [dir="rtl"] .active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -140px; - } -} - -/* MOBILE */ - -@media (max-width: 767px) { - [dir="rtl"] .aligned .related-lookup, - [dir="rtl"] .aligned .datetimeshortcuts { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .aligned ul, - [dir="rtl"] form .aligned ul.errorlist { - margin-right: 0; - } - - [dir="rtl"] #changelist-filter { - margin-left: 0; - margin-right: 0; - } - [dir="rtl"] .aligned .vCheckboxLabel { - padding: 1px 5px 0 0; - } - - [dir="rtl"] .selector-remove { - background-position: 0 0; - } - - [dir="rtl"] .active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -20px; - } - - [dir="rtl"] .selector-add { - background-position: 0 -40px; - } - - [dir="rtl"] .active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -60px; - } -} diff --git a/staticfiles/admin/css/rtl.css b/staticfiles/admin/css/rtl.css deleted file mode 100644 index b8f60e0..0000000 --- a/staticfiles/admin/css/rtl.css +++ /dev/null @@ -1,291 +0,0 @@ -/* GLOBAL */ - -th { - text-align: right; -} - -.module h2, .module caption { - text-align: right; -} - -.module ul, .module ol { - margin-left: 0; - margin-right: 1.5em; -} - -.viewlink, .addlink, .changelink, .hidelink { - padding-left: 0; - padding-right: 16px; - background-position: 100% 1px; -} - -.deletelink { - padding-left: 0; - padding-right: 16px; - background-position: 100% 1px; -} - -.object-tools { - float: left; -} - -thead th:first-child, -tfoot td:first-child { - border-left: none; -} - -/* LAYOUT */ - -#user-tools { - right: auto; - left: 0; - text-align: left; -} - -div.breadcrumbs { - text-align: right; -} - -#content-main { - float: right; -} - -#content-related { - float: left; - margin-left: -300px; - margin-right: auto; -} - -.colMS { - margin-left: 300px; - margin-right: 0; -} - -/* SORTABLE TABLES */ - -table thead th.sorted .sortoptions { - float: left; -} - -thead th.sorted .text { - padding-right: 0; - padding-left: 42px; -} - -/* dashboard styles */ - -.dashboard .module table td a { - padding-left: .6em; - padding-right: 16px; -} - -/* changelists styles */ - -.change-list .filtered table { - border-left: none; - border-right: 0px none; -} - -#changelist-filter { - border-left: none; - border-right: none; - margin-left: 0; - margin-right: 30px; -} - -#changelist-filter li.selected { - border-left: none; - padding-left: 10px; - margin-left: 0; - border-right: 5px solid var(--hairline-color); - padding-right: 10px; - margin-right: -15px; -} - -#changelist table tbody td:first-child, #changelist table tbody th:first-child { - border-right: none; - border-left: none; -} - -.paginator .end { - margin-left: 6px; - margin-right: 0; -} - -.paginator input { - margin-left: 0; - margin-right: auto; -} - -/* FORMS */ - -.aligned label { - padding: 0 0 3px 1em; -} - -.submit-row a.deletelink { - margin-left: 0; - margin-right: auto; -} - -.vDateField, .vTimeField { - margin-left: 2px; -} - -.aligned .form-row input { - margin-left: 5px; -} - -form .aligned ul { - margin-right: 163px; - padding-right: 10px; - margin-left: 0; - padding-left: 0; -} - -form ul.inline li { - float: right; - padding-right: 0; - padding-left: 7px; -} - -form .aligned p.help, -form .aligned div.help { - margin-left: 0; - margin-right: 160px; - padding-right: 10px; -} - -form div.help ul, -form .aligned .checkbox-row + .help, -form .aligned p.date div.help.timezonewarning, -form .aligned p.datetime div.help.timezonewarning, -form .aligned p.time div.help.timezonewarning { - margin-right: 0; - padding-right: 0; -} - -form .wide p.help, -form .wide ul.errorlist, -form .wide div.help { - padding-left: 0; - padding-right: 50px; -} - -.submit-row { - text-align: right; -} - -fieldset .fieldBox { - margin-left: 20px; - margin-right: 0; -} - -.errorlist li { - background-position: 100% 12px; - padding: 0; -} - -.errornote { - background-position: 100% 12px; - padding: 10px 12px; -} - -/* WIDGETS */ - -.calendarnav-previous { - top: 0; - left: auto; - right: 10px; - background: url(../img/calendar-icons.svg) 0 -15px no-repeat; -} - -.calendarnav-next { - top: 0; - right: auto; - left: 10px; - background: url(../img/calendar-icons.svg) 0 0 no-repeat; -} - -.calendar caption, .calendarbox h2 { - text-align: center; -} - -.selector { - float: right; -} - -.selector .selector-filter { - text-align: right; -} - -.selector-add { - background: url(../img/selector-icons.svg) 0 -64px no-repeat; -} - -.active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -80px; -} - -.selector-remove { - background: url(../img/selector-icons.svg) 0 -96px no-repeat; -} - -.active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -112px; -} - -a.selector-chooseall { - background: url(../img/selector-icons.svg) right -128px no-repeat; -} - -a.active.selector-chooseall:focus, a.active.selector-chooseall:hover { - background-position: 100% -144px; -} - -a.selector-clearall { - background: url(../img/selector-icons.svg) 0 -160px no-repeat; -} - -a.active.selector-clearall:focus, a.active.selector-clearall:hover { - background-position: 0 -176px; -} - -.inline-deletelink { - float: left; -} - -form .form-row p.datetime { - overflow: hidden; -} - -.related-widget-wrapper { - float: right; -} - -/* MISC */ - -.inline-related h2, .inline-group h2 { - text-align: right -} - -.inline-related h3 span.delete { - padding-right: 20px; - padding-left: inherit; - left: 10px; - right: inherit; - float:left; -} - -.inline-related h3 span.delete label { - margin-left: inherit; - margin-right: 2px; -} - -.inline-group .tabular td.original p { - right: 0; -} - -.selector .selector-chooser { - margin: 0; -} diff --git a/staticfiles/admin/css/unusable_password_field.css b/staticfiles/admin/css/unusable_password_field.css deleted file mode 100644 index d46eb03..0000000 --- a/staticfiles/admin/css/unusable_password_field.css +++ /dev/null @@ -1,19 +0,0 @@ -/* Hide warnings fields if usable password is selected */ -form:has(#id_usable_password input[value="true"]:checked) .messagelist { - display: none; -} - -/* Hide password fields if unusable password is selected */ -form:has(#id_usable_password input[value="false"]:checked) .field-password1, -form:has(#id_usable_password input[value="false"]:checked) .field-password2 { - display: none; -} - -/* Select appropriate submit button */ -form:has(#id_usable_password input[value="true"]:checked) input[type="submit"].unset-password { - display: none; -} - -form:has(#id_usable_password input[value="false"]:checked) input[type="submit"].set-password { - display: none; -} diff --git a/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md b/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md deleted file mode 100644 index 8cb8a2b..0000000 --- a/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/staticfiles/admin/css/vendor/select2/select2.css b/staticfiles/admin/css/vendor/select2/select2.css deleted file mode 100644 index 750b320..0000000 --- a/staticfiles/admin/css/vendor/select2/select2.css +++ /dev/null @@ -1,481 +0,0 @@ -.select2-container { - box-sizing: border-box; - display: inline-block; - margin: 0; - position: relative; - vertical-align: middle; } - .select2-container .select2-selection--single { - box-sizing: border-box; - cursor: pointer; - display: block; - height: 28px; - user-select: none; - -webkit-user-select: none; } - .select2-container .select2-selection--single .select2-selection__rendered { - display: block; - padding-left: 8px; - padding-right: 20px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } - .select2-container .select2-selection--single .select2-selection__clear { - position: relative; } - .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { - padding-right: 8px; - padding-left: 20px; } - .select2-container .select2-selection--multiple { - box-sizing: border-box; - cursor: pointer; - display: block; - min-height: 32px; - user-select: none; - -webkit-user-select: none; } - .select2-container .select2-selection--multiple .select2-selection__rendered { - display: inline-block; - overflow: hidden; - padding-left: 8px; - text-overflow: ellipsis; - white-space: nowrap; } - .select2-container .select2-search--inline { - float: left; } - .select2-container .select2-search--inline .select2-search__field { - box-sizing: border-box; - border: none; - font-size: 100%; - margin-top: 5px; - padding: 0; } - .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none; } - -.select2-dropdown { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - box-sizing: border-box; - display: block; - position: absolute; - left: -100000px; - width: 100%; - z-index: 1051; } - -.select2-results { - display: block; } - -.select2-results__options { - list-style: none; - margin: 0; - padding: 0; } - -.select2-results__option { - padding: 6px; - user-select: none; - -webkit-user-select: none; } - .select2-results__option[aria-selected] { - cursor: pointer; } - -.select2-container--open .select2-dropdown { - left: 0; } - -.select2-container--open .select2-dropdown--above { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--open .select2-dropdown--below { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-search--dropdown { - display: block; - padding: 4px; } - .select2-search--dropdown .select2-search__field { - padding: 4px; - width: 100%; - box-sizing: border-box; } - .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none; } - .select2-search--dropdown.select2-search--hide { - display: none; } - -.select2-close-mask { - border: 0; - margin: 0; - padding: 0; - display: block; - position: fixed; - left: 0; - top: 0; - min-height: 100%; - min-width: 100%; - height: auto; - width: auto; - opacity: 0; - z-index: 99; - background-color: #fff; - filter: alpha(opacity=0); } - -.select2-hidden-accessible { - border: 0 !important; - clip: rect(0 0 0 0) !important; - -webkit-clip-path: inset(50%) !important; - clip-path: inset(50%) !important; - height: 1px !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - width: 1px !important; - white-space: nowrap !important; } - -.select2-container--default .select2-selection--single { - background-color: #fff; - border: 1px solid #aaa; - border-radius: 4px; } - .select2-container--default .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 28px; } - .select2-container--default .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; } - .select2-container--default .select2-selection--single .select2-selection__placeholder { - color: #999; } - .select2-container--default .select2-selection--single .select2-selection__arrow { - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; } - .select2-container--default .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; } - -.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; } - -.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { - left: 1px; - right: auto; } - -.select2-container--default.select2-container--disabled .select2-selection--single { - background-color: #eee; - cursor: default; } - .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { - display: none; } - -.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; } - -.select2-container--default .select2-selection--multiple { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - cursor: text; } - .select2-container--default .select2-selection--multiple .select2-selection__rendered { - box-sizing: border-box; - list-style: none; - margin: 0; - padding: 0 5px; - width: 100%; } - .select2-container--default .select2-selection--multiple .select2-selection__rendered li { - list-style: none; } - .select2-container--default .select2-selection--multiple .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin-top: 5px; - margin-right: 10px; - padding: 1px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #aaa; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { - color: #999; - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #333; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { - float: right; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - margin-left: 5px; - margin-right: auto; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; } - -.select2-container--default.select2-container--focus .select2-selection--multiple { - border: solid black 1px; - outline: 0; } - -.select2-container--default.select2-container--disabled .select2-selection--multiple { - background-color: #eee; - cursor: default; } - -.select2-container--default.select2-container--disabled .select2-selection__choice__remove { - display: none; } - -.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--default .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa; } - -.select2-container--default .select2-search--inline .select2-search__field { - background: transparent; - border: none; - outline: 0; - box-shadow: none; - -webkit-appearance: textfield; } - -.select2-container--default .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; } - -.select2-container--default .select2-results__option[role=group] { - padding: 0; } - -.select2-container--default .select2-results__option[aria-disabled=true] { - color: #999; } - -.select2-container--default .select2-results__option[aria-selected=true] { - background-color: #ddd; } - -.select2-container--default .select2-results__option .select2-results__option { - padding-left: 1em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__group { - padding-left: 0; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option { - margin-left: -1em; - padding-left: 2em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -2em; - padding-left: 3em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -3em; - padding-left: 4em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -4em; - padding-left: 5em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -5em; - padding-left: 6em; } - -.select2-container--default .select2-results__option--highlighted[aria-selected] { - background-color: #5897fb; - color: white; } - -.select2-container--default .select2-results__group { - cursor: default; - display: block; - padding: 6px; } - -.select2-container--classic .select2-selection--single { - background-color: #f7f7f7; - border: 1px solid #aaa; - border-radius: 4px; - outline: 0; - background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); - background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); - background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } - .select2-container--classic .select2-selection--single:focus { - border: 1px solid #5897fb; } - .select2-container--classic .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 28px; } - .select2-container--classic .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin-right: 10px; } - .select2-container--classic .select2-selection--single .select2-selection__placeholder { - color: #999; } - .select2-container--classic .select2-selection--single .select2-selection__arrow { - background-color: #ddd; - border: none; - border-left: 1px solid #aaa; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; - background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); - background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); - background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } - .select2-container--classic .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; } - -.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; } - -.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { - border: none; - border-right: 1px solid #aaa; - border-radius: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; - left: 1px; - right: auto; } - -.select2-container--classic.select2-container--open .select2-selection--single { - border: 1px solid #5897fb; } - .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { - background: transparent; - border: none; } - .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; } - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; - background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); - background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); - background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); - background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); - background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } - -.select2-container--classic .select2-selection--multiple { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - cursor: text; - outline: 0; } - .select2-container--classic .select2-selection--multiple:focus { - border: 1px solid #5897fb; } - .select2-container--classic .select2-selection--multiple .select2-selection__rendered { - list-style: none; - margin: 0; - padding: 0 5px; } - .select2-container--classic .select2-selection--multiple .select2-selection__clear { - display: none; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #aaa; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { - color: #888; - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #555; } - -.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - float: right; - margin-left: 5px; - margin-right: auto; } - -.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; } - -.select2-container--classic.select2-container--open .select2-selection--multiple { - border: 1px solid #5897fb; } - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--classic .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa; - outline: 0; } - -.select2-container--classic .select2-search--inline .select2-search__field { - outline: 0; - box-shadow: none; } - -.select2-container--classic .select2-dropdown { - background-color: white; - border: 1px solid transparent; } - -.select2-container--classic .select2-dropdown--above { - border-bottom: none; } - -.select2-container--classic .select2-dropdown--below { - border-top: none; } - -.select2-container--classic .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; } - -.select2-container--classic .select2-results__option[role=group] { - padding: 0; } - -.select2-container--classic .select2-results__option[aria-disabled=true] { - color: grey; } - -.select2-container--classic .select2-results__option--highlighted[aria-selected] { - background-color: #3875d7; - color: white; } - -.select2-container--classic .select2-results__group { - cursor: default; - display: block; - padding: 6px; } - -.select2-container--classic.select2-container--open .select2-dropdown { - border-color: #5897fb; } diff --git a/staticfiles/admin/css/vendor/select2/select2.min.css b/staticfiles/admin/css/vendor/select2/select2.min.css deleted file mode 100644 index 7c18ad5..0000000 --- a/staticfiles/admin/css/vendor/select2/select2.min.css +++ /dev/null @@ -1 +0,0 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/staticfiles/admin/css/widgets.css b/staticfiles/admin/css/widgets.css deleted file mode 100644 index cc64811..0000000 --- a/staticfiles/admin/css/widgets.css +++ /dev/null @@ -1,593 +0,0 @@ -/* SELECTOR (FILTER INTERFACE) */ - -.selector { - display: flex; - flex-grow: 1; - gap: 0 10px; -} - -.selector select { - height: 17.2em; - flex: 1 0 auto; - overflow: scroll; - width: 100%; -} - -.selector-available, .selector-chosen { - text-align: center; - display: flex; - flex-direction: column; - flex: 1 1; -} - -.selector-available h2, .selector-chosen h2 { - border: 1px solid var(--border-color); - border-radius: 4px 4px 0 0; -} - -.selector-chosen .list-footer-display { - border: 1px solid var(--border-color); - border-top: none; - border-radius: 0 0 4px 4px; - margin: 0 0 10px; - padding: 8px; - text-align: center; - background: var(--primary); - color: var(--header-link-color); - cursor: pointer; -} -.selector-chosen .list-footer-display__clear { - color: var(--breadcrumbs-fg); -} - -.selector-chosen h2 { - background: var(--secondary); - color: var(--header-link-color); -} - -.selector .selector-available h2 { - background: var(--darkened-bg); - color: var(--body-quiet-color); -} - -.selector .selector-filter { - border: 1px solid var(--border-color); - border-width: 0 1px; - padding: 8px; - color: var(--body-quiet-color); - font-size: 0.625rem; - margin: 0; - text-align: left; - display: flex; -} - -.selector .selector-filter label, -.inline-group .aligned .selector .selector-filter label { - float: left; - margin: 7px 0 0; - width: 18px; - height: 18px; - padding: 0; - overflow: hidden; - line-height: 1; - min-width: auto; -} - -.selector-filter input { - flex-grow: 1; -} - -.selector .selector-available input, -.selector .selector-chosen input { - margin-left: 8px; -} - -.selector ul.selector-chooser { - align-self: center; - width: 22px; - background-color: var(--selected-bg); - border-radius: 10px; - margin: 0; - padding: 0; - transform: translateY(-17px); -} - -.selector-chooser li { - margin: 0; - padding: 3px; - list-style-type: none; -} - -.selector select { - padding: 0 10px; - margin: 0 0 10px; - border-radius: 0 0 4px 4px; -} -.selector .selector-chosen--with-filtered select { - margin: 0; - border-radius: 0; - height: 14em; -} - -.selector .selector-chosen:not(.selector-chosen--with-filtered) .list-footer-display { - display: none; -} - -.selector-add, .selector-remove { - width: 16px; - height: 16px; - display: block; - text-indent: -3000px; - overflow: hidden; - cursor: default; - opacity: 0.55; -} - -.active.selector-add, .active.selector-remove { - opacity: 1; -} - -.active.selector-add:hover, .active.selector-remove:hover { - cursor: pointer; -} - -.selector-add { - background: url(../img/selector-icons.svg) 0 -96px no-repeat; -} - -.active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -112px; -} - -.selector-remove { - background: url(../img/selector-icons.svg) 0 -64px no-repeat; -} - -.active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -80px; -} - -a.selector-chooseall, a.selector-clearall { - display: inline-block; - height: 16px; - text-align: left; - margin: 0 auto; - overflow: hidden; - font-weight: bold; - line-height: 16px; - color: var(--body-quiet-color); - text-decoration: none; - opacity: 0.55; -} - -a.active.selector-chooseall:focus, a.active.selector-clearall:focus, -a.active.selector-chooseall:hover, a.active.selector-clearall:hover { - color: var(--link-fg); -} - -a.active.selector-chooseall, a.active.selector-clearall { - opacity: 1; -} - -a.active.selector-chooseall:hover, a.active.selector-clearall:hover { - cursor: pointer; -} - -a.selector-chooseall { - padding: 0 18px 0 0; - background: url(../img/selector-icons.svg) right -160px no-repeat; - cursor: default; -} - -a.active.selector-chooseall:focus, a.active.selector-chooseall:hover { - background-position: 100% -176px; -} - -a.selector-clearall { - padding: 0 0 0 18px; - background: url(../img/selector-icons.svg) 0 -128px no-repeat; - cursor: default; -} - -a.active.selector-clearall:focus, a.active.selector-clearall:hover { - background-position: 0 -144px; -} - -/* STACKED SELECTORS */ - -.stacked { - float: left; - width: 490px; - display: block; -} - -.stacked select { - width: 480px; - height: 10.1em; -} - -.stacked .selector-available, .stacked .selector-chosen { - width: 480px; -} - -.stacked .selector-available { - margin-bottom: 0; -} - -.stacked .selector-available input { - width: 422px; -} - -.stacked ul.selector-chooser { - height: 22px; - width: 50px; - margin: 0 0 10px 40%; - background-color: #eee; - border-radius: 10px; - transform: none; -} - -.stacked .selector-chooser li { - float: left; - padding: 3px 3px 3px 5px; -} - -.stacked .selector-chooseall, .stacked .selector-clearall { - display: none; -} - -.stacked .selector-add { - background: url(../img/selector-icons.svg) 0 -32px no-repeat; - cursor: default; -} - -.stacked .active.selector-add { - background-position: 0 -32px; - cursor: pointer; -} - -.stacked .active.selector-add:focus, .stacked .active.selector-add:hover { - background-position: 0 -48px; - cursor: pointer; -} - -.stacked .selector-remove { - background: url(../img/selector-icons.svg) 0 0 no-repeat; - cursor: default; -} - -.stacked .active.selector-remove { - background-position: 0 0px; - cursor: pointer; -} - -.stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover { - background-position: 0 -16px; - cursor: pointer; -} - -.selector .help-icon { - background: url(../img/icon-unknown.svg) 0 0 no-repeat; - display: inline-block; - vertical-align: middle; - margin: -2px 0 0 2px; - width: 13px; - height: 13px; -} - -.selector .selector-chosen .help-icon { - background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat; -} - -.selector .search-label-icon { - background: url(../img/search.svg) 0 0 no-repeat; - display: inline-block; - height: 1.125rem; - width: 1.125rem; -} - -/* DATE AND TIME */ - -p.datetime { - line-height: 20px; - margin: 0; - padding: 0; - color: var(--body-quiet-color); - font-weight: bold; -} - -.datetime span { - white-space: nowrap; - font-weight: normal; - font-size: 0.6875rem; - color: var(--body-quiet-color); -} - -.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { - margin-left: 5px; - margin-bottom: 4px; -} - -table p.datetime { - font-size: 0.6875rem; - margin-left: 0; - padding-left: 0; -} - -.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon { - position: relative; - display: inline-block; - vertical-align: middle; - height: 16px; - width: 16px; - overflow: hidden; -} - -.datetimeshortcuts .clock-icon { - background: url(../img/icon-clock.svg) 0 0 no-repeat; -} - -.datetimeshortcuts a:focus .clock-icon, -.datetimeshortcuts a:hover .clock-icon { - background-position: 0 -16px; -} - -.datetimeshortcuts .date-icon { - background: url(../img/icon-calendar.svg) 0 0 no-repeat; - top: -1px; -} - -.datetimeshortcuts a:focus .date-icon, -.datetimeshortcuts a:hover .date-icon { - background-position: 0 -16px; -} - -.timezonewarning { - font-size: 0.6875rem; - color: var(--body-quiet-color); -} - -/* URL */ - -p.url { - line-height: 20px; - margin: 0; - padding: 0; - color: var(--body-quiet-color); - font-size: 0.6875rem; - font-weight: bold; -} - -.url a { - font-weight: normal; -} - -/* FILE UPLOADS */ - -p.file-upload { - line-height: 20px; - margin: 0; - padding: 0; - color: var(--body-quiet-color); - font-size: 0.6875rem; - font-weight: bold; -} - -.file-upload a { - font-weight: normal; -} - -.file-upload .deletelink { - margin-left: 5px; -} - -span.clearable-file-input label { - color: var(--body-fg); - font-size: 0.6875rem; - display: inline; - float: none; -} - -/* CALENDARS & CLOCKS */ - -.calendarbox, .clockbox { - margin: 5px auto; - font-size: 0.75rem; - width: 19em; - text-align: center; - background: var(--body-bg); - color: var(--body-fg); - border: 1px solid var(--hairline-color); - border-radius: 4px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); - overflow: hidden; - position: relative; -} - -.clockbox { - width: auto; -} - -.calendar { - margin: 0; - padding: 0; -} - -.calendar table { - margin: 0; - padding: 0; - border-collapse: collapse; - background: white; - width: 100%; -} - -.calendar caption, .calendarbox h2 { - margin: 0; - text-align: center; - border-top: none; - font-weight: 700; - font-size: 0.75rem; - color: #333; - background: var(--accent); -} - -.calendar th { - padding: 8px 5px; - background: var(--darkened-bg); - border-bottom: 1px solid var(--border-color); - font-weight: 400; - font-size: 0.75rem; - text-align: center; - color: var(--body-quiet-color); -} - -.calendar td { - font-weight: 400; - font-size: 0.75rem; - text-align: center; - padding: 0; - border-top: 1px solid var(--hairline-color); - border-bottom: none; -} - -.calendar td.selected a { - background: var(--secondary); - color: var(--button-fg); -} - -.calendar td.nonday { - background: var(--darkened-bg); -} - -.calendar td.today a { - font-weight: 700; -} - -.calendar td a, .timelist a { - display: block; - font-weight: 400; - padding: 6px; - text-decoration: none; - color: var(--body-quiet-color); -} - -.calendar td a:focus, .timelist a:focus, -.calendar td a:hover, .timelist a:hover { - background: var(--primary); - color: white; -} - -.calendar td a:active, .timelist a:active { - background: var(--header-bg); - color: white; -} - -.calendarnav { - font-size: 0.625rem; - text-align: center; - color: #ccc; - margin: 0; - padding: 1px 3px; -} - -.calendarnav a:link, #calendarnav a:visited, -#calendarnav a:focus, #calendarnav a:hover { - color: var(--body-quiet-color); -} - -.calendar-shortcuts { - background: var(--body-bg); - color: var(--body-quiet-color); - font-size: 0.6875rem; - line-height: 0.6875rem; - border-top: 1px solid var(--hairline-color); - padding: 8px 0; -} - -.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { - display: block; - position: absolute; - top: 8px; - width: 15px; - height: 15px; - text-indent: -9999px; - padding: 0; -} - -.calendarnav-previous { - left: 10px; - background: url(../img/calendar-icons.svg) 0 0 no-repeat; -} - -.calendarnav-next { - right: 10px; - background: url(../img/calendar-icons.svg) 0 -15px no-repeat; -} - -.calendar-cancel { - margin: 0; - padding: 4px 0; - font-size: 0.75rem; - background: var(--close-button-bg); - border-top: 1px solid var(--border-color); - color: var(--button-fg); -} - -.calendar-cancel:focus, .calendar-cancel:hover { - background: var(--close-button-hover-bg); -} - -.calendar-cancel a { - color: var(--button-fg); - display: block; -} - -ul.timelist, .timelist li { - list-style-type: none; - margin: 0; - padding: 0; -} - -.timelist a { - padding: 2px; -} - -/* EDIT INLINE */ - -.inline-deletelink { - float: right; - text-indent: -9999px; - background: url(../img/inline-delete.svg) 0 0 no-repeat; - width: 16px; - height: 16px; - border: 0px none; -} - -.inline-deletelink:focus, .inline-deletelink:hover { - cursor: pointer; -} - -/* RELATED WIDGET WRAPPER */ -.related-widget-wrapper { - display: flex; - gap: 0 10px; - flex-grow: 1; - flex-wrap: wrap; - margin-bottom: 5px; -} - -.related-widget-wrapper-link { - opacity: .6; - filter: grayscale(1); -} - -.related-widget-wrapper-link:link { - opacity: 1; - filter: grayscale(0); -} - -/* GIS MAPS */ -.dj_map { - width: 600px; - height: 400px; -} diff --git a/staticfiles/admin/img/LICENSE b/staticfiles/admin/img/LICENSE deleted file mode 100644 index a4faaa1..0000000 --- a/staticfiles/admin/img/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Code Charm Ltd - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/staticfiles/admin/img/README.txt b/staticfiles/admin/img/README.txt deleted file mode 100644 index bf81f35..0000000 --- a/staticfiles/admin/img/README.txt +++ /dev/null @@ -1,7 +0,0 @@ -All icons are taken from Font Awesome (https://fontawesome.com/) project. -The Font Awesome font is licensed under the SIL OFL 1.1: -- https://scripts.sil.org/OFL - -SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG -Font-Awesome-SVG-PNG is licensed under the MIT license (see file license -in current folder). diff --git a/staticfiles/admin/img/calendar-icons.svg b/staticfiles/admin/img/calendar-icons.svg deleted file mode 100644 index 04c0274..0000000 --- a/staticfiles/admin/img/calendar-icons.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - diff --git a/staticfiles/admin/img/gis/move_vertex_off.svg b/staticfiles/admin/img/gis/move_vertex_off.svg deleted file mode 100644 index 228854f..0000000 --- a/staticfiles/admin/img/gis/move_vertex_off.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/staticfiles/admin/img/gis/move_vertex_on.svg b/staticfiles/admin/img/gis/move_vertex_on.svg deleted file mode 100644 index 96b87fd..0000000 --- a/staticfiles/admin/img/gis/move_vertex_on.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/staticfiles/admin/img/icon-addlink.svg b/staticfiles/admin/img/icon-addlink.svg deleted file mode 100644 index 8d5c6a3..0000000 --- a/staticfiles/admin/img/icon-addlink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/staticfiles/admin/img/icon-alert.svg b/staticfiles/admin/img/icon-alert.svg deleted file mode 100644 index e51ea83..0000000 --- a/staticfiles/admin/img/icon-alert.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/staticfiles/admin/img/icon-calendar.svg b/staticfiles/admin/img/icon-calendar.svg deleted file mode 100644 index 97910a9..0000000 --- a/staticfiles/admin/img/icon-calendar.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/staticfiles/admin/img/icon-changelink.svg b/staticfiles/admin/img/icon-changelink.svg deleted file mode 100644 index 592b093..0000000 --- a/staticfiles/admin/img/icon-changelink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/staticfiles/admin/img/icon-clock.svg b/staticfiles/admin/img/icon-clock.svg deleted file mode 100644 index bf9985d..0000000 --- a/staticfiles/admin/img/icon-clock.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/staticfiles/admin/img/icon-deletelink.svg b/staticfiles/admin/img/icon-deletelink.svg deleted file mode 100644 index 4059b15..0000000 --- a/staticfiles/admin/img/icon-deletelink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/staticfiles/admin/img/icon-hidelink.svg b/staticfiles/admin/img/icon-hidelink.svg deleted file mode 100644 index 2a8b404..0000000 --- a/staticfiles/admin/img/icon-hidelink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/staticfiles/admin/img/icon-no.svg b/staticfiles/admin/img/icon-no.svg deleted file mode 100644 index 2e0d383..0000000 --- a/staticfiles/admin/img/icon-no.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/staticfiles/admin/img/icon-unknown-alt.svg b/staticfiles/admin/img/icon-unknown-alt.svg deleted file mode 100644 index 1c6b99f..0000000 --- a/staticfiles/admin/img/icon-unknown-alt.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/staticfiles/admin/img/icon-unknown.svg b/staticfiles/admin/img/icon-unknown.svg deleted file mode 100644 index 50b4f97..0000000 --- a/staticfiles/admin/img/icon-unknown.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/staticfiles/admin/img/icon-viewlink.svg b/staticfiles/admin/img/icon-viewlink.svg deleted file mode 100644 index a1ca1d3..0000000 --- a/staticfiles/admin/img/icon-viewlink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/staticfiles/admin/img/icon-yes.svg b/staticfiles/admin/img/icon-yes.svg deleted file mode 100644 index 5883d87..0000000 --- a/staticfiles/admin/img/icon-yes.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/staticfiles/admin/img/inline-delete.svg b/staticfiles/admin/img/inline-delete.svg deleted file mode 100644 index 17d1ad6..0000000 --- a/staticfiles/admin/img/inline-delete.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/staticfiles/admin/img/search.svg b/staticfiles/admin/img/search.svg deleted file mode 100644 index c8c69b2..0000000 --- a/staticfiles/admin/img/search.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/staticfiles/admin/img/selector-icons.svg b/staticfiles/admin/img/selector-icons.svg deleted file mode 100644 index 926b8e2..0000000 --- a/staticfiles/admin/img/selector-icons.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/staticfiles/admin/img/sorting-icons.svg b/staticfiles/admin/img/sorting-icons.svg deleted file mode 100644 index 7c31ec9..0000000 --- a/staticfiles/admin/img/sorting-icons.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/staticfiles/admin/img/tooltag-add.svg b/staticfiles/admin/img/tooltag-add.svg deleted file mode 100644 index 1ca64ae..0000000 --- a/staticfiles/admin/img/tooltag-add.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/staticfiles/admin/img/tooltag-arrowright.svg b/staticfiles/admin/img/tooltag-arrowright.svg deleted file mode 100644 index b664d61..0000000 --- a/staticfiles/admin/img/tooltag-arrowright.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/staticfiles/admin/js/SelectBox.js b/staticfiles/admin/js/SelectBox.js deleted file mode 100644 index 3db4ec7..0000000 --- a/staticfiles/admin/js/SelectBox.js +++ /dev/null @@ -1,116 +0,0 @@ -'use strict'; -{ - const SelectBox = { - cache: {}, - init: function(id) { - const box = document.getElementById(id); - SelectBox.cache[id] = []; - const cache = SelectBox.cache[id]; - for (const node of box.options) { - cache.push({value: node.value, text: node.text, displayed: 1}); - } - }, - redisplay: function(id) { - // Repopulate HTML select box from cache - const box = document.getElementById(id); - const scroll_value_from_top = box.scrollTop; - box.innerHTML = ''; - for (const node of SelectBox.cache[id]) { - if (node.displayed) { - const new_option = new Option(node.text, node.value, false, false); - // Shows a tooltip when hovering over the option - new_option.title = node.text; - box.appendChild(new_option); - } - } - box.scrollTop = scroll_value_from_top; - }, - filter: function(id, text) { - // Redisplay the HTML select box, displaying only the choices containing ALL - // the words in text. (It's an AND search.) - const tokens = text.toLowerCase().split(/\s+/); - for (const node of SelectBox.cache[id]) { - node.displayed = 1; - const node_text = node.text.toLowerCase(); - for (const token of tokens) { - if (!node_text.includes(token)) { - node.displayed = 0; - break; // Once the first token isn't found we're done - } - } - } - SelectBox.redisplay(id); - }, - get_hidden_node_count(id) { - const cache = SelectBox.cache[id] || []; - return cache.filter(node => node.displayed === 0).length; - }, - delete_from_cache: function(id, value) { - let delete_index = null; - const cache = SelectBox.cache[id]; - for (const [i, node] of cache.entries()) { - if (node.value === value) { - delete_index = i; - break; - } - } - cache.splice(delete_index, 1); - }, - add_to_cache: function(id, option) { - SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); - }, - cache_contains: function(id, value) { - // Check if an item is contained in the cache - for (const node of SelectBox.cache[id]) { - if (node.value === value) { - return true; - } - } - return false; - }, - move: function(from, to) { - const from_box = document.getElementById(from); - for (const option of from_box.options) { - const option_value = option.value; - if (option.selected && SelectBox.cache_contains(from, option_value)) { - SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); - SelectBox.delete_from_cache(from, option_value); - } - } - SelectBox.redisplay(from); - SelectBox.redisplay(to); - }, - move_all: function(from, to) { - const from_box = document.getElementById(from); - for (const option of from_box.options) { - const option_value = option.value; - if (SelectBox.cache_contains(from, option_value)) { - SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); - SelectBox.delete_from_cache(from, option_value); - } - } - SelectBox.redisplay(from); - SelectBox.redisplay(to); - }, - sort: function(id) { - SelectBox.cache[id].sort(function(a, b) { - a = a.text.toLowerCase(); - b = b.text.toLowerCase(); - if (a > b) { - return 1; - } - if (a < b) { - return -1; - } - return 0; - } ); - }, - select_all: function(id) { - const box = document.getElementById(id); - for (const option of box.options) { - option.selected = true; - } - } - }; - window.SelectBox = SelectBox; -} diff --git a/staticfiles/admin/js/SelectFilter2.js b/staticfiles/admin/js/SelectFilter2.js deleted file mode 100644 index 6957412..0000000 --- a/staticfiles/admin/js/SelectFilter2.js +++ /dev/null @@ -1,286 +0,0 @@ -/*global SelectBox, gettext, ngettext, interpolate, quickElement, SelectFilter*/ -/* -SelectFilter2 - Turns a multiple-select box into a filter interface. - -Requires core.js and SelectBox.js. -*/ -'use strict'; -{ - window.SelectFilter = { - init: function(field_id, field_name, is_stacked) { - if (field_id.match(/__prefix__/)) { - // Don't initialize on empty forms. - return; - } - const from_box = document.getElementById(field_id); - from_box.id += '_from'; // change its ID - from_box.className = 'filtered'; - - for (const p of from_box.parentNode.getElementsByTagName('p')) { - if (p.classList.contains("info")) { - // Remove

, because it just gets in the way. - from_box.parentNode.removeChild(p); - } else if (p.classList.contains("help")) { - // Move help text up to the top so it isn't below the select - // boxes or wrapped off on the side to the right of the add - // button: - from_box.parentNode.insertBefore(p, from_box.parentNode.firstChild); - } - } - - //

or
- const selector_div = quickElement('div', from_box.parentNode); - // Make sure the selector div is at the beginning so that the - // add link would be displayed to the right of the widget. - from_box.parentNode.prepend(selector_div); - selector_div.className = is_stacked ? 'selector stacked' : 'selector'; - - //
- const selector_available = quickElement('div', selector_div); - selector_available.className = 'selector-available'; - const title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name])); - quickElement( - 'span', title_available, '', - 'class', 'help help-tooltip help-icon', - 'title', interpolate( - gettext( - 'This is the list of available %s. You may choose some by ' + - 'selecting them in the box below and then clicking the ' + - '"Choose" arrow between the two boxes.' - ), - [field_name] - ) - ); - - const filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); - filter_p.className = 'selector-filter'; - - const search_filter_label = quickElement('label', filter_p, '', 'for', field_id + '_input'); - - quickElement( - 'span', search_filter_label, '', - 'class', 'help-tooltip search-label-icon', - 'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name]) - ); - - filter_p.appendChild(document.createTextNode(' ')); - - const filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter")); - filter_input.id = field_id + '_input'; - - selector_available.appendChild(from_box); - const choose_all = quickElement('a', selector_available, gettext('Choose all'), 'title', interpolate(gettext('Click to choose all %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_add_all_link'); - choose_all.className = 'selector-chooseall'; - - //
    - const selector_chooser = quickElement('ul', selector_div); - selector_chooser.className = 'selector-chooser'; - const add_link = quickElement('a', quickElement('li', selector_chooser), gettext('Choose'), 'title', gettext('Choose'), 'href', '#', 'id', field_id + '_add_link'); - add_link.className = 'selector-add'; - const remove_link = quickElement('a', quickElement('li', selector_chooser), gettext('Remove'), 'title', gettext('Remove'), 'href', '#', 'id', field_id + '_remove_link'); - remove_link.className = 'selector-remove'; - - //
    - const selector_chosen = quickElement('div', selector_div, '', 'id', field_id + '_selector_chosen'); - selector_chosen.className = 'selector-chosen'; - const title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name])); - quickElement( - 'span', title_chosen, '', - 'class', 'help help-tooltip help-icon', - 'title', interpolate( - gettext( - 'This is the list of chosen %s. You may remove some by ' + - 'selecting them in the box below and then clicking the ' + - '"Remove" arrow between the two boxes.' - ), - [field_name] - ) - ); - - const filter_selected_p = quickElement('p', selector_chosen, '', 'id', field_id + '_filter_selected'); - filter_selected_p.className = 'selector-filter'; - - const search_filter_selected_label = quickElement('label', filter_selected_p, '', 'for', field_id + '_selected_input'); - - quickElement( - 'span', search_filter_selected_label, '', - 'class', 'help-tooltip search-label-icon', - 'title', interpolate(gettext("Type into this box to filter down the list of selected %s."), [field_name]) - ); - - filter_selected_p.appendChild(document.createTextNode(' ')); - - const filter_selected_input = quickElement('input', filter_selected_p, '', 'type', 'text', 'placeholder', gettext("Filter")); - filter_selected_input.id = field_id + '_selected_input'; - - const to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', '', 'size', from_box.size, 'name', from_box.name); - to_box.className = 'filtered'; - - const warning_footer = quickElement('div', selector_chosen, '', 'class', 'list-footer-display'); - quickElement('span', warning_footer, '', 'id', field_id + '_list-footer-display-text'); - quickElement('span', warning_footer, ' (click to clear)', 'class', 'list-footer-display__clear'); - - const clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_remove_all_link'); - clear_all.className = 'selector-clearall'; - - from_box.name = from_box.name + '_old'; - - // Set up the JavaScript event handlers for the select box filter interface - const move_selection = function(e, elem, move_func, from, to) { - if (elem.classList.contains('active')) { - move_func(from, to); - SelectFilter.refresh_icons(field_id); - SelectFilter.refresh_filtered_selects(field_id); - SelectFilter.refresh_filtered_warning(field_id); - } - e.preventDefault(); - }; - choose_all.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move_all, field_id + '_from', field_id + '_to'); - }); - add_link.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move, field_id + '_from', field_id + '_to'); - }); - remove_link.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move, field_id + '_to', field_id + '_from'); - }); - clear_all.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move_all, field_id + '_to', field_id + '_from'); - }); - warning_footer.addEventListener('click', function(e) { - filter_selected_input.value = ''; - SelectBox.filter(field_id + '_to', ''); - SelectFilter.refresh_filtered_warning(field_id); - SelectFilter.refresh_icons(field_id); - }); - filter_input.addEventListener('keypress', function(e) { - SelectFilter.filter_key_press(e, field_id, '_from', '_to'); - }); - filter_input.addEventListener('keyup', function(e) { - SelectFilter.filter_key_up(e, field_id, '_from'); - }); - filter_input.addEventListener('keydown', function(e) { - SelectFilter.filter_key_down(e, field_id, '_from', '_to'); - }); - filter_selected_input.addEventListener('keypress', function(e) { - SelectFilter.filter_key_press(e, field_id, '_to', '_from'); - }); - filter_selected_input.addEventListener('keyup', function(e) { - SelectFilter.filter_key_up(e, field_id, '_to', '_selected_input'); - }); - filter_selected_input.addEventListener('keydown', function(e) { - SelectFilter.filter_key_down(e, field_id, '_to', '_from'); - }); - selector_div.addEventListener('change', function(e) { - if (e.target.tagName === 'SELECT') { - SelectFilter.refresh_icons(field_id); - } - }); - selector_div.addEventListener('dblclick', function(e) { - if (e.target.tagName === 'OPTION') { - if (e.target.closest('select').id === field_id + '_to') { - SelectBox.move(field_id + '_to', field_id + '_from'); - } else { - SelectBox.move(field_id + '_from', field_id + '_to'); - } - SelectFilter.refresh_icons(field_id); - } - }); - from_box.closest('form').addEventListener('submit', function() { - SelectBox.filter(field_id + '_to', ''); - SelectBox.select_all(field_id + '_to'); - }); - SelectBox.init(field_id + '_from'); - SelectBox.init(field_id + '_to'); - // Move selected from_box options to to_box - SelectBox.move(field_id + '_from', field_id + '_to'); - - // Initial icon refresh - SelectFilter.refresh_icons(field_id); - }, - any_selected: function(field) { - // Temporarily add the required attribute and check validity. - field.required = true; - const any_selected = field.checkValidity(); - field.required = false; - return any_selected; - }, - refresh_filtered_warning: function(field_id) { - const count = SelectBox.get_hidden_node_count(field_id + '_to'); - const selector = document.getElementById(field_id + '_selector_chosen'); - const warning = document.getElementById(field_id + '_list-footer-display-text'); - selector.className = selector.className.replace('selector-chosen--with-filtered', ''); - warning.textContent = interpolate(ngettext( - '%s selected option not visible', - '%s selected options not visible', - count - ), [count]); - if(count > 0) { - selector.className += ' selector-chosen--with-filtered'; - } - }, - refresh_filtered_selects: function(field_id) { - SelectBox.filter(field_id + '_from', document.getElementById(field_id + "_input").value); - SelectBox.filter(field_id + '_to', document.getElementById(field_id + "_selected_input").value); - }, - refresh_icons: function(field_id) { - const from = document.getElementById(field_id + '_from'); - const to = document.getElementById(field_id + '_to'); - // Active if at least one item is selected - document.getElementById(field_id + '_add_link').classList.toggle('active', SelectFilter.any_selected(from)); - document.getElementById(field_id + '_remove_link').classList.toggle('active', SelectFilter.any_selected(to)); - // Active if the corresponding box isn't empty - document.getElementById(field_id + '_add_all_link').classList.toggle('active', from.querySelector('option')); - document.getElementById(field_id + '_remove_all_link').classList.toggle('active', to.querySelector('option')); - SelectFilter.refresh_filtered_warning(field_id); - }, - filter_key_press: function(event, field_id, source, target) { - const source_box = document.getElementById(field_id + source); - // don't submit form if user pressed Enter - if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) { - source_box.selectedIndex = 0; - SelectBox.move(field_id + source, field_id + target); - source_box.selectedIndex = 0; - event.preventDefault(); - } - }, - filter_key_up: function(event, field_id, source, filter_input) { - const input = filter_input || '_input'; - const source_box = document.getElementById(field_id + source); - const temp = source_box.selectedIndex; - SelectBox.filter(field_id + source, document.getElementById(field_id + input).value); - source_box.selectedIndex = temp; - SelectFilter.refresh_filtered_warning(field_id); - SelectFilter.refresh_icons(field_id); - }, - filter_key_down: function(event, field_id, source, target) { - const source_box = document.getElementById(field_id + source); - // right key (39) or left key (37) - const direction = source === '_from' ? 39 : 37; - // right arrow -- move across - if ((event.which && event.which === direction) || (event.keyCode && event.keyCode === direction)) { - const old_index = source_box.selectedIndex; - SelectBox.move(field_id + source, field_id + target); - SelectFilter.refresh_filtered_selects(field_id); - SelectFilter.refresh_filtered_warning(field_id); - source_box.selectedIndex = (old_index === source_box.length) ? source_box.length - 1 : old_index; - return; - } - // down arrow -- wrap around - if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) { - source_box.selectedIndex = (source_box.length === source_box.selectedIndex + 1) ? 0 : source_box.selectedIndex + 1; - } - // up arrow -- wrap around - if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) { - source_box.selectedIndex = (source_box.selectedIndex === 0) ? source_box.length - 1 : source_box.selectedIndex - 1; - } - } - }; - - window.addEventListener('load', function(e) { - document.querySelectorAll('select.selectfilter, select.selectfilterstacked').forEach(function(el) { - const data = el.dataset; - SelectFilter.init(el.id, data.fieldName, parseInt(data.isStacked, 10)); - }); - }); -} diff --git a/staticfiles/admin/js/actions.js b/staticfiles/admin/js/actions.js deleted file mode 100644 index 04b25e9..0000000 --- a/staticfiles/admin/js/actions.js +++ /dev/null @@ -1,204 +0,0 @@ -/*global gettext, interpolate, ngettext, Actions*/ -'use strict'; -{ - function show(selector) { - document.querySelectorAll(selector).forEach(function(el) { - el.classList.remove('hidden'); - }); - } - - function hide(selector) { - document.querySelectorAll(selector).forEach(function(el) { - el.classList.add('hidden'); - }); - } - - function showQuestion(options) { - hide(options.acrossClears); - show(options.acrossQuestions); - hide(options.allContainer); - } - - function showClear(options) { - show(options.acrossClears); - hide(options.acrossQuestions); - document.querySelector(options.actionContainer).classList.remove(options.selectedClass); - show(options.allContainer); - hide(options.counterContainer); - } - - function reset(options) { - hide(options.acrossClears); - hide(options.acrossQuestions); - hide(options.allContainer); - show(options.counterContainer); - } - - function clearAcross(options) { - reset(options); - const acrossInputs = document.querySelectorAll(options.acrossInput); - acrossInputs.forEach(function(acrossInput) { - acrossInput.value = 0; - }); - document.querySelector(options.actionContainer).classList.remove(options.selectedClass); - } - - function checker(actionCheckboxes, options, checked) { - if (checked) { - showQuestion(options); - } else { - reset(options); - } - actionCheckboxes.forEach(function(el) { - el.checked = checked; - el.closest('tr').classList.toggle(options.selectedClass, checked); - }); - } - - function updateCounter(actionCheckboxes, options) { - const sel = Array.from(actionCheckboxes).filter(function(el) { - return el.checked; - }).length; - const counter = document.querySelector(options.counterContainer); - // data-actions-icnt is defined in the generated HTML - // and contains the total amount of objects in the queryset - const actions_icnt = Number(counter.dataset.actionsIcnt); - counter.textContent = interpolate( - ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { - sel: sel, - cnt: actions_icnt - }, true); - const allToggle = document.getElementById(options.allToggleId); - allToggle.checked = sel === actionCheckboxes.length; - if (allToggle.checked) { - showQuestion(options); - } else { - clearAcross(options); - } - } - - const defaults = { - actionContainer: "div.actions", - counterContainer: "span.action-counter", - allContainer: "div.actions span.all", - acrossInput: "div.actions input.select-across", - acrossQuestions: "div.actions span.question", - acrossClears: "div.actions span.clear", - allToggleId: "action-toggle", - selectedClass: "selected" - }; - - window.Actions = function(actionCheckboxes, options) { - options = Object.assign({}, defaults, options); - let list_editable_changed = false; - let lastChecked = null; - let shiftPressed = false; - - document.addEventListener('keydown', (event) => { - shiftPressed = event.shiftKey; - }); - - document.addEventListener('keyup', (event) => { - shiftPressed = event.shiftKey; - }); - - document.getElementById(options.allToggleId).addEventListener('click', function(event) { - checker(actionCheckboxes, options, this.checked); - updateCounter(actionCheckboxes, options); - }); - - document.querySelectorAll(options.acrossQuestions + " a").forEach(function(el) { - el.addEventListener('click', function(event) { - event.preventDefault(); - const acrossInputs = document.querySelectorAll(options.acrossInput); - acrossInputs.forEach(function(acrossInput) { - acrossInput.value = 1; - }); - showClear(options); - }); - }); - - document.querySelectorAll(options.acrossClears + " a").forEach(function(el) { - el.addEventListener('click', function(event) { - event.preventDefault(); - document.getElementById(options.allToggleId).checked = false; - clearAcross(options); - checker(actionCheckboxes, options, false); - updateCounter(actionCheckboxes, options); - }); - }); - - function affectedCheckboxes(target, withModifier) { - const multiSelect = (lastChecked && withModifier && lastChecked !== target); - if (!multiSelect) { - return [target]; - } - const checkboxes = Array.from(actionCheckboxes); - const targetIndex = checkboxes.findIndex(el => el === target); - const lastCheckedIndex = checkboxes.findIndex(el => el === lastChecked); - const startIndex = Math.min(targetIndex, lastCheckedIndex); - const endIndex = Math.max(targetIndex, lastCheckedIndex); - const filtered = checkboxes.filter((el, index) => (startIndex <= index) && (index <= endIndex)); - return filtered; - }; - - Array.from(document.getElementById('result_list').tBodies).forEach(function(el) { - el.addEventListener('change', function(event) { - const target = event.target; - if (target.classList.contains('action-select')) { - const checkboxes = affectedCheckboxes(target, shiftPressed); - checker(checkboxes, options, target.checked); - updateCounter(actionCheckboxes, options); - lastChecked = target; - } else { - list_editable_changed = true; - } - }); - }); - - document.querySelector('#changelist-form button[name=index]').addEventListener('click', function(event) { - if (list_editable_changed) { - const confirmed = confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); - if (!confirmed) { - event.preventDefault(); - } - } - }); - - const el = document.querySelector('#changelist-form input[name=_save]'); - // The button does not exist if no fields are editable. - if (el) { - el.addEventListener('click', function(event) { - if (document.querySelector('[name=action]').value) { - const text = list_editable_changed - ? gettext("You have selected an action, but you haven’t saved your changes to individual fields yet. Please click OK to save. You’ll need to re-run the action.") - : gettext("You have selected an action, and you haven’t made any changes on individual fields. You’re probably looking for the Go button rather than the Save button."); - if (!confirm(text)) { - event.preventDefault(); - } - } - }); - } - // Sync counter when navigating to the page, such as through the back - // button. - window.addEventListener('pageshow', (event) => updateCounter(actionCheckboxes, options)); - }; - - // Call function fn when the DOM is loaded and ready. If it is already - // loaded, call the function now. - // http://youmightnotneedjquery.com/#ready - function ready(fn) { - if (document.readyState !== 'loading') { - fn(); - } else { - document.addEventListener('DOMContentLoaded', fn); - } - } - - ready(function() { - const actionsEls = document.querySelectorAll('tr input.action-select'); - if (actionsEls.length > 0) { - Actions(actionsEls); - } - }); -} diff --git a/staticfiles/admin/js/admin/DateTimeShortcuts.js b/staticfiles/admin/js/admin/DateTimeShortcuts.js deleted file mode 100644 index aa1cae9..0000000 --- a/staticfiles/admin/js/admin/DateTimeShortcuts.js +++ /dev/null @@ -1,408 +0,0 @@ -/*global Calendar, findPosX, findPosY, get_format, gettext, gettext_noop, interpolate, ngettext, quickElement*/ -// Inserts shortcut buttons after all of the following: -// -// -'use strict'; -{ - const DateTimeShortcuts = { - calendars: [], - calendarInputs: [], - clockInputs: [], - clockHours: { - default_: [ - [gettext_noop('Now'), -1], - [gettext_noop('Midnight'), 0], - [gettext_noop('6 a.m.'), 6], - [gettext_noop('Noon'), 12], - [gettext_noop('6 p.m.'), 18] - ] - }, - dismissClockFunc: [], - dismissCalendarFunc: [], - calendarDivName1: 'calendarbox', // name of calendar
    that gets toggled - calendarDivName2: 'calendarin', // name of
    that contains calendar - calendarLinkName: 'calendarlink', // name of the link that is used to toggle - clockDivName: 'clockbox', // name of clock
    that gets toggled - clockLinkName: 'clocklink', // name of the link that is used to toggle - shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts - timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch - timezoneOffset: 0, - init: function() { - const serverOffset = document.body.dataset.adminUtcOffset; - if (serverOffset) { - const localOffset = new Date().getTimezoneOffset() * -60; - DateTimeShortcuts.timezoneOffset = localOffset - serverOffset; - } - - for (const inp of document.getElementsByTagName('input')) { - if (inp.type === 'text' && inp.classList.contains('vTimeField')) { - DateTimeShortcuts.addClock(inp); - DateTimeShortcuts.addTimezoneWarning(inp); - } - else if (inp.type === 'text' && inp.classList.contains('vDateField')) { - DateTimeShortcuts.addCalendar(inp); - DateTimeShortcuts.addTimezoneWarning(inp); - } - } - }, - // Return the current time while accounting for the server timezone. - now: function() { - const serverOffset = document.body.dataset.adminUtcOffset; - if (serverOffset) { - const localNow = new Date(); - const localOffset = localNow.getTimezoneOffset() * -60; - localNow.setTime(localNow.getTime() + 1000 * (serverOffset - localOffset)); - return localNow; - } else { - return new Date(); - } - }, - // Add a warning when the time zone in the browser and backend do not match. - addTimezoneWarning: function(inp) { - const warningClass = DateTimeShortcuts.timezoneWarningClass; - let timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600; - - // Only warn if there is a time zone mismatch. - if (!timezoneOffset) { - return; - } - - // Check if warning is already there. - if (inp.parentNode.querySelectorAll('.' + warningClass).length) { - return; - } - - let message; - if (timezoneOffset > 0) { - message = ngettext( - 'Note: You are %s hour ahead of server time.', - 'Note: You are %s hours ahead of server time.', - timezoneOffset - ); - } - else { - timezoneOffset *= -1; - message = ngettext( - 'Note: You are %s hour behind server time.', - 'Note: You are %s hours behind server time.', - timezoneOffset - ); - } - message = interpolate(message, [timezoneOffset]); - - const warning = document.createElement('div'); - warning.classList.add('help', warningClass); - warning.textContent = message; - inp.parentNode.appendChild(warning); - }, - // Add clock widget to a given field - addClock: function(inp) { - const num = DateTimeShortcuts.clockInputs.length; - DateTimeShortcuts.clockInputs[num] = inp; - DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; }; - - // Shortcut links (clock icon and "Now" link) - const shortcuts_span = document.createElement('span'); - shortcuts_span.className = DateTimeShortcuts.shortCutsClass; - inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); - const now_link = document.createElement('a'); - now_link.href = "#"; - now_link.textContent = gettext('Now'); - now_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleClockQuicklink(num, -1); - }); - const clock_link = document.createElement('a'); - clock_link.href = '#'; - clock_link.id = DateTimeShortcuts.clockLinkName + num; - clock_link.addEventListener('click', function(e) { - e.preventDefault(); - // avoid triggering the document click handler to dismiss the clock - e.stopPropagation(); - DateTimeShortcuts.openClock(num); - }); - - quickElement( - 'span', clock_link, '', - 'class', 'clock-icon', - 'title', gettext('Choose a Time') - ); - shortcuts_span.appendChild(document.createTextNode('\u00A0')); - shortcuts_span.appendChild(now_link); - shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); - shortcuts_span.appendChild(clock_link); - - // Create clock link div - // - // Markup looks like: - //
    - //

    Choose a time

    - // - //

    Cancel

    - //
    - - const clock_box = document.createElement('div'); - clock_box.style.display = 'none'; - clock_box.style.position = 'absolute'; - clock_box.className = 'clockbox module'; - clock_box.id = DateTimeShortcuts.clockDivName + num; - document.body.appendChild(clock_box); - clock_box.addEventListener('click', function(e) { e.stopPropagation(); }); - - quickElement('h2', clock_box, gettext('Choose a time')); - const time_list = quickElement('ul', clock_box); - time_list.className = 'timelist'; - // The list of choices can be overridden in JavaScript like this: - // DateTimeShortcuts.clockHours.name = [['3 a.m.', 3]]; - // where name is the name attribute of the . - const name = typeof DateTimeShortcuts.clockHours[inp.name] === 'undefined' ? 'default_' : inp.name; - DateTimeShortcuts.clockHours[name].forEach(function(element) { - const time_link = quickElement('a', quickElement('li', time_list), gettext(element[0]), 'href', '#'); - time_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleClockQuicklink(num, element[1]); - }); - }); - - const cancel_p = quickElement('p', clock_box); - cancel_p.className = 'calendar-cancel'; - const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); - cancel_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.dismissClock(num); - }); - - document.addEventListener('keyup', function(event) { - if (event.which === 27) { - // ESC key closes popup - DateTimeShortcuts.dismissClock(num); - event.preventDefault(); - } - }); - }, - openClock: function(num) { - const clock_box = document.getElementById(DateTimeShortcuts.clockDivName + num); - const clock_link = document.getElementById(DateTimeShortcuts.clockLinkName + num); - - // Recalculate the clockbox position - // is it left-to-right or right-to-left layout ? - if (window.getComputedStyle(document.body).direction !== 'rtl') { - clock_box.style.left = findPosX(clock_link) + 17 + 'px'; - } - else { - // since style's width is in em, it'd be tough to calculate - // px value of it. let's use an estimated px for now - clock_box.style.left = findPosX(clock_link) - 110 + 'px'; - } - clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px'; - - // Show the clock box - clock_box.style.display = 'block'; - document.addEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); - }, - dismissClock: function(num) { - document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none'; - document.removeEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); - }, - handleClockQuicklink: function(num, val) { - let d; - if (val === -1) { - d = DateTimeShortcuts.now(); - } - else { - d = new Date(1970, 1, 1, val, 0, 0, 0); - } - DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]); - DateTimeShortcuts.clockInputs[num].focus(); - DateTimeShortcuts.dismissClock(num); - }, - // Add calendar widget to a given field. - addCalendar: function(inp) { - const num = DateTimeShortcuts.calendars.length; - - DateTimeShortcuts.calendarInputs[num] = inp; - DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; }; - - // Shortcut links (calendar icon and "Today" link) - const shortcuts_span = document.createElement('span'); - shortcuts_span.className = DateTimeShortcuts.shortCutsClass; - inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); - const today_link = document.createElement('a'); - today_link.href = '#'; - today_link.appendChild(document.createTextNode(gettext('Today'))); - today_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleCalendarQuickLink(num, 0); - }); - const cal_link = document.createElement('a'); - cal_link.href = '#'; - cal_link.id = DateTimeShortcuts.calendarLinkName + num; - cal_link.addEventListener('click', function(e) { - e.preventDefault(); - // avoid triggering the document click handler to dismiss the calendar - e.stopPropagation(); - DateTimeShortcuts.openCalendar(num); - }); - quickElement( - 'span', cal_link, '', - 'class', 'date-icon', - 'title', gettext('Choose a Date') - ); - shortcuts_span.appendChild(document.createTextNode('\u00A0')); - shortcuts_span.appendChild(today_link); - shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); - shortcuts_span.appendChild(cal_link); - - // Create calendarbox div. - // - // Markup looks like: - // - //
    - //

    - // - // February 2003 - //

    - //
    - // - //
    - //
    - // Yesterday | Today | Tomorrow - //
    - //

    Cancel

    - //
    - const cal_box = document.createElement('div'); - cal_box.style.display = 'none'; - cal_box.style.position = 'absolute'; - cal_box.className = 'calendarbox module'; - cal_box.id = DateTimeShortcuts.calendarDivName1 + num; - document.body.appendChild(cal_box); - cal_box.addEventListener('click', function(e) { e.stopPropagation(); }); - - // next-prev links - const cal_nav = quickElement('div', cal_box); - const cal_nav_prev = quickElement('a', cal_nav, '<', 'href', '#'); - cal_nav_prev.className = 'calendarnav-previous'; - cal_nav_prev.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.drawPrev(num); - }); - - const cal_nav_next = quickElement('a', cal_nav, '>', 'href', '#'); - cal_nav_next.className = 'calendarnav-next'; - cal_nav_next.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.drawNext(num); - }); - - // main box - const cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num); - cal_main.className = 'calendar'; - DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num)); - DateTimeShortcuts.calendars[num].drawCurrent(); - - // calendar shortcuts - const shortcuts = quickElement('div', cal_box); - shortcuts.className = 'calendar-shortcuts'; - let day_link = quickElement('a', shortcuts, gettext('Yesterday'), 'href', '#'); - day_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleCalendarQuickLink(num, -1); - }); - shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); - day_link = quickElement('a', shortcuts, gettext('Today'), 'href', '#'); - day_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleCalendarQuickLink(num, 0); - }); - shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); - day_link = quickElement('a', shortcuts, gettext('Tomorrow'), 'href', '#'); - day_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleCalendarQuickLink(num, +1); - }); - - // cancel bar - const cancel_p = quickElement('p', cal_box); - cancel_p.className = 'calendar-cancel'; - const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); - cancel_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.dismissCalendar(num); - }); - document.addEventListener('keyup', function(event) { - if (event.which === 27) { - // ESC key closes popup - DateTimeShortcuts.dismissCalendar(num); - event.preventDefault(); - } - }); - }, - openCalendar: function(num) { - const cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1 + num); - const cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName + num); - const inp = DateTimeShortcuts.calendarInputs[num]; - - // Determine if the current value in the input has a valid date. - // If so, draw the calendar with that date's year and month. - if (inp.value) { - const format = get_format('DATE_INPUT_FORMATS')[0]; - const selected = inp.value.strptime(format); - const year = selected.getUTCFullYear(); - const month = selected.getUTCMonth() + 1; - const re = /\d{4}/; - if (re.test(year.toString()) && month >= 1 && month <= 12) { - DateTimeShortcuts.calendars[num].drawDate(month, year, selected); - } - } - - // Recalculate the clockbox position - // is it left-to-right or right-to-left layout ? - if (window.getComputedStyle(document.body).direction !== 'rtl') { - cal_box.style.left = findPosX(cal_link) + 17 + 'px'; - } - else { - // since style's width is in em, it'd be tough to calculate - // px value of it. let's use an estimated px for now - cal_box.style.left = findPosX(cal_link) - 180 + 'px'; - } - cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px'; - - cal_box.style.display = 'block'; - document.addEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); - }, - dismissCalendar: function(num) { - document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; - document.removeEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); - }, - drawPrev: function(num) { - DateTimeShortcuts.calendars[num].drawPreviousMonth(); - }, - drawNext: function(num) { - DateTimeShortcuts.calendars[num].drawNextMonth(); - }, - handleCalendarCallback: function(num) { - const format = get_format('DATE_INPUT_FORMATS')[0]; - return function(y, m, d) { - DateTimeShortcuts.calendarInputs[num].value = new Date(y, m - 1, d).strftime(format); - DateTimeShortcuts.calendarInputs[num].focus(); - document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; - }; - }, - handleCalendarQuickLink: function(num, offset) { - const d = DateTimeShortcuts.now(); - d.setDate(d.getDate() + offset); - DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]); - DateTimeShortcuts.calendarInputs[num].focus(); - DateTimeShortcuts.dismissCalendar(num); - } - }; - - window.addEventListener('load', DateTimeShortcuts.init); - window.DateTimeShortcuts = DateTimeShortcuts; -} diff --git a/staticfiles/admin/js/admin/RelatedObjectLookups.js b/staticfiles/admin/js/admin/RelatedObjectLookups.js deleted file mode 100644 index bc3acce..0000000 --- a/staticfiles/admin/js/admin/RelatedObjectLookups.js +++ /dev/null @@ -1,240 +0,0 @@ -/*global SelectBox, interpolate*/ -// Handles related-objects functionality: lookup link for raw_id_fields -// and Add Another links. -'use strict'; -{ - const $ = django.jQuery; - let popupIndex = 0; - const relatedWindows = []; - - function dismissChildPopups() { - relatedWindows.forEach(function(win) { - if(!win.closed) { - win.dismissChildPopups(); - win.close(); - } - }); - } - - function setPopupIndex() { - if(document.getElementsByName("_popup").length > 0) { - const index = window.name.lastIndexOf("__") + 2; - popupIndex = parseInt(window.name.substring(index)); - } else { - popupIndex = 0; - } - } - - function addPopupIndex(name) { - return name + "__" + (popupIndex + 1); - } - - function removePopupIndex(name) { - return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), ''); - } - - function showAdminPopup(triggeringLink, name_regexp, add_popup) { - const name = addPopupIndex(triggeringLink.id.replace(name_regexp, '')); - const href = new URL(triggeringLink.href); - if (add_popup) { - href.searchParams.set('_popup', 1); - } - const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); - relatedWindows.push(win); - win.focus(); - return false; - } - - function showRelatedObjectLookupPopup(triggeringLink) { - return showAdminPopup(triggeringLink, /^lookup_/, true); - } - - function dismissRelatedLookupPopup(win, chosenId) { - const name = removePopupIndex(win.name); - const elem = document.getElementById(name); - if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { - elem.value += ',' + chosenId; - } else { - document.getElementById(name).value = chosenId; - } - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - function showRelatedObjectPopup(triggeringLink) { - return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false); - } - - function updateRelatedObjectLinks(triggeringLink) { - const $this = $(triggeringLink); - const siblings = $this.nextAll('.view-related, .change-related, .delete-related'); - if (!siblings.length) { - return; - } - const value = $this.val(); - if (value) { - siblings.each(function() { - const elm = $(this); - elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); - elm.removeAttr('aria-disabled'); - }); - } else { - siblings.removeAttr('href'); - siblings.attr('aria-disabled', true); - } - } - - function updateRelatedSelectsOptions(currentSelect, win, objId, newRepr, newId) { - // After create/edit a model from the options next to the current - // select (+ or :pencil:) update ForeignKey PK of the rest of selects - // in the page. - - const path = win.location.pathname; - // Extract the model from the popup url '...//add/' or - // '...///change/' depending the action (add or change). - const modelName = path.split('/')[path.split('/').length - (objId ? 4 : 3)]; - // Select elements with a specific model reference and context of "available-source". - const selectsRelated = document.querySelectorAll(`[data-model-ref="${modelName}"] [data-context="available-source"]`); - - selectsRelated.forEach(function(select) { - if (currentSelect === select) { - return; - } - - let option = select.querySelector(`option[value="${objId}"]`); - - if (!option) { - option = new Option(newRepr, newId); - select.options.add(option); - return; - } - - option.textContent = newRepr; - option.value = newId; - }); - } - - function dismissAddRelatedObjectPopup(win, newId, newRepr) { - const name = removePopupIndex(win.name); - const elem = document.getElementById(name); - if (elem) { - const elemName = elem.nodeName.toUpperCase(); - if (elemName === 'SELECT') { - elem.options[elem.options.length] = new Option(newRepr, newId, true, true); - updateRelatedSelectsOptions(elem, win, null, newRepr, newId); - } else if (elemName === 'INPUT') { - if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { - elem.value += ',' + newId; - } else { - elem.value = newId; - } - } - // Trigger a change event to update related links if required. - $(elem).trigger('change'); - } else { - const toId = name + "_to"; - const o = new Option(newRepr, newId); - SelectBox.add_to_cache(toId, o); - SelectBox.redisplay(toId); - } - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { - const id = removePopupIndex(win.name.replace(/^edit_/, '')); - const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); - const selects = $(selectsSelector); - selects.find('option').each(function() { - if (this.value === objId) { - this.textContent = newRepr; - this.value = newId; - } - }).trigger('change'); - updateRelatedSelectsOptions(selects[0], win, objId, newRepr, newId); - selects.next().find('.select2-selection__rendered').each(function() { - // The element can have a clear button as a child. - // Use the lastChild to modify only the displayed value. - this.lastChild.textContent = newRepr; - this.title = newRepr; - }); - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - function dismissDeleteRelatedObjectPopup(win, objId) { - const id = removePopupIndex(win.name.replace(/^delete_/, '')); - const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); - const selects = $(selectsSelector); - selects.find('option').each(function() { - if (this.value === objId) { - $(this).remove(); - } - }).trigger('change'); - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; - window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; - window.showRelatedObjectPopup = showRelatedObjectPopup; - window.updateRelatedObjectLinks = updateRelatedObjectLinks; - window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; - window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; - window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; - window.dismissChildPopups = dismissChildPopups; - - // Kept for backward compatibility - window.showAddAnotherPopup = showRelatedObjectPopup; - window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; - - window.addEventListener('unload', function(evt) { - window.dismissChildPopups(); - }); - - $(document).ready(function() { - setPopupIndex(); - $("a[data-popup-opener]").on('click', function(event) { - event.preventDefault(); - opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); - }); - $('body').on('click', '.related-widget-wrapper-link[data-popup="yes"]', function(e) { - e.preventDefault(); - if (this.href) { - const event = $.Event('django:show-related', {href: this.href}); - $(this).trigger(event); - if (!event.isDefaultPrevented()) { - showRelatedObjectPopup(this); - } - } - }); - $('body').on('change', '.related-widget-wrapper select', function(e) { - const event = $.Event('django:update-related'); - $(this).trigger(event); - if (!event.isDefaultPrevented()) { - updateRelatedObjectLinks(this); - } - }); - $('.related-widget-wrapper select').trigger('change'); - $('body').on('click', '.related-lookup', function(e) { - e.preventDefault(); - const event = $.Event('django:lookup-related'); - $(this).trigger(event); - if (!event.isDefaultPrevented()) { - showRelatedObjectLookupPopup(this); - } - }); - }); -} diff --git a/staticfiles/admin/js/autocomplete.js b/staticfiles/admin/js/autocomplete.js deleted file mode 100644 index d3daeab..0000000 --- a/staticfiles/admin/js/autocomplete.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict'; -{ - const $ = django.jQuery; - - $.fn.djangoAdminSelect2 = function() { - $.each(this, function(i, element) { - $(element).select2({ - ajax: { - data: (params) => { - return { - term: params.term, - page: params.page, - app_label: element.dataset.appLabel, - model_name: element.dataset.modelName, - field_name: element.dataset.fieldName - }; - } - } - }); - }); - return this; - }; - - $(function() { - // Initialize all autocomplete widgets except the one in the template - // form used when a new formset is added. - $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); - }); - - document.addEventListener('formset:added', (event) => { - $(event.target).find('.admin-autocomplete').djangoAdminSelect2(); - }); -} diff --git a/staticfiles/admin/js/calendar.js b/staticfiles/admin/js/calendar.js deleted file mode 100644 index 776310f..0000000 --- a/staticfiles/admin/js/calendar.js +++ /dev/null @@ -1,239 +0,0 @@ -/*global gettext, pgettext, get_format, quickElement, removeChildren*/ -/* -calendar.js - Calendar functions by Adrian Holovaty -depends on core.js for utility functions like removeChildren or quickElement -*/ -'use strict'; -{ - // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions - const CalendarNamespace = { - monthsOfYear: [ - gettext('January'), - gettext('February'), - gettext('March'), - gettext('April'), - gettext('May'), - gettext('June'), - gettext('July'), - gettext('August'), - gettext('September'), - gettext('October'), - gettext('November'), - gettext('December') - ], - monthsOfYearAbbrev: [ - pgettext('abbrev. month January', 'Jan'), - pgettext('abbrev. month February', 'Feb'), - pgettext('abbrev. month March', 'Mar'), - pgettext('abbrev. month April', 'Apr'), - pgettext('abbrev. month May', 'May'), - pgettext('abbrev. month June', 'Jun'), - pgettext('abbrev. month July', 'Jul'), - pgettext('abbrev. month August', 'Aug'), - pgettext('abbrev. month September', 'Sep'), - pgettext('abbrev. month October', 'Oct'), - pgettext('abbrev. month November', 'Nov'), - pgettext('abbrev. month December', 'Dec') - ], - daysOfWeek: [ - gettext('Sunday'), - gettext('Monday'), - gettext('Tuesday'), - gettext('Wednesday'), - gettext('Thursday'), - gettext('Friday'), - gettext('Saturday') - ], - daysOfWeekAbbrev: [ - pgettext('abbrev. day Sunday', 'Sun'), - pgettext('abbrev. day Monday', 'Mon'), - pgettext('abbrev. day Tuesday', 'Tue'), - pgettext('abbrev. day Wednesday', 'Wed'), - pgettext('abbrev. day Thursday', 'Thur'), - pgettext('abbrev. day Friday', 'Fri'), - pgettext('abbrev. day Saturday', 'Sat') - ], - daysOfWeekInitial: [ - pgettext('one letter Sunday', 'S'), - pgettext('one letter Monday', 'M'), - pgettext('one letter Tuesday', 'T'), - pgettext('one letter Wednesday', 'W'), - pgettext('one letter Thursday', 'T'), - pgettext('one letter Friday', 'F'), - pgettext('one letter Saturday', 'S') - ], - firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')), - isLeapYear: function(year) { - return (((year % 4) === 0) && ((year % 100) !== 0 ) || ((year % 400) === 0)); - }, - getDaysInMonth: function(month, year) { - let days; - if (month === 1 || month === 3 || month === 5 || month === 7 || month === 8 || month === 10 || month === 12) { - days = 31; - } - else if (month === 4 || month === 6 || month === 9 || month === 11) { - days = 30; - } - else if (month === 2 && CalendarNamespace.isLeapYear(year)) { - days = 29; - } - else { - days = 28; - } - return days; - }, - draw: function(month, year, div_id, callback, selected) { // month = 1-12, year = 1-9999 - const today = new Date(); - const todayDay = today.getDate(); - const todayMonth = today.getMonth() + 1; - const todayYear = today.getFullYear(); - let todayClass = ''; - - // Use UTC functions here because the date field does not contain time - // and using the UTC function variants prevent the local time offset - // from altering the date, specifically the day field. For example: - // - // ``` - // var x = new Date('2013-10-02'); - // var day = x.getDate(); - // ``` - // - // The day variable above will be 1 instead of 2 in, say, US Pacific time - // zone. - let isSelectedMonth = false; - if (typeof selected !== 'undefined') { - isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month); - } - - month = parseInt(month); - year = parseInt(year); - const calDiv = document.getElementById(div_id); - removeChildren(calDiv); - const calTable = document.createElement('table'); - quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year); - const tableBody = quickElement('tbody', calTable); - - // Draw days-of-week header - let tableRow = quickElement('tr', tableBody); - for (let i = 0; i < 7; i++) { - quickElement('th', tableRow, CalendarNamespace.daysOfWeekInitial[(i + CalendarNamespace.firstDayOfWeek) % 7]); - } - - const startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); - const days = CalendarNamespace.getDaysInMonth(month, year); - - let nonDayCell; - - // Draw blanks before first of month - tableRow = quickElement('tr', tableBody); - for (let i = 0; i < startingPos; i++) { - nonDayCell = quickElement('td', tableRow, ' '); - nonDayCell.className = "nonday"; - } - - function calendarMonth(y, m) { - function onClick(e) { - e.preventDefault(); - callback(y, m, this.textContent); - } - return onClick; - } - - // Draw days of month - let currentDay = 1; - for (let i = startingPos; currentDay <= days; i++) { - if (i % 7 === 0 && currentDay !== 1) { - tableRow = quickElement('tr', tableBody); - } - if ((currentDay === todayDay) && (month === todayMonth) && (year === todayYear)) { - todayClass = 'today'; - } else { - todayClass = ''; - } - - // use UTC function; see above for explanation. - if (isSelectedMonth && currentDay === selected.getUTCDate()) { - if (todayClass !== '') { - todayClass += " "; - } - todayClass += "selected"; - } - - const cell = quickElement('td', tableRow, '', 'class', todayClass); - const link = quickElement('a', cell, currentDay, 'href', '#'); - link.addEventListener('click', calendarMonth(year, month)); - currentDay++; - } - - // Draw blanks after end of month (optional, but makes for valid code) - while (tableRow.childNodes.length < 7) { - nonDayCell = quickElement('td', tableRow, ' '); - nonDayCell.className = "nonday"; - } - - calDiv.appendChild(calTable); - } - }; - - // Calendar -- A calendar instance - function Calendar(div_id, callback, selected) { - // div_id (string) is the ID of the element in which the calendar will - // be displayed - // callback (string) is the name of a JavaScript function that will be - // called with the parameters (year, month, day) when a day in the - // calendar is clicked - this.div_id = div_id; - this.callback = callback; - this.today = new Date(); - this.currentMonth = this.today.getMonth() + 1; - this.currentYear = this.today.getFullYear(); - if (typeof selected !== 'undefined') { - this.selected = selected; - } - } - Calendar.prototype = { - drawCurrent: function() { - CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback, this.selected); - }, - drawDate: function(month, year, selected) { - this.currentMonth = month; - this.currentYear = year; - - if(selected) { - this.selected = selected; - } - - this.drawCurrent(); - }, - drawPreviousMonth: function() { - if (this.currentMonth === 1) { - this.currentMonth = 12; - this.currentYear--; - } - else { - this.currentMonth--; - } - this.drawCurrent(); - }, - drawNextMonth: function() { - if (this.currentMonth === 12) { - this.currentMonth = 1; - this.currentYear++; - } - else { - this.currentMonth++; - } - this.drawCurrent(); - }, - drawPreviousYear: function() { - this.currentYear--; - this.drawCurrent(); - }, - drawNextYear: function() { - this.currentYear++; - this.drawCurrent(); - } - }; - window.Calendar = Calendar; - window.CalendarNamespace = CalendarNamespace; -} diff --git a/staticfiles/admin/js/cancel.js b/staticfiles/admin/js/cancel.js deleted file mode 100644 index 3069c6f..0000000 --- a/staticfiles/admin/js/cancel.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; -{ - // Call function fn when the DOM is loaded and ready. If it is already - // loaded, call the function now. - // http://youmightnotneedjquery.com/#ready - function ready(fn) { - if (document.readyState !== 'loading') { - fn(); - } else { - document.addEventListener('DOMContentLoaded', fn); - } - } - - ready(function() { - function handleClick(event) { - event.preventDefault(); - const params = new URLSearchParams(window.location.search); - if (params.has('_popup')) { - window.close(); // Close the popup. - } else { - window.history.back(); // Otherwise, go back. - } - } - - document.querySelectorAll('.cancel-link').forEach(function(el) { - el.addEventListener('click', handleClick); - }); - }); -} diff --git a/staticfiles/admin/js/change_form.js b/staticfiles/admin/js/change_form.js deleted file mode 100644 index 96a4c62..0000000 --- a/staticfiles/admin/js/change_form.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; -{ - const inputTags = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA']; - const modelName = document.getElementById('django-admin-form-add-constants').dataset.modelName; - if (modelName) { - const form = document.getElementById(modelName + '_form'); - for (const element of form.elements) { - // HTMLElement.offsetParent returns null when the element is not - // rendered. - if (inputTags.includes(element.tagName) && !element.disabled && element.offsetParent) { - element.focus(); - break; - } - } - } -} diff --git a/staticfiles/admin/js/core.js b/staticfiles/admin/js/core.js deleted file mode 100644 index 10504d4..0000000 --- a/staticfiles/admin/js/core.js +++ /dev/null @@ -1,184 +0,0 @@ -// Core JavaScript helper functions -'use strict'; - -// quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]); -function quickElement() { - const obj = document.createElement(arguments[0]); - if (arguments[2]) { - const textNode = document.createTextNode(arguments[2]); - obj.appendChild(textNode); - } - const len = arguments.length; - for (let i = 3; i < len; i += 2) { - obj.setAttribute(arguments[i], arguments[i + 1]); - } - arguments[1].appendChild(obj); - return obj; -} - -// "a" is reference to an object -function removeChildren(a) { - while (a.hasChildNodes()) { - a.removeChild(a.lastChild); - } -} - -// ---------------------------------------------------------------------------- -// Find-position functions by PPK -// See https://www.quirksmode.org/js/findpos.html -// ---------------------------------------------------------------------------- -function findPosX(obj) { - let curleft = 0; - if (obj.offsetParent) { - while (obj.offsetParent) { - curleft += obj.offsetLeft - obj.scrollLeft; - obj = obj.offsetParent; - } - } else if (obj.x) { - curleft += obj.x; - } - return curleft; -} - -function findPosY(obj) { - let curtop = 0; - if (obj.offsetParent) { - while (obj.offsetParent) { - curtop += obj.offsetTop - obj.scrollTop; - obj = obj.offsetParent; - } - } else if (obj.y) { - curtop += obj.y; - } - return curtop; -} - -//----------------------------------------------------------------------------- -// Date object extensions -// ---------------------------------------------------------------------------- -{ - Date.prototype.getTwelveHours = function() { - return this.getHours() % 12 || 12; - }; - - Date.prototype.getTwoDigitMonth = function() { - return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1); - }; - - Date.prototype.getTwoDigitDate = function() { - return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate(); - }; - - Date.prototype.getTwoDigitTwelveHour = function() { - return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours(); - }; - - Date.prototype.getTwoDigitHour = function() { - return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours(); - }; - - Date.prototype.getTwoDigitMinute = function() { - return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes(); - }; - - Date.prototype.getTwoDigitSecond = function() { - return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); - }; - - Date.prototype.getAbbrevDayName = function() { - return typeof window.CalendarNamespace === "undefined" - ? '0' + this.getDay() - : window.CalendarNamespace.daysOfWeekAbbrev[this.getDay()]; - }; - - Date.prototype.getFullDayName = function() { - return typeof window.CalendarNamespace === "undefined" - ? '0' + this.getDay() - : window.CalendarNamespace.daysOfWeek[this.getDay()]; - }; - - Date.prototype.getAbbrevMonthName = function() { - return typeof window.CalendarNamespace === "undefined" - ? this.getTwoDigitMonth() - : window.CalendarNamespace.monthsOfYearAbbrev[this.getMonth()]; - }; - - Date.prototype.getFullMonthName = function() { - return typeof window.CalendarNamespace === "undefined" - ? this.getTwoDigitMonth() - : window.CalendarNamespace.monthsOfYear[this.getMonth()]; - }; - - Date.prototype.strftime = function(format) { - const fields = { - a: this.getAbbrevDayName(), - A: this.getFullDayName(), - b: this.getAbbrevMonthName(), - B: this.getFullMonthName(), - c: this.toString(), - d: this.getTwoDigitDate(), - H: this.getTwoDigitHour(), - I: this.getTwoDigitTwelveHour(), - m: this.getTwoDigitMonth(), - M: this.getTwoDigitMinute(), - p: (this.getHours() >= 12) ? 'PM' : 'AM', - S: this.getTwoDigitSecond(), - w: '0' + this.getDay(), - x: this.toLocaleDateString(), - X: this.toLocaleTimeString(), - y: ('' + this.getFullYear()).substr(2, 4), - Y: '' + this.getFullYear(), - '%': '%' - }; - let result = '', i = 0; - while (i < format.length) { - if (format.charAt(i) === '%') { - result += fields[format.charAt(i + 1)]; - ++i; - } - else { - result += format.charAt(i); - } - ++i; - } - return result; - }; - - // ---------------------------------------------------------------------------- - // String object extensions - // ---------------------------------------------------------------------------- - String.prototype.strptime = function(format) { - const split_format = format.split(/[.\-/]/); - const date = this.split(/[.\-/]/); - let i = 0; - let day, month, year; - while (i < split_format.length) { - switch (split_format[i]) { - case "%d": - day = date[i]; - break; - case "%m": - month = date[i] - 1; - break; - case "%Y": - year = date[i]; - break; - case "%y": - // A %y value in the range of [00, 68] is in the current - // century, while [69, 99] is in the previous century, - // according to the Open Group Specification. - if (parseInt(date[i], 10) >= 69) { - year = date[i]; - } else { - year = (new Date(Date.UTC(date[i], 0))).getUTCFullYear() + 100; - } - break; - } - ++i; - } - // Create Date object from UTC since the parsed value is supposed to be - // in UTC, not local time. Also, the calendar uses UTC functions for - // date extraction. - return new Date(Date.UTC(year, month, day)); - }; -} diff --git a/staticfiles/admin/js/filters.js b/staticfiles/admin/js/filters.js deleted file mode 100644 index f5536eb..0000000 --- a/staticfiles/admin/js/filters.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Persist changelist filters state (collapsed/expanded). - */ -'use strict'; -{ - // Init filters. - let filters = JSON.parse(sessionStorage.getItem('django.admin.filtersState')); - - if (!filters) { - filters = {}; - } - - Object.entries(filters).forEach(([key, value]) => { - const detailElement = document.querySelector(`[data-filter-title='${CSS.escape(key)}']`); - - // Check if the filter is present, it could be from other view. - if (detailElement) { - value ? detailElement.setAttribute('open', '') : detailElement.removeAttribute('open'); - } - }); - - // Save filter state when clicks. - const details = document.querySelectorAll('details'); - details.forEach(detail => { - detail.addEventListener('toggle', event => { - filters[`${event.target.dataset.filterTitle}`] = detail.open; - sessionStorage.setItem('django.admin.filtersState', JSON.stringify(filters)); - }); - }); -} diff --git a/staticfiles/admin/js/inlines.js b/staticfiles/admin/js/inlines.js deleted file mode 100644 index e9a1dfe..0000000 --- a/staticfiles/admin/js/inlines.js +++ /dev/null @@ -1,359 +0,0 @@ -/*global DateTimeShortcuts, SelectFilter*/ -/** - * Django admin inlines - * - * Based on jQuery Formset 1.1 - * @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com) - * @requires jQuery 1.2.6 or later - * - * Copyright (c) 2009, Stanislaus Madueke - * All rights reserved. - * - * Spiced up with Code from Zain Memon's GSoC project 2009 - * and modified for Django by Jannis Leidel, Travis Swicegood and Julien Phalip. - * - * Licensed under the New BSD License - * See: https://opensource.org/licenses/bsd-license.php - */ -'use strict'; -{ - const $ = django.jQuery; - $.fn.formset = function(opts) { - const options = $.extend({}, $.fn.formset.defaults, opts); - const $this = $(this); - const $parent = $this.parent(); - const updateElementIndex = function(el, prefix, ndx) { - const id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))"); - const replacement = prefix + "-" + ndx; - if ($(el).prop("for")) { - $(el).prop("for", $(el).prop("for").replace(id_regex, replacement)); - } - if (el.id) { - el.id = el.id.replace(id_regex, replacement); - } - if (el.name) { - el.name = el.name.replace(id_regex, replacement); - } - }; - const totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off"); - let nextIndex = parseInt(totalForms.val(), 10); - const maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off"); - const minForms = $("#id_" + options.prefix + "-MIN_NUM_FORMS").prop("autocomplete", "off"); - let addButton; - - /** - * The "Add another MyModel" button below the inline forms. - */ - const addInlineAddButton = function() { - if (addButton === null) { - if ($this.prop("tagName") === "TR") { - // If forms are laid out as table rows, insert the - // "add" button in a new table row: - const numCols = $this.eq(-1).children().length; - $parent.append('' + options.addText + ""); - addButton = $parent.find("tr:last a"); - } else { - // Otherwise, insert it immediately after the last form: - $this.filter(":last").after('"); - addButton = $this.filter(":last").next().find("a"); - } - } - addButton.on('click', addInlineClickHandler); - }; - - const addInlineClickHandler = function(e) { - e.preventDefault(); - const template = $("#" + options.prefix + "-empty"); - const row = template.clone(true); - row.removeClass(options.emptyCssClass) - .addClass(options.formCssClass) - .attr("id", options.prefix + "-" + nextIndex); - addInlineDeleteButton(row); - row.find("*").each(function() { - updateElementIndex(this, options.prefix, totalForms.val()); - }); - // Insert the new form when it has been fully edited. - row.insertBefore($(template)); - // Update number of total forms. - $(totalForms).val(parseInt(totalForms.val(), 10) + 1); - nextIndex += 1; - // Hide the add button if there's a limit and it's been reached. - if ((maxForms.val() !== '') && (maxForms.val() - totalForms.val()) <= 0) { - addButton.parent().hide(); - } - // Show the remove buttons if there are more than min_num. - toggleDeleteButtonVisibility(row.closest('.inline-group')); - - // Pass the new form to the post-add callback, if provided. - if (options.added) { - options.added(row); - } - row.get(0).dispatchEvent(new CustomEvent("formset:added", { - bubbles: true, - detail: { - formsetName: options.prefix - } - })); - }; - - /** - * The "X" button that is part of every unsaved inline. - * (When saved, it is replaced with a "Delete" checkbox.) - */ - const addInlineDeleteButton = function(row) { - if (row.is("tr")) { - // If the forms are laid out in table rows, insert - // the remove button into the last table cell: - row.children(":last").append('"); - } else if (row.is("ul") || row.is("ol")) { - // If they're laid out as an ordered/unordered list, - // insert an
  • after the last list item: - row.append('
  • ' + options.deleteText + "
  • "); - } else { - // Otherwise, just insert the remove button as the - // last child element of the form's container: - row.children(":first").append('' + options.deleteText + ""); - } - // Add delete handler for each row. - row.find("a." + options.deleteCssClass).on('click', inlineDeleteHandler.bind(this)); - }; - - const inlineDeleteHandler = function(e1) { - e1.preventDefault(); - const deleteButton = $(e1.target); - const row = deleteButton.closest('.' + options.formCssClass); - const inlineGroup = row.closest('.inline-group'); - // Remove the parent form containing this button, - // and also remove the relevant row with non-field errors: - const prevRow = row.prev(); - if (prevRow.length && prevRow.hasClass('row-form-errors')) { - prevRow.remove(); - } - row.remove(); - nextIndex -= 1; - // Pass the deleted form to the post-delete callback, if provided. - if (options.removed) { - options.removed(row); - } - document.dispatchEvent(new CustomEvent("formset:removed", { - detail: { - formsetName: options.prefix - } - })); - // Update the TOTAL_FORMS form count. - const forms = $("." + options.formCssClass); - $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length); - // Show add button again once below maximum number. - if ((maxForms.val() === '') || (maxForms.val() - forms.length) > 0) { - addButton.parent().show(); - } - // Hide the remove buttons if at min_num. - toggleDeleteButtonVisibility(inlineGroup); - // Also, update names and ids for all remaining form controls so - // they remain in sequence: - let i, formCount; - const updateElementCallback = function() { - updateElementIndex(this, options.prefix, i); - }; - for (i = 0, formCount = forms.length; i < formCount; i++) { - updateElementIndex($(forms).get(i), options.prefix, i); - $(forms.get(i)).find("*").each(updateElementCallback); - } - }; - - const toggleDeleteButtonVisibility = function(inlineGroup) { - if ((minForms.val() !== '') && (minForms.val() - totalForms.val()) >= 0) { - inlineGroup.find('.inline-deletelink').hide(); - } else { - inlineGroup.find('.inline-deletelink').show(); - } - }; - - $this.each(function(i) { - $(this).not("." + options.emptyCssClass).addClass(options.formCssClass); - }); - - // Create the delete buttons for all unsaved inlines: - $this.filter('.' + options.formCssClass + ':not(.has_original):not(.' + options.emptyCssClass + ')').each(function() { - addInlineDeleteButton($(this)); - }); - toggleDeleteButtonVisibility($this); - - // Create the add button, initially hidden. - addButton = options.addButton; - addInlineAddButton(); - - // Show the add button if allowed to add more items. - // Note that max_num = None translates to a blank string. - const showAddButton = maxForms.val() === '' || (maxForms.val() - totalForms.val()) > 0; - if ($this.length && showAddButton) { - addButton.parent().show(); - } else { - addButton.parent().hide(); - } - - return this; - }; - - /* Setup plugin defaults */ - $.fn.formset.defaults = { - prefix: "form", // The form prefix for your django formset - addText: "add another", // Text for the add link - deleteText: "remove", // Text for the delete link - addCssClass: "add-row", // CSS class applied to the add link - deleteCssClass: "delete-row", // CSS class applied to the delete link - emptyCssClass: "empty-row", // CSS class applied to the empty row - formCssClass: "dynamic-form", // CSS class applied to each form in a formset - added: null, // Function called each time a new form is added - removed: null, // Function called each time a form is deleted - addButton: null // Existing add button to use - }; - - - // Tabular inlines --------------------------------------------------------- - $.fn.tabularFormset = function(selector, options) { - const $rows = $(this); - - const reinitDateTimeShortCuts = function() { - // Reinitialize the calendar and clock widgets by force - if (typeof DateTimeShortcuts !== "undefined") { - $(".datetimeshortcuts").remove(); - DateTimeShortcuts.init(); - } - }; - - const updateSelectFilter = function() { - // If any SelectFilter widgets are a part of the new form, - // instantiate a new SelectFilter instance for it. - if (typeof SelectFilter !== 'undefined') { - $('.selectfilter').each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, false); - }); - $('.selectfilterstacked').each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, true); - }); - } - }; - - const initPrepopulatedFields = function(row) { - row.find('.prepopulated_field').each(function() { - const field = $(this), - input = field.find('input, select, textarea'), - dependency_list = input.data('dependency_list') || [], - dependencies = []; - $.each(dependency_list, function(i, field_name) { - dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id')); - }); - if (dependencies.length) { - input.prepopulate(dependencies, input.attr('maxlength')); - } - }); - }; - - $rows.formset({ - prefix: options.prefix, - addText: options.addText, - formCssClass: "dynamic-" + options.prefix, - deleteCssClass: "inline-deletelink", - deleteText: options.deleteText, - emptyCssClass: "empty-form", - added: function(row) { - initPrepopulatedFields(row); - reinitDateTimeShortCuts(); - updateSelectFilter(); - }, - addButton: options.addButton - }); - - return $rows; - }; - - // Stacked inlines --------------------------------------------------------- - $.fn.stackedFormset = function(selector, options) { - const $rows = $(this); - const updateInlineLabel = function(row) { - $(selector).find(".inline_label").each(function(i) { - const count = i + 1; - $(this).html($(this).html().replace(/(#\d+)/g, "#" + count)); - }); - }; - - const reinitDateTimeShortCuts = function() { - // Reinitialize the calendar and clock widgets by force, yuck. - if (typeof DateTimeShortcuts !== "undefined") { - $(".datetimeshortcuts").remove(); - DateTimeShortcuts.init(); - } - }; - - const updateSelectFilter = function() { - // If any SelectFilter widgets were added, instantiate a new instance. - if (typeof SelectFilter !== "undefined") { - $(".selectfilter").each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, false); - }); - $(".selectfilterstacked").each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, true); - }); - } - }; - - const initPrepopulatedFields = function(row) { - row.find('.prepopulated_field').each(function() { - const field = $(this), - input = field.find('input, select, textarea'), - dependency_list = input.data('dependency_list') || [], - dependencies = []; - $.each(dependency_list, function(i, field_name) { - // Dependency in a fieldset. - let field_element = row.find('.form-row .field-' + field_name); - // Dependency without a fieldset. - if (!field_element.length) { - field_element = row.find('.form-row.field-' + field_name); - } - dependencies.push('#' + field_element.find('input, select, textarea').attr('id')); - }); - if (dependencies.length) { - input.prepopulate(dependencies, input.attr('maxlength')); - } - }); - }; - - $rows.formset({ - prefix: options.prefix, - addText: options.addText, - formCssClass: "dynamic-" + options.prefix, - deleteCssClass: "inline-deletelink", - deleteText: options.deleteText, - emptyCssClass: "empty-form", - removed: updateInlineLabel, - added: function(row) { - initPrepopulatedFields(row); - reinitDateTimeShortCuts(); - updateSelectFilter(); - updateInlineLabel(row); - }, - addButton: options.addButton - }); - - return $rows; - }; - - $(document).ready(function() { - $(".js-inline-admin-formset").each(function() { - const data = $(this).data(), - inlineOptions = data.inlineFormset; - let selector; - switch(data.inlineType) { - case "stacked": - selector = inlineOptions.name + "-group .inline-related"; - $(selector).stackedFormset(selector, inlineOptions.options); - break; - case "tabular": - selector = inlineOptions.name + "-group .tabular.inline-related tbody:first > tr.form-row"; - $(selector).tabularFormset(selector, inlineOptions.options); - break; - } - }); - }); -} diff --git a/staticfiles/admin/js/jquery.init.js b/staticfiles/admin/js/jquery.init.js deleted file mode 100644 index f40b27f..0000000 --- a/staticfiles/admin/js/jquery.init.js +++ /dev/null @@ -1,8 +0,0 @@ -/*global jQuery:false*/ -'use strict'; -/* Puts the included jQuery into our own namespace using noConflict and passing - * it 'true'. This ensures that the included jQuery doesn't pollute the global - * namespace (i.e. this preserves pre-existing values for both window.$ and - * window.jQuery). - */ -window.django = {jQuery: jQuery.noConflict(true)}; diff --git a/staticfiles/admin/js/nav_sidebar.js b/staticfiles/admin/js/nav_sidebar.js deleted file mode 100644 index 7e735db..0000000 --- a/staticfiles/admin/js/nav_sidebar.js +++ /dev/null @@ -1,79 +0,0 @@ -'use strict'; -{ - const toggleNavSidebar = document.getElementById('toggle-nav-sidebar'); - if (toggleNavSidebar !== null) { - const navSidebar = document.getElementById('nav-sidebar'); - const main = document.getElementById('main'); - let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen'); - if (navSidebarIsOpen === null) { - navSidebarIsOpen = 'true'; - } - main.classList.toggle('shifted', navSidebarIsOpen === 'true'); - navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); - - toggleNavSidebar.addEventListener('click', function() { - if (navSidebarIsOpen === 'true') { - navSidebarIsOpen = 'false'; - } else { - navSidebarIsOpen = 'true'; - } - localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen); - main.classList.toggle('shifted'); - navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); - }); - } - - function initSidebarQuickFilter() { - const options = []; - const navSidebar = document.getElementById('nav-sidebar'); - if (!navSidebar) { - return; - } - navSidebar.querySelectorAll('th[scope=row] a').forEach((container) => { - options.push({title: container.innerHTML, node: container}); - }); - - function checkValue(event) { - let filterValue = event.target.value; - if (filterValue) { - filterValue = filterValue.toLowerCase(); - } - if (event.key === 'Escape') { - filterValue = ''; - event.target.value = ''; // clear input - } - let matches = false; - for (const o of options) { - let displayValue = ''; - if (filterValue) { - if (o.title.toLowerCase().indexOf(filterValue) === -1) { - displayValue = 'none'; - } else { - matches = true; - } - } - // show/hide parent - o.node.parentNode.parentNode.style.display = displayValue; - } - if (!filterValue || matches) { - event.target.classList.remove('no-results'); - } else { - event.target.classList.add('no-results'); - } - sessionStorage.setItem('django.admin.navSidebarFilterValue', filterValue); - } - - const nav = document.getElementById('nav-filter'); - nav.addEventListener('change', checkValue, false); - nav.addEventListener('input', checkValue, false); - nav.addEventListener('keyup', checkValue, false); - - const storedValue = sessionStorage.getItem('django.admin.navSidebarFilterValue'); - if (storedValue) { - nav.value = storedValue; - checkValue({target: nav, key: ''}); - } - } - window.initSidebarQuickFilter = initSidebarQuickFilter; - initSidebarQuickFilter(); -} diff --git a/staticfiles/admin/js/popup_response.js b/staticfiles/admin/js/popup_response.js deleted file mode 100644 index fecf0f4..0000000 --- a/staticfiles/admin/js/popup_response.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; -{ - const initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); - switch(initData.action) { - case 'change': - opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value); - break; - case 'delete': - opener.dismissDeleteRelatedObjectPopup(window, initData.value); - break; - default: - opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj); - break; - } -} diff --git a/staticfiles/admin/js/prepopulate.js b/staticfiles/admin/js/prepopulate.js deleted file mode 100644 index 89e95ab..0000000 --- a/staticfiles/admin/js/prepopulate.js +++ /dev/null @@ -1,43 +0,0 @@ -/*global URLify*/ -'use strict'; -{ - const $ = django.jQuery; - $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) { - /* - Depends on urlify.js - Populates a selected field with the values of the dependent fields, - URLifies and shortens the string. - dependencies - array of dependent fields ids - maxLength - maximum length of the URLify'd string - allowUnicode - Unicode support of the URLify'd string - */ - return this.each(function() { - const prepopulatedField = $(this); - - const populate = function() { - // Bail if the field's value has been changed by the user - if (prepopulatedField.data('_changed')) { - return; - } - - const values = []; - $.each(dependencies, function(i, field) { - field = $(field); - if (field.val().length > 0) { - values.push(field.val()); - } - }); - prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode)); - }; - - prepopulatedField.data('_changed', false); - prepopulatedField.on('change', function() { - prepopulatedField.data('_changed', true); - }); - - if (!prepopulatedField.val()) { - $(dependencies.join(',')).on('keyup change focus', populate); - } - }); - }; -} diff --git a/staticfiles/admin/js/prepopulate_init.js b/staticfiles/admin/js/prepopulate_init.js deleted file mode 100644 index a58841f..0000000 --- a/staticfiles/admin/js/prepopulate_init.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; -{ - const $ = django.jQuery; - const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields'); - $.each(fields, function(index, field) { - $( - '.empty-form .form-row .field-' + field.name + - ', .empty-form.form-row .field-' + field.name + - ', .empty-form .form-row.field-' + field.name - ).addClass('prepopulated_field'); - $(field.id).data('dependency_list', field.dependency_list).prepopulate( - field.dependency_ids, field.maxLength, field.allowUnicode - ); - }); -} diff --git a/staticfiles/admin/js/theme.js b/staticfiles/admin/js/theme.js deleted file mode 100644 index e79d375..0000000 --- a/staticfiles/admin/js/theme.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; -{ - function setTheme(mode) { - if (mode !== "light" && mode !== "dark" && mode !== "auto") { - console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`); - mode = "auto"; - } - document.documentElement.dataset.theme = mode; - localStorage.setItem("theme", mode); - } - - function cycleTheme() { - const currentTheme = localStorage.getItem("theme") || "auto"; - const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; - - if (prefersDark) { - // Auto (dark) -> Light -> Dark - if (currentTheme === "auto") { - setTheme("light"); - } else if (currentTheme === "light") { - setTheme("dark"); - } else { - setTheme("auto"); - } - } else { - // Auto (light) -> Dark -> Light - if (currentTheme === "auto") { - setTheme("dark"); - } else if (currentTheme === "dark") { - setTheme("light"); - } else { - setTheme("auto"); - } - } - } - - function initTheme() { - // set theme defined in localStorage if there is one, or fallback to auto mode - const currentTheme = localStorage.getItem("theme"); - currentTheme ? setTheme(currentTheme) : setTheme("auto"); - } - - window.addEventListener('load', function(_) { - const buttons = document.getElementsByClassName("theme-toggle"); - Array.from(buttons).forEach((btn) => { - btn.addEventListener("click", cycleTheme); - }); - }); - - initTheme(); -} diff --git a/staticfiles/admin/js/unusable_password_field.js b/staticfiles/admin/js/unusable_password_field.js deleted file mode 100644 index ec26238..0000000 --- a/staticfiles/admin/js/unusable_password_field.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict"; -// Fallback JS for browsers which do not support :has selector used in -// admin/css/unusable_password_fields.css -// Remove file once all supported browsers support :has selector -try { - // If browser does not support :has selector this will raise an error - document.querySelector("form:has(input)"); -} catch (error) { - console.log("Defaulting to javascript for usable password form management: " + error); - // JS replacement for unsupported :has selector - document.querySelectorAll('input[name="usable_password"]').forEach(option => { - option.addEventListener('change', function() { - const usablePassword = (this.value === "true" ? this.checked : !this.checked); - const submit1 = document.querySelector('input[type="submit"].set-password'); - const submit2 = document.querySelector('input[type="submit"].unset-password'); - const messages = document.querySelector('#id_unusable_warning'); - document.getElementById('id_password1').closest('.form-row').hidden = !usablePassword; - document.getElementById('id_password2').closest('.form-row').hidden = !usablePassword; - if (messages) { - messages.hidden = usablePassword; - } - if (submit1 && submit2) { - submit1.hidden = !usablePassword; - submit2.hidden = usablePassword; - } - }); - option.dispatchEvent(new Event('change')); - }); -} diff --git a/staticfiles/admin/js/urlify.js b/staticfiles/admin/js/urlify.js deleted file mode 100644 index 9fc0409..0000000 --- a/staticfiles/admin/js/urlify.js +++ /dev/null @@ -1,169 +0,0 @@ -/*global XRegExp*/ -'use strict'; -{ - const LATIN_MAP = { - 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', - 'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', - 'Î': 'I', 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', - 'Õ': 'O', 'Ö': 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', - 'Ü': 'U', 'Ű': 'U', 'Ý': 'Y', 'Þ': 'TH', 'Ÿ': 'Y', 'ß': 'ss', 'à': 'a', - 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', - 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i', - 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', - 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', - 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y' - }; - const LATIN_SYMBOLS_MAP = { - '©': '(c)' - }; - const GREEK_MAP = { - 'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h', - 'θ': '8', 'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm', 'ν': 'n', 'ξ': '3', - 'ο': 'o', 'π': 'p', 'ρ': 'r', 'σ': 's', 'τ': 't', 'υ': 'y', 'φ': 'f', - 'χ': 'x', 'ψ': 'ps', 'ω': 'w', 'ά': 'a', 'έ': 'e', 'ί': 'i', 'ό': 'o', - 'ύ': 'y', 'ή': 'h', 'ώ': 'w', 'ς': 's', 'ϊ': 'i', 'ΰ': 'y', 'ϋ': 'y', - 'ΐ': 'i', 'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z', - 'Η': 'H', 'Θ': '8', 'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M', 'Ν': 'N', - 'Ξ': '3', 'Ο': 'O', 'Π': 'P', 'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y', - 'Φ': 'F', 'Χ': 'X', 'Ψ': 'PS', 'Ω': 'W', 'Ά': 'A', 'Έ': 'E', 'Ί': 'I', - 'Ό': 'O', 'Ύ': 'Y', 'Ή': 'H', 'Ώ': 'W', 'Ϊ': 'I', 'Ϋ': 'Y' - }; - const TURKISH_MAP = { - 'ş': 's', 'Ş': 'S', 'ı': 'i', 'İ': 'I', 'ç': 'c', 'Ç': 'C', 'ü': 'u', - 'Ü': 'U', 'ö': 'o', 'Ö': 'O', 'ğ': 'g', 'Ğ': 'G' - }; - const ROMANIAN_MAP = { - 'ă': 'a', 'î': 'i', 'ș': 's', 'ț': 't', 'â': 'a', - 'Ă': 'A', 'Î': 'I', 'Ș': 'S', 'Ț': 'T', 'Â': 'A' - }; - const RUSSIAN_MAP = { - 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo', - 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', - 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', - 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'sh', 'ъ': '', - 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu', 'я': 'ya', - 'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'Yo', - 'Ж': 'Zh', 'З': 'Z', 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M', - 'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U', - 'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Sh', 'Ъ': '', - 'Ы': 'Y', 'Ь': '', 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya' - }; - const UKRAINIAN_MAP = { - 'Є': 'Ye', 'І': 'I', 'Ї': 'Yi', 'Ґ': 'G', 'є': 'ye', 'і': 'i', - 'ї': 'yi', 'ґ': 'g' - }; - const CZECH_MAP = { - 'č': 'c', 'ď': 'd', 'ě': 'e', 'ň': 'n', 'ř': 'r', 'š': 's', 'ť': 't', - 'ů': 'u', 'ž': 'z', 'Č': 'C', 'Ď': 'D', 'Ě': 'E', 'Ň': 'N', 'Ř': 'R', - 'Š': 'S', 'Ť': 'T', 'Ů': 'U', 'Ž': 'Z' - }; - const SLOVAK_MAP = { - 'á': 'a', 'ä': 'a', 'č': 'c', 'ď': 'd', 'é': 'e', 'í': 'i', 'ľ': 'l', - 'ĺ': 'l', 'ň': 'n', 'ó': 'o', 'ô': 'o', 'ŕ': 'r', 'š': 's', 'ť': 't', - 'ú': 'u', 'ý': 'y', 'ž': 'z', - 'Á': 'a', 'Ä': 'A', 'Č': 'C', 'Ď': 'D', 'É': 'E', 'Í': 'I', 'Ľ': 'L', - 'Ĺ': 'L', 'Ň': 'N', 'Ó': 'O', 'Ô': 'O', 'Ŕ': 'R', 'Š': 'S', 'Ť': 'T', - 'Ú': 'U', 'Ý': 'Y', 'Ž': 'Z' - }; - const POLISH_MAP = { - 'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ó': 'o', 'ś': 's', - 'ź': 'z', 'ż': 'z', - 'Ą': 'A', 'Ć': 'C', 'Ę': 'E', 'Ł': 'L', 'Ń': 'N', 'Ó': 'O', 'Ś': 'S', - 'Ź': 'Z', 'Ż': 'Z' - }; - const LATVIAN_MAP = { - 'ā': 'a', 'č': 'c', 'ē': 'e', 'ģ': 'g', 'ī': 'i', 'ķ': 'k', 'ļ': 'l', - 'ņ': 'n', 'š': 's', 'ū': 'u', 'ž': 'z', - 'Ā': 'A', 'Č': 'C', 'Ē': 'E', 'Ģ': 'G', 'Ī': 'I', 'Ķ': 'K', 'Ļ': 'L', - 'Ņ': 'N', 'Š': 'S', 'Ū': 'U', 'Ž': 'Z' - }; - const ARABIC_MAP = { - 'أ': 'a', 'ب': 'b', 'ت': 't', 'ث': 'th', 'ج': 'g', 'ح': 'h', 'خ': 'kh', 'د': 'd', - 'ذ': 'th', 'ر': 'r', 'ز': 'z', 'س': 's', 'ش': 'sh', 'ص': 's', 'ض': 'd', 'ط': 't', - 'ظ': 'th', 'ع': 'aa', 'غ': 'gh', 'ف': 'f', 'ق': 'k', 'ك': 'k', 'ل': 'l', 'م': 'm', - 'ن': 'n', 'ه': 'h', 'و': 'o', 'ي': 'y' - }; - const LITHUANIAN_MAP = { - 'ą': 'a', 'č': 'c', 'ę': 'e', 'ė': 'e', 'į': 'i', 'š': 's', 'ų': 'u', - 'ū': 'u', 'ž': 'z', - 'Ą': 'A', 'Č': 'C', 'Ę': 'E', 'Ė': 'E', 'Į': 'I', 'Š': 'S', 'Ų': 'U', - 'Ū': 'U', 'Ž': 'Z' - }; - const SERBIAN_MAP = { - 'ђ': 'dj', 'ј': 'j', 'љ': 'lj', 'њ': 'nj', 'ћ': 'c', 'џ': 'dz', - 'đ': 'dj', 'Ђ': 'Dj', 'Ј': 'j', 'Љ': 'Lj', 'Њ': 'Nj', 'Ћ': 'C', - 'Џ': 'Dz', 'Đ': 'Dj' - }; - const AZERBAIJANI_MAP = { - 'ç': 'c', 'ə': 'e', 'ğ': 'g', 'ı': 'i', 'ö': 'o', 'ş': 's', 'ü': 'u', - 'Ç': 'C', 'Ə': 'E', 'Ğ': 'G', 'İ': 'I', 'Ö': 'O', 'Ş': 'S', 'Ü': 'U' - }; - const GEORGIAN_MAP = { - 'ა': 'a', 'ბ': 'b', 'გ': 'g', 'დ': 'd', 'ე': 'e', 'ვ': 'v', 'ზ': 'z', - 'თ': 't', 'ი': 'i', 'კ': 'k', 'ლ': 'l', 'მ': 'm', 'ნ': 'n', 'ო': 'o', - 'პ': 'p', 'ჟ': 'j', 'რ': 'r', 'ს': 's', 'ტ': 't', 'უ': 'u', 'ფ': 'f', - 'ქ': 'q', 'ღ': 'g', 'ყ': 'y', 'შ': 'sh', 'ჩ': 'ch', 'ც': 'c', 'ძ': 'dz', - 'წ': 'w', 'ჭ': 'ch', 'ხ': 'x', 'ჯ': 'j', 'ჰ': 'h' - }; - - const ALL_DOWNCODE_MAPS = [ - LATIN_MAP, - LATIN_SYMBOLS_MAP, - GREEK_MAP, - TURKISH_MAP, - ROMANIAN_MAP, - RUSSIAN_MAP, - UKRAINIAN_MAP, - CZECH_MAP, - SLOVAK_MAP, - POLISH_MAP, - LATVIAN_MAP, - ARABIC_MAP, - LITHUANIAN_MAP, - SERBIAN_MAP, - AZERBAIJANI_MAP, - GEORGIAN_MAP - ]; - - const Downcoder = { - 'Initialize': function() { - if (Downcoder.map) { // already made - return; - } - Downcoder.map = {}; - for (const lookup of ALL_DOWNCODE_MAPS) { - Object.assign(Downcoder.map, lookup); - } - Downcoder.regex = new RegExp(Object.keys(Downcoder.map).join('|'), 'g'); - } - }; - - function downcode(slug) { - Downcoder.Initialize(); - return slug.replace(Downcoder.regex, function(m) { - return Downcoder.map[m]; - }); - } - - - function URLify(s, num_chars, allowUnicode) { - // changes, e.g., "Petty theft" to "petty-theft" - if (!allowUnicode) { - s = downcode(s); - } - s = s.toLowerCase(); // convert to lowercase - // if downcode doesn't hit, the char will be stripped here - if (allowUnicode) { - // Keep Unicode letters including both lowercase and uppercase - // characters, whitespace, and dash; remove other characters. - s = XRegExp.replace(s, XRegExp('[^-_\\p{L}\\p{N}\\s]', 'g'), ''); - } else { - s = s.replace(/[^-\w\s]/g, ''); // remove unneeded chars - } - s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces - s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens - s = s.substring(0, num_chars); // trim to first num_chars chars - return s.replace(/-+$/g, ''); // trim any trailing hyphens - } - window.URLify = URLify; -} diff --git a/staticfiles/admin/js/vendor/jquery/LICENSE.txt b/staticfiles/admin/js/vendor/jquery/LICENSE.txt deleted file mode 100644 index f642c3f..0000000 --- a/staticfiles/admin/js/vendor/jquery/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright OpenJS Foundation and other contributors, https://openjsf.org/ - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/staticfiles/admin/js/vendor/jquery/jquery.js b/staticfiles/admin/js/vendor/jquery/jquery.js deleted file mode 100644 index 1a86433..0000000 --- a/staticfiles/admin/js/vendor/jquery/jquery.js +++ /dev/null @@ -1,10716 +0,0 @@ -/*! - * jQuery JavaScript Library v3.7.1 - * https://jquery.com/ - * - * Copyright OpenJS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2023-08-28T13:37Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket trac-14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 - // Plus for old WebKit, typeof returns "function" for HTML collections - // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) - return typeof obj === "function" && typeof obj.nodeType !== "number" && - typeof obj.item !== "function"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var version = "3.7.1", - - rhtmlSuffix = /HTML$/i, - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - - // Retrieve the text value of an array of DOM nodes - text: function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += jQuery.text( node ); - } - } - if ( nodeType === 1 || nodeType === 11 ) { - return elem.textContent; - } - if ( nodeType === 9 ) { - return elem.documentElement.textContent; - } - if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - isXMLDoc: function( elem ) { - var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; - - // Assume HTML when documentElement doesn't yet exist, such as inside - // document fragments. - return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), - function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); - } ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -} -var pop = arr.pop; - - -var sort = arr.sort; - - -var splice = arr.splice; - - -var whitespace = "[\\x20\\t\\r\\n\\f]"; - - -var rtrimCSS = new RegExp( - "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", - "g" -); - - - - -// Note: an element does not contain itself -jQuery.contains = function( a, b ) { - var bup = b && b.parentNode; - - return a === bup || !!( bup && bup.nodeType === 1 && ( - - // Support: IE 9 - 11+ - // IE doesn't have `contains` on SVG. - a.contains ? - a.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); -}; - - - - -// CSS string/identifier serialization -// https://drafts.csswg.org/cssom/#common-serializing-idioms -var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; - -function fcssescape( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; -} - -jQuery.escapeSelector = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - - - - -var preferredDoc = document, - pushNative = push; - -( function() { - -var i, - Expr, - outermostContext, - sortInput, - hasDuplicate, - push = pushNative, - - // Local document vars - document, - documentElement, - documentIsHTML, - rbuggyQSA, - matches, - - // Instance-specific data - expando = jQuery.expando, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + - "loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + - whitespace + "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - ID: new RegExp( "^#(" + identifier + ")" ), - CLASS: new RegExp( "^\\.(" + identifier + ")" ), - TAG: new RegExp( "^(" + identifier + "|[*])" ), - ATTR: new RegExp( "^" + attributes ), - PSEUDO: new RegExp( "^" + pseudos ), - CHILD: new RegExp( - "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - bool: new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - needsContext: new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - if ( nonHex ) { - - // Strip the backslash prefix from a non-hex escape sequence - return nonHex; - } - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - return high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // Used for iframes; see `setDocument`. - // Support: IE 9 - 11+, Edge 12 - 18+ - // Removing the function wrapper causes a "Permission Denied" - // error in IE/Edge. - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && nodeName( elem, "fieldset" ); - }, - { dir: "parentNode", next: "legend" } - ); - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android <=4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { - apply: function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - }, - call: function( target ) { - pushNative.apply( target, slice.call( arguments, 1 ) ); - } - }; -} - -function find( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE 9 only - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - push.call( results, elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE 9 only - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - find.contains( context, elem ) && - elem.id === m ) { - - push.call( results, elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when - // strict-comparing two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( newContext != context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = jQuery.escapeSelector( nid ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties - // (see https://github.com/jquery/sizzle/issues/157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by jQuery selector module - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - return nodeName( elem, "input" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && - elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11+ - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a jQuery selector context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [node] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -function setDocument( node ) { - var subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - documentElement = document.documentElement; - documentIsHTML = !jQuery.isXMLDoc( document ); - - // Support: iOS 7 only, IE 9 - 11+ - // Older browsers didn't support unprefixed `matches`. - matches = documentElement.matches || - documentElement.webkitMatchesSelector || - documentElement.msMatchesSelector; - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors - // (see trac-13936). - // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, - // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. - if ( documentElement.msMatchesSelector && - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 9 - 11+, Edge 12 - 18+ - subWindow.addEventListener( "unload", unloadHandler ); - } - - // Support: IE <10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - documentElement.appendChild( el ).id = jQuery.expando; - return !document.getElementsByName || - !document.getElementsByName( jQuery.expando ).length; - } ); - - // Support: IE 9 only - // Check to see if it's possible to do matchesSelector - // on a disconnected node. - support.disconnectedMatch = assert( function( el ) { - return matches.call( el, "*" ); - } ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // IE/Edge don't support the :scope pseudo-class. - support.scope = assert( function() { - return document.querySelectorAll( ":scope" ); - } ); - - // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only - // Make sure the `:has()` argument is parsed unforgivingly. - // We include `*` in the test to detect buggy implementations that are - // _selectively_ forgiving (specifically when the list includes at least - // one valid selector). - // Note that we treat complete lack of support for `:has()` as if it were - // spec-compliant support, which is fine because use of `:has()` in such - // environments will fail in the qSA path and fall back to jQuery traversal - // anyway. - support.cssHas = assert( function() { - try { - document.querySelector( ":has(*,:jqfake)" ); - return false; - } catch ( e ) { - return true; - } - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter.ID = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find.ID = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter.ID = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find.ID = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find.TAG = function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else { - return context.querySelectorAll( tag ); - } - }; - - // Class - Expr.find.CLASS = function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - rbuggyQSA = []; - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - documentElement.appendChild( el ).innerHTML = - "" + - ""; - - // Support: iOS <=7 - 8 only - // Boolean attributes and "value" are not treated correctly in some XML documents - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: iOS <=7 - 8 only - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: iOS 8 only - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ - // In some of the document kinds, these selectors wouldn't work natively. - // This is probably OK but for backwards compatibility we want to maintain - // handling them through jQuery traversal in jQuery 3.x. - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE 9 - 11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ - // In some of the document kinds, these selectors wouldn't work natively. - // This is probably OK but for backwards compatibility we want to maintain - // handling them through jQuery traversal in jQuery 3.x. - documentElement.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - } ); - - if ( !support.cssHas ) { - - // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ - // Our regular `try-catch` mechanism fails to detect natively-unsupported - // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) - // in browsers that parse the `:has()` argument as a forgiving selector list. - // https://drafts.csswg.org/selectors/#relational now requires the argument - // to be parsed unforgivingly, but browsers have not yet fully adjusted. - rbuggyQSA.push( ":has" ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a === document || a.ownerDocument == preferredDoc && - find.contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b === document || b.ownerDocument == preferredDoc && - find.contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - }; - - return document; -} - -find.matches = function( expr, elements ) { - return find( expr, null, null, elements ); -}; - -find.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return find( expr, document, null, [ elem ] ).length > 0; -}; - -find.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return jQuery.contains( context, elem ); -}; - - -find.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (see trac-13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - if ( val !== undefined ) { - return val; - } - - return elem.getAttribute( name ); -}; - -find.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -jQuery.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - // - // Support: Android <=4.0+ - // Testing for detecting duplicates is unpredictable so instead assume we can't - // depend on duplicate detection in all browsers without a stable sort. - hasDuplicate = !support.sortStable; - sortInput = !support.sortStable && slice.call( results, 0 ); - sort.call( results, sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - splice.call( results, duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -jQuery.fn.uniqueSort = function() { - return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); -}; - -Expr = jQuery.expr = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - ATTR: function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) - .replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - CHILD: function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - find.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) - ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - find.error( match[ 0 ] ); - } - - return match; - }, - - PSEUDO: function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr.CHILD.test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - TAG: function( nodeNameSelector ) { - var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return nodeName( elem, expectedNodeName ); - }; - }, - - CLASS: function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + ")" + className + - "(" + whitespace + "|$)" ) ) && - classCache( className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - ATTR: function( name, operator, check ) { - return function( elem ) { - var result = find.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - if ( operator === "=" ) { - return result === check; - } - if ( operator === "!=" ) { - return result !== check; - } - if ( operator === "^=" ) { - return check && result.indexOf( check ) === 0; - } - if ( operator === "*=" ) { - return check && result.indexOf( check ) > -1; - } - if ( operator === "$=" ) { - return check && result.slice( -check.length ) === check; - } - if ( operator === "~=" ) { - return ( " " + result.replace( rwhitespace, " " ) + " " ) - .indexOf( check ) > -1; - } - if ( operator === "|=" ) { - return result === check || result.slice( 0, check.length + 1 ) === check + "-"; - } - - return false; - }; - }, - - CHILD: function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - nodeName( node, name ) : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || ( parent[ expando ] = {} ); - cache = outerCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - cache = outerCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - nodeName( node, name ) : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - outerCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - PSEUDO: function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // https://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - find.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as jQuery does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - not: markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrimCSS, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element - // (see https://github.com/jquery/sizzle/issues/299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - has: markFunction( function( selector ) { - return function( elem ) { - return find( selector, elem ).length > 0; - }; - } ), - - contains: markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // https://www.w3.org/TR/selectors/#lang-pseudo - lang: markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - find.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - target: function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - root: function( elem ) { - return elem === documentElement; - }, - - focus: function( elem ) { - return elem === safeActiveElement() && - document.hasFocus() && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - enabled: createDisabledPseudo( false ), - disabled: createDisabledPseudo( true ), - - checked: function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - return ( nodeName( elem, "input" ) && !!elem.checked ) || - ( nodeName( elem, "option" ) && !!elem.selected ); - }, - - selected: function( elem ) { - - // Support: IE <=11+ - // Accessing the selectedIndex property - // forces the browser to treat the default option as - // selected when in an optgroup. - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - empty: function( elem ) { - - // https://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - parent: function( elem ) { - return !Expr.pseudos.empty( elem ); - }, - - // Element/input types - header: function( elem ) { - return rheader.test( elem.nodeName ); - }, - - input: function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - button: function( elem ) { - return nodeName( elem, "input" ) && elem.type === "button" || - nodeName( elem, "button" ); - }, - - text: function( elem ) { - var attr; - return nodeName( elem, "input" ) && elem.type === "text" && - - // Support: IE <10 only - // New HTML5 attribute values (e.g., "search") appear - // with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - first: createPositionalPseudo( function() { - return [ 0 ]; - } ), - - last: createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - even: createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - odd: createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - lt: createPositionalPseudo( function( matchIndexes, length, argument ) { - var i; - - if ( argument < 0 ) { - i = argument + length; - } else if ( argument > length ) { - i = length; - } else { - i = argument; - } - - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - gt: createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos.nth = Expr.pseudos.eq; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -function tokenize( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rleadingCombinator.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrimCSS, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - if ( parseOnly ) { - return soFar.length; - } - - return soFar ? - find.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -} - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - if ( skip && nodeName( elem, skip ) ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = outerCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - outerCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - find( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, matcherOut, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || - multipleContexts( selector || "*", - context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems; - - if ( matcher ) { - - // If we have a postFinder, or filtered seed, or non-seed postFilter - // or preexisting results, - matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results; - - // Find primary matches - matcher( matcherIn, matcherOut, context, xml ); - } else { - matcherOut = matcherIn; - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element - // (see https://github.com/jquery/sizzle/issues/299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrimCSS, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find.TAG( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: iOS <=7 - 9 only - // Tolerate NodeList properties (IE: "length"; Safari: ) matching - // elements by id. (see trac-14142) - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - push.call( results, elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - jQuery.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -function compile( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -} - -/** - * A low-level selection function that works with jQuery's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with jQuery selector compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -function select( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find.ID( - token.matches[ 0 ].replace( runescape, funescape ), - context - ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && - testContext( context.parentNode ) || context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -} - -// One-time assignments - -// Support: Android <=4.0 - 4.1+ -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Initialize against the default document -setDocument(); - -// Support: Android <=4.0 - 4.1+ -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -jQuery.find = find; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.unique = jQuery.uniqueSort; - -// These have always been private, but they used to be documented as part of -// Sizzle so let's maintain them for now for backwards compatibility purposes. -find.compile = compile; -find.select = select; -find.setDocument = setDocument; -find.tokenize = tokenize; - -find.escape = jQuery.escapeSelector; -find.getText = jQuery.text; -find.isXML = jQuery.isXMLDoc; -find.selectors = jQuery.expr; -find.support = jQuery.support; -find.uniqueSort = jQuery.uniqueSort; - - /* eslint-enable */ - -} )(); - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (trac-9521) - // Strict HTML recognition (trac-11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to jQuery#find - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.error ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the error, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getErrorHook ) { - process.error = jQuery.Deferred.getErrorHook(); - - // The deprecated alias of the above. While the name suggests - // returning the stack, not an error instance, jQuery just passes - // it directly to `console.warn` so both will work; an instance - // just better cooperates with source maps. - } else if ( jQuery.Deferred.getStackHook ) { - process.error = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the primary Deferred - primary = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - primary.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( primary.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return primary.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); - } - - return primary.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error -// captured before the async barrier to get the original error cause -// which may otherwise be hidden. -jQuery.Deferred.exceptionHook = function( error, asyncError ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, - error.stack, asyncError ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See trac-6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (trac-9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see trac-8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (trac-14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (trac-11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (trac-14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (trac-13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
    " ], - col: [ 2, "", "
    " ], - tr: [ 2, "", "
    " ], - td: [ 3, "", "
    " ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (trac-12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (trac-13208) - // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (trac-13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", true ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, isSetup ) { - - // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add - if ( !isSetup ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - if ( !saved ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - this[ type ](); - result = dataPriv.get( this, type ); - dataPriv.set( this, type, false ); - - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - - return result; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering - // the native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved ) { - - // ...and capture the result - dataPriv.set( this, type, jQuery.event.trigger( - saved[ 0 ], - saved.slice( 1 ), - this - ) ); - - // Abort handling of the native event by all jQuery handlers while allowing - // native handlers on the same element to run. On target, this is achieved - // by stopping immediate propagation just on the jQuery event. However, - // the native event is re-wrapped by a jQuery one on each level of the - // propagation so the only way to stop it for jQuery is to stop it for - // everyone via native `stopPropagation()`. This is not a problem for - // focus/blur which don't bubble, but it does also stop click on checkboxes - // and radios. We accept this limitation. - event.stopPropagation(); - event.isImmediatePropagationStopped = returnTrue; - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (trac-504, trac-13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - which: true -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - - function focusMappedHandler( nativeEvent ) { - if ( document.documentMode ) { - - // Support: IE 11+ - // Attach a single focusin/focusout handler on the document while someone wants - // focus/blur. This is because the former are synchronous in IE while the latter - // are async. In other browsers, all those handlers are invoked synchronously. - - // `handle` from private data would already wrap the event, but we need - // to change the `type` here. - var handle = dataPriv.get( this, "handle" ), - event = jQuery.event.fix( nativeEvent ); - event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; - event.isSimulated = true; - - // First, handle focusin/focusout - handle( nativeEvent ); - - // ...then, handle focus/blur - // - // focus/blur don't bubble while focusin/focusout do; simulate the former by only - // invoking the handler at the lower level. - if ( event.target === event.currentTarget ) { - - // The setup part calls `leverageNative`, which, in turn, calls - // `jQuery.event.add`, so event handle will already have been set - // by this point. - handle( event ); - } - } else { - - // For non-IE browsers, attach a single capturing handler on the document - // while someone wants focusin/focusout. - jQuery.event.simulate( delegateType, nativeEvent.target, - jQuery.event.fix( nativeEvent ) ); - } - } - - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - var attaches; - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, true ); - - if ( document.documentMode ) { - - // Support: IE 9 - 11+ - // We use the same native handler for focusin & focus (and focusout & blur) - // so we need to coordinate setup & teardown parts between those events. - // Use `delegateType` as the key as `type` is already used by `leverageNative`. - attaches = dataPriv.get( this, delegateType ); - if ( !attaches ) { - this.addEventListener( delegateType, focusMappedHandler ); - } - dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); - } else { - - // Return false to allow normal processing in the caller - return false; - } - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - teardown: function() { - var attaches; - - if ( document.documentMode ) { - attaches = dataPriv.get( this, delegateType ) - 1; - if ( !attaches ) { - this.removeEventListener( delegateType, focusMappedHandler ); - dataPriv.remove( this, delegateType ); - } else { - dataPriv.set( this, delegateType, attaches ); - } - } else { - - // Return false to indicate standard teardown should be applied - return false; - } - }, - - // Suppress native focus or blur if we're currently inside - // a leveraged native-event stack - _default: function( event ) { - return dataPriv.get( event.target, type ); - }, - - delegateType: delegateType - }; - - // Support: Firefox <=44 - // Firefox doesn't have focus(in | out) events - // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 - // - // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 - // focus(in | out) events fire after focus & blur events, - // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order - // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 - // - // Support: IE 9 - 11+ - // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, - // attach a single handler for both events in IE. - jQuery.event.special[ delegateType ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - dataHolder = document.documentMode ? this : doc, - attaches = dataPriv.get( dataHolder, delegateType ); - - // Support: IE 9 - 11+ - // We use the same native handler for focusin & focus (and focusout & blur) - // so we need to coordinate setup & teardown parts between those events. - // Use `delegateType` as the key as `type` is already used by `leverageNative`. - if ( !attaches ) { - if ( document.documentMode ) { - this.addEventListener( delegateType, focusMappedHandler ); - } else { - doc.addEventListener( type, focusMappedHandler, true ); - } - } - dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - dataHolder = document.documentMode ? this : doc, - attaches = dataPriv.get( dataHolder, delegateType ) - 1; - - if ( !attaches ) { - if ( document.documentMode ) { - this.removeEventListener( delegateType, focusMappedHandler ); - } else { - doc.removeEventListener( type, focusMappedHandler, true ); - } - dataPriv.remove( dataHolder, delegateType ); - } else { - dataPriv.set( dataHolder, delegateType, attaches ); - } - } - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (trac-8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Re-enable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - - // Unwrap a CDATA section containing script contents. This shouldn't be - // needed as in XML documents they're already not visible when - // inspecting element contents and in HTML documents they have no - // meaning but we're preserving that logic for backwards compatibility. - // This will be removed completely in 4.0. See gh-4904. - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew jQuery#find here for performance reasons: - // https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var rcustomProp = /^--/; - - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (trac-8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - // - // Support: Firefox 70+ - // Only Firefox includes border widths - // in computed dimensions. (gh-4529) - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; - tr.style.cssText = "box-sizing:content-box;border:1px solid"; - - // Support: Chrome 86+ - // Height set through cssText does not get applied. - // Computed height then comes back as 0. - tr.style.height = "1px"; - trChild.style.height = "9px"; - - // Support: Android 8 Chrome 86+ - // In our bodyBackground.html iframe, - // display for all div elements is set to "inline", - // which causes a problem only in Android 8 Chrome 86. - // Ensuring the div is `display: block` - // gets around this issue. - trChild.style.display = "block"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + - parseInt( trStyle.borderTopWidth, 10 ) + - parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - isCustomProp = rcustomProp.test( name ), - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, trac-12537) - // .css('--customProperty) (gh-3144) - if ( computed ) { - - // Support: IE <=9 - 11+ - // IE only supports `"float"` in `getPropertyValue`; in computed styles - // it's only available as `"cssFloat"`. We no longer modify properties - // sent to `.css()` apart from camelCasing, so we need to check both. - // Normally, this would create difference in behavior: if - // `getPropertyValue` returns an empty string, the value returned - // by `.css()` would be `undefined`. This is usually the case for - // disconnected elements. However, in IE even disconnected elements - // with no styles return `"none"` for `getPropertyValue( "float" )` - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( isCustomProp && ret ) { - - // Support: Firefox 105+, Chrome <=105+ - // Spec requires trimming whitespace for custom properties (gh-4926). - // Firefox only trims leading whitespace. Chrome just collapses - // both leading & trailing whitespace to a single space. - // - // Fall back to `undefined` if empty string returned. - // This collapses a missing definition with property defined - // and set to an empty string but there's no standard API - // allowing us to differentiate them without a performance penalty - // and returning `undefined` aligns with older jQuery. - // - // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED - // as whitespace while CSS does not, but this is not a problem - // because CSS preprocessing replaces them with U+000A LINE FEED - // (which *is* CSS whitespace) - // https://www.w3.org/TR/css-syntax-3/#input-preprocessing - ret = ret.replace( rtrimCSS, "$1" ) || undefined; - } - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0, - marginDelta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - // Count margin delta separately to only add it after scroll gutter adjustment. - // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). - if ( box === "margin" ) { - marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta + marginDelta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - animationIterationCount: true, - aspectRatio: true, - borderImageSlice: true, - columnCount: true, - flexGrow: true, - flexShrink: true, - fontWeight: true, - gridArea: true, - gridColumn: true, - gridColumnEnd: true, - gridColumnStart: true, - gridRow: true, - gridRowEnd: true, - gridRowStart: true, - lineHeight: true, - opacity: true, - order: true, - orphans: true, - scale: true, - widows: true, - zIndex: true, - zoom: true, - - // SVG-related - fillOpacity: true, - floodOpacity: true, - stopOpacity: true, - strokeMiterlimit: true, - strokeOpacity: true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (trac-7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug trac-9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (trac-7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // Use proper attribute retrieval (trac-12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classNames, cur, curValue, className, i, finalValue; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classNames = classesToArray( value ); - - if ( classNames.length ) { - return this.each( function() { - curValue = getClass( this ); - cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - for ( i = 0; i < classNames.length; i++ ) { - className = classNames[ i ]; - if ( cur.indexOf( " " + className + " " ) < 0 ) { - cur += className + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - this.setAttribute( "class", finalValue ); - } - } - } ); - } - - return this; - }, - - removeClass: function( value ) { - var classNames, cur, curValue, className, i, finalValue; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classNames = classesToArray( value ); - - if ( classNames.length ) { - return this.each( function() { - curValue = getClass( this ); - - // This expression is here for better compressibility (see addClass) - cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - for ( i = 0; i < classNames.length; i++ ) { - className = classNames[ i ]; - - // Remove *all* instances - while ( cur.indexOf( " " + className + " " ) > -1 ) { - cur = cur.replace( " " + className + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - this.setAttribute( "class", finalValue ); - } - } - } ); - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var classNames, className, i, self, - type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - classNames = classesToArray( value ); - - return this.each( function() { - if ( isValidValue ) { - - // Toggle individual class names - self = jQuery( this ); - - for ( i = 0; i < classNames.length; i++ ) { - className = classNames[ i ]; - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (trac-14686, trac-14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (trac-2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml, parserErrorElem; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) {} - - parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; - if ( !xml || parserErrorElem ) { - jQuery.error( "Invalid XML: " + ( - parserErrorElem ? - jQuery.map( parserErrorElem.childNodes, function( el ) { - return el.textContent; - } ).join( "\n" ) : - data - ) ); - } - return xml; -}; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (trac-9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (trac-6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ).filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ).map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // trac-7653, trac-8125, trac-8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - -originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes trac-9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (trac-10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket trac-12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // trac-9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script but not if jsonp - if ( !isSuccess && - jQuery.inArray( "script", s.dataTypes ) > -1 && - jQuery.inArray( "json", s.dataTypes ) < 0 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (trac-11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // trac-1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see trac-8605, trac-14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // trac-14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( "