From ee459a6fc29228dc7d67a5c49166dffd332ec74e Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 18 Nov 2025 02:46:36 +0000 Subject: [PATCH] Revert to version d74af7d --- assets/pasted-20251118-024426-e59dd4cc.jpg | Bin 0 -> 304159 bytes config/__pycache__/settings.cpython-311.pyc | Bin 5396 -> 5455 bytes config/settings.py | 5 +- core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 1933 bytes core/templates/base.html | 25 +- core/templates/core/index.html | 201 +- core/views.py | 39 +- static/admin/css/autocomplete.css | 279 + static/admin/css/base.css | 1180 ++ static/admin/css/changelists.css | 343 + static/admin/css/dark_mode.css | 130 + static/admin/css/dashboard.css | 29 + static/admin/css/forms.css | 498 + static/admin/css/login.css | 61 + static/admin/css/nav_sidebar.css | 150 + static/admin/css/responsive.css | 904 ++ static/admin/css/responsive_rtl.css | 89 + static/admin/css/rtl.css | 293 + static/admin/css/unusable_password_field.css | 19 + .../css/vendor/select2/LICENSE-SELECT2.md | 21 + static/admin/css/vendor/select2/select2.css | 481 + .../admin/css/vendor/select2/select2.min.css | 1 + static/admin/css/widgets.css | 613 + static/admin/img/LICENSE | 20 + static/admin/img/README.txt | 7 + static/admin/img/calendar-icons.svg | 63 + static/admin/img/gis/move_vertex_off.svg | 1 + static/admin/img/gis/move_vertex_on.svg | 1 + static/admin/img/icon-addlink.svg | 3 + static/admin/img/icon-alert.svg | 3 + static/admin/img/icon-calendar.svg | 9 + static/admin/img/icon-changelink.svg | 3 + static/admin/img/icon-clock.svg | 9 + static/admin/img/icon-deletelink.svg | 3 + static/admin/img/icon-hidelink.svg | 3 + static/admin/img/icon-no.svg | 3 + static/admin/img/icon-unknown-alt.svg | 3 + static/admin/img/icon-unknown.svg | 3 + static/admin/img/icon-viewlink.svg | 3 + static/admin/img/icon-yes.svg | 3 + static/admin/img/inline-delete.svg | 3 + static/admin/img/search.svg | 3 + static/admin/img/selector-icons.svg | 34 + static/admin/img/sorting-icons.svg | 19 + static/admin/img/tooltag-add.svg | 3 + static/admin/img/tooltag-arrowright.svg | 3 + static/admin/js/SelectBox.js | 116 + static/admin/js/SelectFilter2.js | 311 + static/admin/js/actions.js | 204 + static/admin/js/admin/DateTimeShortcuts.js | 408 + static/admin/js/admin/RelatedObjectLookups.js | 252 + static/admin/js/autocomplete.js | 33 + static/admin/js/calendar.js | 239 + static/admin/js/cancel.js | 29 + static/admin/js/change_form.js | 16 + static/admin/js/core.js | 184 + static/admin/js/filters.js | 30 + static/admin/js/inlines.js | 359 + static/admin/js/jquery.init.js | 8 + static/admin/js/nav_sidebar.js | 79 + static/admin/js/popup_response.js | 15 + static/admin/js/prepopulate.js | 43 + static/admin/js/prepopulate_init.js | 15 + static/admin/js/theme.js | 51 + static/admin/js/unusable_password_field.js | 29 + static/admin/js/urlify.js | 169 + static/admin/js/vendor/jquery/LICENSE.txt | 20 + static/admin/js/vendor/jquery/jquery.js | 10716 ++++++++++++++++ static/admin/js/vendor/jquery/jquery.min.js | 2 + static/admin/js/vendor/select2/LICENSE.md | 21 + static/admin/js/vendor/select2/i18n/af.js | 3 + static/admin/js/vendor/select2/i18n/ar.js | 3 + static/admin/js/vendor/select2/i18n/az.js | 3 + static/admin/js/vendor/select2/i18n/bg.js | 3 + static/admin/js/vendor/select2/i18n/bn.js | 3 + static/admin/js/vendor/select2/i18n/bs.js | 3 + static/admin/js/vendor/select2/i18n/ca.js | 3 + static/admin/js/vendor/select2/i18n/cs.js | 3 + static/admin/js/vendor/select2/i18n/da.js | 3 + static/admin/js/vendor/select2/i18n/de.js | 3 + static/admin/js/vendor/select2/i18n/dsb.js | 3 + static/admin/js/vendor/select2/i18n/el.js | 3 + static/admin/js/vendor/select2/i18n/en.js | 3 + static/admin/js/vendor/select2/i18n/es.js | 3 + static/admin/js/vendor/select2/i18n/et.js | 3 + static/admin/js/vendor/select2/i18n/eu.js | 3 + static/admin/js/vendor/select2/i18n/fa.js | 3 + static/admin/js/vendor/select2/i18n/fi.js | 3 + static/admin/js/vendor/select2/i18n/fr.js | 3 + static/admin/js/vendor/select2/i18n/gl.js | 3 + static/admin/js/vendor/select2/i18n/he.js | 3 + static/admin/js/vendor/select2/i18n/hi.js | 3 + static/admin/js/vendor/select2/i18n/hr.js | 3 + static/admin/js/vendor/select2/i18n/hsb.js | 3 + static/admin/js/vendor/select2/i18n/hu.js | 3 + static/admin/js/vendor/select2/i18n/hy.js | 3 + static/admin/js/vendor/select2/i18n/id.js | 3 + static/admin/js/vendor/select2/i18n/is.js | 3 + static/admin/js/vendor/select2/i18n/it.js | 3 + static/admin/js/vendor/select2/i18n/ja.js | 3 + static/admin/js/vendor/select2/i18n/ka.js | 3 + static/admin/js/vendor/select2/i18n/km.js | 3 + static/admin/js/vendor/select2/i18n/ko.js | 3 + static/admin/js/vendor/select2/i18n/lt.js | 3 + static/admin/js/vendor/select2/i18n/lv.js | 3 + static/admin/js/vendor/select2/i18n/mk.js | 3 + static/admin/js/vendor/select2/i18n/ms.js | 3 + static/admin/js/vendor/select2/i18n/nb.js | 3 + static/admin/js/vendor/select2/i18n/ne.js | 3 + static/admin/js/vendor/select2/i18n/nl.js | 3 + static/admin/js/vendor/select2/i18n/pl.js | 3 + static/admin/js/vendor/select2/i18n/ps.js | 3 + static/admin/js/vendor/select2/i18n/pt-BR.js | 3 + static/admin/js/vendor/select2/i18n/pt.js | 3 + static/admin/js/vendor/select2/i18n/ro.js | 3 + static/admin/js/vendor/select2/i18n/ru.js | 3 + static/admin/js/vendor/select2/i18n/sk.js | 3 + static/admin/js/vendor/select2/i18n/sl.js | 3 + static/admin/js/vendor/select2/i18n/sq.js | 3 + .../admin/js/vendor/select2/i18n/sr-Cyrl.js | 3 + static/admin/js/vendor/select2/i18n/sr.js | 3 + static/admin/js/vendor/select2/i18n/sv.js | 3 + static/admin/js/vendor/select2/i18n/th.js | 3 + static/admin/js/vendor/select2/i18n/tk.js | 3 + static/admin/js/vendor/select2/i18n/tr.js | 3 + static/admin/js/vendor/select2/i18n/uk.js | 3 + static/admin/js/vendor/select2/i18n/vi.js | 3 + static/admin/js/vendor/select2/i18n/zh-CN.js | 3 + static/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 + static/admin/js/vendor/xregexp/LICENSE.txt | 21 + static/admin/js/vendor/xregexp/xregexp.js | 6126 +++++++++ static/admin/js/vendor/xregexp/xregexp.min.js | 17 + static/css/custom.css | 127 + .../pasted-20251118-024426-e59dd4cc.jpg | Bin 0 -> 304159 bytes 136 files changed, 32030 insertions(+), 175 deletions(-) create mode 100644 assets/pasted-20251118-024426-e59dd4cc.jpg create mode 100644 static/admin/css/autocomplete.css create mode 100644 static/admin/css/base.css create mode 100644 static/admin/css/changelists.css create mode 100644 static/admin/css/dark_mode.css create mode 100644 static/admin/css/dashboard.css create mode 100644 static/admin/css/forms.css create mode 100644 static/admin/css/login.css create mode 100644 static/admin/css/nav_sidebar.css create mode 100644 static/admin/css/responsive.css create mode 100644 static/admin/css/responsive_rtl.css create mode 100644 static/admin/css/rtl.css create mode 100644 static/admin/css/unusable_password_field.css create mode 100644 static/admin/css/vendor/select2/LICENSE-SELECT2.md create mode 100644 static/admin/css/vendor/select2/select2.css create mode 100644 static/admin/css/vendor/select2/select2.min.css create mode 100644 static/admin/css/widgets.css create mode 100644 static/admin/img/LICENSE create mode 100644 static/admin/img/README.txt create mode 100644 static/admin/img/calendar-icons.svg create mode 100644 static/admin/img/gis/move_vertex_off.svg create mode 100644 static/admin/img/gis/move_vertex_on.svg create mode 100644 static/admin/img/icon-addlink.svg create mode 100644 static/admin/img/icon-alert.svg create mode 100644 static/admin/img/icon-calendar.svg create mode 100644 static/admin/img/icon-changelink.svg create mode 100644 static/admin/img/icon-clock.svg create mode 100644 static/admin/img/icon-deletelink.svg create mode 100644 static/admin/img/icon-hidelink.svg create mode 100644 static/admin/img/icon-no.svg create mode 100644 static/admin/img/icon-unknown-alt.svg create mode 100644 static/admin/img/icon-unknown.svg create mode 100644 static/admin/img/icon-viewlink.svg create mode 100644 static/admin/img/icon-yes.svg create mode 100644 static/admin/img/inline-delete.svg create mode 100644 static/admin/img/search.svg create mode 100644 static/admin/img/selector-icons.svg create mode 100644 static/admin/img/sorting-icons.svg create mode 100644 static/admin/img/tooltag-add.svg create mode 100644 static/admin/img/tooltag-arrowright.svg create mode 100644 static/admin/js/SelectBox.js create mode 100644 static/admin/js/SelectFilter2.js create mode 100644 static/admin/js/actions.js create mode 100644 static/admin/js/admin/DateTimeShortcuts.js create mode 100644 static/admin/js/admin/RelatedObjectLookups.js create mode 100644 static/admin/js/autocomplete.js create mode 100644 static/admin/js/calendar.js create mode 100644 static/admin/js/cancel.js create mode 100644 static/admin/js/change_form.js create mode 100644 static/admin/js/core.js create mode 100644 static/admin/js/filters.js create mode 100644 static/admin/js/inlines.js create mode 100644 static/admin/js/jquery.init.js create mode 100644 static/admin/js/nav_sidebar.js create mode 100644 static/admin/js/popup_response.js create mode 100644 static/admin/js/prepopulate.js create mode 100644 static/admin/js/prepopulate_init.js create mode 100644 static/admin/js/theme.js create mode 100644 static/admin/js/unusable_password_field.js create mode 100644 static/admin/js/urlify.js create mode 100644 static/admin/js/vendor/jquery/LICENSE.txt create mode 100644 static/admin/js/vendor/jquery/jquery.js create mode 100644 static/admin/js/vendor/jquery/jquery.min.js create mode 100644 static/admin/js/vendor/select2/LICENSE.md create mode 100644 static/admin/js/vendor/select2/i18n/af.js create mode 100644 static/admin/js/vendor/select2/i18n/ar.js create mode 100644 static/admin/js/vendor/select2/i18n/az.js create mode 100644 static/admin/js/vendor/select2/i18n/bg.js create mode 100644 static/admin/js/vendor/select2/i18n/bn.js create mode 100644 static/admin/js/vendor/select2/i18n/bs.js create mode 100644 static/admin/js/vendor/select2/i18n/ca.js create mode 100644 static/admin/js/vendor/select2/i18n/cs.js create mode 100644 static/admin/js/vendor/select2/i18n/da.js create mode 100644 static/admin/js/vendor/select2/i18n/de.js create mode 100644 static/admin/js/vendor/select2/i18n/dsb.js create mode 100644 static/admin/js/vendor/select2/i18n/el.js create mode 100644 static/admin/js/vendor/select2/i18n/en.js create mode 100644 static/admin/js/vendor/select2/i18n/es.js create mode 100644 static/admin/js/vendor/select2/i18n/et.js create mode 100644 static/admin/js/vendor/select2/i18n/eu.js create mode 100644 static/admin/js/vendor/select2/i18n/fa.js create mode 100644 static/admin/js/vendor/select2/i18n/fi.js create mode 100644 static/admin/js/vendor/select2/i18n/fr.js create mode 100644 static/admin/js/vendor/select2/i18n/gl.js create mode 100644 static/admin/js/vendor/select2/i18n/he.js create mode 100644 static/admin/js/vendor/select2/i18n/hi.js create mode 100644 static/admin/js/vendor/select2/i18n/hr.js create mode 100644 static/admin/js/vendor/select2/i18n/hsb.js create mode 100644 static/admin/js/vendor/select2/i18n/hu.js create mode 100644 static/admin/js/vendor/select2/i18n/hy.js create mode 100644 static/admin/js/vendor/select2/i18n/id.js create mode 100644 static/admin/js/vendor/select2/i18n/is.js create mode 100644 static/admin/js/vendor/select2/i18n/it.js create mode 100644 static/admin/js/vendor/select2/i18n/ja.js create mode 100644 static/admin/js/vendor/select2/i18n/ka.js create mode 100644 static/admin/js/vendor/select2/i18n/km.js create mode 100644 static/admin/js/vendor/select2/i18n/ko.js create mode 100644 static/admin/js/vendor/select2/i18n/lt.js create mode 100644 static/admin/js/vendor/select2/i18n/lv.js create mode 100644 static/admin/js/vendor/select2/i18n/mk.js create mode 100644 static/admin/js/vendor/select2/i18n/ms.js create mode 100644 static/admin/js/vendor/select2/i18n/nb.js create mode 100644 static/admin/js/vendor/select2/i18n/ne.js create mode 100644 static/admin/js/vendor/select2/i18n/nl.js create mode 100644 static/admin/js/vendor/select2/i18n/pl.js create mode 100644 static/admin/js/vendor/select2/i18n/ps.js create mode 100644 static/admin/js/vendor/select2/i18n/pt-BR.js create mode 100644 static/admin/js/vendor/select2/i18n/pt.js create mode 100644 static/admin/js/vendor/select2/i18n/ro.js create mode 100644 static/admin/js/vendor/select2/i18n/ru.js create mode 100644 static/admin/js/vendor/select2/i18n/sk.js create mode 100644 static/admin/js/vendor/select2/i18n/sl.js create mode 100644 static/admin/js/vendor/select2/i18n/sq.js create mode 100644 static/admin/js/vendor/select2/i18n/sr-Cyrl.js create mode 100644 static/admin/js/vendor/select2/i18n/sr.js create mode 100644 static/admin/js/vendor/select2/i18n/sv.js create mode 100644 static/admin/js/vendor/select2/i18n/th.js create mode 100644 static/admin/js/vendor/select2/i18n/tk.js create mode 100644 static/admin/js/vendor/select2/i18n/tr.js create mode 100644 static/admin/js/vendor/select2/i18n/uk.js create mode 100644 static/admin/js/vendor/select2/i18n/vi.js create mode 100644 static/admin/js/vendor/select2/i18n/zh-CN.js create mode 100644 static/admin/js/vendor/select2/i18n/zh-TW.js create mode 100644 static/admin/js/vendor/select2/select2.full.js create mode 100644 static/admin/js/vendor/select2/select2.full.min.js create mode 100644 static/admin/js/vendor/xregexp/LICENSE.txt create mode 100644 static/admin/js/vendor/xregexp/xregexp.js create mode 100644 static/admin/js/vendor/xregexp/xregexp.min.js create mode 100644 static/css/custom.css create mode 100644 staticfiles/pasted-20251118-024426-e59dd4cc.jpg diff --git a/assets/pasted-20251118-024426-e59dd4cc.jpg b/assets/pasted-20251118-024426-e59dd4cc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8833a4cf7bc744efb915a14f45de55fc0cc95f2 GIT binary patch literal 304159 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�o5IT&Db#@f>Q7#}LoS`dLZS=73 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 delta 430 zcmX@FHARbWIWI340}%8?h-Y39n#d=?xMQRGRi=6-hE(P(unb5x#URCS850A;Y9NMy zC?zx%Mk!oqDwKgLRM1ozr&?n?JC4aj>%$mn4>CCU5rREoWq0IQbY~BctAC5B?2|W<>@-bBYXs#4YB` zypkd#5Z44mn1Tp15Md4?EP=!=*5ZPk%#tG8$qs^sTuDF?P*4=_*<3By&BP&bkx#LK M`vco%IT1rf02o_NBme*a diff --git a/config/settings.py b/config/settings.py index 7253f29..2301d78 100644 --- a/config/settings.py +++ b/config/settings.py @@ -144,7 +144,10 @@ USE_TZ = True # https://docs.djangoproject.com/en/5.2/howto/static-files/ STATIC_URL = 'static/' -STATIC_ROOT = BASE_DIR / 'static' +STATIC_ROOT = BASE_DIR / 'staticfiles' +STATICFILES_DIRS = [ + BASE_DIR / 'assets', +] # Email EMAIL_BACKEND = os.getenv( diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 6867ddf286a519cf1754ac97038f9f1e4605fbf2..e32bac5b8c3e73d65456c6a55651adf03f16c4c5 100644 GIT binary patch literal 1933 zcmah}O>7fK6rNqLe{f8)Kp+VwVT2`6Aa)RG;9><8Xd?LA$Qi-;z)E+s~s#4dHC9LhGYE`MdS;{S^zFCJ9E0sE)eV%#0 z^WOJn9`D{AMKG3rjq5WCLVt+Ot08YKHacN(9}z?(1LdXbl7xu7gs#gZFot@SzlB<_ z<-NN@zw%{6VByKL}d~?zUa|Rp3`@4P6Mg0+O|D zX<2yQF;;-Hw#{9TOL9pfavC@#*$NQ_c0sW#JRqTxT!y4~j%FX9BNBcXAQ2KM2Y2cs zM0PEK?{etBWX+x~pyvGww*wAHl(di-*_{o-xn+plDkwy6BP!WL_GUw5-xmSM zpq9tuu}&*_Adg#Z5}Wr56&LAuDn<{Cq6QNOtG&G-FlP(tKTNm>B}*0xcA zX6SYIJ!3)H5D(;#Ul+Srmf-Wmv0I@QW}77V+hD4Bth$z&{QWhuT%!k z&e06(1iBA*K~PE9zV`bcgoJo}4=ADRU+xmgr@SHh4PAD;+;YwjQ||Z3G_^Qb30tAj2mRBq=<~bDcVmgR!FNoXZFPk< zZQ2|=11WsYG{JsL1ogvnI?rLD`R2uB(VU}<5^UMoEQEpnvr?X#r(FAhP%FdqqTo3( zKYTJP+9^PEYTcq+U=mU1s>aqz?hB%U&3 z>IL8w4IKoAi0?tpMFUV~qV1qGu)k%)alEj9Kjt|TPm3j_aJ5*g??>Ry60j6(>jFF? zi>Mw!ZF?4nYvIE+>j!bK`cf-DNe6k8OFruS~e_O}pfl+sW!-7d7dAXXr?DmYn1ZQu5Jo;zLo_ojK zc;9Na(sH`ma@ti+GZm^i0vM=dMk{2^l$A3XhudiR;P?f9f_yC>hs{VjZxY*}L+mJ6 dil^K<38Ws7B&miHZu6`w`=v8=w3GNA{{gJy08an_ literal 1364 zcmZ`(&1)M+6ra_{dS%J>I!@|TuH%hUh$T{~CE!96oTjQ1oHkCdQ%ZHHPf-Q6#oP5Eq{V!1Q7#*Ku^61OfEk4%~~s}guETzy!YnKoA>c! z|CpMZL_mL+PRlpL2>m0JfI>sz+l$SscSs^=|k4VB6wxYJ2mwh>6 zP1s6a0Xh0B%Et_88>QrbMYzqB#N#E*3Oks3CUHQODRvA@K~k7$;|6iCE(zZu#bJlk z(8(RJK1WUTVt6pV9fEo^GQIeJgpqaJXHRNMhV;}glZK3tBN^en5Q~o7QAND#(>piA zMx+^HvEUS;@pC3}9#TaPq;a2SxGAxj;0&RP639l>kPjiNqhJ8&1AY_l`WecBvKL`< zK_mp-GGfihA=Gg+ss)BI*;w21yRNY^)~upqm`+Labc(T~)l62_EK-D_XmFxoXUC+( zv9ZH61GA!Od6`C{=(;tt(Wqy1VsquT>;5P-9=l@|nMF#b-iU4DnzqgA7Upvgw;tSE z&pj%9yS|;<+IaYA=m{Nfc9(G8LP76tKq2MQk+Efgahls~zxB^Y15iq2p ze1hU%s@P+67IZo#*hj*3LMINxyUY_2H9@DJWy{3I+3Mq}!>U=li}flaG+QI|spl4T zob~hDF>%eyxOE;8-gFVJ3n+TO18bo->ila}J65%hy4+QlU#ly}>PkmVchz)jqo<`_ z{(P+6Xlpn2)BEXH3$5?^ljojY`z`Y<)5;BG^zo;?`Q?6crISo|lj(kPxtsi=lf2$d zUhiF8=v}zfU%GryZ>QE?g*r>Q?ozJ5xODJS`|4MJebZUI)m^+bn2pWI0|cyf_w9L< zIJbYby>RVisS{uA##h^s)e}e(07x&wM(2TX`E06G0Q9V<>X{|ul?i3g0?%(HPYlgf z1`zb;;Me{qqL;+gPk@~&H*I26ExbmrfGYk1-V - - - {% block title %}Knowledge Base{% endblock %} + + + Viral Content Generator + + + + + {% load static %} + {% block head %}{% endblock %} - - - {% block content %}{% endblock %} - - + + +

+ {% block content %}{% endblock %} +
+ + + \ No newline at end of file diff --git a/core/templates/core/index.html b/core/templates/core/index.html index 0a3f404..5d1206a 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,154 +1,63 @@ {% extends "base.html" %} +{% load static %} -{% block title %}{{ project_name }}{% endblock %} +{% block title %}Viral YouTube Content Generator{% endblock %} {% block head %} -{% if project_description %} - - - -{% endif %} -{% if project_image_url %} - - -{% endif %} - - - - + + + {% endblock %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+
+

Generate Viral YouTube Content

+

Enter your video topic and get instant, SEO-friendly titles, tags, and hashtags.

+ +
+ {% csrf_token %} +
+ +
+
+ +
+
+ + {% if error %} +
{{ error }}
+ {% endif %}
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
-{% endblock %} \ No newline at end of file + + +{% if results %} +
+

Your Results for "{{ topic }}"

+
+
+
+

Suggested Viral Title (H1)

+

{{ results.title }}

+
+
+
+
+

Suggested Hashtags

+
+ {% for tag in results.hashtags %} + {{ tag }} + {% endfor %} +
+
+
+
+
+

Suggested Tags

+

{{ results.tags|join:", " }}

+
+
+
+
+{% endif %} +{% endblock %} diff --git a/core/views.py b/core/views.py index c9aed12..af8c5da 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,24 @@ -import os -import platform - -from django import get_version as django_version from django.shortcuts import render -from django.utils import timezone - def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() + """ + Render the landing page and handle the content generation form. + """ + context = {} + if request.method == 'POST': + topic = request.POST.get('topic', '').strip() + context['topic'] = topic + + if not topic: + context['error'] = 'Please enter a video topic.' + else: + # Mock data for demonstration purposes + context['results'] = { + 'title': f'🚀 The Ultimate Guide to {topic.title()} in 2025 | SEO Secrets', + 'hashtags': ['#' + ''.join(word.capitalize() for word in topic.split()), '#YouTube', '#SEO', '#Viral', '#ContentCreation'], + 'tags': [topic, f'{topic} tutorial`, `learn {topic}', 'how to', '2025', 'SEO tips', 'viral video'] + } + context['meta_description'] = f'Get the best viral tags, hashtags, and titles for your video about {topic}. Boost your views with our AI-powered suggestions.' + context['slug'] = f'viral-guide-{topic.lower().replace(" ", "-")}' - context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), - } return render(request, "core/index.html", context) diff --git a/static/admin/css/autocomplete.css b/static/admin/css/autocomplete.css new file mode 100644 index 0000000..7478c2c --- /dev/null +++ b/static/admin/css/autocomplete.css @@ -0,0 +1,279 @@ +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/static/admin/css/base.css b/static/admin/css/base.css new file mode 100644 index 0000000..3791043 --- /dev/null +++ b/static/admin/css/base.css @@ -0,0 +1,1180 @@ +/* + 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%; + box-sizing: border-box; +} + +.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/static/admin/css/changelists.css b/static/admin/css/changelists.css new file mode 100644 index 0000000..005b776 --- /dev/null +++ b/static/admin/css/changelists.css @@ -0,0 +1,343 @@ +/* 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/static/admin/css/dark_mode.css b/static/admin/css/dark_mode.css new file mode 100644 index 0000000..65b58d0 --- /dev/null +++ b/static/admin/css/dark_mode.css @@ -0,0 +1,130 @@ +@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: 1.5rem; + width: 1.5rem; + 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/static/admin/css/dashboard.css b/static/admin/css/dashboard.css new file mode 100644 index 0000000..242b81a --- /dev/null +++ b/static/admin/css/dashboard.css @@ -0,0 +1,29 @@ +/* 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/static/admin/css/forms.css b/static/admin/css/forms.css new file mode 100644 index 0000000..c6ce788 --- /dev/null +++ b/static/admin/css/forms.css @@ -0,0 +1,498 @@ +@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 select option:checked { + background-color: var(--selected-row); +} + +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 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 div.add-row a, +.inline-group .tabular tr.add-row td a { + 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/static/admin/css/login.css b/static/admin/css/login.css new file mode 100644 index 0000000..805a34b --- /dev/null +++ b/static/admin/css/login.css @@ -0,0 +1,61 @@ +/* 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/static/admin/css/nav_sidebar.css b/static/admin/css/nav_sidebar.css new file mode 100644 index 0000000..7eb0de9 --- /dev/null +++ b/static/admin/css/nav_sidebar.css @@ -0,0 +1,150 @@ +.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/static/admin/css/responsive.css b/static/admin/css/responsive.css new file mode 100644 index 0000000..f0fcade --- /dev/null +++ b/static/admin/css/responsive.css @@ -0,0 +1,904 @@ +/* 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 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-chooseall, .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 { + padding: 0 2px; + transform: none; + } + + .stacked .selector-chooser li { + padding: 3px; + } + + .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; + flex: 1 0 auto; + } + + .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: flex; + width: 60px; + height: 30px; + padding: 0 2px; + transform: none; + } + + .selector ul.selector-chooser li { + float: left; + } + + .selector-remove { + background-position: 0 0; + } + + :enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -24px; + } + + .selector-add { + background-position: 0 -48px; + } + + :enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -72px; + } + + /* 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/static/admin/css/responsive_rtl.css b/static/admin/css/responsive_rtl.css new file mode 100644 index 0000000..5e8f5c5 --- /dev/null +++ b/static/admin/css/responsive_rtl.css @@ -0,0 +1,89 @@ +/* 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 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"] .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; + } +} + +/* 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"] :enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -24px; + } + + [dir="rtl"] .selector-add { + background-position: 0 -48px; + } + + [dir="rtl"] :enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -72px; + } +} diff --git a/static/admin/css/rtl.css b/static/admin/css/rtl.css new file mode 100644 index 0000000..a2556d0 --- /dev/null +++ b/static/admin/css/rtl.css @@ -0,0 +1,293 @@ +/* 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 -96px no-repeat; + background-size: 24px auto; +} + +:enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -120px; +} + +.selector-remove { + background: url(../img/selector-icons.svg) 0 -144px no-repeat; + background-size: 24px auto; +} + +:enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -168px; +} + +.selector-chooseall { + background: url(../img/selector-icons.svg) right -128px no-repeat; +} + +:enabled.selector-chooseall:focus, :enabled.selector-chooseall:hover { + background-position: 100% -144px; +} + +.selector-clearall { + background: url(../img/selector-icons.svg) 0 -160px no-repeat; +} + +:enabled.selector-clearall:focus, :enabled.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/static/admin/css/unusable_password_field.css b/static/admin/css/unusable_password_field.css new file mode 100644 index 0000000..d46eb03 --- /dev/null +++ b/static/admin/css/unusable_password_field.css @@ -0,0 +1,19 @@ +/* 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/static/admin/css/vendor/select2/LICENSE-SELECT2.md b/static/admin/css/vendor/select2/LICENSE-SELECT2.md new file mode 100644 index 0000000..8cb8a2b --- /dev/null +++ b/static/admin/css/vendor/select2/LICENSE-SELECT2.md @@ -0,0 +1,21 @@ +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/static/admin/css/vendor/select2/select2.css b/static/admin/css/vendor/select2/select2.css new file mode 100644 index 0000000..750b320 --- /dev/null +++ b/static/admin/css/vendor/select2/select2.css @@ -0,0 +1,481 @@ +.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/static/admin/css/vendor/select2/select2.min.css b/static/admin/css/vendor/select2/select2.min.css new file mode 100644 index 0000000..7c18ad5 --- /dev/null +++ b/static/admin/css/vendor/select2/select2.min.css @@ -0,0 +1 @@ +.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/static/admin/css/widgets.css b/static/admin/css/widgets.css new file mode 100644 index 0000000..a5f615a --- /dev/null +++ b/static/admin/css/widgets.css @@ -0,0 +1,613 @@ +/* SELECTOR (FILTER INTERFACE) */ + +.selector { + display: flex; + flex: 1; + gap: 0 10px; +} + +.selector select { + height: 17.2em; + flex: 1 0 auto; + overflow: scroll; + width: 100%; +} + +.selector-available, .selector-chosen { + display: flex; + flex-direction: column; + flex: 1 1; +} + +.selector-available-title, .selector-chosen-title { + border: 1px solid var(--border-color); + border-radius: 4px 4px 0 0; +} + +.selector .helptext { + font-size: 0.6875rem; +} + +.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-title { + background: var(--secondary); + color: var(--header-link-color); + padding: 8px; +} + +.selector-chosen-title label { + color: var(--header-link-color); + width: 100%; +} + +.selector-available-title { + background: var(--darkened-bg); + color: var(--body-quiet-color); + padding: 8px; +} + +.selector-available-title label { + width: 100%; +} + +.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; + gap: 8px; +} + +.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 ul.selector-chooser { + align-self: center; + width: 30px; + 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: 24px; + height: 24px; + display: block; + text-indent: -3000px; + overflow: hidden; + cursor: default; + opacity: 0.55; + border: none; +} + +:enabled.selector-add, :enabled.selector-remove { + opacity: 1; +} + +:enabled.selector-add:hover, :enabled.selector-remove:hover { + cursor: pointer; +} + +.selector-add { + background: url(../img/selector-icons.svg) 0 -144px no-repeat; + background-size: 24px auto; +} + +:enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -168px; +} + +.selector-remove { + background: url(../img/selector-icons.svg) 0 -96px no-repeat; + background-size: 24px auto; +} + +:enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -120px; +} + +.selector-chooseall, .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; + border: none; +} + +:enabled.selector-chooseall:focus, :enabled.selector-clearall:focus, +:enabled.selector-chooseall:hover, :enabled.selector-clearall:hover { + color: var(--link-fg); +} + +:enabled.selector-chooseall, :enabled.selector-clearall { + opacity: 1; +} + +:enabled.selector-chooseall:hover, :enabled.selector-clearall:hover { + cursor: pointer; +} + +.selector-chooseall { + padding: 0 18px 0 0; + background: url(../img/selector-icons.svg) right -160px no-repeat; + cursor: default; +} + +:enabled.selector-chooseall:focus, :enabled.selector-chooseall:hover { + background-position: 100% -176px; +} + +.selector-clearall { + padding: 0 0 0 18px; + background: url(../img/selector-icons.svg) 0 -128px no-repeat; + cursor: default; +} + +:enabled.selector-clearall:focus, :enabled.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 { + display: flex; + height: 30px; + width: 64px; + 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 -48px no-repeat; + background-size: 24px auto; + cursor: default; +} + +.stacked :enabled.selector-add { + background-position: 0 -48px; + cursor: pointer; +} + +.stacked :enabled.selector-add:focus, .stacked :enabled.selector-add:hover { + background-position: 0 -72px; + cursor: pointer; +} + +.stacked .selector-remove { + background: url(../img/selector-icons.svg) 0 0 no-repeat; + background-size: 24px auto; + cursor: default; +} + +.stacked :enabled.selector-remove { + background-position: 0 0px; + cursor: pointer; +} + +.stacked :enabled.selector-remove:focus, .stacked :enabled.selector-remove:hover { + background-position: 0 -24px; + 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: 24px; + width: 24px; + overflow: hidden; +} + +.datetimeshortcuts .clock-icon { + background: url(../img/icon-clock.svg) 0 0 no-repeat; + background-size: 24px auto; +} + +.datetimeshortcuts a:focus .clock-icon, +.datetimeshortcuts a:hover .clock-icon { + background-position: 0 -24px; +} + +.datetimeshortcuts .date-icon { + background: url(../img/icon-calendar.svg) 0 0 no-repeat; + background-size: 24px auto; + top: -1px; +} + +.datetimeshortcuts a:focus .date-icon, +.datetimeshortcuts a:hover .date-icon { + background-position: 0 -24px; +} + +.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: 1.5rem; + height: 1.5rem; + border: 0px none; + margin-bottom: .25rem; +} + +.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/static/admin/img/LICENSE b/static/admin/img/LICENSE new file mode 100644 index 0000000..a4faaa1 --- /dev/null +++ b/static/admin/img/LICENSE @@ -0,0 +1,20 @@ +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/static/admin/img/README.txt b/static/admin/img/README.txt new file mode 100644 index 0000000..bf81f35 --- /dev/null +++ b/static/admin/img/README.txt @@ -0,0 +1,7 @@ +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/static/admin/img/calendar-icons.svg b/static/admin/img/calendar-icons.svg new file mode 100644 index 0000000..04c0274 --- /dev/null +++ b/static/admin/img/calendar-icons.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + diff --git a/static/admin/img/gis/move_vertex_off.svg b/static/admin/img/gis/move_vertex_off.svg new file mode 100644 index 0000000..228854f --- /dev/null +++ b/static/admin/img/gis/move_vertex_off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/admin/img/gis/move_vertex_on.svg b/static/admin/img/gis/move_vertex_on.svg new file mode 100644 index 0000000..96b87fd --- /dev/null +++ b/static/admin/img/gis/move_vertex_on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/admin/img/icon-addlink.svg b/static/admin/img/icon-addlink.svg new file mode 100644 index 0000000..8d5c6a3 --- /dev/null +++ b/static/admin/img/icon-addlink.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-alert.svg b/static/admin/img/icon-alert.svg new file mode 100644 index 0000000..e51ea83 --- /dev/null +++ b/static/admin/img/icon-alert.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-calendar.svg b/static/admin/img/icon-calendar.svg new file mode 100644 index 0000000..97910a9 --- /dev/null +++ b/static/admin/img/icon-calendar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/admin/img/icon-changelink.svg b/static/admin/img/icon-changelink.svg new file mode 100644 index 0000000..592b093 --- /dev/null +++ b/static/admin/img/icon-changelink.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-clock.svg b/static/admin/img/icon-clock.svg new file mode 100644 index 0000000..bf9985d --- /dev/null +++ b/static/admin/img/icon-clock.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/admin/img/icon-deletelink.svg b/static/admin/img/icon-deletelink.svg new file mode 100644 index 0000000..4059b15 --- /dev/null +++ b/static/admin/img/icon-deletelink.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-hidelink.svg b/static/admin/img/icon-hidelink.svg new file mode 100644 index 0000000..2a8b404 --- /dev/null +++ b/static/admin/img/icon-hidelink.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-no.svg b/static/admin/img/icon-no.svg new file mode 100644 index 0000000..2e0d383 --- /dev/null +++ b/static/admin/img/icon-no.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-unknown-alt.svg b/static/admin/img/icon-unknown-alt.svg new file mode 100644 index 0000000..1c6b99f --- /dev/null +++ b/static/admin/img/icon-unknown-alt.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-unknown.svg b/static/admin/img/icon-unknown.svg new file mode 100644 index 0000000..50b4f97 --- /dev/null +++ b/static/admin/img/icon-unknown.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-viewlink.svg b/static/admin/img/icon-viewlink.svg new file mode 100644 index 0000000..a1ca1d3 --- /dev/null +++ b/static/admin/img/icon-viewlink.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/icon-yes.svg b/static/admin/img/icon-yes.svg new file mode 100644 index 0000000..5883d87 --- /dev/null +++ b/static/admin/img/icon-yes.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/inline-delete.svg b/static/admin/img/inline-delete.svg new file mode 100644 index 0000000..8751150 --- /dev/null +++ b/static/admin/img/inline-delete.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/search.svg b/static/admin/img/search.svg new file mode 100644 index 0000000..c8c69b2 --- /dev/null +++ b/static/admin/img/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/selector-icons.svg b/static/admin/img/selector-icons.svg new file mode 100644 index 0000000..926b8e2 --- /dev/null +++ b/static/admin/img/selector-icons.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/admin/img/sorting-icons.svg b/static/admin/img/sorting-icons.svg new file mode 100644 index 0000000..7c31ec9 --- /dev/null +++ b/static/admin/img/sorting-icons.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/static/admin/img/tooltag-add.svg b/static/admin/img/tooltag-add.svg new file mode 100644 index 0000000..1ca64ae --- /dev/null +++ b/static/admin/img/tooltag-add.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/img/tooltag-arrowright.svg b/static/admin/img/tooltag-arrowright.svg new file mode 100644 index 0000000..b664d61 --- /dev/null +++ b/static/admin/img/tooltag-arrowright.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/admin/js/SelectBox.js b/static/admin/js/SelectBox.js new file mode 100644 index 0000000..3db4ec7 --- /dev/null +++ b/static/admin/js/SelectBox.js @@ -0,0 +1,116 @@ +'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/static/admin/js/SelectFilter2.js b/static/admin/js/SelectFilter2.js new file mode 100644 index 0000000..970b511 --- /dev/null +++ b/static/admin/js/SelectFilter2.js @@ -0,0 +1,311 @@ +/*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'; + from_box.setAttribute('aria-labelledby', field_id + '_from_title'); + + 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 selector_available_title = quickElement('div', selector_available); + selector_available_title.id = field_id + '_from_title'; + selector_available_title.className = 'selector-available-title'; + quickElement('label', selector_available_title, interpolate(gettext('Available %s') + ' ', [field_name]), 'for', field_id + '_from'); + quickElement( + 'p', + selector_available_title, + interpolate(gettext('Choose %s by selecting them and then select the "Choose" arrow button.'), [field_name]), + 'class', 'helptext' + ); + + 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', + 'aria-label', 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( + 'button', + selector_available, + interpolate(gettext('Choose all %s'), [field_name]), + 'id', field_id + '_add_all', + 'class', 'selector-chooseall', + 'type', 'button' + ); + + //
    + const selector_chooser = quickElement('ul', selector_div); + selector_chooser.className = 'selector-chooser'; + const add_button = quickElement( + 'button', + quickElement('li', selector_chooser), + interpolate(gettext('Choose selected %s'), [field_name]), + 'id', field_id + '_add', + 'class', 'selector-add', + 'type', 'button' + ); + const remove_button = quickElement( + 'button', + quickElement('li', selector_chooser), + interpolate(gettext('Remove selected %s'), [field_name]), + 'id', field_id + '_remove', + 'class', 'selector-remove', + 'type', 'button' + ); + + //
    + const selector_chosen = quickElement('div', selector_div, '', 'id', field_id + '_selector_chosen'); + selector_chosen.className = 'selector-chosen'; + const selector_chosen_title = quickElement('div', selector_chosen); + selector_chosen_title.className = 'selector-chosen-title'; + selector_chosen_title.id = field_id + '_to_title'; + quickElement('label', selector_chosen_title, interpolate(gettext('Chosen %s') + ' ', [field_name]), 'for', field_id + '_to'); + quickElement( + 'p', + selector_chosen_title, + interpolate(gettext('Remove %s by selecting them and then select the "Remove" arrow button.'), [field_name]), + 'class', 'helptext' + ); + + 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', + 'aria-label', 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'; + + quickElement( + 'select', + selector_chosen, + '', + 'id', field_id + '_to', + 'multiple', '', + 'size', from_box.size, + 'name', from_box.name, + 'aria-labelledby', field_id + '_to_title', + 'class', '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, ' ' + gettext('(click to clear)'), 'class', 'list-footer-display__clear'); + const clear_all = quickElement( + 'button', + selector_chosen, + interpolate(gettext('Remove all %s'), [field_name]), + 'id', field_id + '_remove_all', + 'class', 'selector-clearall', + 'type', 'button' + ); + + 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.hasAttribute('disabled')) { + 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_button.addEventListener('click', function(e) { + move_selection(e, this, SelectBox.move, field_id + '_from', field_id + '_to'); + }); + remove_button.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'); + // Disabled if no items are selected. + document.getElementById(field_id + '_add').disabled = !SelectFilter.any_selected(from); + document.getElementById(field_id + '_remove').disabled = !SelectFilter.any_selected(to); + // Disabled if the corresponding box is empty. + document.getElementById(field_id + '_add_all').disabled = !from.querySelector('option'); + document.getElementById(field_id + '_remove_all').disabled = !to.querySelector('option'); + }, + 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/static/admin/js/actions.js b/static/admin/js/actions.js new file mode 100644 index 0000000..04b25e9 --- /dev/null +++ b/static/admin/js/actions.js @@ -0,0 +1,204 @@ +/*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/static/admin/js/admin/DateTimeShortcuts.js b/static/admin/js/admin/DateTimeShortcuts.js new file mode 100644 index 0000000..aa1cae9 --- /dev/null +++ b/static/admin/js/admin/DateTimeShortcuts.js @@ -0,0 +1,408 @@ +/*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: + // + + 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/static/admin/js/admin/RelatedObjectLookups.js b/static/admin/js/admin/RelatedObjectLookups.js new file mode 100644 index 0000000..1fc03c6 --- /dev/null +++ b/static/admin/js/admin/RelatedObjectLookups.js @@ -0,0 +1,252 @@ +/*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 { + elem.value = chosenId; + } + $(elem).trigger('change'); + 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, skipIds = []) { + // 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 || skipIds && skipIds.includes(select.id)) { + return; + } + + let option = select.querySelector(`option[value="${objId}"]`); + + if (!option) { + option = new Option(newRepr, newId); + select.options.add(option); + // Update SelectBox cache for related fields. + if (window.SelectBox !== undefined && !SelectBox.cache[currentSelect.id]) { + SelectBox.add_to_cache(select.id, option); + SelectBox.redisplay(select.id); + } + 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 toElem = document.getElementById(toId); + const o = new Option(newRepr, newId); + SelectBox.add_to_cache(toId, o); + SelectBox.redisplay(toId); + if (toElem && toElem.nodeName.toUpperCase() === 'SELECT') { + const skipIds = [name + "_from"]; + updateRelatedSelectsOptions(toElem, win, null, newRepr, newId, skipIds); + } + } + 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; + window.relatedWindows = relatedWindows; + + // 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/static/admin/js/autocomplete.js b/static/admin/js/autocomplete.js new file mode 100644 index 0000000..d3daeab --- /dev/null +++ b/static/admin/js/autocomplete.js @@ -0,0 +1,33 @@ +'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/static/admin/js/calendar.js b/static/admin/js/calendar.js new file mode 100644 index 0000000..776310f --- /dev/null +++ b/static/admin/js/calendar.js @@ -0,0 +1,239 @@ +/*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/static/admin/js/cancel.js b/static/admin/js/cancel.js new file mode 100644 index 0000000..3069c6f --- /dev/null +++ b/static/admin/js/cancel.js @@ -0,0 +1,29 @@ +'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/static/admin/js/change_form.js b/static/admin/js/change_form.js new file mode 100644 index 0000000..96a4c62 --- /dev/null +++ b/static/admin/js/change_form.js @@ -0,0 +1,16 @@ +'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/static/admin/js/core.js b/static/admin/js/core.js new file mode 100644 index 0000000..10504d4 --- /dev/null +++ b/static/admin/js/core.js @@ -0,0 +1,184 @@ +// 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/static/admin/js/filters.js b/static/admin/js/filters.js new file mode 100644 index 0000000..f5536eb --- /dev/null +++ b/static/admin/js/filters.js @@ -0,0 +1,30 @@ +/** + * 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/static/admin/js/inlines.js b/static/admin/js/inlines.js new file mode 100644 index 0000000..cd3726c --- /dev/null +++ b/static/admin/js/inlines.js @@ -0,0 +1,359 @@ +/*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/static/admin/js/jquery.init.js b/static/admin/js/jquery.init.js new file mode 100644 index 0000000..f40b27f --- /dev/null +++ b/static/admin/js/jquery.init.js @@ -0,0 +1,8 @@ +/*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/static/admin/js/nav_sidebar.js b/static/admin/js/nav_sidebar.js new file mode 100644 index 0000000..7e735db --- /dev/null +++ b/static/admin/js/nav_sidebar.js @@ -0,0 +1,79 @@ +'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/static/admin/js/popup_response.js b/static/admin/js/popup_response.js new file mode 100644 index 0000000..fecf0f4 --- /dev/null +++ b/static/admin/js/popup_response.js @@ -0,0 +1,15 @@ +'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/static/admin/js/prepopulate.js b/static/admin/js/prepopulate.js new file mode 100644 index 0000000..89e95ab --- /dev/null +++ b/static/admin/js/prepopulate.js @@ -0,0 +1,43 @@ +/*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/static/admin/js/prepopulate_init.js b/static/admin/js/prepopulate_init.js new file mode 100644 index 0000000..a58841f --- /dev/null +++ b/static/admin/js/prepopulate_init.js @@ -0,0 +1,15 @@ +'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/static/admin/js/theme.js b/static/admin/js/theme.js new file mode 100644 index 0000000..e79d375 --- /dev/null +++ b/static/admin/js/theme.js @@ -0,0 +1,51 @@ +'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/static/admin/js/unusable_password_field.js b/static/admin/js/unusable_password_field.js new file mode 100644 index 0000000..ec26238 --- /dev/null +++ b/static/admin/js/unusable_password_field.js @@ -0,0 +1,29 @@ +"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/static/admin/js/urlify.js b/static/admin/js/urlify.js new file mode 100644 index 0000000..9fc0409 --- /dev/null +++ b/static/admin/js/urlify.js @@ -0,0 +1,169 @@ +/*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/static/admin/js/vendor/jquery/LICENSE.txt b/static/admin/js/vendor/jquery/LICENSE.txt new file mode 100644 index 0000000..f642c3f --- /dev/null +++ b/static/admin/js/vendor/jquery/LICENSE.txt @@ -0,0 +1,20 @@ +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/static/admin/js/vendor/jquery/jquery.js b/static/admin/js/vendor/jquery/jquery.js new file mode 100644 index 0000000..1a86433 --- /dev/null +++ b/static/admin/js/vendor/jquery/jquery.js @@ -0,0 +1,10716 @@ +/*! + * 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( "