From 072aa802f636af1d95d1afe8abb2ac69635f08d2 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 18 Nov 2025 02:46:26 +0000 Subject: [PATCH] Revert to version dab75bb --- assets/pasted-20251118-024426-e59dd4cc.jpg | Bin 304159 -> 0 bytes config/__pycache__/settings.cpython-311.pyc | Bin 5455 -> 5396 bytes config/settings.py | 5 +- core/__pycache__/views.cpython-311.pyc | Bin 1933 -> 1364 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 304159 -> 0 bytes 136 files changed, 175 insertions(+), 32030 deletions(-) delete mode 100644 assets/pasted-20251118-024426-e59dd4cc.jpg delete mode 100644 static/admin/css/autocomplete.css delete mode 100644 static/admin/css/base.css delete mode 100644 static/admin/css/changelists.css delete mode 100644 static/admin/css/dark_mode.css delete mode 100644 static/admin/css/dashboard.css delete mode 100644 static/admin/css/forms.css delete mode 100644 static/admin/css/login.css delete mode 100644 static/admin/css/nav_sidebar.css delete mode 100644 static/admin/css/responsive.css delete mode 100644 static/admin/css/responsive_rtl.css delete mode 100644 static/admin/css/rtl.css delete mode 100644 static/admin/css/unusable_password_field.css delete mode 100644 static/admin/css/vendor/select2/LICENSE-SELECT2.md delete mode 100644 static/admin/css/vendor/select2/select2.css delete mode 100644 static/admin/css/vendor/select2/select2.min.css delete mode 100644 static/admin/css/widgets.css delete mode 100644 static/admin/img/LICENSE delete mode 100644 static/admin/img/README.txt delete mode 100644 static/admin/img/calendar-icons.svg delete mode 100644 static/admin/img/gis/move_vertex_off.svg delete mode 100644 static/admin/img/gis/move_vertex_on.svg delete mode 100644 static/admin/img/icon-addlink.svg delete mode 100644 static/admin/img/icon-alert.svg delete mode 100644 static/admin/img/icon-calendar.svg delete mode 100644 static/admin/img/icon-changelink.svg delete mode 100644 static/admin/img/icon-clock.svg delete mode 100644 static/admin/img/icon-deletelink.svg delete mode 100644 static/admin/img/icon-hidelink.svg delete mode 100644 static/admin/img/icon-no.svg delete mode 100644 static/admin/img/icon-unknown-alt.svg delete mode 100644 static/admin/img/icon-unknown.svg delete mode 100644 static/admin/img/icon-viewlink.svg delete mode 100644 static/admin/img/icon-yes.svg delete mode 100644 static/admin/img/inline-delete.svg delete mode 100644 static/admin/img/search.svg delete mode 100644 static/admin/img/selector-icons.svg delete mode 100644 static/admin/img/sorting-icons.svg delete mode 100644 static/admin/img/tooltag-add.svg delete mode 100644 static/admin/img/tooltag-arrowright.svg delete mode 100644 static/admin/js/SelectBox.js delete mode 100644 static/admin/js/SelectFilter2.js delete mode 100644 static/admin/js/actions.js delete mode 100644 static/admin/js/admin/DateTimeShortcuts.js delete mode 100644 static/admin/js/admin/RelatedObjectLookups.js delete mode 100644 static/admin/js/autocomplete.js delete mode 100644 static/admin/js/calendar.js delete mode 100644 static/admin/js/cancel.js delete mode 100644 static/admin/js/change_form.js delete mode 100644 static/admin/js/core.js delete mode 100644 static/admin/js/filters.js delete mode 100644 static/admin/js/inlines.js delete mode 100644 static/admin/js/jquery.init.js delete mode 100644 static/admin/js/nav_sidebar.js delete mode 100644 static/admin/js/popup_response.js delete mode 100644 static/admin/js/prepopulate.js delete mode 100644 static/admin/js/prepopulate_init.js delete mode 100644 static/admin/js/theme.js delete mode 100644 static/admin/js/unusable_password_field.js delete mode 100644 static/admin/js/urlify.js delete mode 100644 static/admin/js/vendor/jquery/LICENSE.txt delete mode 100644 static/admin/js/vendor/jquery/jquery.js delete mode 100644 static/admin/js/vendor/jquery/jquery.min.js delete mode 100644 static/admin/js/vendor/select2/LICENSE.md delete mode 100644 static/admin/js/vendor/select2/i18n/af.js delete mode 100644 static/admin/js/vendor/select2/i18n/ar.js delete mode 100644 static/admin/js/vendor/select2/i18n/az.js delete mode 100644 static/admin/js/vendor/select2/i18n/bg.js delete mode 100644 static/admin/js/vendor/select2/i18n/bn.js delete mode 100644 static/admin/js/vendor/select2/i18n/bs.js delete mode 100644 static/admin/js/vendor/select2/i18n/ca.js delete mode 100644 static/admin/js/vendor/select2/i18n/cs.js delete mode 100644 static/admin/js/vendor/select2/i18n/da.js delete mode 100644 static/admin/js/vendor/select2/i18n/de.js delete mode 100644 static/admin/js/vendor/select2/i18n/dsb.js delete mode 100644 static/admin/js/vendor/select2/i18n/el.js delete mode 100644 static/admin/js/vendor/select2/i18n/en.js delete mode 100644 static/admin/js/vendor/select2/i18n/es.js delete mode 100644 static/admin/js/vendor/select2/i18n/et.js delete mode 100644 static/admin/js/vendor/select2/i18n/eu.js delete mode 100644 static/admin/js/vendor/select2/i18n/fa.js delete mode 100644 static/admin/js/vendor/select2/i18n/fi.js delete mode 100644 static/admin/js/vendor/select2/i18n/fr.js delete mode 100644 static/admin/js/vendor/select2/i18n/gl.js delete mode 100644 static/admin/js/vendor/select2/i18n/he.js delete mode 100644 static/admin/js/vendor/select2/i18n/hi.js delete mode 100644 static/admin/js/vendor/select2/i18n/hr.js delete mode 100644 static/admin/js/vendor/select2/i18n/hsb.js delete mode 100644 static/admin/js/vendor/select2/i18n/hu.js delete mode 100644 static/admin/js/vendor/select2/i18n/hy.js delete mode 100644 static/admin/js/vendor/select2/i18n/id.js delete mode 100644 static/admin/js/vendor/select2/i18n/is.js delete mode 100644 static/admin/js/vendor/select2/i18n/it.js delete mode 100644 static/admin/js/vendor/select2/i18n/ja.js delete mode 100644 static/admin/js/vendor/select2/i18n/ka.js delete mode 100644 static/admin/js/vendor/select2/i18n/km.js delete mode 100644 static/admin/js/vendor/select2/i18n/ko.js delete mode 100644 static/admin/js/vendor/select2/i18n/lt.js delete mode 100644 static/admin/js/vendor/select2/i18n/lv.js delete mode 100644 static/admin/js/vendor/select2/i18n/mk.js delete mode 100644 static/admin/js/vendor/select2/i18n/ms.js delete mode 100644 static/admin/js/vendor/select2/i18n/nb.js delete mode 100644 static/admin/js/vendor/select2/i18n/ne.js delete mode 100644 static/admin/js/vendor/select2/i18n/nl.js delete mode 100644 static/admin/js/vendor/select2/i18n/pl.js delete mode 100644 static/admin/js/vendor/select2/i18n/ps.js delete mode 100644 static/admin/js/vendor/select2/i18n/pt-BR.js delete mode 100644 static/admin/js/vendor/select2/i18n/pt.js delete mode 100644 static/admin/js/vendor/select2/i18n/ro.js delete mode 100644 static/admin/js/vendor/select2/i18n/ru.js delete mode 100644 static/admin/js/vendor/select2/i18n/sk.js delete mode 100644 static/admin/js/vendor/select2/i18n/sl.js delete mode 100644 static/admin/js/vendor/select2/i18n/sq.js delete mode 100644 static/admin/js/vendor/select2/i18n/sr-Cyrl.js delete mode 100644 static/admin/js/vendor/select2/i18n/sr.js delete mode 100644 static/admin/js/vendor/select2/i18n/sv.js delete mode 100644 static/admin/js/vendor/select2/i18n/th.js delete mode 100644 static/admin/js/vendor/select2/i18n/tk.js delete mode 100644 static/admin/js/vendor/select2/i18n/tr.js delete mode 100644 static/admin/js/vendor/select2/i18n/uk.js delete mode 100644 static/admin/js/vendor/select2/i18n/vi.js delete mode 100644 static/admin/js/vendor/select2/i18n/zh-CN.js delete mode 100644 static/admin/js/vendor/select2/i18n/zh-TW.js delete mode 100644 static/admin/js/vendor/select2/select2.full.js delete mode 100644 static/admin/js/vendor/select2/select2.full.min.js delete mode 100644 static/admin/js/vendor/xregexp/LICENSE.txt delete mode 100644 static/admin/js/vendor/xregexp/xregexp.js delete mode 100644 static/admin/js/vendor/xregexp/xregexp.min.js delete mode 100644 static/css/custom.css delete mode 100644 staticfiles/pasted-20251118-024426-e59dd4cc.jpg diff --git a/assets/pasted-20251118-024426-e59dd4cc.jpg b/assets/pasted-20251118-024426-e59dd4cc.jpg deleted file mode 100644 index a8833a4cf7bc744efb915a14f45de55fc0cc95f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304159 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�o5IT&Db#@f>Q7#}LoS`dLZS=73 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 M`vco%IT1rf02o_NBme*a delta 517 zcmbQDbzX~aIWI340}w2_E1k(IJdsa=@yJH?t4#H&oGAuX+zbrqj8RHV45`dnU{xTM zDTXOV%a|A#Rs%5vL@A@GFizn@Q=tM>p^B!;B*hd})iOq)sXz<_lP5A;aPuOhC$Wf6 zKFMq&tchlZWs240Q_R-&T4>_dDK-erAOoYcQ*2up&{Wx_YNM)JpaW8i4pQuqTn3bM zVORzvSHqP>=?bN46)~kaL}{itM(L$62Qz3oZGOVy#Ua97T#{IlnVgoHlUjU>EwQ*b zwWN5nDQ`I=>Ejw4@8TI0Tx19|zQ_nj++xnm zD=9JtaZN#l8Hg|k5f&iA3P{{yEiTB(EGe>^EGlTol>!t2g<|oU%>jblOcJse`P3S? cAF%LrR9s{c|G>;7!gPT_-~-p@$HIn;08{Q^u>b%7 diff --git a/config/settings.py b/config/settings.py index 2301d78..7253f29 100644 --- a/config/settings.py +++ b/config/settings.py @@ -144,10 +144,7 @@ USE_TZ = True # https://docs.djangoproject.com/en/5.2/howto/static-files/ STATIC_URL = 'static/' -STATIC_ROOT = BASE_DIR / 'staticfiles' -STATICFILES_DIRS = [ - BASE_DIR / 'assets', -] +STATIC_ROOT = BASE_DIR / 'static' # Email EMAIL_BACKEND = os.getenv( diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index e32bac5b8c3e73d65456c6a55651adf03f16c4c5..6867ddf286a519cf1754ac97038f9f1e4605fbf2 100644 GIT binary patch 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-V7fK6rNqLe{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_ diff --git a/core/templates/base.html b/core/templates/base.html index d7d5b8f..788576e 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -1,20 +1,11 @@ - - - Viral Content Generator - - - - - {% load static %} - + + + {% block title %}Knowledge Base{% endblock %} {% block head %}{% endblock %} - - -

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

Generate Viral YouTube Content

-

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

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

Analyzing your requirements and generating your app…

+
+ Loading…
-
- -{% 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 %} +

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 diff --git a/core/views.py b/core/views.py index af8c5da..c9aed12 100644 --- a/core/views.py +++ b/core/views.py @@ -1,24 +1,25 @@ +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 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(" ", "-")}' + """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() + 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 deleted file mode 100644 index 7478c2c..0000000 --- a/static/admin/css/autocomplete.css +++ /dev/null @@ -1,279 +0,0 @@ -select.admin-autocomplete { - width: 20em; -} - -.select2-container--admin-autocomplete.select2-container { - min-height: 30px; -} - -.select2-container--admin-autocomplete .select2-selection--single, -.select2-container--admin-autocomplete .select2-selection--multiple { - min-height: 30px; - padding: 0; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection, -.select2-container--admin-autocomplete.select2-container--open .select2-selection { - border-color: var(--body-quiet-color); - min-height: 30px; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--single, -.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--single { - padding: 0; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--multiple, -.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--multiple { - padding: 0; -} - -.select2-container--admin-autocomplete .select2-selection--single { - background-color: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: 4px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered { - color: var(--body-fg); - line-height: 30px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder { - color: var(--body-quiet-color); -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow { - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__arrow { - left: 1px; - right: auto; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single { - background-color: var(--darkened-bg); - cursor: default; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single .select2-selection__clear { - display: none; -} - -.select2-container--admin-autocomplete.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple { - background-color: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: 4px; - cursor: text; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered { - box-sizing: border-box; - list-style: none; - margin: 0; - padding: 0 10px 5px 5px; - width: 100%; - display: flex; - flex-wrap: wrap; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li { - list-style: none; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder { - color: var(--body-quiet-color); - margin-top: 5px; - float: left; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin: 5px; - position: absolute; - right: 0; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice { - background-color: var(--darkened-bg); - border: 1px solid var(--border-color); - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove { - color: var(--body-quiet-color); - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover { - color: var(--body-fg); -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline { - float: right; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - margin-left: 5px; - margin-right: auto; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple { - border: solid var(--body-quiet-color) 1px; - outline: 0; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple { - background-color: var(--darkened-bg); - cursor: default; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection__choice__remove { - display: none; -} - -.select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--multiple { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} - -.select2-container--admin-autocomplete .select2-search--dropdown { - background: var(--darkened-bg); -} - -.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field { - background: var(--body-bg); - color: var(--body-fg); - border: 1px solid var(--border-color); - border-radius: 4px; -} - -.select2-container--admin-autocomplete .select2-search--inline .select2-search__field { - background: transparent; - color: var(--body-fg); - border: none; - outline: 0; - box-shadow: none; - -webkit-appearance: textfield; -} - -.select2-container--admin-autocomplete .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; - color: var(--body-fg); - background: var(--body-bg); -} - -.select2-container--admin-autocomplete .select2-results__option[role=group] { - padding: 0; -} - -.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] { - color: var(--body-quiet-color); -} - -.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] { - background-color: var(--selected-bg); - color: var(--body-fg); -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option { - padding-left: 1em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__group { - padding-left: 0; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option { - margin-left: -1em; - padding-left: 2em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -2em; - padding-left: 3em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -3em; - padding-left: 4em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -4em; - padding-left: 5em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -5em; - padding-left: 6em; -} - -.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] { - background-color: var(--primary); - color: var(--primary-fg); -} - -.select2-container--admin-autocomplete .select2-results__group { - cursor: default; - display: block; - padding: 6px; -} - -.errors .select2-selection { - border: 1px solid var(--error-fg); -} diff --git a/static/admin/css/base.css b/static/admin/css/base.css deleted file mode 100644 index 3791043..0000000 --- a/static/admin/css/base.css +++ /dev/null @@ -1,1180 +0,0 @@ -/* - DJANGO Admin styles -*/ - -/* VARIABLE DEFINITIONS */ -html[data-theme="light"], -:root { - --primary: #79aec8; - --secondary: #417690; - --accent: #f5dd5d; - --primary-fg: #fff; - - --body-fg: #333; - --body-bg: #fff; - --body-quiet-color: #666; - --body-medium-color: #444; - --body-loud-color: #000; - - --header-color: #ffc; - --header-branding-color: var(--accent); - --header-bg: var(--secondary); - --header-link-color: var(--primary-fg); - - --breadcrumbs-fg: #c4dce8; - --breadcrumbs-link-fg: var(--body-bg); - --breadcrumbs-bg: #264b5d; - - --link-fg: #417893; - --link-hover-color: #036; - --link-selected-fg: var(--secondary); - - --hairline-color: #e8e8e8; - --border-color: #ccc; - - --error-fg: #ba2121; - - --message-success-bg: #dfd; - --message-warning-bg: #ffc; - --message-error-bg: #ffefef; - - --darkened-bg: #f8f8f8; /* A bit darker than --body-bg */ - --selected-bg: #e4e4e4; /* E.g. selected table cells */ - --selected-row: #ffc; - - --button-fg: #fff; - --button-bg: var(--secondary); - --button-hover-bg: #205067; - --default-button-bg: #205067; - --default-button-hover-bg: var(--secondary); - --close-button-bg: #747474; - --close-button-hover-bg: #333; - --delete-button-bg: #ba2121; - --delete-button-hover-bg: #a41515; - - --object-tools-fg: var(--button-fg); - --object-tools-bg: var(--close-button-bg); - --object-tools-hover-bg: var(--close-button-hover-bg); - - --font-family-primary: - "Segoe UI", - system-ui, - Roboto, - "Helvetica Neue", - Arial, - sans-serif, - "Apple Color Emoji", - "Segoe UI Emoji", - "Segoe UI Symbol", - "Noto Color Emoji"; - --font-family-monospace: - ui-monospace, - Menlo, - Monaco, - "Cascadia Mono", - "Segoe UI Mono", - "Roboto Mono", - "Oxygen Mono", - "Ubuntu Monospace", - "Source Code Pro", - "Fira Mono", - "Droid Sans Mono", - "Courier New", - monospace, - "Apple Color Emoji", - "Segoe UI Emoji", - "Segoe UI Symbol", - "Noto Color Emoji"; - - color-scheme: light; -} - -html, body { - height: 100%; -} - -body { - margin: 0; - padding: 0; - font-size: 0.875rem; - font-family: var(--font-family-primary); - color: var(--body-fg); - background: var(--body-bg); -} - -/* LINKS */ - -a:link, a:visited { - color: var(--link-fg); - text-decoration: none; - transition: color 0.15s, background 0.15s; -} - -a:focus, a:hover { - color: var(--link-hover-color); -} - -a:focus { - text-decoration: underline; -} - -a img { - border: none; -} - -a.section:link, a.section:visited { - color: var(--header-link-color); - text-decoration: none; -} - -a.section:focus, a.section:hover { - text-decoration: underline; -} - -/* GLOBAL DEFAULTS */ - -p, ol, ul, dl { - margin: .2em 0 .8em 0; -} - -p { - padding: 0; - line-height: 140%; -} - -h1,h2,h3,h4,h5 { - font-weight: bold; -} - -h1 { - margin: 0 0 20px; - font-weight: 300; - font-size: 1.25rem; -} - -h2 { - font-size: 1rem; - margin: 1em 0 .5em 0; -} - -h2.subhead { - font-weight: normal; - margin-top: 0; -} - -h3 { - font-size: 0.875rem; - margin: .8em 0 .3em 0; - color: var(--body-medium-color); - font-weight: bold; -} - -h4 { - font-size: 0.75rem; - margin: 1em 0 .8em 0; - padding-bottom: 3px; - color: var(--body-medium-color); -} - -h5 { - font-size: 0.625rem; - margin: 1.5em 0 .5em 0; - color: var(--body-quiet-color); - text-transform: uppercase; - letter-spacing: 1px; -} - -ul > li { - list-style-type: square; - padding: 1px 0; -} - -li ul { - margin-bottom: 0; -} - -li, dt, dd { - font-size: 0.8125rem; - line-height: 1.25rem; -} - -dt { - font-weight: bold; - margin-top: 4px; -} - -dd { - margin-left: 0; -} - -form { - margin: 0; - padding: 0; -} - -fieldset { - margin: 0; - min-width: 0; - padding: 0; - border: none; - border-top: 1px solid var(--hairline-color); -} - -details summary { - cursor: pointer; -} - -blockquote { - font-size: 0.6875rem; - color: #777; - margin-left: 2px; - padding-left: 10px; - border-left: 5px solid #ddd; -} - -code, pre { - font-family: var(--font-family-monospace); - color: var(--body-quiet-color); - font-size: 0.75rem; - overflow-x: auto; -} - -pre.literal-block { - margin: 10px; - background: var(--darkened-bg); - padding: 6px 8px; -} - -code strong { - color: #930; -} - -hr { - clear: both; - color: var(--hairline-color); - background-color: var(--hairline-color); - height: 1px; - border: none; - margin: 0; - padding: 0; - line-height: 1px; -} - -/* TEXT STYLES & MODIFIERS */ - -.small { - font-size: 0.6875rem; -} - -.mini { - font-size: 0.625rem; -} - -.help, p.help, form p.help, div.help, form div.help, div.help li { - font-size: 0.6875rem; - color: var(--body-quiet-color); -} - -div.help ul { - margin-bottom: 0; -} - -.help-tooltip { - cursor: help; -} - -p img, h1 img, h2 img, h3 img, h4 img, td img { - vertical-align: middle; -} - -.quiet, a.quiet:link, a.quiet:visited { - color: var(--body-quiet-color); - font-weight: normal; -} - -.clear { - clear: both; -} - -.nowrap { - white-space: nowrap; -} - -.hidden { - display: none !important; -} - -/* TABLES */ - -table { - border-collapse: collapse; - border-color: var(--border-color); -} - -td, th { - font-size: 0.8125rem; - line-height: 1rem; - border-bottom: 1px solid var(--hairline-color); - vertical-align: top; - padding: 8px; -} - -th { - font-weight: 500; - text-align: left; -} - -thead th, -tfoot td { - color: var(--body-quiet-color); - padding: 5px 10px; - font-size: 0.6875rem; - background: var(--body-bg); - border: none; - border-top: 1px solid var(--hairline-color); - border-bottom: 1px solid var(--hairline-color); -} - -tfoot td { - border-bottom: none; - border-top: 1px solid var(--hairline-color); -} - -thead th.required { - font-weight: bold; -} - -tr.alt { - background: var(--darkened-bg); -} - -tr:nth-child(odd), .row-form-errors { - background: var(--body-bg); -} - -tr:nth-child(even), -tr:nth-child(even) .errorlist, -tr:nth-child(odd) + .row-form-errors, -tr:nth-child(odd) + .row-form-errors .errorlist { - background: var(--darkened-bg); -} - -/* SORTABLE TABLES */ - -thead th { - padding: 5px 10px; - line-height: normal; - text-transform: uppercase; - background: var(--darkened-bg); -} - -thead th a:link, thead th a:visited { - color: var(--body-quiet-color); -} - -thead th.sorted { - background: var(--selected-bg); -} - -thead th.sorted .text { - padding-right: 42px; -} - -table thead th .text span { - padding: 8px 10px; - display: block; -} - -table thead th .text a { - display: block; - cursor: pointer; - padding: 8px 10px; -} - -table thead th .text a:focus, table thead th .text a:hover { - background: var(--selected-bg); -} - -thead th.sorted a.sortremove { - visibility: hidden; -} - -table thead th.sorted:hover a.sortremove { - visibility: visible; -} - -table thead th.sorted .sortoptions { - display: block; - padding: 9px 5px 0 5px; - float: right; - text-align: right; -} - -table thead th.sorted .sortpriority { - font-size: .8em; - min-width: 12px; - text-align: center; - vertical-align: 3px; - margin-left: 2px; - margin-right: 2px; -} - -table thead th.sorted .sortoptions a { - position: relative; - width: 14px; - height: 14px; - display: inline-block; - background: url(../img/sorting-icons.svg) 0 0 no-repeat; - background-size: 14px auto; -} - -table thead th.sorted .sortoptions a.sortremove { - background-position: 0 0; -} - -table thead th.sorted .sortoptions a.sortremove:after { - content: '\\'; - position: absolute; - top: -6px; - left: 3px; - font-weight: 200; - font-size: 1.125rem; - color: var(--body-quiet-color); -} - -table thead th.sorted .sortoptions a.sortremove:focus:after, -table thead th.sorted .sortoptions a.sortremove:hover:after { - color: var(--link-fg); -} - -table thead th.sorted .sortoptions a.sortremove:focus, -table thead th.sorted .sortoptions a.sortremove:hover { - background-position: 0 -14px; -} - -table thead th.sorted .sortoptions a.ascending { - background-position: 0 -28px; -} - -table thead th.sorted .sortoptions a.ascending:focus, -table thead th.sorted .sortoptions a.ascending:hover { - background-position: 0 -42px; -} - -table thead th.sorted .sortoptions a.descending { - top: 1px; - background-position: 0 -56px; -} - -table thead th.sorted .sortoptions a.descending:focus, -table thead th.sorted .sortoptions a.descending:hover { - background-position: 0 -70px; -} - -/* FORM DEFAULTS */ - -input, textarea, select, .form-row p, form .button { - margin: 2px 0; - padding: 2px 3px; - vertical-align: middle; - font-family: var(--font-family-primary); - font-weight: normal; - font-size: 0.8125rem; -} -.form-row div.help { - padding: 2px 3px; -} - -textarea { - vertical-align: top; -} - -/* -Minifiers remove the default (text) "type" attribute from "input" HTML tags. -Add input:not([type]) to make the CSS stylesheet work the same. -*/ -input:not([type]), input[type=text], input[type=password], input[type=email], -input[type=url], input[type=number], input[type=tel], textarea, select, -.vTextField { - border: 1px solid var(--border-color); - border-radius: 4px; - padding: 5px 6px; - margin-top: 0; - color: var(--body-fg); - background-color: var(--body-bg); -} - -/* -Minifiers remove the default (text) "type" attribute from "input" HTML tags. -Add input:not([type]) to make the CSS stylesheet work the same. -*/ -input:not([type]):focus, input[type=text]:focus, input[type=password]:focus, -input[type=email]:focus, input[type=url]:focus, input[type=number]:focus, -input[type=tel]:focus, textarea:focus, select:focus, .vTextField:focus { - border-color: var(--body-quiet-color); -} - -select { - height: 1.875rem; -} - -select[multiple] { - /* Allow HTML size attribute to override the height in the rule above. */ - height: auto; - min-height: 150px; -} - -/* FORM BUTTONS */ - -.button, input[type=submit], input[type=button], .submit-row input, a.button { - background: var(--button-bg); - padding: 10px 15px; - border: none; - border-radius: 4px; - color: var(--button-fg); - cursor: pointer; - transition: background 0.15s; -} - -a.button { - padding: 4px 5px; -} - -.button:active, input[type=submit]:active, input[type=button]:active, -.button:focus, input[type=submit]:focus, input[type=button]:focus, -.button:hover, input[type=submit]:hover, input[type=button]:hover { - background: var(--button-hover-bg); -} - -.button[disabled], input[type=submit][disabled], input[type=button][disabled] { - opacity: 0.4; -} - -.button.default, input[type=submit].default, .submit-row input.default { - border: none; - font-weight: 400; - background: var(--default-button-bg); -} - -.button.default:active, input[type=submit].default:active, -.button.default:focus, input[type=submit].default:focus, -.button.default:hover, input[type=submit].default:hover { - background: var(--default-button-hover-bg); -} - -.button[disabled].default, -input[type=submit][disabled].default, -input[type=button][disabled].default { - opacity: 0.4; -} - - -/* MODULES */ - -.module { - border: none; - margin-bottom: 30px; - background: var(--body-bg); -} - -.module p, .module ul, .module h3, .module h4, .module dl, .module pre { - padding-left: 10px; - padding-right: 10px; -} - -.module blockquote { - margin-left: 12px; -} - -.module ul, .module ol { - margin-left: 1.5em; -} - -.module h3 { - margin-top: .6em; -} - -.module h2, .module caption, .inline-group h2 { - margin: 0; - padding: 8px; - font-weight: 400; - font-size: 0.8125rem; - text-align: left; - background: var(--header-bg); - color: var(--header-link-color); -} - -.module caption, -.inline-group h2 { - font-size: 0.75rem; - letter-spacing: 0.5px; - text-transform: uppercase; -} - -.module table { - border-collapse: collapse; -} - -/* MESSAGES & ERRORS */ - -ul.messagelist { - padding: 0; - margin: 0; -} - -ul.messagelist li { - display: block; - font-weight: 400; - font-size: 0.8125rem; - padding: 10px 10px 10px 65px; - margin: 0 0 10px 0; - background: var(--message-success-bg) url(../img/icon-yes.svg) 40px 12px no-repeat; - background-size: 16px auto; - color: var(--body-fg); - word-break: break-word; -} - -ul.messagelist li.warning { - background: var(--message-warning-bg) url(../img/icon-alert.svg) 40px 14px no-repeat; - background-size: 14px auto; -} - -ul.messagelist li.error { - background: var(--message-error-bg) url(../img/icon-no.svg) 40px 12px no-repeat; - background-size: 16px auto; -} - -.errornote { - font-size: 0.875rem; - font-weight: 700; - display: block; - padding: 10px 12px; - margin: 0 0 10px 0; - color: var(--error-fg); - border: 1px solid var(--error-fg); - border-radius: 4px; - background-color: var(--body-bg); - background-position: 5px 12px; - overflow-wrap: break-word; -} - -ul.errorlist { - margin: 0 0 4px; - padding: 0; - color: var(--error-fg); - background: var(--body-bg); -} - -ul.errorlist li { - font-size: 0.8125rem; - display: block; - margin-bottom: 4px; - overflow-wrap: break-word; -} - -ul.errorlist li:first-child { - margin-top: 0; -} - -ul.errorlist li a { - color: inherit; - text-decoration: underline; -} - -td ul.errorlist { - margin: 0; - padding: 0; -} - -td ul.errorlist li { - margin: 0; -} - -.form-row.errors { - margin: 0; - border: none; - border-bottom: 1px solid var(--hairline-color); - background: none; -} - -.form-row.errors ul.errorlist li { - padding-left: 0; -} - -.errors input, .errors select, .errors textarea, -td ul.errorlist + input, td ul.errorlist + select, td ul.errorlist + textarea { - border: 1px solid var(--error-fg); -} - -.description { - font-size: 0.75rem; - padding: 5px 0 0 12px; -} - -/* BREADCRUMBS */ - -div.breadcrumbs { - background: var(--breadcrumbs-bg); - padding: 10px 40px; - border: none; - color: var(--breadcrumbs-fg); - text-align: left; -} - -div.breadcrumbs a { - color: var(--breadcrumbs-link-fg); -} - -div.breadcrumbs a:focus, div.breadcrumbs a:hover { - color: var(--breadcrumbs-fg); -} - -/* ACTION ICONS */ - -.viewlink, .inlineviewlink { - padding-left: 16px; - background: url(../img/icon-viewlink.svg) 0 1px no-repeat; -} - -.hidelink { - padding-left: 16px; - background: url(../img/icon-hidelink.svg) 0 1px no-repeat; -} - -.addlink { - padding-left: 16px; - background: url(../img/icon-addlink.svg) 0 1px no-repeat; -} - -.changelink, .inlinechangelink { - padding-left: 16px; - background: url(../img/icon-changelink.svg) 0 1px no-repeat; -} - -.deletelink { - padding-left: 16px; - background: url(../img/icon-deletelink.svg) 0 1px no-repeat; -} - -a.deletelink:link, a.deletelink:visited { - color: #CC3434; /* XXX Probably unused? */ -} - -a.deletelink:focus, a.deletelink:hover { - color: #993333; /* XXX Probably unused? */ - text-decoration: none; -} - -/* OBJECT TOOLS */ - -.object-tools { - font-size: 0.625rem; - font-weight: bold; - padding-left: 0; - float: right; - position: relative; - margin-top: -48px; -} - -.object-tools li { - display: block; - float: left; - margin-left: 5px; - height: 1rem; -} - -.object-tools a { - border-radius: 15px; -} - -.object-tools a:link, .object-tools a:visited { - display: block; - float: left; - padding: 3px 12px; - background: var(--object-tools-bg); - color: var(--object-tools-fg); - font-weight: 400; - font-size: 0.6875rem; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.object-tools a:focus, .object-tools a:hover { - background-color: var(--object-tools-hover-bg); -} - -.object-tools a:focus{ - text-decoration: none; -} - -.object-tools a.viewsitelink, .object-tools a.addlink { - background-repeat: no-repeat; - background-position: right 7px center; - padding-right: 26px; -} - -.object-tools a.viewsitelink { - background-image: url(../img/tooltag-arrowright.svg); -} - -.object-tools a.addlink { - background-image: url(../img/tooltag-add.svg); -} - -/* OBJECT HISTORY */ - -#change-history table { - width: 100%; -} - -#change-history table tbody th { - width: 16em; -} - -#change-history .paginator { - color: var(--body-quiet-color); - border-bottom: 1px solid var(--hairline-color); - background: var(--body-bg); - overflow: hidden; -} - -/* PAGE STRUCTURE */ - -#container { - position: relative; - width: 100%; - min-width: 980px; - padding: 0; - display: flex; - flex-direction: column; - height: 100%; -} - -#container > .main { - display: flex; - flex: 1 0 auto; -} - -.main > .content { - flex: 1 0; - max-width: 100%; -} - -.skip-to-content-link { - position: absolute; - top: -999px; - margin: 5px; - padding: 5px; - background: var(--body-bg); - z-index: 1; -} - -.skip-to-content-link:focus { - left: 0px; - top: 0px; -} - -#content { - padding: 20px 40px; -} - -.dashboard #content { - width: 600px; -} - -#content-main { - float: left; - width: 100%; -} - -#content-related { - float: right; - width: 260px; - position: relative; - margin-right: -300px; -} - -@media (forced-colors: active) { - #content-related { - border: 1px solid; - } -} - -/* COLUMN TYPES */ - -.colMS { - margin-right: 300px; -} - -.colSM { - margin-left: 300px; -} - -.colSM #content-related { - float: left; - margin-right: 0; - margin-left: -300px; -} - -.colSM #content-main { - float: right; -} - -.popup .colM { - width: auto; -} - -/* HEADER */ - -#header { - width: auto; - height: auto; - display: flex; - justify-content: space-between; - align-items: center; - padding: 10px 40px; - background: var(--header-bg); - color: var(--header-color); -} - -#header a:link, #header a:visited, #logout-form button { - color: var(--header-link-color); -} - -#header a:focus , #header a:hover { - text-decoration: underline; -} - -@media (forced-colors: active) { - #header { - border-bottom: 1px solid; - } -} - -#branding { - display: flex; -} - -#site-name { - padding: 0; - margin: 0; - margin-inline-end: 20px; - font-weight: 300; - font-size: 1.5rem; - color: var(--header-branding-color); -} - -#site-name a:link, #site-name a:visited { - color: var(--accent); -} - -#branding h2 { - padding: 0 10px; - font-size: 0.875rem; - margin: -8px 0 8px 0; - font-weight: normal; - color: var(--header-color); -} - -#branding a:hover { - text-decoration: none; -} - -#logout-form { - display: inline; -} - -#logout-form button { - background: none; - border: 0; - cursor: pointer; - font-family: var(--font-family-primary); -} - -#user-tools { - float: right; - margin: 0 0 0 20px; - text-align: right; -} - -#user-tools, #logout-form button{ - padding: 0; - font-weight: 300; - font-size: 0.6875rem; - letter-spacing: 0.5px; - text-transform: uppercase; -} - -#user-tools a, #logout-form button { - border-bottom: 1px solid rgba(255, 255, 255, 0.25); -} - -#user-tools a:focus, #user-tools a:hover, -#logout-form button:active, #logout-form button:hover { - text-decoration: none; - border-bottom: 0; -} - -#logout-form button:active, #logout-form button:hover { - margin-bottom: 1px; -} - -/* SIDEBAR */ - -#content-related { - background: var(--darkened-bg); -} - -#content-related .module { - background: none; -} - -#content-related h3 { - color: var(--body-quiet-color); - padding: 0 16px; - margin: 0 0 16px; -} - -#content-related h4 { - font-size: 0.8125rem; -} - -#content-related p { - padding-left: 16px; - padding-right: 16px; -} - -#content-related .actionlist { - padding: 0; - margin: 16px; -} - -#content-related .actionlist li { - line-height: 1.2; - margin-bottom: 10px; - padding-left: 18px; -} - -#content-related .module h2 { - background: none; - padding: 16px; - margin-bottom: 16px; - border-bottom: 1px solid var(--hairline-color); - font-size: 1.125rem; - color: var(--body-fg); -} - -.delete-confirmation form input[type="submit"] { - background: var(--delete-button-bg); - border-radius: 4px; - padding: 10px 15px; - color: var(--button-fg); -} - -.delete-confirmation form input[type="submit"]:active, -.delete-confirmation form input[type="submit"]:focus, -.delete-confirmation form input[type="submit"]:hover { - background: var(--delete-button-hover-bg); -} - -.delete-confirmation form .cancel-link { - display: inline-block; - vertical-align: middle; - height: 0.9375rem; - line-height: 0.9375rem; - border-radius: 4px; - padding: 10px 15px; - color: var(--button-fg); - background: var(--close-button-bg); - margin: 0 0 0 10px; -} - -.delete-confirmation form .cancel-link:active, -.delete-confirmation form .cancel-link:focus, -.delete-confirmation form .cancel-link:hover { - background: var(--close-button-hover-bg); -} - -/* POPUP */ -.popup #content { - padding: 20px; -} - -.popup #container { - min-width: 0; -} - -.popup #header { - padding: 10px 20px; -} - -/* PAGINATOR */ - -.paginator { - display: flex; - align-items: center; - gap: 4px; - font-size: 0.8125rem; - padding-top: 10px; - padding-bottom: 10px; - line-height: 22px; - margin: 0; - border-top: 1px solid var(--hairline-color); - width: 100%; - 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 deleted file mode 100644 index 005b776..0000000 --- a/static/admin/css/changelists.css +++ /dev/null @@ -1,343 +0,0 @@ -/* CHANGELISTS */ - -#changelist { - display: flex; - align-items: flex-start; - justify-content: space-between; -} - -#changelist .changelist-form-container { - flex: 1 1 auto; - min-width: 0; -} - -#changelist table { - width: 100%; -} - -.change-list .hiddenfields { display:none; } - -.change-list .filtered table { - border-right: none; -} - -.change-list .filtered { - min-height: 400px; -} - -.change-list .filtered .results, .change-list .filtered .paginator, -.filtered #toolbar, .filtered div.xfull { - width: auto; -} - -.change-list .filtered table tbody th { - padding-right: 1em; -} - -#changelist-form .results { - overflow-x: auto; - width: 100%; -} - -#changelist .toplinks { - border-bottom: 1px solid var(--hairline-color); -} - -#changelist .paginator { - color: var(--body-quiet-color); - border-bottom: 1px solid var(--hairline-color); - background: var(--body-bg); - overflow: hidden; -} - -/* CHANGELIST TABLES */ - -#changelist table thead th { - padding: 0; - white-space: nowrap; - vertical-align: middle; -} - -#changelist table thead th.action-checkbox-column { - width: 1.5em; - text-align: center; -} - -#changelist table tbody td.action-checkbox { - text-align: center; -} - -#changelist table tfoot { - color: var(--body-quiet-color); -} - -/* TOOLBAR */ - -#toolbar { - padding: 8px 10px; - margin-bottom: 15px; - border-top: 1px solid var(--hairline-color); - border-bottom: 1px solid var(--hairline-color); - background: var(--darkened-bg); - color: var(--body-quiet-color); -} - -#toolbar form input { - border-radius: 4px; - font-size: 0.875rem; - padding: 5px; - color: var(--body-fg); -} - -#toolbar #searchbar { - height: 1.1875rem; - border: 1px solid var(--border-color); - padding: 2px 5px; - margin: 0; - vertical-align: top; - font-size: 0.8125rem; - max-width: 100%; -} - -#toolbar #searchbar:focus { - border-color: var(--body-quiet-color); -} - -#toolbar form input[type="submit"] { - border: 1px solid var(--border-color); - font-size: 0.8125rem; - padding: 4px 8px; - margin: 0; - vertical-align: middle; - background: var(--body-bg); - box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; - cursor: pointer; - color: var(--body-fg); -} - -#toolbar form input[type="submit"]:focus, -#toolbar form input[type="submit"]:hover { - border-color: var(--body-quiet-color); -} - -#changelist-search img { - vertical-align: middle; - margin-right: 4px; -} - -#changelist-search .help { - word-break: break-word; -} - -/* FILTER COLUMN */ - -#changelist-filter { - flex: 0 0 240px; - order: 1; - background: var(--darkened-bg); - border-left: none; - margin: 0 0 0 30px; -} - -@media (forced-colors: active) { - #changelist-filter { - border: 1px solid; - } -} - -#changelist-filter h2 { - font-size: 0.875rem; - text-transform: uppercase; - letter-spacing: 0.5px; - padding: 5px 15px; - margin-bottom: 12px; - border-bottom: none; -} - -#changelist-filter h3, -#changelist-filter details summary { - font-weight: 400; - padding: 0 15px; - margin-bottom: 10px; -} - -#changelist-filter details summary > * { - display: inline; -} - -#changelist-filter details > summary { - list-style-type: none; -} - -#changelist-filter details > summary::-webkit-details-marker { - display: none; -} - -#changelist-filter details > summary::before { - content: '→'; - font-weight: bold; - color: var(--link-hover-color); -} - -#changelist-filter details[open] > summary::before { - content: '↓'; -} - -#changelist-filter ul { - margin: 5px 0; - padding: 0 15px 15px; - border-bottom: 1px solid var(--hairline-color); -} - -#changelist-filter ul:last-child { - border-bottom: none; -} - -#changelist-filter li { - list-style-type: none; - margin-left: 0; - padding-left: 0; -} - -#changelist-filter a { - display: block; - color: var(--body-quiet-color); - word-break: break-word; -} - -#changelist-filter li.selected { - border-left: 5px solid var(--hairline-color); - padding-left: 10px; - margin-left: -15px; -} - -#changelist-filter li.selected a { - color: var(--link-selected-fg); -} - -#changelist-filter a:focus, #changelist-filter a:hover, -#changelist-filter li.selected a:focus, -#changelist-filter li.selected a:hover { - color: var(--link-hover-color); -} - -#changelist-filter #changelist-filter-extra-actions { - font-size: 0.8125rem; - margin-bottom: 10px; - border-bottom: 1px solid var(--hairline-color); -} - -/* DATE DRILLDOWN */ - -.change-list .toplinks { - display: flex; - padding-bottom: 5px; - flex-wrap: wrap; - gap: 3px 17px; - font-weight: bold; -} - -.change-list .toplinks a { - font-size: 0.8125rem; -} - -.change-list .toplinks .date-back { - color: var(--body-quiet-color); -} - -.change-list .toplinks .date-back:focus, -.change-list .toplinks .date-back:hover { - color: var(--link-hover-color); -} - -/* ACTIONS */ - -.filtered .actions { - border-right: none; -} - -#changelist table input { - margin: 0; - vertical-align: baseline; -} - -/* Once the :has() pseudo-class is supported by all browsers, the tr.selected - selector and the JS adding the class can be removed. */ -#changelist tbody tr.selected { - background-color: var(--selected-row); -} - -#changelist tbody tr:has(.action-select:checked) { - background-color: var(--selected-row); -} - -@media (forced-colors: active) { - #changelist tbody tr.selected { - background-color: SelectedItem; - } - #changelist tbody tr:has(.action-select:checked) { - background-color: SelectedItem; - } -} - -#changelist .actions { - padding: 10px; - background: var(--body-bg); - border-top: none; - border-bottom: none; - line-height: 1.5rem; - color: var(--body-quiet-color); - width: 100%; -} - -#changelist .actions span.all, -#changelist .actions span.action-counter, -#changelist .actions span.clear, -#changelist .actions span.question { - font-size: 0.8125rem; - margin: 0 0.5em; -} - -#changelist .actions:last-child { - border-bottom: none; -} - -#changelist .actions select { - vertical-align: top; - height: 1.5rem; - color: var(--body-fg); - border: 1px solid var(--border-color); - border-radius: 4px; - font-size: 0.875rem; - padding: 0 0 0 4px; - margin: 0; - margin-left: 10px; -} - -#changelist .actions select:focus { - border-color: var(--body-quiet-color); -} - -#changelist .actions label { - display: inline-block; - vertical-align: middle; - font-size: 0.8125rem; -} - -#changelist .actions .button { - font-size: 0.8125rem; - border: 1px solid var(--border-color); - border-radius: 4px; - background: var(--body-bg); - box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; - cursor: pointer; - height: 1.5rem; - line-height: 1; - padding: 4px 8px; - margin: 0; - color: var(--body-fg); -} - -#changelist .actions .button:focus, #changelist .actions .button:hover { - border-color: var(--body-quiet-color); -} diff --git a/static/admin/css/dark_mode.css b/static/admin/css/dark_mode.css deleted file mode 100644 index 65b58d0..0000000 --- a/static/admin/css/dark_mode.css +++ /dev/null @@ -1,130 +0,0 @@ -@media (prefers-color-scheme: dark) { - :root { - --primary: #264b5d; - --primary-fg: #f7f7f7; - - --body-fg: #eeeeee; - --body-bg: #121212; - --body-quiet-color: #d0d0d0; - --body-medium-color: #e0e0e0; - --body-loud-color: #ffffff; - - --breadcrumbs-link-fg: #e0e0e0; - --breadcrumbs-bg: var(--primary); - - --link-fg: #81d4fa; - --link-hover-color: #4ac1f7; - --link-selected-fg: #6f94c6; - - --hairline-color: #272727; - --border-color: #353535; - - --error-fg: #e35f5f; - --message-success-bg: #006b1b; - --message-warning-bg: #583305; - --message-error-bg: #570808; - - --darkened-bg: #212121; - --selected-bg: #1b1b1b; - --selected-row: #00363a; - - --close-button-bg: #333333; - --close-button-hover-bg: #666666; - - color-scheme: dark; - } - } - - -html[data-theme="dark"] { - --primary: #264b5d; - --primary-fg: #f7f7f7; - - --body-fg: #eeeeee; - --body-bg: #121212; - --body-quiet-color: #d0d0d0; - --body-medium-color: #e0e0e0; - --body-loud-color: #ffffff; - - --breadcrumbs-link-fg: #e0e0e0; - --breadcrumbs-bg: var(--primary); - - --link-fg: #81d4fa; - --link-hover-color: #4ac1f7; - --link-selected-fg: #6f94c6; - - --hairline-color: #272727; - --border-color: #353535; - - --error-fg: #e35f5f; - --message-success-bg: #006b1b; - --message-warning-bg: #583305; - --message-error-bg: #570808; - - --darkened-bg: #212121; - --selected-bg: #1b1b1b; - --selected-row: #00363a; - - --close-button-bg: #333333; - --close-button-hover-bg: #666666; - - color-scheme: dark; -} - -/* THEME SWITCH */ -.theme-toggle { - cursor: pointer; - border: none; - padding: 0; - background: transparent; - vertical-align: middle; - margin-inline-start: 5px; - margin-top: -1px; -} - -.theme-toggle svg { - vertical-align: middle; - height: 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 deleted file mode 100644 index 242b81a..0000000 --- a/static/admin/css/dashboard.css +++ /dev/null @@ -1,29 +0,0 @@ -/* DASHBOARD */ -.dashboard td, .dashboard th { - word-break: break-word; -} - -.dashboard .module table th { - width: 100%; -} - -.dashboard .module table td { - white-space: nowrap; -} - -.dashboard .module table td a { - display: block; - padding-right: .6em; -} - -/* RECENT ACTIONS MODULE */ - -.module ul.actionlist { - margin-left: 0; -} - -ul.actionlist li { - list-style-type: none; - overflow: hidden; - text-overflow: ellipsis; -} diff --git a/static/admin/css/forms.css b/static/admin/css/forms.css deleted file mode 100644 index c6ce788..0000000 --- a/static/admin/css/forms.css +++ /dev/null @@ -1,498 +0,0 @@ -@import url('widgets.css'); - -/* FORM ROWS */ - -.form-row { - overflow: hidden; - padding: 10px; - font-size: 0.8125rem; - border-bottom: 1px solid var(--hairline-color); -} - -.form-row img, .form-row input { - vertical-align: middle; -} - -.form-row label input[type="checkbox"] { - margin-top: 0; - vertical-align: 0; -} - -form .form-row p { - padding-left: 0; -} - -.flex-container { - display: flex; -} - -.form-multiline { - flex-wrap: wrap; -} - -.form-multiline > div { - padding-bottom: 10px; -} - -/* FORM LABELS */ - -label { - font-weight: normal; - color: var(--body-quiet-color); - font-size: 0.8125rem; -} - -.required label, label.required { - font-weight: bold; -} - -/* RADIO BUTTONS */ - -form div.radiolist div { - padding-right: 7px; -} - -form div.radiolist.inline div { - display: inline-block; -} - -form div.radiolist label { - width: auto; -} - -form div.radiolist input[type="radio"] { - margin: -2px 4px 0 0; - padding: 0; -} - -form ul.inline { - margin-left: 0; - padding: 0; -} - -form ul.inline li { - float: left; - padding-right: 7px; -} - -/* FIELDSETS */ - -fieldset .fieldset-heading, -fieldset .inline-heading, -:not(.inline-related) .collapse summary { - border: 1px solid var(--header-bg); - margin: 0; - padding: 8px; - font-weight: 400; - font-size: 0.8125rem; - background: var(--header-bg); - color: var(--header-link-color); -} - -/* ALIGNED FIELDSETS */ - -.aligned label { - display: block; - padding: 4px 10px 0 0; - min-width: 160px; - width: 160px; - word-wrap: break-word; -} - -.aligned label:not(.vCheckboxLabel):after { - content: ''; - display: inline-block; - vertical-align: middle; -} - -.aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly { - padding: 6px 0; - margin-top: 0; - margin-bottom: 0; - margin-left: 0; - overflow-wrap: break-word; -} - -.aligned ul label { - display: inline; - float: none; - width: auto; -} - -.aligned .form-row input { - margin-bottom: 0; -} - -.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField { - width: 350px; -} - -form .aligned ul { - margin-left: 160px; - padding-left: 10px; -} - -form .aligned div.radiolist { - display: inline-block; - margin: 0; - padding: 0; -} - -form .aligned p.help, -form .aligned div.help { - margin-top: 0; - margin-left: 160px; - padding-left: 10px; -} - -form .aligned p.date div.help.timezonewarning, -form .aligned p.datetime div.help.timezonewarning, -form .aligned p.time div.help.timezonewarning { - margin-left: 0; - padding-left: 0; - font-weight: normal; -} - -form .aligned p.help:last-child, -form .aligned div.help:last-child { - margin-bottom: 0; - padding-bottom: 0; -} - -form .aligned input + p.help, -form .aligned textarea + p.help, -form .aligned select + p.help, -form .aligned input + div.help, -form .aligned textarea + div.help, -form .aligned select + div.help { - margin-left: 160px; - padding-left: 10px; -} - -form .aligned 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 deleted file mode 100644 index 805a34b..0000000 --- a/static/admin/css/login.css +++ /dev/null @@ -1,61 +0,0 @@ -/* LOGIN FORM */ - -.login { - background: var(--darkened-bg); - height: auto; -} - -.login #header { - height: auto; - padding: 15px 16px; - justify-content: center; -} - -.login #header h1 { - font-size: 1.125rem; - margin: 0; -} - -.login #header h1 a { - color: var(--header-link-color); -} - -.login #content { - padding: 20px; -} - -.login #container { - background: var(--body-bg); - border: 1px solid var(--hairline-color); - border-radius: 4px; - overflow: hidden; - width: 28em; - min-width: 300px; - margin: 100px auto; - height: auto; -} - -.login .form-row { - padding: 4px 0; -} - -.login .form-row label { - display: block; - line-height: 2em; -} - -.login .form-row #id_username, .login .form-row #id_password { - padding: 8px; - width: 100%; - box-sizing: border-box; -} - -.login .submit-row { - padding: 1em 0 0 0; - margin: 0; - text-align: center; -} - -.login .password-reset-link { - text-align: center; -} diff --git a/static/admin/css/nav_sidebar.css b/static/admin/css/nav_sidebar.css deleted file mode 100644 index 7eb0de9..0000000 --- a/static/admin/css/nav_sidebar.css +++ /dev/null @@ -1,150 +0,0 @@ -.sticky { - position: sticky; - top: 0; - max-height: 100vh; -} - -.toggle-nav-sidebar { - z-index: 20; - left: 0; - display: flex; - align-items: center; - justify-content: center; - flex: 0 0 23px; - width: 23px; - border: 0; - border-right: 1px solid var(--hairline-color); - background-color: var(--body-bg); - cursor: pointer; - font-size: 1.25rem; - color: var(--link-fg); - padding: 0; -} - -[dir="rtl"] .toggle-nav-sidebar { - border-left: 1px solid var(--hairline-color); - border-right: 0; -} - -.toggle-nav-sidebar:hover, -.toggle-nav-sidebar:focus { - background-color: var(--darkened-bg); -} - -#nav-sidebar { - z-index: 15; - flex: 0 0 275px; - left: -276px; - margin-left: -276px; - border-top: 1px solid transparent; - border-right: 1px solid var(--hairline-color); - background-color: var(--body-bg); - overflow: auto; -} - -[dir="rtl"] #nav-sidebar { - border-left: 1px solid var(--hairline-color); - border-right: 0; - left: 0; - margin-left: 0; - right: -276px; - margin-right: -276px; -} - -.toggle-nav-sidebar::before { - content: '\00BB'; -} - -.main.shifted .toggle-nav-sidebar::before { - content: '\00AB'; -} - -.main > #nav-sidebar { - visibility: hidden; -} - -.main.shifted > #nav-sidebar { - margin-left: 0; - visibility: visible; -} - -[dir="rtl"] .main.shifted > #nav-sidebar { - margin-right: 0; -} - -#nav-sidebar .module th { - width: 100%; - overflow-wrap: anywhere; -} - -#nav-sidebar .module th, -#nav-sidebar .module caption { - padding-left: 16px; -} - -#nav-sidebar .module td { - white-space: nowrap; -} - -[dir="rtl"] #nav-sidebar .module th, -[dir="rtl"] #nav-sidebar .module caption { - padding-left: 8px; - padding-right: 16px; -} - -#nav-sidebar .current-app .section:link, -#nav-sidebar .current-app .section:visited { - color: var(--header-color); - font-weight: bold; -} - -#nav-sidebar .current-model { - background: var(--selected-row); -} - -@media (forced-colors: active) { - #nav-sidebar .current-model { - background-color: SelectedItem; - } -} - -.main > #nav-sidebar + .content { - max-width: calc(100% - 23px); -} - -.main.shifted > #nav-sidebar + .content { - max-width: calc(100% - 299px); -} - -@media (max-width: 767px) { - #nav-sidebar, #toggle-nav-sidebar { - display: none; - } - - .main > #nav-sidebar + .content, - .main.shifted > #nav-sidebar + .content { - max-width: 100%; - } -} - -#nav-filter { - width: 100%; - box-sizing: border-box; - padding: 2px 5px; - margin: 5px 0; - border: 1px solid var(--border-color); - background-color: var(--darkened-bg); - color: var(--body-fg); -} - -#nav-filter:focus { - border-color: var(--body-quiet-color); -} - -#nav-filter.no-results { - background: var(--message-error-bg); -} - -#nav-sidebar table { - width: 100%; -} diff --git a/static/admin/css/responsive.css b/static/admin/css/responsive.css deleted file mode 100644 index f0fcade..0000000 --- a/static/admin/css/responsive.css +++ /dev/null @@ -1,904 +0,0 @@ -/* Tablets */ - -input[type="submit"], button { - -webkit-appearance: none; - appearance: none; -} - -@media (max-width: 1024px) { - /* Basic */ - - html { - -webkit-text-size-adjust: 100%; - } - - td, th { - padding: 10px; - font-size: 0.875rem; - } - - .small { - font-size: 0.75rem; - } - - /* Layout */ - - #container { - min-width: 0; - } - - #content { - padding: 15px 20px 20px; - } - - div.breadcrumbs { - padding: 10px 30px; - } - - /* Header */ - - #header { - flex-direction: column; - padding: 15px 30px; - justify-content: flex-start; - } - - #site-name { - margin: 0 0 8px; - line-height: 1.2; - } - - #user-tools { - margin: 0; - font-weight: 400; - line-height: 1.85; - text-align: left; - } - - #user-tools a { - display: inline-block; - line-height: 1.4; - } - - /* Dashboard */ - - .dashboard #content { - width: auto; - } - - #content-related { - margin-right: -290px; - } - - .colSM #content-related { - margin-left: -290px; - } - - .colMS { - margin-right: 290px; - } - - .colSM { - margin-left: 290px; - } - - .dashboard .module table td a { - padding-right: 0; - } - - td .changelink, td .addlink { - font-size: 0.8125rem; - } - - /* Changelist */ - - #toolbar { - border: none; - padding: 15px; - } - - #changelist-search > div { - display: flex; - flex-wrap: nowrap; - max-width: 480px; - } - - #changelist-search label { - line-height: 1.375rem; - } - - #toolbar form #searchbar { - flex: 1 0 auto; - width: 0; - height: 1.375rem; - margin: 0 10px 0 6px; - } - - #toolbar form input[type=submit] { - flex: 0 1 auto; - } - - #changelist-search .quiet { - width: 0; - flex: 1 0 auto; - margin: 5px 0 0 25px; - } - - #changelist .actions { - display: flex; - flex-wrap: wrap; - padding: 15px 0; - } - - #changelist .actions label { - display: flex; - } - - #changelist .actions select { - background: var(--body-bg); - } - - #changelist .actions .button { - min-width: 48px; - margin: 0 10px; - } - - #changelist .actions span.all, - #changelist .actions span.clear, - #changelist .actions span.question, - #changelist .actions span.action-counter { - font-size: 0.6875rem; - margin: 0 10px 0 0; - } - - #changelist-filter { - flex-basis: 200px; - } - - .change-list .filtered .results, - .change-list .filtered .paginator, - .filtered #toolbar, - .filtered .actions, - - #changelist .paginator { - border-top-color: var(--hairline-color); /* XXX Is this used at all? */ - } - - #changelist .results + .paginator { - border-top: none; - } - - /* Forms */ - - label { - font-size: 1rem; - } - - /* - Minifiers remove the default (text) "type" attribute from "input" HTML - tags. Add input:not([type]) to make the CSS stylesheet work the same. - */ - .form-row input:not([type]), - .form-row input[type=text], - .form-row input[type=password], - .form-row input[type=email], - .form-row input[type=url], - .form-row input[type=tel], - .form-row input[type=number], - .form-row textarea, - .form-row select, - .form-row .vTextField { - box-sizing: border-box; - margin: 0; - padding: 6px 8px; - min-height: 2.25rem; - font-size: 1rem; - } - - .form-row select { - height: 2.25rem; - } - - .form-row select[multiple] { - height: auto; - min-height: 0; - } - - fieldset .fieldBox + .fieldBox { - margin-top: 10px; - padding-top: 10px; - border-top: 1px solid var(--hairline-color); - } - - textarea { - max-width: 100%; - max-height: 120px; - } - - .aligned label { - padding-top: 6px; - } - - .aligned .related-lookup, - .aligned .datetimeshortcuts, - .aligned .related-lookup + strong { - align-self: center; - margin-left: 15px; - } - - form .aligned div.radiolist { - margin-left: 2px; - } - - .submit-row { - padding: 8px; - } - - .submit-row a.deletelink { - padding: 10px 7px; - } - - .button, input[type=submit], input[type=button], .submit-row input, a.button { - padding: 7px; - } - - /* Selector */ - - .selector { - display: flex; - width: 100%; - } - - .selector .selector-filter { - display: flex; - align-items: center; - } - - .selector .selector-filter 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 deleted file mode 100644 index 5e8f5c5..0000000 --- a/static/admin/css/responsive_rtl.css +++ /dev/null @@ -1,89 +0,0 @@ -/* TABLETS */ - -@media (max-width: 1024px) { - [dir="rtl"] .colMS { - margin-right: 0; - } - - [dir="rtl"] #user-tools { - text-align: right; - } - - [dir="rtl"] #changelist .actions label { - padding-left: 10px; - padding-right: 0; - } - - [dir="rtl"] #changelist .actions select { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .change-list .filtered .results, - [dir="rtl"] .change-list .filtered .paginator, - [dir="rtl"] .filtered #toolbar, - [dir="rtl"] .filtered div.xfull, - [dir="rtl"] .filtered .actions, - [dir="rtl"] #changelist-filter { - margin-left: 0; - } - - [dir="rtl"] .inline-group 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 deleted file mode 100644 index a2556d0..0000000 --- a/static/admin/css/rtl.css +++ /dev/null @@ -1,293 +0,0 @@ -/* GLOBAL */ - -th { - text-align: right; -} - -.module h2, .module caption { - text-align: right; -} - -.module ul, .module ol { - margin-left: 0; - margin-right: 1.5em; -} - -.viewlink, .addlink, .changelink, .hidelink { - padding-left: 0; - padding-right: 16px; - background-position: 100% 1px; -} - -.deletelink { - padding-left: 0; - padding-right: 16px; - background-position: 100% 1px; -} - -.object-tools { - float: left; -} - -thead th:first-child, -tfoot td:first-child { - border-left: none; -} - -/* LAYOUT */ - -#user-tools { - right: auto; - left: 0; - text-align: left; -} - -div.breadcrumbs { - text-align: right; -} - -#content-main { - float: right; -} - -#content-related { - float: left; - margin-left: -300px; - margin-right: auto; -} - -.colMS { - margin-left: 300px; - margin-right: 0; -} - -/* SORTABLE TABLES */ - -table thead th.sorted .sortoptions { - float: left; -} - -thead th.sorted .text { - padding-right: 0; - padding-left: 42px; -} - -/* dashboard styles */ - -.dashboard .module table td a { - padding-left: .6em; - padding-right: 16px; -} - -/* changelists styles */ - -.change-list .filtered table { - border-left: none; - border-right: 0px none; -} - -#changelist-filter { - border-left: none; - border-right: none; - margin-left: 0; - margin-right: 30px; -} - -#changelist-filter li.selected { - border-left: none; - padding-left: 10px; - margin-left: 0; - border-right: 5px solid var(--hairline-color); - padding-right: 10px; - margin-right: -15px; -} - -#changelist table tbody td:first-child, #changelist table tbody th:first-child { - border-right: none; - border-left: none; -} - -.paginator .end { - margin-left: 6px; - margin-right: 0; -} - -.paginator input { - margin-left: 0; - margin-right: auto; -} - -/* FORMS */ - -.aligned label { - padding: 0 0 3px 1em; -} - -.submit-row a.deletelink { - margin-left: 0; - margin-right: auto; -} - -.vDateField, .vTimeField { - margin-left: 2px; -} - -.aligned .form-row input { - margin-left: 5px; -} - -form .aligned ul { - margin-right: 163px; - padding-right: 10px; - margin-left: 0; - padding-left: 0; -} - -form ul.inline li { - float: right; - padding-right: 0; - padding-left: 7px; -} - -form .aligned p.help, -form .aligned div.help { - margin-left: 0; - margin-right: 160px; - padding-right: 10px; -} - -form div.help ul, -form .aligned .checkbox-row + .help, -form .aligned p.date div.help.timezonewarning, -form .aligned p.datetime div.help.timezonewarning, -form .aligned p.time div.help.timezonewarning { - margin-right: 0; - padding-right: 0; -} - -form .wide p.help, -form .wide ul.errorlist, -form .wide div.help { - padding-left: 0; - padding-right: 50px; -} - -.submit-row { - text-align: right; -} - -fieldset .fieldBox { - margin-left: 20px; - margin-right: 0; -} - -.errorlist li { - background-position: 100% 12px; - padding: 0; -} - -.errornote { - background-position: 100% 12px; - padding: 10px 12px; -} - -/* WIDGETS */ - -.calendarnav-previous { - top: 0; - left: auto; - right: 10px; - background: url(../img/calendar-icons.svg) 0 -15px no-repeat; -} - -.calendarnav-next { - top: 0; - right: auto; - left: 10px; - background: url(../img/calendar-icons.svg) 0 0 no-repeat; -} - -.calendar caption, .calendarbox h2 { - text-align: center; -} - -.selector { - float: right; -} - -.selector .selector-filter { - text-align: right; -} - -.selector-add { - background: url(../img/selector-icons.svg) 0 -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 deleted file mode 100644 index d46eb03..0000000 --- a/static/admin/css/unusable_password_field.css +++ /dev/null @@ -1,19 +0,0 @@ -/* Hide warnings fields if usable password is selected */ -form:has(#id_usable_password input[value="true"]:checked) .messagelist { - display: none; -} - -/* Hide password fields if unusable password is selected */ -form:has(#id_usable_password input[value="false"]:checked) .field-password1, -form:has(#id_usable_password input[value="false"]:checked) .field-password2 { - display: none; -} - -/* Select appropriate submit button */ -form:has(#id_usable_password input[value="true"]:checked) input[type="submit"].unset-password { - display: none; -} - -form:has(#id_usable_password input[value="false"]:checked) input[type="submit"].set-password { - display: none; -} diff --git a/static/admin/css/vendor/select2/LICENSE-SELECT2.md b/static/admin/css/vendor/select2/LICENSE-SELECT2.md deleted file mode 100644 index 8cb8a2b..0000000 --- a/static/admin/css/vendor/select2/LICENSE-SELECT2.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/static/admin/css/vendor/select2/select2.css b/static/admin/css/vendor/select2/select2.css deleted file mode 100644 index 750b320..0000000 --- a/static/admin/css/vendor/select2/select2.css +++ /dev/null @@ -1,481 +0,0 @@ -.select2-container { - box-sizing: border-box; - display: inline-block; - margin: 0; - position: relative; - vertical-align: middle; } - .select2-container .select2-selection--single { - box-sizing: border-box; - cursor: pointer; - display: block; - height: 28px; - user-select: none; - -webkit-user-select: none; } - .select2-container .select2-selection--single .select2-selection__rendered { - display: block; - padding-left: 8px; - padding-right: 20px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } - .select2-container .select2-selection--single .select2-selection__clear { - position: relative; } - .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { - padding-right: 8px; - padding-left: 20px; } - .select2-container .select2-selection--multiple { - box-sizing: border-box; - cursor: pointer; - display: block; - min-height: 32px; - user-select: none; - -webkit-user-select: none; } - .select2-container .select2-selection--multiple .select2-selection__rendered { - display: inline-block; - overflow: hidden; - padding-left: 8px; - text-overflow: ellipsis; - white-space: nowrap; } - .select2-container .select2-search--inline { - float: left; } - .select2-container .select2-search--inline .select2-search__field { - box-sizing: border-box; - border: none; - font-size: 100%; - margin-top: 5px; - padding: 0; } - .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none; } - -.select2-dropdown { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - box-sizing: border-box; - display: block; - position: absolute; - left: -100000px; - width: 100%; - z-index: 1051; } - -.select2-results { - display: block; } - -.select2-results__options { - list-style: none; - margin: 0; - padding: 0; } - -.select2-results__option { - padding: 6px; - user-select: none; - -webkit-user-select: none; } - .select2-results__option[aria-selected] { - cursor: pointer; } - -.select2-container--open .select2-dropdown { - left: 0; } - -.select2-container--open .select2-dropdown--above { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--open .select2-dropdown--below { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-search--dropdown { - display: block; - padding: 4px; } - .select2-search--dropdown .select2-search__field { - padding: 4px; - width: 100%; - box-sizing: border-box; } - .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none; } - .select2-search--dropdown.select2-search--hide { - display: none; } - -.select2-close-mask { - border: 0; - margin: 0; - padding: 0; - display: block; - position: fixed; - left: 0; - top: 0; - min-height: 100%; - min-width: 100%; - height: auto; - width: auto; - opacity: 0; - z-index: 99; - background-color: #fff; - filter: alpha(opacity=0); } - -.select2-hidden-accessible { - border: 0 !important; - clip: rect(0 0 0 0) !important; - -webkit-clip-path: inset(50%) !important; - clip-path: inset(50%) !important; - height: 1px !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - width: 1px !important; - white-space: nowrap !important; } - -.select2-container--default .select2-selection--single { - background-color: #fff; - border: 1px solid #aaa; - border-radius: 4px; } - .select2-container--default .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 28px; } - .select2-container--default .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; } - .select2-container--default .select2-selection--single .select2-selection__placeholder { - color: #999; } - .select2-container--default .select2-selection--single .select2-selection__arrow { - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; } - .select2-container--default .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; } - -.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; } - -.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { - left: 1px; - right: auto; } - -.select2-container--default.select2-container--disabled .select2-selection--single { - background-color: #eee; - cursor: default; } - .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { - display: none; } - -.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; } - -.select2-container--default .select2-selection--multiple { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - cursor: text; } - .select2-container--default .select2-selection--multiple .select2-selection__rendered { - box-sizing: border-box; - list-style: none; - margin: 0; - padding: 0 5px; - width: 100%; } - .select2-container--default .select2-selection--multiple .select2-selection__rendered li { - list-style: none; } - .select2-container--default .select2-selection--multiple .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin-top: 5px; - margin-right: 10px; - padding: 1px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #aaa; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { - color: #999; - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #333; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { - float: right; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - margin-left: 5px; - margin-right: auto; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; } - -.select2-container--default.select2-container--focus .select2-selection--multiple { - border: solid black 1px; - outline: 0; } - -.select2-container--default.select2-container--disabled .select2-selection--multiple { - background-color: #eee; - cursor: default; } - -.select2-container--default.select2-container--disabled .select2-selection__choice__remove { - display: none; } - -.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--default .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa; } - -.select2-container--default .select2-search--inline .select2-search__field { - background: transparent; - border: none; - outline: 0; - box-shadow: none; - -webkit-appearance: textfield; } - -.select2-container--default .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; } - -.select2-container--default .select2-results__option[role=group] { - padding: 0; } - -.select2-container--default .select2-results__option[aria-disabled=true] { - color: #999; } - -.select2-container--default .select2-results__option[aria-selected=true] { - background-color: #ddd; } - -.select2-container--default .select2-results__option .select2-results__option { - padding-left: 1em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__group { - padding-left: 0; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option { - margin-left: -1em; - padding-left: 2em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -2em; - padding-left: 3em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -3em; - padding-left: 4em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -4em; - padding-left: 5em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -5em; - padding-left: 6em; } - -.select2-container--default .select2-results__option--highlighted[aria-selected] { - background-color: #5897fb; - color: white; } - -.select2-container--default .select2-results__group { - cursor: default; - display: block; - padding: 6px; } - -.select2-container--classic .select2-selection--single { - background-color: #f7f7f7; - border: 1px solid #aaa; - border-radius: 4px; - outline: 0; - background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); - background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); - background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } - .select2-container--classic .select2-selection--single:focus { - border: 1px solid #5897fb; } - .select2-container--classic .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 28px; } - .select2-container--classic .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin-right: 10px; } - .select2-container--classic .select2-selection--single .select2-selection__placeholder { - color: #999; } - .select2-container--classic .select2-selection--single .select2-selection__arrow { - background-color: #ddd; - border: none; - border-left: 1px solid #aaa; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; - background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); - background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); - background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } - .select2-container--classic .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; } - -.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; } - -.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { - border: none; - border-right: 1px solid #aaa; - border-radius: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; - left: 1px; - right: auto; } - -.select2-container--classic.select2-container--open .select2-selection--single { - border: 1px solid #5897fb; } - .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { - background: transparent; - border: none; } - .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; } - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; - background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); - background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); - background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); - background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); - background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } - -.select2-container--classic .select2-selection--multiple { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - cursor: text; - outline: 0; } - .select2-container--classic .select2-selection--multiple:focus { - border: 1px solid #5897fb; } - .select2-container--classic .select2-selection--multiple .select2-selection__rendered { - list-style: none; - margin: 0; - padding: 0 5px; } - .select2-container--classic .select2-selection--multiple .select2-selection__clear { - display: none; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #aaa; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { - color: #888; - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #555; } - -.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - float: right; - margin-left: 5px; - margin-right: auto; } - -.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; } - -.select2-container--classic.select2-container--open .select2-selection--multiple { - border: 1px solid #5897fb; } - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--classic .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa; - outline: 0; } - -.select2-container--classic .select2-search--inline .select2-search__field { - outline: 0; - box-shadow: none; } - -.select2-container--classic .select2-dropdown { - background-color: white; - border: 1px solid transparent; } - -.select2-container--classic .select2-dropdown--above { - border-bottom: none; } - -.select2-container--classic .select2-dropdown--below { - border-top: none; } - -.select2-container--classic .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; } - -.select2-container--classic .select2-results__option[role=group] { - padding: 0; } - -.select2-container--classic .select2-results__option[aria-disabled=true] { - color: grey; } - -.select2-container--classic .select2-results__option--highlighted[aria-selected] { - background-color: #3875d7; - color: white; } - -.select2-container--classic .select2-results__group { - cursor: default; - display: block; - padding: 6px; } - -.select2-container--classic.select2-container--open .select2-dropdown { - border-color: #5897fb; } diff --git a/static/admin/css/vendor/select2/select2.min.css b/static/admin/css/vendor/select2/select2.min.css deleted file mode 100644 index 7c18ad5..0000000 --- a/static/admin/css/vendor/select2/select2.min.css +++ /dev/null @@ -1 +0,0 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/static/admin/css/widgets.css b/static/admin/css/widgets.css deleted file mode 100644 index a5f615a..0000000 --- a/static/admin/css/widgets.css +++ /dev/null @@ -1,613 +0,0 @@ -/* 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 deleted file mode 100644 index a4faaa1..0000000 --- a/static/admin/img/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Code Charm Ltd - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/static/admin/img/README.txt b/static/admin/img/README.txt deleted file mode 100644 index bf81f35..0000000 --- a/static/admin/img/README.txt +++ /dev/null @@ -1,7 +0,0 @@ -All icons are taken from Font Awesome (https://fontawesome.com/) project. -The Font Awesome font is licensed under the SIL OFL 1.1: -- https://scripts.sil.org/OFL - -SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG -Font-Awesome-SVG-PNG is licensed under the MIT license (see file license -in current folder). diff --git a/static/admin/img/calendar-icons.svg b/static/admin/img/calendar-icons.svg deleted file mode 100644 index 04c0274..0000000 --- a/static/admin/img/calendar-icons.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - diff --git a/static/admin/img/gis/move_vertex_off.svg b/static/admin/img/gis/move_vertex_off.svg deleted file mode 100644 index 228854f..0000000 --- a/static/admin/img/gis/move_vertex_off.svg +++ /dev/null @@ -1 +0,0 @@ - \ 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 deleted file mode 100644 index 96b87fd..0000000 --- a/static/admin/img/gis/move_vertex_on.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/admin/img/icon-addlink.svg b/static/admin/img/icon-addlink.svg deleted file mode 100644 index 8d5c6a3..0000000 --- a/static/admin/img/icon-addlink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/admin/img/icon-alert.svg b/static/admin/img/icon-alert.svg deleted file mode 100644 index e51ea83..0000000 --- a/static/admin/img/icon-alert.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/admin/img/icon-calendar.svg b/static/admin/img/icon-calendar.svg deleted file mode 100644 index 97910a9..0000000 --- a/static/admin/img/icon-calendar.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/static/admin/img/icon-changelink.svg b/static/admin/img/icon-changelink.svg deleted file mode 100644 index 592b093..0000000 --- a/static/admin/img/icon-changelink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/admin/img/icon-clock.svg b/static/admin/img/icon-clock.svg deleted file mode 100644 index bf9985d..0000000 --- a/static/admin/img/icon-clock.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/static/admin/img/icon-deletelink.svg b/static/admin/img/icon-deletelink.svg deleted file mode 100644 index 4059b15..0000000 --- a/static/admin/img/icon-deletelink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/admin/img/icon-hidelink.svg b/static/admin/img/icon-hidelink.svg deleted file mode 100644 index 2a8b404..0000000 --- a/static/admin/img/icon-hidelink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/admin/img/icon-no.svg b/static/admin/img/icon-no.svg deleted file mode 100644 index 2e0d383..0000000 --- a/static/admin/img/icon-no.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/admin/img/icon-unknown-alt.svg b/static/admin/img/icon-unknown-alt.svg deleted file mode 100644 index 1c6b99f..0000000 --- a/static/admin/img/icon-unknown-alt.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/admin/img/icon-unknown.svg b/static/admin/img/icon-unknown.svg deleted file mode 100644 index 50b4f97..0000000 --- a/static/admin/img/icon-unknown.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/admin/img/icon-viewlink.svg b/static/admin/img/icon-viewlink.svg deleted file mode 100644 index a1ca1d3..0000000 --- a/static/admin/img/icon-viewlink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/admin/img/icon-yes.svg b/static/admin/img/icon-yes.svg deleted file mode 100644 index 5883d87..0000000 --- a/static/admin/img/icon-yes.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/admin/img/inline-delete.svg b/static/admin/img/inline-delete.svg deleted file mode 100644 index 8751150..0000000 --- a/static/admin/img/inline-delete.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/admin/img/search.svg b/static/admin/img/search.svg deleted file mode 100644 index c8c69b2..0000000 --- a/static/admin/img/search.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/admin/img/selector-icons.svg b/static/admin/img/selector-icons.svg deleted file mode 100644 index 926b8e2..0000000 --- a/static/admin/img/selector-icons.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/admin/img/sorting-icons.svg b/static/admin/img/sorting-icons.svg deleted file mode 100644 index 7c31ec9..0000000 --- a/static/admin/img/sorting-icons.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/static/admin/img/tooltag-add.svg b/static/admin/img/tooltag-add.svg deleted file mode 100644 index 1ca64ae..0000000 --- a/static/admin/img/tooltag-add.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/admin/img/tooltag-arrowright.svg b/static/admin/img/tooltag-arrowright.svg deleted file mode 100644 index b664d61..0000000 --- a/static/admin/img/tooltag-arrowright.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/admin/js/SelectBox.js b/static/admin/js/SelectBox.js deleted file mode 100644 index 3db4ec7..0000000 --- a/static/admin/js/SelectBox.js +++ /dev/null @@ -1,116 +0,0 @@ -'use strict'; -{ - const SelectBox = { - cache: {}, - init: function(id) { - const box = document.getElementById(id); - SelectBox.cache[id] = []; - const cache = SelectBox.cache[id]; - for (const node of box.options) { - cache.push({value: node.value, text: node.text, displayed: 1}); - } - }, - redisplay: function(id) { - // Repopulate HTML select box from cache - const box = document.getElementById(id); - const scroll_value_from_top = box.scrollTop; - box.innerHTML = ''; - for (const node of SelectBox.cache[id]) { - if (node.displayed) { - const new_option = new Option(node.text, node.value, false, false); - // Shows a tooltip when hovering over the option - new_option.title = node.text; - box.appendChild(new_option); - } - } - box.scrollTop = scroll_value_from_top; - }, - filter: function(id, text) { - // Redisplay the HTML select box, displaying only the choices containing ALL - // the words in text. (It's an AND search.) - const tokens = text.toLowerCase().split(/\s+/); - for (const node of SelectBox.cache[id]) { - node.displayed = 1; - const node_text = node.text.toLowerCase(); - for (const token of tokens) { - if (!node_text.includes(token)) { - node.displayed = 0; - break; // Once the first token isn't found we're done - } - } - } - SelectBox.redisplay(id); - }, - get_hidden_node_count(id) { - const cache = SelectBox.cache[id] || []; - return cache.filter(node => node.displayed === 0).length; - }, - delete_from_cache: function(id, value) { - let delete_index = null; - const cache = SelectBox.cache[id]; - for (const [i, node] of cache.entries()) { - if (node.value === value) { - delete_index = i; - break; - } - } - cache.splice(delete_index, 1); - }, - add_to_cache: function(id, option) { - SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); - }, - cache_contains: function(id, value) { - // Check if an item is contained in the cache - for (const node of SelectBox.cache[id]) { - if (node.value === value) { - return true; - } - } - return false; - }, - move: function(from, to) { - const from_box = document.getElementById(from); - for (const option of from_box.options) { - const option_value = option.value; - if (option.selected && SelectBox.cache_contains(from, option_value)) { - SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); - SelectBox.delete_from_cache(from, option_value); - } - } - SelectBox.redisplay(from); - SelectBox.redisplay(to); - }, - move_all: function(from, to) { - const from_box = document.getElementById(from); - for (const option of from_box.options) { - const option_value = option.value; - if (SelectBox.cache_contains(from, option_value)) { - SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); - SelectBox.delete_from_cache(from, option_value); - } - } - SelectBox.redisplay(from); - SelectBox.redisplay(to); - }, - sort: function(id) { - SelectBox.cache[id].sort(function(a, b) { - a = a.text.toLowerCase(); - b = b.text.toLowerCase(); - if (a > b) { - return 1; - } - if (a < b) { - return -1; - } - return 0; - } ); - }, - select_all: function(id) { - const box = document.getElementById(id); - for (const option of box.options) { - option.selected = true; - } - } - }; - window.SelectBox = SelectBox; -} diff --git a/static/admin/js/SelectFilter2.js b/static/admin/js/SelectFilter2.js deleted file mode 100644 index 970b511..0000000 --- a/static/admin/js/SelectFilter2.js +++ /dev/null @@ -1,311 +0,0 @@ -/*global SelectBox, gettext, ngettext, interpolate, quickElement, SelectFilter*/ -/* -SelectFilter2 - Turns a multiple-select box into a filter interface. - -Requires core.js and SelectBox.js. -*/ -'use strict'; -{ - window.SelectFilter = { - init: function(field_id, field_name, is_stacked) { - if (field_id.match(/__prefix__/)) { - // Don't initialize on empty forms. - return; - } - const from_box = document.getElementById(field_id); - from_box.id += '_from'; // change its ID - from_box.className = 'filtered'; - 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 deleted file mode 100644 index 04b25e9..0000000 --- a/static/admin/js/actions.js +++ /dev/null @@ -1,204 +0,0 @@ -/*global gettext, interpolate, ngettext, Actions*/ -'use strict'; -{ - function show(selector) { - document.querySelectorAll(selector).forEach(function(el) { - el.classList.remove('hidden'); - }); - } - - function hide(selector) { - document.querySelectorAll(selector).forEach(function(el) { - el.classList.add('hidden'); - }); - } - - function showQuestion(options) { - hide(options.acrossClears); - show(options.acrossQuestions); - hide(options.allContainer); - } - - function showClear(options) { - show(options.acrossClears); - hide(options.acrossQuestions); - document.querySelector(options.actionContainer).classList.remove(options.selectedClass); - show(options.allContainer); - hide(options.counterContainer); - } - - function reset(options) { - hide(options.acrossClears); - hide(options.acrossQuestions); - hide(options.allContainer); - show(options.counterContainer); - } - - function clearAcross(options) { - reset(options); - const acrossInputs = document.querySelectorAll(options.acrossInput); - acrossInputs.forEach(function(acrossInput) { - acrossInput.value = 0; - }); - document.querySelector(options.actionContainer).classList.remove(options.selectedClass); - } - - function checker(actionCheckboxes, options, checked) { - if (checked) { - showQuestion(options); - } else { - reset(options); - } - actionCheckboxes.forEach(function(el) { - el.checked = checked; - el.closest('tr').classList.toggle(options.selectedClass, checked); - }); - } - - function updateCounter(actionCheckboxes, options) { - const sel = Array.from(actionCheckboxes).filter(function(el) { - return el.checked; - }).length; - const counter = document.querySelector(options.counterContainer); - // data-actions-icnt is defined in the generated HTML - // and contains the total amount of objects in the queryset - const actions_icnt = Number(counter.dataset.actionsIcnt); - counter.textContent = interpolate( - ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { - sel: sel, - cnt: actions_icnt - }, true); - const allToggle = document.getElementById(options.allToggleId); - allToggle.checked = sel === actionCheckboxes.length; - if (allToggle.checked) { - showQuestion(options); - } else { - clearAcross(options); - } - } - - const defaults = { - actionContainer: "div.actions", - counterContainer: "span.action-counter", - allContainer: "div.actions span.all", - acrossInput: "div.actions input.select-across", - acrossQuestions: "div.actions span.question", - acrossClears: "div.actions span.clear", - allToggleId: "action-toggle", - selectedClass: "selected" - }; - - window.Actions = function(actionCheckboxes, options) { - options = Object.assign({}, defaults, options); - let list_editable_changed = false; - let lastChecked = null; - let shiftPressed = false; - - document.addEventListener('keydown', (event) => { - shiftPressed = event.shiftKey; - }); - - document.addEventListener('keyup', (event) => { - shiftPressed = event.shiftKey; - }); - - document.getElementById(options.allToggleId).addEventListener('click', function(event) { - checker(actionCheckboxes, options, this.checked); - updateCounter(actionCheckboxes, options); - }); - - document.querySelectorAll(options.acrossQuestions + " a").forEach(function(el) { - el.addEventListener('click', function(event) { - event.preventDefault(); - const acrossInputs = document.querySelectorAll(options.acrossInput); - acrossInputs.forEach(function(acrossInput) { - acrossInput.value = 1; - }); - showClear(options); - }); - }); - - document.querySelectorAll(options.acrossClears + " a").forEach(function(el) { - el.addEventListener('click', function(event) { - event.preventDefault(); - document.getElementById(options.allToggleId).checked = false; - clearAcross(options); - checker(actionCheckboxes, options, false); - updateCounter(actionCheckboxes, options); - }); - }); - - function affectedCheckboxes(target, withModifier) { - const multiSelect = (lastChecked && withModifier && lastChecked !== target); - if (!multiSelect) { - return [target]; - } - const checkboxes = Array.from(actionCheckboxes); - const targetIndex = checkboxes.findIndex(el => el === target); - const lastCheckedIndex = checkboxes.findIndex(el => el === lastChecked); - const startIndex = Math.min(targetIndex, lastCheckedIndex); - const endIndex = Math.max(targetIndex, lastCheckedIndex); - const filtered = checkboxes.filter((el, index) => (startIndex <= index) && (index <= endIndex)); - return filtered; - }; - - Array.from(document.getElementById('result_list').tBodies).forEach(function(el) { - el.addEventListener('change', function(event) { - const target = event.target; - if (target.classList.contains('action-select')) { - const checkboxes = affectedCheckboxes(target, shiftPressed); - checker(checkboxes, options, target.checked); - updateCounter(actionCheckboxes, options); - lastChecked = target; - } else { - list_editable_changed = true; - } - }); - }); - - document.querySelector('#changelist-form button[name=index]').addEventListener('click', function(event) { - if (list_editable_changed) { - const confirmed = confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); - if (!confirmed) { - event.preventDefault(); - } - } - }); - - const el = document.querySelector('#changelist-form input[name=_save]'); - // The button does not exist if no fields are editable. - if (el) { - el.addEventListener('click', function(event) { - if (document.querySelector('[name=action]').value) { - const text = list_editable_changed - ? gettext("You have selected an action, but you haven’t saved your changes to individual fields yet. Please click OK to save. You’ll need to re-run the action.") - : gettext("You have selected an action, and you haven’t made any changes on individual fields. You’re probably looking for the Go button rather than the Save button."); - if (!confirm(text)) { - event.preventDefault(); - } - } - }); - } - // Sync counter when navigating to the page, such as through the back - // button. - window.addEventListener('pageshow', (event) => updateCounter(actionCheckboxes, options)); - }; - - // Call function fn when the DOM is loaded and ready. If it is already - // loaded, call the function now. - // http://youmightnotneedjquery.com/#ready - function ready(fn) { - if (document.readyState !== 'loading') { - fn(); - } else { - document.addEventListener('DOMContentLoaded', fn); - } - } - - ready(function() { - const actionsEls = document.querySelectorAll('tr input.action-select'); - if (actionsEls.length > 0) { - Actions(actionsEls); - } - }); -} diff --git a/static/admin/js/admin/DateTimeShortcuts.js b/static/admin/js/admin/DateTimeShortcuts.js deleted file mode 100644 index aa1cae9..0000000 --- a/static/admin/js/admin/DateTimeShortcuts.js +++ /dev/null @@ -1,408 +0,0 @@ -/*global Calendar, findPosX, findPosY, get_format, gettext, gettext_noop, interpolate, ngettext, quickElement*/ -// Inserts shortcut buttons after all of the following: -// -// -'use strict'; -{ - const DateTimeShortcuts = { - calendars: [], - calendarInputs: [], - clockInputs: [], - clockHours: { - default_: [ - [gettext_noop('Now'), -1], - [gettext_noop('Midnight'), 0], - [gettext_noop('6 a.m.'), 6], - [gettext_noop('Noon'), 12], - [gettext_noop('6 p.m.'), 18] - ] - }, - dismissClockFunc: [], - dismissCalendarFunc: [], - calendarDivName1: 'calendarbox', // name of calendar
    that gets toggled - calendarDivName2: 'calendarin', // name of
    that contains calendar - calendarLinkName: 'calendarlink', // name of the link that is used to toggle - clockDivName: 'clockbox', // name of clock
    that gets toggled - clockLinkName: 'clocklink', // name of the link that is used to toggle - shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts - timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch - timezoneOffset: 0, - init: function() { - const serverOffset = document.body.dataset.adminUtcOffset; - if (serverOffset) { - const localOffset = new Date().getTimezoneOffset() * -60; - DateTimeShortcuts.timezoneOffset = localOffset - serverOffset; - } - - for (const inp of document.getElementsByTagName('input')) { - if (inp.type === 'text' && inp.classList.contains('vTimeField')) { - DateTimeShortcuts.addClock(inp); - DateTimeShortcuts.addTimezoneWarning(inp); - } - else if (inp.type === 'text' && inp.classList.contains('vDateField')) { - DateTimeShortcuts.addCalendar(inp); - DateTimeShortcuts.addTimezoneWarning(inp); - } - } - }, - // Return the current time while accounting for the server timezone. - now: function() { - const serverOffset = document.body.dataset.adminUtcOffset; - if (serverOffset) { - const localNow = new Date(); - const localOffset = localNow.getTimezoneOffset() * -60; - localNow.setTime(localNow.getTime() + 1000 * (serverOffset - localOffset)); - return localNow; - } else { - return new Date(); - } - }, - // Add a warning when the time zone in the browser and backend do not match. - addTimezoneWarning: function(inp) { - const warningClass = DateTimeShortcuts.timezoneWarningClass; - let timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600; - - // Only warn if there is a time zone mismatch. - if (!timezoneOffset) { - return; - } - - // Check if warning is already there. - if (inp.parentNode.querySelectorAll('.' + warningClass).length) { - return; - } - - let message; - if (timezoneOffset > 0) { - message = ngettext( - 'Note: You are %s hour ahead of server time.', - 'Note: You are %s hours ahead of server time.', - timezoneOffset - ); - } - else { - timezoneOffset *= -1; - message = ngettext( - 'Note: You are %s hour behind server time.', - 'Note: You are %s hours behind server time.', - timezoneOffset - ); - } - message = interpolate(message, [timezoneOffset]); - - const warning = document.createElement('div'); - warning.classList.add('help', warningClass); - warning.textContent = message; - inp.parentNode.appendChild(warning); - }, - // Add clock widget to a given field - addClock: function(inp) { - const num = DateTimeShortcuts.clockInputs.length; - DateTimeShortcuts.clockInputs[num] = inp; - DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; }; - - // Shortcut links (clock icon and "Now" link) - const shortcuts_span = document.createElement('span'); - shortcuts_span.className = DateTimeShortcuts.shortCutsClass; - inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); - const now_link = document.createElement('a'); - now_link.href = "#"; - now_link.textContent = gettext('Now'); - now_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleClockQuicklink(num, -1); - }); - const clock_link = document.createElement('a'); - clock_link.href = '#'; - clock_link.id = DateTimeShortcuts.clockLinkName + num; - clock_link.addEventListener('click', function(e) { - e.preventDefault(); - // avoid triggering the document click handler to dismiss the clock - e.stopPropagation(); - DateTimeShortcuts.openClock(num); - }); - - quickElement( - 'span', clock_link, '', - 'class', 'clock-icon', - 'title', gettext('Choose a Time') - ); - shortcuts_span.appendChild(document.createTextNode('\u00A0')); - shortcuts_span.appendChild(now_link); - shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); - shortcuts_span.appendChild(clock_link); - - // Create clock link div - // - // Markup looks like: - // - - 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 deleted file mode 100644 index 1fc03c6..0000000 --- a/static/admin/js/admin/RelatedObjectLookups.js +++ /dev/null @@ -1,252 +0,0 @@ -/*global SelectBox, interpolate*/ -// Handles related-objects functionality: lookup link for raw_id_fields -// and Add Another links. -'use strict'; -{ - const $ = django.jQuery; - let popupIndex = 0; - const relatedWindows = []; - - function dismissChildPopups() { - relatedWindows.forEach(function(win) { - if(!win.closed) { - win.dismissChildPopups(); - win.close(); - } - }); - } - - function setPopupIndex() { - if(document.getElementsByName("_popup").length > 0) { - const index = window.name.lastIndexOf("__") + 2; - popupIndex = parseInt(window.name.substring(index)); - } else { - popupIndex = 0; - } - } - - function addPopupIndex(name) { - return name + "__" + (popupIndex + 1); - } - - function removePopupIndex(name) { - return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), ''); - } - - function showAdminPopup(triggeringLink, name_regexp, add_popup) { - const name = addPopupIndex(triggeringLink.id.replace(name_regexp, '')); - const href = new URL(triggeringLink.href); - if (add_popup) { - href.searchParams.set('_popup', 1); - } - const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); - relatedWindows.push(win); - win.focus(); - return false; - } - - function showRelatedObjectLookupPopup(triggeringLink) { - return showAdminPopup(triggeringLink, /^lookup_/, true); - } - - function dismissRelatedLookupPopup(win, chosenId) { - const name = removePopupIndex(win.name); - const elem = document.getElementById(name); - if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { - elem.value += ',' + chosenId; - } else { - 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 deleted file mode 100644 index d3daeab..0000000 --- a/static/admin/js/autocomplete.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict'; -{ - const $ = django.jQuery; - - $.fn.djangoAdminSelect2 = function() { - $.each(this, function(i, element) { - $(element).select2({ - ajax: { - data: (params) => { - return { - term: params.term, - page: params.page, - app_label: element.dataset.appLabel, - model_name: element.dataset.modelName, - field_name: element.dataset.fieldName - }; - } - } - }); - }); - return this; - }; - - $(function() { - // Initialize all autocomplete widgets except the one in the template - // form used when a new formset is added. - $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); - }); - - document.addEventListener('formset:added', (event) => { - $(event.target).find('.admin-autocomplete').djangoAdminSelect2(); - }); -} diff --git a/static/admin/js/calendar.js b/static/admin/js/calendar.js deleted file mode 100644 index 776310f..0000000 --- a/static/admin/js/calendar.js +++ /dev/null @@ -1,239 +0,0 @@ -/*global gettext, pgettext, get_format, quickElement, removeChildren*/ -/* -calendar.js - Calendar functions by Adrian Holovaty -depends on core.js for utility functions like removeChildren or quickElement -*/ -'use strict'; -{ - // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions - const CalendarNamespace = { - monthsOfYear: [ - gettext('January'), - gettext('February'), - gettext('March'), - gettext('April'), - gettext('May'), - gettext('June'), - gettext('July'), - gettext('August'), - gettext('September'), - gettext('October'), - gettext('November'), - gettext('December') - ], - monthsOfYearAbbrev: [ - pgettext('abbrev. month January', 'Jan'), - pgettext('abbrev. month February', 'Feb'), - pgettext('abbrev. month March', 'Mar'), - pgettext('abbrev. month April', 'Apr'), - pgettext('abbrev. month May', 'May'), - pgettext('abbrev. month June', 'Jun'), - pgettext('abbrev. month July', 'Jul'), - pgettext('abbrev. month August', 'Aug'), - pgettext('abbrev. month September', 'Sep'), - pgettext('abbrev. month October', 'Oct'), - pgettext('abbrev. month November', 'Nov'), - pgettext('abbrev. month December', 'Dec') - ], - daysOfWeek: [ - gettext('Sunday'), - gettext('Monday'), - gettext('Tuesday'), - gettext('Wednesday'), - gettext('Thursday'), - gettext('Friday'), - gettext('Saturday') - ], - daysOfWeekAbbrev: [ - pgettext('abbrev. day Sunday', 'Sun'), - pgettext('abbrev. day Monday', 'Mon'), - pgettext('abbrev. day Tuesday', 'Tue'), - pgettext('abbrev. day Wednesday', 'Wed'), - pgettext('abbrev. day Thursday', 'Thur'), - pgettext('abbrev. day Friday', 'Fri'), - pgettext('abbrev. day Saturday', 'Sat') - ], - daysOfWeekInitial: [ - pgettext('one letter Sunday', 'S'), - pgettext('one letter Monday', 'M'), - pgettext('one letter Tuesday', 'T'), - pgettext('one letter Wednesday', 'W'), - pgettext('one letter Thursday', 'T'), - pgettext('one letter Friday', 'F'), - pgettext('one letter Saturday', 'S') - ], - firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')), - isLeapYear: function(year) { - return (((year % 4) === 0) && ((year % 100) !== 0 ) || ((year % 400) === 0)); - }, - getDaysInMonth: function(month, year) { - let days; - if (month === 1 || month === 3 || month === 5 || month === 7 || month === 8 || month === 10 || month === 12) { - days = 31; - } - else if (month === 4 || month === 6 || month === 9 || month === 11) { - days = 30; - } - else if (month === 2 && CalendarNamespace.isLeapYear(year)) { - days = 29; - } - else { - days = 28; - } - return days; - }, - draw: function(month, year, div_id, callback, selected) { // month = 1-12, year = 1-9999 - const today = new Date(); - const todayDay = today.getDate(); - const todayMonth = today.getMonth() + 1; - const todayYear = today.getFullYear(); - let todayClass = ''; - - // Use UTC functions here because the date field does not contain time - // and using the UTC function variants prevent the local time offset - // from altering the date, specifically the day field. For example: - // - // ``` - // var x = new Date('2013-10-02'); - // var day = x.getDate(); - // ``` - // - // The day variable above will be 1 instead of 2 in, say, US Pacific time - // zone. - let isSelectedMonth = false; - if (typeof selected !== 'undefined') { - isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month); - } - - month = parseInt(month); - year = parseInt(year); - const calDiv = document.getElementById(div_id); - removeChildren(calDiv); - const calTable = document.createElement('table'); - quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year); - const tableBody = quickElement('tbody', calTable); - - // Draw days-of-week header - let tableRow = quickElement('tr', tableBody); - for (let i = 0; i < 7; i++) { - quickElement('th', tableRow, CalendarNamespace.daysOfWeekInitial[(i + CalendarNamespace.firstDayOfWeek) % 7]); - } - - const startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); - const days = CalendarNamespace.getDaysInMonth(month, year); - - let nonDayCell; - - // Draw blanks before first of month - tableRow = quickElement('tr', tableBody); - for (let i = 0; i < startingPos; i++) { - nonDayCell = quickElement('td', tableRow, ' '); - nonDayCell.className = "nonday"; - } - - function calendarMonth(y, m) { - function onClick(e) { - e.preventDefault(); - callback(y, m, this.textContent); - } - return onClick; - } - - // Draw days of month - let currentDay = 1; - for (let i = startingPos; currentDay <= days; i++) { - if (i % 7 === 0 && currentDay !== 1) { - tableRow = quickElement('tr', tableBody); - } - if ((currentDay === todayDay) && (month === todayMonth) && (year === todayYear)) { - todayClass = 'today'; - } else { - todayClass = ''; - } - - // use UTC function; see above for explanation. - if (isSelectedMonth && currentDay === selected.getUTCDate()) { - if (todayClass !== '') { - todayClass += " "; - } - todayClass += "selected"; - } - - const cell = quickElement('td', tableRow, '', 'class', todayClass); - const link = quickElement('a', cell, currentDay, 'href', '#'); - link.addEventListener('click', calendarMonth(year, month)); - currentDay++; - } - - // Draw blanks after end of month (optional, but makes for valid code) - while (tableRow.childNodes.length < 7) { - nonDayCell = quickElement('td', tableRow, ' '); - nonDayCell.className = "nonday"; - } - - calDiv.appendChild(calTable); - } - }; - - // Calendar -- A calendar instance - function Calendar(div_id, callback, selected) { - // div_id (string) is the ID of the element in which the calendar will - // be displayed - // callback (string) is the name of a JavaScript function that will be - // called with the parameters (year, month, day) when a day in the - // calendar is clicked - this.div_id = div_id; - this.callback = callback; - this.today = new Date(); - this.currentMonth = this.today.getMonth() + 1; - this.currentYear = this.today.getFullYear(); - if (typeof selected !== 'undefined') { - this.selected = selected; - } - } - Calendar.prototype = { - drawCurrent: function() { - CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback, this.selected); - }, - drawDate: function(month, year, selected) { - this.currentMonth = month; - this.currentYear = year; - - if(selected) { - this.selected = selected; - } - - this.drawCurrent(); - }, - drawPreviousMonth: function() { - if (this.currentMonth === 1) { - this.currentMonth = 12; - this.currentYear--; - } - else { - this.currentMonth--; - } - this.drawCurrent(); - }, - drawNextMonth: function() { - if (this.currentMonth === 12) { - this.currentMonth = 1; - this.currentYear++; - } - else { - this.currentMonth++; - } - this.drawCurrent(); - }, - drawPreviousYear: function() { - this.currentYear--; - this.drawCurrent(); - }, - drawNextYear: function() { - this.currentYear++; - this.drawCurrent(); - } - }; - window.Calendar = Calendar; - window.CalendarNamespace = CalendarNamespace; -} diff --git a/static/admin/js/cancel.js b/static/admin/js/cancel.js deleted file mode 100644 index 3069c6f..0000000 --- a/static/admin/js/cancel.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; -{ - // Call function fn when the DOM is loaded and ready. If it is already - // loaded, call the function now. - // http://youmightnotneedjquery.com/#ready - function ready(fn) { - if (document.readyState !== 'loading') { - fn(); - } else { - document.addEventListener('DOMContentLoaded', fn); - } - } - - ready(function() { - function handleClick(event) { - event.preventDefault(); - const params = new URLSearchParams(window.location.search); - if (params.has('_popup')) { - window.close(); // Close the popup. - } else { - window.history.back(); // Otherwise, go back. - } - } - - document.querySelectorAll('.cancel-link').forEach(function(el) { - el.addEventListener('click', handleClick); - }); - }); -} diff --git a/static/admin/js/change_form.js b/static/admin/js/change_form.js deleted file mode 100644 index 96a4c62..0000000 --- a/static/admin/js/change_form.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; -{ - const inputTags = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA']; - const modelName = document.getElementById('django-admin-form-add-constants').dataset.modelName; - if (modelName) { - const form = document.getElementById(modelName + '_form'); - for (const element of form.elements) { - // HTMLElement.offsetParent returns null when the element is not - // rendered. - if (inputTags.includes(element.tagName) && !element.disabled && element.offsetParent) { - element.focus(); - break; - } - } - } -} diff --git a/static/admin/js/core.js b/static/admin/js/core.js deleted file mode 100644 index 10504d4..0000000 --- a/static/admin/js/core.js +++ /dev/null @@ -1,184 +0,0 @@ -// Core JavaScript helper functions -'use strict'; - -// quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]); -function quickElement() { - const obj = document.createElement(arguments[0]); - if (arguments[2]) { - const textNode = document.createTextNode(arguments[2]); - obj.appendChild(textNode); - } - const len = arguments.length; - for (let i = 3; i < len; i += 2) { - obj.setAttribute(arguments[i], arguments[i + 1]); - } - arguments[1].appendChild(obj); - return obj; -} - -// "a" is reference to an object -function removeChildren(a) { - while (a.hasChildNodes()) { - a.removeChild(a.lastChild); - } -} - -// ---------------------------------------------------------------------------- -// Find-position functions by PPK -// See https://www.quirksmode.org/js/findpos.html -// ---------------------------------------------------------------------------- -function findPosX(obj) { - let curleft = 0; - if (obj.offsetParent) { - while (obj.offsetParent) { - curleft += obj.offsetLeft - obj.scrollLeft; - obj = obj.offsetParent; - } - } else if (obj.x) { - curleft += obj.x; - } - return curleft; -} - -function findPosY(obj) { - let curtop = 0; - if (obj.offsetParent) { - while (obj.offsetParent) { - curtop += obj.offsetTop - obj.scrollTop; - obj = obj.offsetParent; - } - } else if (obj.y) { - curtop += obj.y; - } - return curtop; -} - -//----------------------------------------------------------------------------- -// Date object extensions -// ---------------------------------------------------------------------------- -{ - Date.prototype.getTwelveHours = function() { - return this.getHours() % 12 || 12; - }; - - Date.prototype.getTwoDigitMonth = function() { - return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1); - }; - - Date.prototype.getTwoDigitDate = function() { - return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate(); - }; - - Date.prototype.getTwoDigitTwelveHour = function() { - return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours(); - }; - - Date.prototype.getTwoDigitHour = function() { - return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours(); - }; - - Date.prototype.getTwoDigitMinute = function() { - return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes(); - }; - - Date.prototype.getTwoDigitSecond = function() { - return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); - }; - - Date.prototype.getAbbrevDayName = function() { - return typeof window.CalendarNamespace === "undefined" - ? '0' + this.getDay() - : window.CalendarNamespace.daysOfWeekAbbrev[this.getDay()]; - }; - - Date.prototype.getFullDayName = function() { - return typeof window.CalendarNamespace === "undefined" - ? '0' + this.getDay() - : window.CalendarNamespace.daysOfWeek[this.getDay()]; - }; - - Date.prototype.getAbbrevMonthName = function() { - return typeof window.CalendarNamespace === "undefined" - ? this.getTwoDigitMonth() - : window.CalendarNamespace.monthsOfYearAbbrev[this.getMonth()]; - }; - - Date.prototype.getFullMonthName = function() { - return typeof window.CalendarNamespace === "undefined" - ? this.getTwoDigitMonth() - : window.CalendarNamespace.monthsOfYear[this.getMonth()]; - }; - - Date.prototype.strftime = function(format) { - const fields = { - a: this.getAbbrevDayName(), - A: this.getFullDayName(), - b: this.getAbbrevMonthName(), - B: this.getFullMonthName(), - c: this.toString(), - d: this.getTwoDigitDate(), - H: this.getTwoDigitHour(), - I: this.getTwoDigitTwelveHour(), - m: this.getTwoDigitMonth(), - M: this.getTwoDigitMinute(), - p: (this.getHours() >= 12) ? 'PM' : 'AM', - S: this.getTwoDigitSecond(), - w: '0' + this.getDay(), - x: this.toLocaleDateString(), - X: this.toLocaleTimeString(), - y: ('' + this.getFullYear()).substr(2, 4), - Y: '' + this.getFullYear(), - '%': '%' - }; - let result = '', i = 0; - while (i < format.length) { - if (format.charAt(i) === '%') { - result += fields[format.charAt(i + 1)]; - ++i; - } - else { - result += format.charAt(i); - } - ++i; - } - return result; - }; - - // ---------------------------------------------------------------------------- - // String object extensions - // ---------------------------------------------------------------------------- - String.prototype.strptime = function(format) { - const split_format = format.split(/[.\-/]/); - const date = this.split(/[.\-/]/); - let i = 0; - let day, month, year; - while (i < split_format.length) { - switch (split_format[i]) { - case "%d": - day = date[i]; - break; - case "%m": - month = date[i] - 1; - break; - case "%Y": - year = date[i]; - break; - case "%y": - // A %y value in the range of [00, 68] is in the current - // century, while [69, 99] is in the previous century, - // according to the Open Group Specification. - if (parseInt(date[i], 10) >= 69) { - year = date[i]; - } else { - year = (new Date(Date.UTC(date[i], 0))).getUTCFullYear() + 100; - } - break; - } - ++i; - } - // Create Date object from UTC since the parsed value is supposed to be - // in UTC, not local time. Also, the calendar uses UTC functions for - // date extraction. - return new Date(Date.UTC(year, month, day)); - }; -} diff --git a/static/admin/js/filters.js b/static/admin/js/filters.js deleted file mode 100644 index f5536eb..0000000 --- a/static/admin/js/filters.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Persist changelist filters state (collapsed/expanded). - */ -'use strict'; -{ - // Init filters. - let filters = JSON.parse(sessionStorage.getItem('django.admin.filtersState')); - - if (!filters) { - filters = {}; - } - - Object.entries(filters).forEach(([key, value]) => { - const detailElement = document.querySelector(`[data-filter-title='${CSS.escape(key)}']`); - - // Check if the filter is present, it could be from other view. - if (detailElement) { - value ? detailElement.setAttribute('open', '') : detailElement.removeAttribute('open'); - } - }); - - // Save filter state when clicks. - const details = document.querySelectorAll('details'); - details.forEach(detail => { - detail.addEventListener('toggle', event => { - filters[`${event.target.dataset.filterTitle}`] = detail.open; - sessionStorage.setItem('django.admin.filtersState', JSON.stringify(filters)); - }); - }); -} diff --git a/static/admin/js/inlines.js b/static/admin/js/inlines.js deleted file mode 100644 index cd3726c..0000000 --- a/static/admin/js/inlines.js +++ /dev/null @@ -1,359 +0,0 @@ -/*global DateTimeShortcuts, SelectFilter*/ -/** - * Django admin inlines - * - * Based on jQuery Formset 1.1 - * @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com) - * @requires jQuery 1.2.6 or later - * - * Copyright (c) 2009, Stanislaus Madueke - * All rights reserved. - * - * Spiced up with Code from Zain Memon's GSoC project 2009 - * and modified for Django by Jannis Leidel, Travis Swicegood and Julien Phalip. - * - * Licensed under the New BSD License - * See: https://opensource.org/licenses/bsd-license.php - */ -'use strict'; -{ - const $ = django.jQuery; - $.fn.formset = function(opts) { - const options = $.extend({}, $.fn.formset.defaults, opts); - const $this = $(this); - const $parent = $this.parent(); - const updateElementIndex = function(el, prefix, ndx) { - const id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))"); - const replacement = prefix + "-" + ndx; - if ($(el).prop("for")) { - $(el).prop("for", $(el).prop("for").replace(id_regex, replacement)); - } - if (el.id) { - el.id = el.id.replace(id_regex, replacement); - } - if (el.name) { - el.name = el.name.replace(id_regex, replacement); - } - }; - const totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off"); - let nextIndex = parseInt(totalForms.val(), 10); - const maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off"); - const minForms = $("#id_" + options.prefix + "-MIN_NUM_FORMS").prop("autocomplete", "off"); - let addButton; - - /** - * The "Add another MyModel" button below the inline forms. - */ - const addInlineAddButton = function() { - if (addButton === null) { - if ($this.prop("tagName") === "TR") { - // If forms are laid out as table rows, insert the - // "add" button in a new table row: - const numCols = $this.eq(-1).children().length; - $parent.append('' + options.addText + ""); - addButton = $parent.find("tr:last a"); - } else { - // Otherwise, insert it immediately after the last form: - $this.filter(":last").after('"); - addButton = $this.filter(":last").next().find("a"); - } - } - addButton.on('click', addInlineClickHandler); - }; - - const addInlineClickHandler = function(e) { - e.preventDefault(); - const template = $("#" + options.prefix + "-empty"); - const row = template.clone(true); - row.removeClass(options.emptyCssClass) - .addClass(options.formCssClass) - .attr("id", options.prefix + "-" + nextIndex); - addInlineDeleteButton(row); - row.find("*").each(function() { - updateElementIndex(this, options.prefix, totalForms.val()); - }); - // Insert the new form when it has been fully edited. - row.insertBefore($(template)); - // Update number of total forms. - $(totalForms).val(parseInt(totalForms.val(), 10) + 1); - nextIndex += 1; - // Hide the add button if there's a limit and it's been reached. - if ((maxForms.val() !== '') && (maxForms.val() - totalForms.val()) <= 0) { - addButton.parent().hide(); - } - // Show the remove buttons if there are more than min_num. - toggleDeleteButtonVisibility(row.closest('.inline-group')); - - // Pass the new form to the post-add callback, if provided. - if (options.added) { - options.added(row); - } - row.get(0).dispatchEvent(new CustomEvent("formset:added", { - bubbles: true, - detail: { - formsetName: options.prefix - } - })); - }; - - /** - * The "X" button that is part of every unsaved inline. - * (When saved, it is replaced with a "Delete" checkbox.) - */ - const addInlineDeleteButton = function(row) { - if (row.is("tr")) { - // If the forms are laid out in table rows, insert - // the remove button into the last table cell: - row.children(":last").append('"); - } else if (row.is("ul") || row.is("ol")) { - // If they're laid out as an ordered/unordered list, - // insert an
  • after the last list item: - row.append('
  • ' + options.deleteText + "
  • "); - } else { - // Otherwise, just insert the remove button as the - // last child element of the form's container: - row.children(":first").append('' + options.deleteText + ""); - } - // Add delete handler for each row. - row.find("a." + options.deleteCssClass).on('click', inlineDeleteHandler.bind(this)); - }; - - const inlineDeleteHandler = function(e1) { - e1.preventDefault(); - const deleteButton = $(e1.target); - const row = deleteButton.closest('.' + options.formCssClass); - const inlineGroup = row.closest('.inline-group'); - // Remove the parent form containing this button, - // and also remove the relevant row with non-field errors: - const prevRow = row.prev(); - if (prevRow.length && prevRow.hasClass('row-form-errors')) { - prevRow.remove(); - } - row.remove(); - nextIndex -= 1; - // Pass the deleted form to the post-delete callback, if provided. - if (options.removed) { - options.removed(row); - } - document.dispatchEvent(new CustomEvent("formset:removed", { - detail: { - formsetName: options.prefix - } - })); - // Update the TOTAL_FORMS form count. - const forms = $("." + options.formCssClass); - $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length); - // Show add button again once below maximum number. - if ((maxForms.val() === '') || (maxForms.val() - forms.length) > 0) { - addButton.parent().show(); - } - // Hide the remove buttons if at min_num. - toggleDeleteButtonVisibility(inlineGroup); - // Also, update names and ids for all remaining form controls so - // they remain in sequence: - let i, formCount; - const updateElementCallback = function() { - updateElementIndex(this, options.prefix, i); - }; - for (i = 0, formCount = forms.length; i < formCount; i++) { - updateElementIndex($(forms).get(i), options.prefix, i); - $(forms.get(i)).find("*").each(updateElementCallback); - } - }; - - const toggleDeleteButtonVisibility = function(inlineGroup) { - if ((minForms.val() !== '') && (minForms.val() - totalForms.val()) >= 0) { - inlineGroup.find('.inline-deletelink').hide(); - } else { - inlineGroup.find('.inline-deletelink').show(); - } - }; - - $this.each(function(i) { - $(this).not("." + options.emptyCssClass).addClass(options.formCssClass); - }); - - // Create the delete buttons for all unsaved inlines: - $this.filter('.' + options.formCssClass + ':not(.has_original):not(.' + options.emptyCssClass + ')').each(function() { - addInlineDeleteButton($(this)); - }); - toggleDeleteButtonVisibility($this); - - // Create the add button, initially hidden. - addButton = options.addButton; - addInlineAddButton(); - - // Show the add button if allowed to add more items. - // Note that max_num = None translates to a blank string. - const showAddButton = maxForms.val() === '' || (maxForms.val() - totalForms.val()) > 0; - if ($this.length && showAddButton) { - addButton.parent().show(); - } else { - addButton.parent().hide(); - } - - return this; - }; - - /* Setup plugin defaults */ - $.fn.formset.defaults = { - prefix: "form", // The form prefix for your django formset - addText: "add another", // Text for the add link - deleteText: "remove", // Text for the delete link - addCssClass: "add-row", // CSS class applied to the add link - deleteCssClass: "delete-row", // CSS class applied to the delete link - emptyCssClass: "empty-row", // CSS class applied to the empty row - formCssClass: "dynamic-form", // CSS class applied to each form in a formset - added: null, // Function called each time a new form is added - removed: null, // Function called each time a form is deleted - addButton: null // Existing add button to use - }; - - - // Tabular inlines --------------------------------------------------------- - $.fn.tabularFormset = function(selector, options) { - const $rows = $(this); - - const reinitDateTimeShortCuts = function() { - // Reinitialize the calendar and clock widgets by force - if (typeof DateTimeShortcuts !== "undefined") { - $(".datetimeshortcuts").remove(); - DateTimeShortcuts.init(); - } - }; - - const updateSelectFilter = function() { - // If any SelectFilter widgets are a part of the new form, - // instantiate a new SelectFilter instance for it. - if (typeof SelectFilter !== 'undefined') { - $('.selectfilter').each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, false); - }); - $('.selectfilterstacked').each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, true); - }); - } - }; - - const initPrepopulatedFields = function(row) { - row.find('.prepopulated_field').each(function() { - const field = $(this), - input = field.find('input, select, textarea'), - dependency_list = input.data('dependency_list') || [], - dependencies = []; - $.each(dependency_list, function(i, field_name) { - dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id')); - }); - if (dependencies.length) { - input.prepopulate(dependencies, input.attr('maxlength')); - } - }); - }; - - $rows.formset({ - prefix: options.prefix, - addText: options.addText, - formCssClass: "dynamic-" + options.prefix, - deleteCssClass: "inline-deletelink", - deleteText: options.deleteText, - emptyCssClass: "empty-form", - added: function(row) { - initPrepopulatedFields(row); - reinitDateTimeShortCuts(); - updateSelectFilter(); - }, - addButton: options.addButton - }); - - return $rows; - }; - - // Stacked inlines --------------------------------------------------------- - $.fn.stackedFormset = function(selector, options) { - const $rows = $(this); - const updateInlineLabel = function(row) { - $(selector).find(".inline_label").each(function(i) { - const count = i + 1; - $(this).html($(this).html().replace(/(#\d+)/g, "#" + count)); - }); - }; - - const reinitDateTimeShortCuts = function() { - // Reinitialize the calendar and clock widgets by force, yuck. - if (typeof DateTimeShortcuts !== "undefined") { - $(".datetimeshortcuts").remove(); - DateTimeShortcuts.init(); - } - }; - - const updateSelectFilter = function() { - // If any SelectFilter widgets were added, instantiate a new instance. - if (typeof SelectFilter !== "undefined") { - $(".selectfilter").each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, false); - }); - $(".selectfilterstacked").each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, true); - }); - } - }; - - const initPrepopulatedFields = function(row) { - row.find('.prepopulated_field').each(function() { - const field = $(this), - input = field.find('input, select, textarea'), - dependency_list = input.data('dependency_list') || [], - dependencies = []; - $.each(dependency_list, function(i, field_name) { - // Dependency in a fieldset. - let field_element = row.find('.form-row .field-' + field_name); - // Dependency without a fieldset. - if (!field_element.length) { - field_element = row.find('.form-row.field-' + field_name); - } - dependencies.push('#' + field_element.find('input, select, textarea').attr('id')); - }); - if (dependencies.length) { - input.prepopulate(dependencies, input.attr('maxlength')); - } - }); - }; - - $rows.formset({ - prefix: options.prefix, - addText: options.addText, - formCssClass: "dynamic-" + options.prefix, - deleteCssClass: "inline-deletelink", - deleteText: options.deleteText, - emptyCssClass: "empty-form", - removed: updateInlineLabel, - added: function(row) { - initPrepopulatedFields(row); - reinitDateTimeShortCuts(); - updateSelectFilter(); - updateInlineLabel(row); - }, - addButton: options.addButton - }); - - return $rows; - }; - - $(document).ready(function() { - $(".js-inline-admin-formset").each(function() { - const data = $(this).data(), - inlineOptions = data.inlineFormset; - let selector; - switch(data.inlineType) { - case "stacked": - selector = inlineOptions.name + "-group .inline-related"; - $(selector).stackedFormset(selector, inlineOptions.options); - break; - case "tabular": - selector = inlineOptions.name + "-group .tabular.inline-related tbody:first > tr.form-row"; - $(selector).tabularFormset(selector, inlineOptions.options); - break; - } - }); - }); -} diff --git a/static/admin/js/jquery.init.js b/static/admin/js/jquery.init.js deleted file mode 100644 index f40b27f..0000000 --- a/static/admin/js/jquery.init.js +++ /dev/null @@ -1,8 +0,0 @@ -/*global jQuery:false*/ -'use strict'; -/* Puts the included jQuery into our own namespace using noConflict and passing - * it 'true'. This ensures that the included jQuery doesn't pollute the global - * namespace (i.e. this preserves pre-existing values for both window.$ and - * window.jQuery). - */ -window.django = {jQuery: jQuery.noConflict(true)}; diff --git a/static/admin/js/nav_sidebar.js b/static/admin/js/nav_sidebar.js deleted file mode 100644 index 7e735db..0000000 --- a/static/admin/js/nav_sidebar.js +++ /dev/null @@ -1,79 +0,0 @@ -'use strict'; -{ - const toggleNavSidebar = document.getElementById('toggle-nav-sidebar'); - if (toggleNavSidebar !== null) { - const navSidebar = document.getElementById('nav-sidebar'); - const main = document.getElementById('main'); - let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen'); - if (navSidebarIsOpen === null) { - navSidebarIsOpen = 'true'; - } - main.classList.toggle('shifted', navSidebarIsOpen === 'true'); - navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); - - toggleNavSidebar.addEventListener('click', function() { - if (navSidebarIsOpen === 'true') { - navSidebarIsOpen = 'false'; - } else { - navSidebarIsOpen = 'true'; - } - localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen); - main.classList.toggle('shifted'); - navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); - }); - } - - function initSidebarQuickFilter() { - const options = []; - const navSidebar = document.getElementById('nav-sidebar'); - if (!navSidebar) { - return; - } - navSidebar.querySelectorAll('th[scope=row] a').forEach((container) => { - options.push({title: container.innerHTML, node: container}); - }); - - function checkValue(event) { - let filterValue = event.target.value; - if (filterValue) { - filterValue = filterValue.toLowerCase(); - } - if (event.key === 'Escape') { - filterValue = ''; - event.target.value = ''; // clear input - } - let matches = false; - for (const o of options) { - let displayValue = ''; - if (filterValue) { - if (o.title.toLowerCase().indexOf(filterValue) === -1) { - displayValue = 'none'; - } else { - matches = true; - } - } - // show/hide parent - o.node.parentNode.parentNode.style.display = displayValue; - } - if (!filterValue || matches) { - event.target.classList.remove('no-results'); - } else { - event.target.classList.add('no-results'); - } - sessionStorage.setItem('django.admin.navSidebarFilterValue', filterValue); - } - - const nav = document.getElementById('nav-filter'); - nav.addEventListener('change', checkValue, false); - nav.addEventListener('input', checkValue, false); - nav.addEventListener('keyup', checkValue, false); - - const storedValue = sessionStorage.getItem('django.admin.navSidebarFilterValue'); - if (storedValue) { - nav.value = storedValue; - checkValue({target: nav, key: ''}); - } - } - window.initSidebarQuickFilter = initSidebarQuickFilter; - initSidebarQuickFilter(); -} diff --git a/static/admin/js/popup_response.js b/static/admin/js/popup_response.js deleted file mode 100644 index fecf0f4..0000000 --- a/static/admin/js/popup_response.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; -{ - const initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); - switch(initData.action) { - case 'change': - opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value); - break; - case 'delete': - opener.dismissDeleteRelatedObjectPopup(window, initData.value); - break; - default: - opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj); - break; - } -} diff --git a/static/admin/js/prepopulate.js b/static/admin/js/prepopulate.js deleted file mode 100644 index 89e95ab..0000000 --- a/static/admin/js/prepopulate.js +++ /dev/null @@ -1,43 +0,0 @@ -/*global URLify*/ -'use strict'; -{ - const $ = django.jQuery; - $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) { - /* - Depends on urlify.js - Populates a selected field with the values of the dependent fields, - URLifies and shortens the string. - dependencies - array of dependent fields ids - maxLength - maximum length of the URLify'd string - allowUnicode - Unicode support of the URLify'd string - */ - return this.each(function() { - const prepopulatedField = $(this); - - const populate = function() { - // Bail if the field's value has been changed by the user - if (prepopulatedField.data('_changed')) { - return; - } - - const values = []; - $.each(dependencies, function(i, field) { - field = $(field); - if (field.val().length > 0) { - values.push(field.val()); - } - }); - prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode)); - }; - - prepopulatedField.data('_changed', false); - prepopulatedField.on('change', function() { - prepopulatedField.data('_changed', true); - }); - - if (!prepopulatedField.val()) { - $(dependencies.join(',')).on('keyup change focus', populate); - } - }); - }; -} diff --git a/static/admin/js/prepopulate_init.js b/static/admin/js/prepopulate_init.js deleted file mode 100644 index a58841f..0000000 --- a/static/admin/js/prepopulate_init.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; -{ - const $ = django.jQuery; - const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields'); - $.each(fields, function(index, field) { - $( - '.empty-form .form-row .field-' + field.name + - ', .empty-form.form-row .field-' + field.name + - ', .empty-form .form-row.field-' + field.name - ).addClass('prepopulated_field'); - $(field.id).data('dependency_list', field.dependency_list).prepopulate( - field.dependency_ids, field.maxLength, field.allowUnicode - ); - }); -} diff --git a/static/admin/js/theme.js b/static/admin/js/theme.js deleted file mode 100644 index e79d375..0000000 --- a/static/admin/js/theme.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; -{ - function setTheme(mode) { - if (mode !== "light" && mode !== "dark" && mode !== "auto") { - console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`); - mode = "auto"; - } - document.documentElement.dataset.theme = mode; - localStorage.setItem("theme", mode); - } - - function cycleTheme() { - const currentTheme = localStorage.getItem("theme") || "auto"; - const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; - - if (prefersDark) { - // Auto (dark) -> Light -> Dark - if (currentTheme === "auto") { - setTheme("light"); - } else if (currentTheme === "light") { - setTheme("dark"); - } else { - setTheme("auto"); - } - } else { - // Auto (light) -> Dark -> Light - if (currentTheme === "auto") { - setTheme("dark"); - } else if (currentTheme === "dark") { - setTheme("light"); - } else { - setTheme("auto"); - } - } - } - - function initTheme() { - // set theme defined in localStorage if there is one, or fallback to auto mode - const currentTheme = localStorage.getItem("theme"); - currentTheme ? setTheme(currentTheme) : setTheme("auto"); - } - - window.addEventListener('load', function(_) { - const buttons = document.getElementsByClassName("theme-toggle"); - Array.from(buttons).forEach((btn) => { - btn.addEventListener("click", cycleTheme); - }); - }); - - initTheme(); -} diff --git a/static/admin/js/unusable_password_field.js b/static/admin/js/unusable_password_field.js deleted file mode 100644 index ec26238..0000000 --- a/static/admin/js/unusable_password_field.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict"; -// Fallback JS for browsers which do not support :has selector used in -// admin/css/unusable_password_fields.css -// Remove file once all supported browsers support :has selector -try { - // If browser does not support :has selector this will raise an error - document.querySelector("form:has(input)"); -} catch (error) { - console.log("Defaulting to javascript for usable password form management: " + error); - // JS replacement for unsupported :has selector - document.querySelectorAll('input[name="usable_password"]').forEach(option => { - option.addEventListener('change', function() { - const usablePassword = (this.value === "true" ? this.checked : !this.checked); - const submit1 = document.querySelector('input[type="submit"].set-password'); - const submit2 = document.querySelector('input[type="submit"].unset-password'); - const messages = document.querySelector('#id_unusable_warning'); - document.getElementById('id_password1').closest('.form-row').hidden = !usablePassword; - document.getElementById('id_password2').closest('.form-row').hidden = !usablePassword; - if (messages) { - messages.hidden = usablePassword; - } - if (submit1 && submit2) { - submit1.hidden = !usablePassword; - submit2.hidden = usablePassword; - } - }); - option.dispatchEvent(new Event('change')); - }); -} diff --git a/static/admin/js/urlify.js b/static/admin/js/urlify.js deleted file mode 100644 index 9fc0409..0000000 --- a/static/admin/js/urlify.js +++ /dev/null @@ -1,169 +0,0 @@ -/*global XRegExp*/ -'use strict'; -{ - const LATIN_MAP = { - 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', - 'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', - 'Î': 'I', 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', - 'Õ': 'O', 'Ö': 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', - 'Ü': 'U', 'Ű': 'U', 'Ý': 'Y', 'Þ': 'TH', 'Ÿ': 'Y', 'ß': 'ss', 'à': 'a', - 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', - 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i', - 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', - 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', - 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y' - }; - const LATIN_SYMBOLS_MAP = { - '©': '(c)' - }; - const GREEK_MAP = { - 'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h', - 'θ': '8', 'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm', 'ν': 'n', 'ξ': '3', - 'ο': 'o', 'π': 'p', 'ρ': 'r', 'σ': 's', 'τ': 't', 'υ': 'y', 'φ': 'f', - 'χ': 'x', 'ψ': 'ps', 'ω': 'w', 'ά': 'a', 'έ': 'e', 'ί': 'i', 'ό': 'o', - 'ύ': 'y', 'ή': 'h', 'ώ': 'w', 'ς': 's', 'ϊ': 'i', 'ΰ': 'y', 'ϋ': 'y', - 'ΐ': 'i', 'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z', - 'Η': 'H', 'Θ': '8', 'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M', 'Ν': 'N', - 'Ξ': '3', 'Ο': 'O', 'Π': 'P', 'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y', - 'Φ': 'F', 'Χ': 'X', 'Ψ': 'PS', 'Ω': 'W', 'Ά': 'A', 'Έ': 'E', 'Ί': 'I', - 'Ό': 'O', 'Ύ': 'Y', 'Ή': 'H', 'Ώ': 'W', 'Ϊ': 'I', 'Ϋ': 'Y' - }; - const TURKISH_MAP = { - 'ş': 's', 'Ş': 'S', 'ı': 'i', 'İ': 'I', 'ç': 'c', 'Ç': 'C', 'ü': 'u', - 'Ü': 'U', 'ö': 'o', 'Ö': 'O', 'ğ': 'g', 'Ğ': 'G' - }; - const ROMANIAN_MAP = { - 'ă': 'a', 'î': 'i', 'ș': 's', 'ț': 't', 'â': 'a', - 'Ă': 'A', 'Î': 'I', 'Ș': 'S', 'Ț': 'T', 'Â': 'A' - }; - const RUSSIAN_MAP = { - 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo', - 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', - 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', - 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'sh', 'ъ': '', - 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu', 'я': 'ya', - 'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'Yo', - 'Ж': 'Zh', 'З': 'Z', 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M', - 'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U', - 'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Sh', 'Ъ': '', - 'Ы': 'Y', 'Ь': '', 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya' - }; - const UKRAINIAN_MAP = { - 'Є': 'Ye', 'І': 'I', 'Ї': 'Yi', 'Ґ': 'G', 'є': 'ye', 'і': 'i', - 'ї': 'yi', 'ґ': 'g' - }; - const CZECH_MAP = { - 'č': 'c', 'ď': 'd', 'ě': 'e', 'ň': 'n', 'ř': 'r', 'š': 's', 'ť': 't', - 'ů': 'u', 'ž': 'z', 'Č': 'C', 'Ď': 'D', 'Ě': 'E', 'Ň': 'N', 'Ř': 'R', - 'Š': 'S', 'Ť': 'T', 'Ů': 'U', 'Ž': 'Z' - }; - const SLOVAK_MAP = { - 'á': 'a', 'ä': 'a', 'č': 'c', 'ď': 'd', 'é': 'e', 'í': 'i', 'ľ': 'l', - 'ĺ': 'l', 'ň': 'n', 'ó': 'o', 'ô': 'o', 'ŕ': 'r', 'š': 's', 'ť': 't', - 'ú': 'u', 'ý': 'y', 'ž': 'z', - 'Á': 'a', 'Ä': 'A', 'Č': 'C', 'Ď': 'D', 'É': 'E', 'Í': 'I', 'Ľ': 'L', - 'Ĺ': 'L', 'Ň': 'N', 'Ó': 'O', 'Ô': 'O', 'Ŕ': 'R', 'Š': 'S', 'Ť': 'T', - 'Ú': 'U', 'Ý': 'Y', 'Ž': 'Z' - }; - const POLISH_MAP = { - 'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ó': 'o', 'ś': 's', - 'ź': 'z', 'ż': 'z', - 'Ą': 'A', 'Ć': 'C', 'Ę': 'E', 'Ł': 'L', 'Ń': 'N', 'Ó': 'O', 'Ś': 'S', - 'Ź': 'Z', 'Ż': 'Z' - }; - const LATVIAN_MAP = { - 'ā': 'a', 'č': 'c', 'ē': 'e', 'ģ': 'g', 'ī': 'i', 'ķ': 'k', 'ļ': 'l', - 'ņ': 'n', 'š': 's', 'ū': 'u', 'ž': 'z', - 'Ā': 'A', 'Č': 'C', 'Ē': 'E', 'Ģ': 'G', 'Ī': 'I', 'Ķ': 'K', 'Ļ': 'L', - 'Ņ': 'N', 'Š': 'S', 'Ū': 'U', 'Ž': 'Z' - }; - const ARABIC_MAP = { - 'أ': 'a', 'ب': 'b', 'ت': 't', 'ث': 'th', 'ج': 'g', 'ح': 'h', 'خ': 'kh', 'د': 'd', - 'ذ': 'th', 'ر': 'r', 'ز': 'z', 'س': 's', 'ش': 'sh', 'ص': 's', 'ض': 'd', 'ط': 't', - 'ظ': 'th', 'ع': 'aa', 'غ': 'gh', 'ف': 'f', 'ق': 'k', 'ك': 'k', 'ل': 'l', 'م': 'm', - 'ن': 'n', 'ه': 'h', 'و': 'o', 'ي': 'y' - }; - const LITHUANIAN_MAP = { - 'ą': 'a', 'č': 'c', 'ę': 'e', 'ė': 'e', 'į': 'i', 'š': 's', 'ų': 'u', - 'ū': 'u', 'ž': 'z', - 'Ą': 'A', 'Č': 'C', 'Ę': 'E', 'Ė': 'E', 'Į': 'I', 'Š': 'S', 'Ų': 'U', - 'Ū': 'U', 'Ž': 'Z' - }; - const SERBIAN_MAP = { - 'ђ': 'dj', 'ј': 'j', 'љ': 'lj', 'њ': 'nj', 'ћ': 'c', 'џ': 'dz', - 'đ': 'dj', 'Ђ': 'Dj', 'Ј': 'j', 'Љ': 'Lj', 'Њ': 'Nj', 'Ћ': 'C', - 'Џ': 'Dz', 'Đ': 'Dj' - }; - const AZERBAIJANI_MAP = { - 'ç': 'c', 'ə': 'e', 'ğ': 'g', 'ı': 'i', 'ö': 'o', 'ş': 's', 'ü': 'u', - 'Ç': 'C', 'Ə': 'E', 'Ğ': 'G', 'İ': 'I', 'Ö': 'O', 'Ş': 'S', 'Ü': 'U' - }; - const GEORGIAN_MAP = { - 'ა': 'a', 'ბ': 'b', 'გ': 'g', 'დ': 'd', 'ე': 'e', 'ვ': 'v', 'ზ': 'z', - 'თ': 't', 'ი': 'i', 'კ': 'k', 'ლ': 'l', 'მ': 'm', 'ნ': 'n', 'ო': 'o', - 'პ': 'p', 'ჟ': 'j', 'რ': 'r', 'ს': 's', 'ტ': 't', 'უ': 'u', 'ფ': 'f', - 'ქ': 'q', 'ღ': 'g', 'ყ': 'y', 'შ': 'sh', 'ჩ': 'ch', 'ც': 'c', 'ძ': 'dz', - 'წ': 'w', 'ჭ': 'ch', 'ხ': 'x', 'ჯ': 'j', 'ჰ': 'h' - }; - - const ALL_DOWNCODE_MAPS = [ - LATIN_MAP, - LATIN_SYMBOLS_MAP, - GREEK_MAP, - TURKISH_MAP, - ROMANIAN_MAP, - RUSSIAN_MAP, - UKRAINIAN_MAP, - CZECH_MAP, - SLOVAK_MAP, - POLISH_MAP, - LATVIAN_MAP, - ARABIC_MAP, - LITHUANIAN_MAP, - SERBIAN_MAP, - AZERBAIJANI_MAP, - GEORGIAN_MAP - ]; - - const Downcoder = { - 'Initialize': function() { - if (Downcoder.map) { // already made - return; - } - Downcoder.map = {}; - for (const lookup of ALL_DOWNCODE_MAPS) { - Object.assign(Downcoder.map, lookup); - } - Downcoder.regex = new RegExp(Object.keys(Downcoder.map).join('|'), 'g'); - } - }; - - function downcode(slug) { - Downcoder.Initialize(); - return slug.replace(Downcoder.regex, function(m) { - return Downcoder.map[m]; - }); - } - - - function URLify(s, num_chars, allowUnicode) { - // changes, e.g., "Petty theft" to "petty-theft" - if (!allowUnicode) { - s = downcode(s); - } - s = s.toLowerCase(); // convert to lowercase - // if downcode doesn't hit, the char will be stripped here - if (allowUnicode) { - // Keep Unicode letters including both lowercase and uppercase - // characters, whitespace, and dash; remove other characters. - s = XRegExp.replace(s, XRegExp('[^-_\\p{L}\\p{N}\\s]', 'g'), ''); - } else { - s = s.replace(/[^-\w\s]/g, ''); // remove unneeded chars - } - s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces - s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens - s = s.substring(0, num_chars); // trim to first num_chars chars - return s.replace(/-+$/g, ''); // trim any trailing hyphens - } - window.URLify = URLify; -} diff --git a/static/admin/js/vendor/jquery/LICENSE.txt b/static/admin/js/vendor/jquery/LICENSE.txt deleted file mode 100644 index f642c3f..0000000 --- a/static/admin/js/vendor/jquery/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright OpenJS Foundation and other contributors, https://openjsf.org/ - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/static/admin/js/vendor/jquery/jquery.js b/static/admin/js/vendor/jquery/jquery.js deleted file mode 100644 index 1a86433..0000000 --- a/static/admin/js/vendor/jquery/jquery.js +++ /dev/null @@ -1,10716 +0,0 @@ -/*! - * jQuery JavaScript Library v3.7.1 - * https://jquery.com/ - * - * Copyright OpenJS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2023-08-28T13:37Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket trac-14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 - // Plus for old WebKit, typeof returns "function" for HTML collections - // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) - return typeof obj === "function" && typeof obj.nodeType !== "number" && - typeof obj.item !== "function"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var version = "3.7.1", - - rhtmlSuffix = /HTML$/i, - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - - // Retrieve the text value of an array of DOM nodes - text: function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += jQuery.text( node ); - } - } - if ( nodeType === 1 || nodeType === 11 ) { - return elem.textContent; - } - if ( nodeType === 9 ) { - return elem.documentElement.textContent; - } - if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - isXMLDoc: function( elem ) { - var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; - - // Assume HTML when documentElement doesn't yet exist, such as inside - // document fragments. - return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), - function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); - } ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -} -var pop = arr.pop; - - -var sort = arr.sort; - - -var splice = arr.splice; - - -var whitespace = "[\\x20\\t\\r\\n\\f]"; - - -var rtrimCSS = new RegExp( - "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", - "g" -); - - - - -// Note: an element does not contain itself -jQuery.contains = function( a, b ) { - var bup = b && b.parentNode; - - return a === bup || !!( bup && bup.nodeType === 1 && ( - - // Support: IE 9 - 11+ - // IE doesn't have `contains` on SVG. - a.contains ? - a.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); -}; - - - - -// CSS string/identifier serialization -// https://drafts.csswg.org/cssom/#common-serializing-idioms -var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; - -function fcssescape( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; -} - -jQuery.escapeSelector = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - - - - -var preferredDoc = document, - pushNative = push; - -( function() { - -var i, - Expr, - outermostContext, - sortInput, - hasDuplicate, - push = pushNative, - - // Local document vars - document, - documentElement, - documentIsHTML, - rbuggyQSA, - matches, - - // Instance-specific data - expando = jQuery.expando, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + - "loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + - whitespace + "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - ID: new RegExp( "^#(" + identifier + ")" ), - CLASS: new RegExp( "^\\.(" + identifier + ")" ), - TAG: new RegExp( "^(" + identifier + "|[*])" ), - ATTR: new RegExp( "^" + attributes ), - PSEUDO: new RegExp( "^" + pseudos ), - CHILD: new RegExp( - "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - bool: new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - needsContext: new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - if ( nonHex ) { - - // Strip the backslash prefix from a non-hex escape sequence - return nonHex; - } - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - return high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // Used for iframes; see `setDocument`. - // Support: IE 9 - 11+, Edge 12 - 18+ - // Removing the function wrapper causes a "Permission Denied" - // error in IE/Edge. - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && nodeName( elem, "fieldset" ); - }, - { dir: "parentNode", next: "legend" } - ); - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android <=4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { - apply: function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - }, - call: function( target ) { - pushNative.apply( target, slice.call( arguments, 1 ) ); - } - }; -} - -function find( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE 9 only - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - push.call( results, elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE 9 only - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - find.contains( context, elem ) && - elem.id === m ) { - - push.call( results, elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when - // strict-comparing two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( newContext != context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = jQuery.escapeSelector( nid ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties - // (see https://github.com/jquery/sizzle/issues/157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by jQuery selector module - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - return nodeName( elem, "input" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && - elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11+ - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a jQuery selector context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [node] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -function setDocument( node ) { - var subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - documentElement = document.documentElement; - documentIsHTML = !jQuery.isXMLDoc( document ); - - // Support: iOS 7 only, IE 9 - 11+ - // Older browsers didn't support unprefixed `matches`. - matches = documentElement.matches || - documentElement.webkitMatchesSelector || - documentElement.msMatchesSelector; - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors - // (see trac-13936). - // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, - // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. - if ( documentElement.msMatchesSelector && - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 9 - 11+, Edge 12 - 18+ - subWindow.addEventListener( "unload", unloadHandler ); - } - - // Support: IE <10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - documentElement.appendChild( el ).id = jQuery.expando; - return !document.getElementsByName || - !document.getElementsByName( jQuery.expando ).length; - } ); - - // Support: IE 9 only - // Check to see if it's possible to do matchesSelector - // on a disconnected node. - support.disconnectedMatch = assert( function( el ) { - return matches.call( el, "*" ); - } ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // IE/Edge don't support the :scope pseudo-class. - support.scope = assert( function() { - return document.querySelectorAll( ":scope" ); - } ); - - // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only - // Make sure the `:has()` argument is parsed unforgivingly. - // We include `*` in the test to detect buggy implementations that are - // _selectively_ forgiving (specifically when the list includes at least - // one valid selector). - // Note that we treat complete lack of support for `:has()` as if it were - // spec-compliant support, which is fine because use of `:has()` in such - // environments will fail in the qSA path and fall back to jQuery traversal - // anyway. - support.cssHas = assert( function() { - try { - document.querySelector( ":has(*,:jqfake)" ); - return false; - } catch ( e ) { - return true; - } - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter.ID = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find.ID = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter.ID = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find.ID = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find.TAG = function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else { - return context.querySelectorAll( tag ); - } - }; - - // Class - Expr.find.CLASS = function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - rbuggyQSA = []; - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - documentElement.appendChild( el ).innerHTML = - "" + - ""; - - // Support: iOS <=7 - 8 only - // Boolean attributes and "value" are not treated correctly in some XML documents - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: iOS <=7 - 8 only - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: iOS 8 only - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ - // In some of the document kinds, these selectors wouldn't work natively. - // This is probably OK but for backwards compatibility we want to maintain - // handling them through jQuery traversal in jQuery 3.x. - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE 9 - 11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ - // In some of the document kinds, these selectors wouldn't work natively. - // This is probably OK but for backwards compatibility we want to maintain - // handling them through jQuery traversal in jQuery 3.x. - documentElement.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - } ); - - if ( !support.cssHas ) { - - // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ - // Our regular `try-catch` mechanism fails to detect natively-unsupported - // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) - // in browsers that parse the `:has()` argument as a forgiving selector list. - // https://drafts.csswg.org/selectors/#relational now requires the argument - // to be parsed unforgivingly, but browsers have not yet fully adjusted. - rbuggyQSA.push( ":has" ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a === document || a.ownerDocument == preferredDoc && - find.contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b === document || b.ownerDocument == preferredDoc && - find.contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - }; - - return document; -} - -find.matches = function( expr, elements ) { - return find( expr, null, null, elements ); -}; - -find.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return find( expr, document, null, [ elem ] ).length > 0; -}; - -find.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return jQuery.contains( context, elem ); -}; - - -find.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (see trac-13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - if ( val !== undefined ) { - return val; - } - - return elem.getAttribute( name ); -}; - -find.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -jQuery.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - // - // Support: Android <=4.0+ - // Testing for detecting duplicates is unpredictable so instead assume we can't - // depend on duplicate detection in all browsers without a stable sort. - hasDuplicate = !support.sortStable; - sortInput = !support.sortStable && slice.call( results, 0 ); - sort.call( results, sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - splice.call( results, duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -jQuery.fn.uniqueSort = function() { - return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); -}; - -Expr = jQuery.expr = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - ATTR: function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) - .replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - CHILD: function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - find.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) - ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - find.error( match[ 0 ] ); - } - - return match; - }, - - PSEUDO: function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr.CHILD.test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - TAG: function( nodeNameSelector ) { - var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return nodeName( elem, expectedNodeName ); - }; - }, - - CLASS: function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + ")" + className + - "(" + whitespace + "|$)" ) ) && - classCache( className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - ATTR: function( name, operator, check ) { - return function( elem ) { - var result = find.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - if ( operator === "=" ) { - return result === check; - } - if ( operator === "!=" ) { - return result !== check; - } - if ( operator === "^=" ) { - return check && result.indexOf( check ) === 0; - } - if ( operator === "*=" ) { - return check && result.indexOf( check ) > -1; - } - if ( operator === "$=" ) { - return check && result.slice( -check.length ) === check; - } - if ( operator === "~=" ) { - return ( " " + result.replace( rwhitespace, " " ) + " " ) - .indexOf( check ) > -1; - } - if ( operator === "|=" ) { - return result === check || result.slice( 0, check.length + 1 ) === check + "-"; - } - - return false; - }; - }, - - CHILD: function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - nodeName( node, name ) : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || ( parent[ expando ] = {} ); - cache = outerCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - cache = outerCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - nodeName( node, name ) : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - outerCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - PSEUDO: function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // https://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - find.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as jQuery does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - not: markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrimCSS, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element - // (see https://github.com/jquery/sizzle/issues/299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - has: markFunction( function( selector ) { - return function( elem ) { - return find( selector, elem ).length > 0; - }; - } ), - - contains: markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // https://www.w3.org/TR/selectors/#lang-pseudo - lang: markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - find.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - target: function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - root: function( elem ) { - return elem === documentElement; - }, - - focus: function( elem ) { - return elem === safeActiveElement() && - document.hasFocus() && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - enabled: createDisabledPseudo( false ), - disabled: createDisabledPseudo( true ), - - checked: function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - return ( nodeName( elem, "input" ) && !!elem.checked ) || - ( nodeName( elem, "option" ) && !!elem.selected ); - }, - - selected: function( elem ) { - - // Support: IE <=11+ - // Accessing the selectedIndex property - // forces the browser to treat the default option as - // selected when in an optgroup. - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - empty: function( elem ) { - - // https://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - parent: function( elem ) { - return !Expr.pseudos.empty( elem ); - }, - - // Element/input types - header: function( elem ) { - return rheader.test( elem.nodeName ); - }, - - input: function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - button: function( elem ) { - return nodeName( elem, "input" ) && elem.type === "button" || - nodeName( elem, "button" ); - }, - - text: function( elem ) { - var attr; - return nodeName( elem, "input" ) && elem.type === "text" && - - // Support: IE <10 only - // New HTML5 attribute values (e.g., "search") appear - // with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - first: createPositionalPseudo( function() { - return [ 0 ]; - } ), - - last: createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - even: createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - odd: createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - lt: createPositionalPseudo( function( matchIndexes, length, argument ) { - var i; - - if ( argument < 0 ) { - i = argument + length; - } else if ( argument > length ) { - i = length; - } else { - i = argument; - } - - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - gt: createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos.nth = Expr.pseudos.eq; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -function tokenize( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rleadingCombinator.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrimCSS, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - if ( parseOnly ) { - return soFar.length; - } - - return soFar ? - find.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -} - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - if ( skip && nodeName( elem, skip ) ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = outerCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - outerCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - find( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, matcherOut, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || - multipleContexts( selector || "*", - context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems; - - if ( matcher ) { - - // If we have a postFinder, or filtered seed, or non-seed postFilter - // or preexisting results, - matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results; - - // Find primary matches - matcher( matcherIn, matcherOut, context, xml ); - } else { - matcherOut = matcherIn; - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element - // (see https://github.com/jquery/sizzle/issues/299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrimCSS, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find.TAG( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: iOS <=7 - 9 only - // Tolerate NodeList properties (IE: "length"; Safari: ) matching - // elements by id. (see trac-14142) - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - push.call( results, elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - jQuery.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -function compile( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -} - -/** - * A low-level selection function that works with jQuery's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with jQuery selector compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -function select( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find.ID( - token.matches[ 0 ].replace( runescape, funescape ), - context - ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && - testContext( context.parentNode ) || context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -} - -// One-time assignments - -// Support: Android <=4.0 - 4.1+ -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Initialize against the default document -setDocument(); - -// Support: Android <=4.0 - 4.1+ -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -jQuery.find = find; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.unique = jQuery.uniqueSort; - -// These have always been private, but they used to be documented as part of -// Sizzle so let's maintain them for now for backwards compatibility purposes. -find.compile = compile; -find.select = select; -find.setDocument = setDocument; -find.tokenize = tokenize; - -find.escape = jQuery.escapeSelector; -find.getText = jQuery.text; -find.isXML = jQuery.isXMLDoc; -find.selectors = jQuery.expr; -find.support = jQuery.support; -find.uniqueSort = jQuery.uniqueSort; - - /* eslint-enable */ - -} )(); - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (trac-9521) - // Strict HTML recognition (trac-11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to jQuery#find - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.error ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the error, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getErrorHook ) { - process.error = jQuery.Deferred.getErrorHook(); - - // The deprecated alias of the above. While the name suggests - // returning the stack, not an error instance, jQuery just passes - // it directly to `console.warn` so both will work; an instance - // just better cooperates with source maps. - } else if ( jQuery.Deferred.getStackHook ) { - process.error = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the primary Deferred - primary = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - primary.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( primary.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return primary.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); - } - - return primary.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error -// captured before the async barrier to get the original error cause -// which may otherwise be hidden. -jQuery.Deferred.exceptionHook = function( error, asyncError ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, - error.stack, asyncError ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See trac-6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (trac-9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see trac-8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (trac-14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (trac-11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (trac-14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (trac-13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
    " ], - col: [ 2, "", "
    " ], - tr: [ 2, "", "
    " ], - td: [ 3, "", "
    " ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (trac-12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (trac-13208) - // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (trac-13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", true ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, isSetup ) { - - // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add - if ( !isSetup ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - if ( !saved ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - this[ type ](); - result = dataPriv.get( this, type ); - dataPriv.set( this, type, false ); - - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - - return result; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering - // the native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved ) { - - // ...and capture the result - dataPriv.set( this, type, jQuery.event.trigger( - saved[ 0 ], - saved.slice( 1 ), - this - ) ); - - // Abort handling of the native event by all jQuery handlers while allowing - // native handlers on the same element to run. On target, this is achieved - // by stopping immediate propagation just on the jQuery event. However, - // the native event is re-wrapped by a jQuery one on each level of the - // propagation so the only way to stop it for jQuery is to stop it for - // everyone via native `stopPropagation()`. This is not a problem for - // focus/blur which don't bubble, but it does also stop click on checkboxes - // and radios. We accept this limitation. - event.stopPropagation(); - event.isImmediatePropagationStopped = returnTrue; - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (trac-504, trac-13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - which: true -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - - function focusMappedHandler( nativeEvent ) { - if ( document.documentMode ) { - - // Support: IE 11+ - // Attach a single focusin/focusout handler on the document while someone wants - // focus/blur. This is because the former are synchronous in IE while the latter - // are async. In other browsers, all those handlers are invoked synchronously. - - // `handle` from private data would already wrap the event, but we need - // to change the `type` here. - var handle = dataPriv.get( this, "handle" ), - event = jQuery.event.fix( nativeEvent ); - event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; - event.isSimulated = true; - - // First, handle focusin/focusout - handle( nativeEvent ); - - // ...then, handle focus/blur - // - // focus/blur don't bubble while focusin/focusout do; simulate the former by only - // invoking the handler at the lower level. - if ( event.target === event.currentTarget ) { - - // The setup part calls `leverageNative`, which, in turn, calls - // `jQuery.event.add`, so event handle will already have been set - // by this point. - handle( event ); - } - } else { - - // For non-IE browsers, attach a single capturing handler on the document - // while someone wants focusin/focusout. - jQuery.event.simulate( delegateType, nativeEvent.target, - jQuery.event.fix( nativeEvent ) ); - } - } - - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - var attaches; - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, true ); - - if ( document.documentMode ) { - - // Support: IE 9 - 11+ - // We use the same native handler for focusin & focus (and focusout & blur) - // so we need to coordinate setup & teardown parts between those events. - // Use `delegateType` as the key as `type` is already used by `leverageNative`. - attaches = dataPriv.get( this, delegateType ); - if ( !attaches ) { - this.addEventListener( delegateType, focusMappedHandler ); - } - dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); - } else { - - // Return false to allow normal processing in the caller - return false; - } - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - teardown: function() { - var attaches; - - if ( document.documentMode ) { - attaches = dataPriv.get( this, delegateType ) - 1; - if ( !attaches ) { - this.removeEventListener( delegateType, focusMappedHandler ); - dataPriv.remove( this, delegateType ); - } else { - dataPriv.set( this, delegateType, attaches ); - } - } else { - - // Return false to indicate standard teardown should be applied - return false; - } - }, - - // Suppress native focus or blur if we're currently inside - // a leveraged native-event stack - _default: function( event ) { - return dataPriv.get( event.target, type ); - }, - - delegateType: delegateType - }; - - // Support: Firefox <=44 - // Firefox doesn't have focus(in | out) events - // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 - // - // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 - // focus(in | out) events fire after focus & blur events, - // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order - // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 - // - // Support: IE 9 - 11+ - // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, - // attach a single handler for both events in IE. - jQuery.event.special[ delegateType ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - dataHolder = document.documentMode ? this : doc, - attaches = dataPriv.get( dataHolder, delegateType ); - - // Support: IE 9 - 11+ - // We use the same native handler for focusin & focus (and focusout & blur) - // so we need to coordinate setup & teardown parts between those events. - // Use `delegateType` as the key as `type` is already used by `leverageNative`. - if ( !attaches ) { - if ( document.documentMode ) { - this.addEventListener( delegateType, focusMappedHandler ); - } else { - doc.addEventListener( type, focusMappedHandler, true ); - } - } - dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - dataHolder = document.documentMode ? this : doc, - attaches = dataPriv.get( dataHolder, delegateType ) - 1; - - if ( !attaches ) { - if ( document.documentMode ) { - this.removeEventListener( delegateType, focusMappedHandler ); - } else { - doc.removeEventListener( type, focusMappedHandler, true ); - } - dataPriv.remove( dataHolder, delegateType ); - } else { - dataPriv.set( dataHolder, delegateType, attaches ); - } - } - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (trac-8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Re-enable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - - // Unwrap a CDATA section containing script contents. This shouldn't be - // needed as in XML documents they're already not visible when - // inspecting element contents and in HTML documents they have no - // meaning but we're preserving that logic for backwards compatibility. - // This will be removed completely in 4.0. See gh-4904. - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew jQuery#find here for performance reasons: - // https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var rcustomProp = /^--/; - - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (trac-8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - // - // Support: Firefox 70+ - // Only Firefox includes border widths - // in computed dimensions. (gh-4529) - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; - tr.style.cssText = "box-sizing:content-box;border:1px solid"; - - // Support: Chrome 86+ - // Height set through cssText does not get applied. - // Computed height then comes back as 0. - tr.style.height = "1px"; - trChild.style.height = "9px"; - - // Support: Android 8 Chrome 86+ - // In our bodyBackground.html iframe, - // display for all div elements is set to "inline", - // which causes a problem only in Android 8 Chrome 86. - // Ensuring the div is `display: block` - // gets around this issue. - trChild.style.display = "block"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + - parseInt( trStyle.borderTopWidth, 10 ) + - parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - isCustomProp = rcustomProp.test( name ), - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, trac-12537) - // .css('--customProperty) (gh-3144) - if ( computed ) { - - // Support: IE <=9 - 11+ - // IE only supports `"float"` in `getPropertyValue`; in computed styles - // it's only available as `"cssFloat"`. We no longer modify properties - // sent to `.css()` apart from camelCasing, so we need to check both. - // Normally, this would create difference in behavior: if - // `getPropertyValue` returns an empty string, the value returned - // by `.css()` would be `undefined`. This is usually the case for - // disconnected elements. However, in IE even disconnected elements - // with no styles return `"none"` for `getPropertyValue( "float" )` - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( isCustomProp && ret ) { - - // Support: Firefox 105+, Chrome <=105+ - // Spec requires trimming whitespace for custom properties (gh-4926). - // Firefox only trims leading whitespace. Chrome just collapses - // both leading & trailing whitespace to a single space. - // - // Fall back to `undefined` if empty string returned. - // This collapses a missing definition with property defined - // and set to an empty string but there's no standard API - // allowing us to differentiate them without a performance penalty - // and returning `undefined` aligns with older jQuery. - // - // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED - // as whitespace while CSS does not, but this is not a problem - // because CSS preprocessing replaces them with U+000A LINE FEED - // (which *is* CSS whitespace) - // https://www.w3.org/TR/css-syntax-3/#input-preprocessing - ret = ret.replace( rtrimCSS, "$1" ) || undefined; - } - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0, - marginDelta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - // Count margin delta separately to only add it after scroll gutter adjustment. - // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). - if ( box === "margin" ) { - marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta + marginDelta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - animationIterationCount: true, - aspectRatio: true, - borderImageSlice: true, - columnCount: true, - flexGrow: true, - flexShrink: true, - fontWeight: true, - gridArea: true, - gridColumn: true, - gridColumnEnd: true, - gridColumnStart: true, - gridRow: true, - gridRowEnd: true, - gridRowStart: true, - lineHeight: true, - opacity: true, - order: true, - orphans: true, - scale: true, - widows: true, - zIndex: true, - zoom: true, - - // SVG-related - fillOpacity: true, - floodOpacity: true, - stopOpacity: true, - strokeMiterlimit: true, - strokeOpacity: true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (trac-7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug trac-9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (trac-7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // Use proper attribute retrieval (trac-12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classNames, cur, curValue, className, i, finalValue; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classNames = classesToArray( value ); - - if ( classNames.length ) { - return this.each( function() { - curValue = getClass( this ); - cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - for ( i = 0; i < classNames.length; i++ ) { - className = classNames[ i ]; - if ( cur.indexOf( " " + className + " " ) < 0 ) { - cur += className + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - this.setAttribute( "class", finalValue ); - } - } - } ); - } - - return this; - }, - - removeClass: function( value ) { - var classNames, cur, curValue, className, i, finalValue; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classNames = classesToArray( value ); - - if ( classNames.length ) { - return this.each( function() { - curValue = getClass( this ); - - // This expression is here for better compressibility (see addClass) - cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - for ( i = 0; i < classNames.length; i++ ) { - className = classNames[ i ]; - - // Remove *all* instances - while ( cur.indexOf( " " + className + " " ) > -1 ) { - cur = cur.replace( " " + className + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - this.setAttribute( "class", finalValue ); - } - } - } ); - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var classNames, className, i, self, - type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - classNames = classesToArray( value ); - - return this.each( function() { - if ( isValidValue ) { - - // Toggle individual class names - self = jQuery( this ); - - for ( i = 0; i < classNames.length; i++ ) { - className = classNames[ i ]; - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (trac-14686, trac-14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (trac-2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml, parserErrorElem; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) {} - - parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; - if ( !xml || parserErrorElem ) { - jQuery.error( "Invalid XML: " + ( - parserErrorElem ? - jQuery.map( parserErrorElem.childNodes, function( el ) { - return el.textContent; - } ).join( "\n" ) : - data - ) ); - } - return xml; -}; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (trac-9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (trac-6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ).filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ).map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // trac-7653, trac-8125, trac-8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - -originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes trac-9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (trac-10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket trac-12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // trac-9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script but not if jsonp - if ( !isSuccess && - jQuery.inArray( "script", s.dataTypes ) > -1 && - jQuery.inArray( "json", s.dataTypes ) < 0 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (trac-11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // trac-1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see trac-8605, trac-14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // trac-14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( "