From 2f31bf39e6277ab589d7a21b8519b4cf104e7778 Mon Sep 17 00:00:00 2001 From: C4 Patino Date: Sun, 7 Aug 2022 14:50:23 -0500 Subject: [PATCH] Removed static folder --- CollegiateHouseWars/settings/__init__.py | 3 + .../{settings.py => settings/dev.py} | 31 +- CollegiateHouseWars/settings/prod.py | 141 + .../{test_settings.py => settings/test.py} | 26 +- CollegiateHouseWars/urls.py | 4 +- requirements.txt | Bin 324 -> 364 bytes static/favicon.ico | Bin 0 -> 15406 bytes static/src/admin/css/autocomplete.css | 275 - static/src/admin/css/base.css | 1052 -- static/src/admin/css/changelists.css | 355 - static/src/admin/css/dashboard.css | 26 - static/src/admin/css/fonts.css | 20 - static/src/admin/css/forms.css | 527 - static/src/admin/css/login.css | 61 - static/src/admin/css/nav_sidebar.css | 139 - static/src/admin/css/responsive.css | 1004 -- static/src/admin/css/responsive_rtl.css | 80 - static/src/admin/css/rtl.css | 227 - .../css/vendor/select2/LICENSE-SELECT2.md | 21 - .../src/admin/css/vendor/select2/select2.css | 481 - .../admin/css/vendor/select2/select2.min.css | 1 - static/src/admin/css/widgets.css | 574 - static/src/admin/fonts/LICENSE.txt | 202 - static/src/admin/fonts/README.txt | 3 - .../src/admin/fonts/Roboto-Bold-webfont.woff | Bin 86184 -> 0 bytes .../src/admin/fonts/Roboto-Light-webfont.woff | Bin 85692 -> 0 bytes .../admin/fonts/Roboto-Regular-webfont.woff | Bin 85876 -> 0 bytes static/src/admin/img/LICENSE | 20 - static/src/admin/img/README.txt | 7 - static/src/admin/img/calendar-icons.svg | 14 - static/src/admin/img/gis/move_vertex_off.svg | 1 - static/src/admin/img/gis/move_vertex_on.svg | 1 - static/src/admin/img/icon-addlink.svg | 3 - static/src/admin/img/icon-alert.svg | 3 - static/src/admin/img/icon-calendar.svg | 9 - static/src/admin/img/icon-changelink.svg | 3 - static/src/admin/img/icon-clock.svg | 9 - static/src/admin/img/icon-deletelink.svg | 3 - static/src/admin/img/icon-no.svg | 3 - static/src/admin/img/icon-unknown-alt.svg | 3 - static/src/admin/img/icon-unknown.svg | 3 - static/src/admin/img/icon-viewlink.svg | 3 - static/src/admin/img/icon-yes.svg | 3 - static/src/admin/img/inline-delete.svg | 3 - static/src/admin/img/search.svg | 3 - static/src/admin/img/selector-icons.svg | 34 - static/src/admin/img/sorting-icons.svg | 19 - static/src/admin/img/tooltag-add.svg | 3 - static/src/admin/img/tooltag-arrowright.svg | 3 - static/src/admin/js/SelectBox.js | 112 - static/src/admin/js/SelectFilter2.js | 236 - static/src/admin/js/actions.js | 201 - .../src/admin/js/admin/DateTimeShortcuts.js | 415 - .../admin/js/admin/RelatedObjectLookups.js | 155 - static/src/admin/js/autocomplete.js | 35 - static/src/admin/js/calendar.js | 221 - static/src/admin/js/cancel.js | 29 - static/src/admin/js/change_form.js | 16 - static/src/admin/js/collapse.js | 43 - static/src/admin/js/core.js | 170 - static/src/admin/js/inlines.js | 344 - static/src/admin/js/jquery.init.js | 8 - static/src/admin/js/nav_sidebar.js | 93 - static/src/admin/js/popup_response.js | 16 - static/src/admin/js/prepopulate.js | 43 - static/src/admin/js/prepopulate_init.js | 11 - static/src/admin/js/urlify.js | 170 - static/src/admin/js/vendor/jquery/LICENSE.txt | 20 - static/src/admin/js/vendor/jquery/jquery.js | 10881 ---------------- .../src/admin/js/vendor/jquery/jquery.min.js | 2 - static/src/admin/js/vendor/select2/LICENSE.md | 21 - static/src/admin/js/vendor/select2/i18n/af.js | 3 - static/src/admin/js/vendor/select2/i18n/ar.js | 3 - static/src/admin/js/vendor/select2/i18n/az.js | 3 - static/src/admin/js/vendor/select2/i18n/bg.js | 3 - static/src/admin/js/vendor/select2/i18n/bn.js | 3 - static/src/admin/js/vendor/select2/i18n/bs.js | 3 - static/src/admin/js/vendor/select2/i18n/ca.js | 3 - static/src/admin/js/vendor/select2/i18n/cs.js | 3 - static/src/admin/js/vendor/select2/i18n/da.js | 3 - static/src/admin/js/vendor/select2/i18n/de.js | 3 - .../src/admin/js/vendor/select2/i18n/dsb.js | 3 - static/src/admin/js/vendor/select2/i18n/el.js | 3 - static/src/admin/js/vendor/select2/i18n/en.js | 3 - static/src/admin/js/vendor/select2/i18n/es.js | 3 - static/src/admin/js/vendor/select2/i18n/et.js | 3 - static/src/admin/js/vendor/select2/i18n/eu.js | 3 - static/src/admin/js/vendor/select2/i18n/fa.js | 3 - static/src/admin/js/vendor/select2/i18n/fi.js | 3 - static/src/admin/js/vendor/select2/i18n/fr.js | 3 - static/src/admin/js/vendor/select2/i18n/gl.js | 3 - static/src/admin/js/vendor/select2/i18n/he.js | 3 - static/src/admin/js/vendor/select2/i18n/hi.js | 3 - static/src/admin/js/vendor/select2/i18n/hr.js | 3 - .../src/admin/js/vendor/select2/i18n/hsb.js | 3 - static/src/admin/js/vendor/select2/i18n/hu.js | 3 - static/src/admin/js/vendor/select2/i18n/hy.js | 3 - static/src/admin/js/vendor/select2/i18n/id.js | 3 - static/src/admin/js/vendor/select2/i18n/is.js | 3 - static/src/admin/js/vendor/select2/i18n/it.js | 3 - static/src/admin/js/vendor/select2/i18n/ja.js | 3 - static/src/admin/js/vendor/select2/i18n/ka.js | 3 - static/src/admin/js/vendor/select2/i18n/km.js | 3 - static/src/admin/js/vendor/select2/i18n/ko.js | 3 - static/src/admin/js/vendor/select2/i18n/lt.js | 3 - static/src/admin/js/vendor/select2/i18n/lv.js | 3 - static/src/admin/js/vendor/select2/i18n/mk.js | 3 - static/src/admin/js/vendor/select2/i18n/ms.js | 3 - static/src/admin/js/vendor/select2/i18n/nb.js | 3 - static/src/admin/js/vendor/select2/i18n/ne.js | 3 - static/src/admin/js/vendor/select2/i18n/nl.js | 3 - static/src/admin/js/vendor/select2/i18n/pl.js | 3 - static/src/admin/js/vendor/select2/i18n/ps.js | 3 - .../src/admin/js/vendor/select2/i18n/pt-BR.js | 3 - static/src/admin/js/vendor/select2/i18n/pt.js | 3 - static/src/admin/js/vendor/select2/i18n/ro.js | 3 - static/src/admin/js/vendor/select2/i18n/ru.js | 3 - static/src/admin/js/vendor/select2/i18n/sk.js | 3 - static/src/admin/js/vendor/select2/i18n/sl.js | 3 - static/src/admin/js/vendor/select2/i18n/sq.js | 3 - .../admin/js/vendor/select2/i18n/sr-Cyrl.js | 3 - static/src/admin/js/vendor/select2/i18n/sr.js | 3 - static/src/admin/js/vendor/select2/i18n/sv.js | 3 - static/src/admin/js/vendor/select2/i18n/th.js | 3 - static/src/admin/js/vendor/select2/i18n/tk.js | 3 - static/src/admin/js/vendor/select2/i18n/tr.js | 3 - static/src/admin/js/vendor/select2/i18n/uk.js | 3 - static/src/admin/js/vendor/select2/i18n/vi.js | 3 - .../src/admin/js/vendor/select2/i18n/zh-CN.js | 3 - .../src/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 - .../src/admin/js/vendor/xregexp/LICENSE.txt | 21 - static/src/admin/js/vendor/xregexp/xregexp.js | 4652 ------- .../admin/js/vendor/xregexp/xregexp.min.js | 160 - static/src/css/main.css | 62 - templates/base.html | 1 + 137 files changed, 168 insertions(+), 30375 deletions(-) create mode 100644 CollegiateHouseWars/settings/__init__.py rename CollegiateHouseWars/{settings.py => settings/dev.py} (85%) create mode 100644 CollegiateHouseWars/settings/prod.py rename CollegiateHouseWars/{test_settings.py => settings/test.py} (87%) create mode 100644 static/favicon.ico delete mode 100644 static/src/admin/css/autocomplete.css delete mode 100644 static/src/admin/css/base.css delete mode 100644 static/src/admin/css/changelists.css delete mode 100644 static/src/admin/css/dashboard.css delete mode 100644 static/src/admin/css/fonts.css delete mode 100644 static/src/admin/css/forms.css delete mode 100644 static/src/admin/css/login.css delete mode 100644 static/src/admin/css/nav_sidebar.css delete mode 100644 static/src/admin/css/responsive.css delete mode 100644 static/src/admin/css/responsive_rtl.css delete mode 100644 static/src/admin/css/rtl.css delete mode 100644 static/src/admin/css/vendor/select2/LICENSE-SELECT2.md delete mode 100644 static/src/admin/css/vendor/select2/select2.css delete mode 100644 static/src/admin/css/vendor/select2/select2.min.css delete mode 100644 static/src/admin/css/widgets.css delete mode 100644 static/src/admin/fonts/LICENSE.txt delete mode 100644 static/src/admin/fonts/README.txt delete mode 100644 static/src/admin/fonts/Roboto-Bold-webfont.woff delete mode 100644 static/src/admin/fonts/Roboto-Light-webfont.woff delete mode 100644 static/src/admin/fonts/Roboto-Regular-webfont.woff delete mode 100644 static/src/admin/img/LICENSE delete mode 100644 static/src/admin/img/README.txt delete mode 100644 static/src/admin/img/calendar-icons.svg delete mode 100644 static/src/admin/img/gis/move_vertex_off.svg delete mode 100644 static/src/admin/img/gis/move_vertex_on.svg delete mode 100644 static/src/admin/img/icon-addlink.svg delete mode 100644 static/src/admin/img/icon-alert.svg delete mode 100644 static/src/admin/img/icon-calendar.svg delete mode 100644 static/src/admin/img/icon-changelink.svg delete mode 100644 static/src/admin/img/icon-clock.svg delete mode 100644 static/src/admin/img/icon-deletelink.svg delete mode 100644 static/src/admin/img/icon-no.svg delete mode 100644 static/src/admin/img/icon-unknown-alt.svg delete mode 100644 static/src/admin/img/icon-unknown.svg delete mode 100644 static/src/admin/img/icon-viewlink.svg delete mode 100644 static/src/admin/img/icon-yes.svg delete mode 100644 static/src/admin/img/inline-delete.svg delete mode 100644 static/src/admin/img/search.svg delete mode 100644 static/src/admin/img/selector-icons.svg delete mode 100644 static/src/admin/img/sorting-icons.svg delete mode 100644 static/src/admin/img/tooltag-add.svg delete mode 100644 static/src/admin/img/tooltag-arrowright.svg delete mode 100644 static/src/admin/js/SelectBox.js delete mode 100644 static/src/admin/js/SelectFilter2.js delete mode 100644 static/src/admin/js/actions.js delete mode 100644 static/src/admin/js/admin/DateTimeShortcuts.js delete mode 100644 static/src/admin/js/admin/RelatedObjectLookups.js delete mode 100644 static/src/admin/js/autocomplete.js delete mode 100644 static/src/admin/js/calendar.js delete mode 100644 static/src/admin/js/cancel.js delete mode 100644 static/src/admin/js/change_form.js delete mode 100644 static/src/admin/js/collapse.js delete mode 100644 static/src/admin/js/core.js delete mode 100644 static/src/admin/js/inlines.js delete mode 100644 static/src/admin/js/jquery.init.js delete mode 100644 static/src/admin/js/nav_sidebar.js delete mode 100644 static/src/admin/js/popup_response.js delete mode 100644 static/src/admin/js/prepopulate.js delete mode 100644 static/src/admin/js/prepopulate_init.js delete mode 100644 static/src/admin/js/urlify.js delete mode 100644 static/src/admin/js/vendor/jquery/LICENSE.txt delete mode 100644 static/src/admin/js/vendor/jquery/jquery.js delete mode 100644 static/src/admin/js/vendor/jquery/jquery.min.js delete mode 100644 static/src/admin/js/vendor/select2/LICENSE.md delete mode 100644 static/src/admin/js/vendor/select2/i18n/af.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/ar.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/az.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/bg.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/bn.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/bs.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/ca.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/cs.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/da.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/de.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/dsb.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/el.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/en.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/es.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/et.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/eu.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/fa.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/fi.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/fr.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/gl.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/he.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/hi.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/hr.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/hsb.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/hu.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/hy.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/id.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/is.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/it.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/ja.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/ka.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/km.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/ko.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/lt.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/lv.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/mk.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/ms.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/nb.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/ne.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/nl.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/pl.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/ps.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/pt-BR.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/pt.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/ro.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/ru.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/sk.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/sl.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/sq.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/sr-Cyrl.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/sr.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/sv.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/th.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/tk.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/tr.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/uk.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/vi.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/zh-CN.js delete mode 100644 static/src/admin/js/vendor/select2/i18n/zh-TW.js delete mode 100644 static/src/admin/js/vendor/select2/select2.full.js delete mode 100644 static/src/admin/js/vendor/select2/select2.full.min.js delete mode 100644 static/src/admin/js/vendor/xregexp/LICENSE.txt delete mode 100644 static/src/admin/js/vendor/xregexp/xregexp.js delete mode 100644 static/src/admin/js/vendor/xregexp/xregexp.min.js delete mode 100644 static/src/css/main.css diff --git a/CollegiateHouseWars/settings/__init__.py b/CollegiateHouseWars/settings/__init__.py new file mode 100644 index 0000000..72e250a --- /dev/null +++ b/CollegiateHouseWars/settings/__init__.py @@ -0,0 +1,3 @@ +from . import dev +from . import prod +from . import test diff --git a/CollegiateHouseWars/settings.py b/CollegiateHouseWars/settings/dev.py similarity index 85% rename from CollegiateHouseWars/settings.py rename to CollegiateHouseWars/settings/dev.py index 09d63cd..0f88db5 100644 --- a/CollegiateHouseWars/settings.py +++ b/CollegiateHouseWars/settings/dev.py @@ -1,21 +1,9 @@ -""" -Django settings for CollegiateHouseWars project. - -Generated by 'django-admin startproject' using Django 4.0.4. - -For more information on this file, see -https://docs.djangoproject.com/en/4.0/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/4.0/ref/settings/ -""" - from pathlib import Path import os from django.contrib.messages import constants # Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent +BASE_DIR = Path(__file__).resolve().parent.parent.parent # Quick-start development settings - unsuitable for production @@ -34,7 +22,7 @@ CSRF_COOKIE_SECURE = False ALLOWED_HOSTS = [ 'localhost', - '127.0.0.1' + '127.0.0.1', ] # Application definition @@ -88,14 +76,12 @@ WSGI_APPLICATION = 'CollegiateHouseWars.wsgi.application' DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', - }, - 'production': { 'ENGINE': 'django.db.backends.mysql', - 'NAME': os.environ.get('DATABASE_NAME'), + 'NAME': 'dev', 'USER': os.environ.get('DATABASE_USERNAME'), 'PASSWORD': os.environ.get('DATABASE_PASSWORD'), + 'HOST': 'mysqldb', + 'PORT': '3306' } } @@ -135,7 +121,12 @@ USE_TZ = True # https://docs.djangoproject.com/en/4.0/howto/static-files/ STATIC_URL = 'static/' -STATIC_ROOT = BASE_DIR / 'static/src' +STATIC_ROOT = '/var/www/collegiate-housewars/static/' + +STATICFILES_DIRS = [ + BASE_DIR / "static" +] + # Default primary key field type # https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field diff --git a/CollegiateHouseWars/settings/prod.py b/CollegiateHouseWars/settings/prod.py new file mode 100644 index 0000000..a333cbe --- /dev/null +++ b/CollegiateHouseWars/settings/prod.py @@ -0,0 +1,141 @@ +from pathlib import Path +import os +from django.contrib.messages import constants + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +DOTENV_FILE = BASE_DIR / '.env' +SECRET_KEY = os.environ.get('SECRET_KEY') + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +SECURE_SSL_REDIRECT = False +SESSION_COOKIE_SECURE = False +CSRF_COOKIE_SECURE = False + +ALLOWED_HOSTS = [ + 'localhost', + '127.0.0.1', +] + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + + 'formtools', + + 'housewars.apps.HousewarsConfig' +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'CollegiateHouseWars.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [BASE_DIR / 'templates'], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'CollegiateHouseWars.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.0/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'prod', + 'USER': os.environ.get('DATABASE_USERNAME'), + 'PASSWORD': os.environ.get('DATABASE_PASSWORD'), + 'HOST': 'mysqldb', + 'PORT': '3306' + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.0/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.0/howto/static-files/ + +STATIC_URL = 'static/' +STATIC_ROOT = '/var/www/housewars/static/' + +STATICFILES_DIRS = [ + BASE_DIR / "static" +] + + +# Default primary key field type +# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + + +MESSAGE_TAGS = {constants.DEBUG: 'debug', + constants.INFO: 'info', + constants.SUCCESS: 'success', + constants.WARNING: 'warning', + constants.ERROR: 'danger', } diff --git a/CollegiateHouseWars/test_settings.py b/CollegiateHouseWars/settings/test.py similarity index 87% rename from CollegiateHouseWars/test_settings.py rename to CollegiateHouseWars/settings/test.py index df8f3ac..2572d15 100644 --- a/CollegiateHouseWars/test_settings.py +++ b/CollegiateHouseWars/settings/test.py @@ -1,22 +1,9 @@ -""" -Django settings for CollegiateHouseWars project. - -Generated by 'django-admin startproject' using Django 4.0.4. - -For more information on this file, see -https://docs.djangoproject.com/en/4.0/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/4.0/ref/settings/ -""" - from pathlib import Path import os from django.contrib.messages import constants # Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - +BASE_DIR = Path(__file__).resolve().parent.parent.parent # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/ @@ -34,7 +21,7 @@ CSRF_COOKIE_SECURE = False ALLOWED_HOSTS = [ 'localhost', - '127.0.0.1' + '127.0.0.1', ] # Application definition @@ -89,7 +76,7 @@ WSGI_APPLICATION = 'CollegiateHouseWars.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', + 'NAME': '/var/www/house-wars/db/db.sqlite3', } } @@ -129,7 +116,12 @@ USE_TZ = True # https://docs.djangoproject.com/en/4.0/howto/static-files/ STATIC_URL = 'static/' -STATIC_ROOT = BASE_DIR / 'static/src' +STATIC_ROOT = '/var/www/collegiate-housewars/static/' + +STATICFILES_DIRS = [ + BASE_DIR / "static" +] + # Default primary key field type # https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field diff --git a/CollegiateHouseWars/urls.py b/CollegiateHouseWars/urls.py index 543c54f..9546ba2 100644 --- a/CollegiateHouseWars/urls.py +++ b/CollegiateHouseWars/urls.py @@ -15,9 +15,11 @@ Including another URLconf """ from django.contrib import admin from django.urls import path, include +from django.conf import settings +from django.conf.urls.static import static urlpatterns = [ path('', include('housewars.urls')), path('admin/', admin.site.urls), -] +] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) diff --git a/requirements.txt b/requirements.txt index da044f2b72dbc715b3ec0c1aa99c86db981c5c94..8ecc00046cd3fa73ec427bc9921a1d387ad15a0b 100644 GIT binary patch delta 45 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 MhQMeDFfcFx007ggjQ{`u literal 0 HcmV?d00001 diff --git a/static/src/admin/css/autocomplete.css b/static/src/admin/css/autocomplete.css deleted file mode 100644 index 69c94e7..0000000 --- a/static/src/admin/css/autocomplete.css +++ /dev/null @@ -1,275 +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; -} diff --git a/static/src/admin/css/base.css b/static/src/admin/css/base.css deleted file mode 100644 index 1cb3acd..0000000 --- a/static/src/admin/css/base.css +++ /dev/null @@ -1,1052 +0,0 @@ -/* - DJANGO Admin styles -*/ - -@import url(fonts.css); - -/* VARIABLE DEFINITIONS */ -:root { - --primary: #79aec8; - --secondary: #417690; - --accent: #f5dd5d; - --primary-fg: #fff; - - --body-fg: #333; - --body-bg: #fff; - --body-quiet-color: #666; - --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: var(--primary); - - --link-fg: #447e9b; - --link-hover-color: #036; - --link-selected-fg: #5b80b2; - - --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(--primary); - --button-hover-bg: #609ab6; - --default-button-bg: var(--secondary); - --default-button-hover-bg: #205067; - --close-button-bg: #888; /* Previously #bbb, contrast 1.92 */ - --close-button-hover-bg: #747474; - --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); -} - -@media (prefers-color-scheme: dark) { - :root { - --primary: #264b5d; - --primary-fg: #eee; - - --body-fg: #eeeeee; - --body-bg: #121212; - --body-quiet-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; - } -} - -html, body { - height: 100%; -} - -body { - margin: 0; - padding: 0; - font-size: 14px; - font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif; - 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: 20px; - color: var(--body-quiet-color); -} - -h2 { - font-size: 16px; - margin: 1em 0 .5em 0; -} - -h2.subhead { - font-weight: normal; - margin-top: 0; -} - -h3 { - font-size: 14px; - margin: .8em 0 .3em 0; - color: var(--body-quiet-color); - font-weight: bold; -} - -h4 { - font-size: 12px; - margin: 1em 0 .8em 0; - padding-bottom: 3px; -} - -h5 { - font-size: 10px; - 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: 13px; - line-height: 20px; -} - -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); -} - -blockquote { - font-size: 11px; - color: #777; - margin-left: 2px; - padding-left: 10px; - border-left: 5px solid #ddd; -} - -code, pre { - font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; - color: var(--body-quiet-color); - font-size: 12px; - 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; - font-size: 1px; - line-height: 1px; -} - -/* TEXT STYLES & MODIFIERS */ - -.small { - font-size: 11px; -} - -.mini { - font-size: 10px; -} - -.help, p.help, form p.help, div.help, form div.help, div.help li { - font-size: 11px; - 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; -} - -/* TABLES */ - -table { - border-collapse: collapse; - border-color: var(--border-color); -} - -td, th { - font-size: 13px; - line-height: 16px; - border-bottom: 1px solid var(--hairline-color); - vertical-align: top; - padding: 8px; -} - -th { - font-weight: 600; - text-align: left; -} - -thead th, -tfoot td { - color: var(--body-quiet-color); - padding: 5px 10px; - font-size: 11px; - 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 { - color: var(--body-loud-color); -} - -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: 18px; - 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: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; - font-weight: normal; - font-size: 13px; -} -.form-row div.help { - padding: 2px 3px; -} - -textarea { - vertical-align: top; -} - -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); -} - -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: 30px; -} - -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 { - float: right; - 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: 13px; - text-align: left; - background: var(--primary); - color: var(--header-link-color); -} - -.module caption, -.inline-group h2 { - font-size: 12px; - 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: 13px; - 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); -} - -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: 14px; - 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: 13px; - 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: 12px; - 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; -} - -.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: 10px; - font-weight: bold; - padding-left: 0; - float: right; - position: relative; - margin-top: -48px; -} - -.object-tools li { - display: block; - float: left; - margin-left: 5px; - height: 16px; -} - -.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: 11px; - 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 */ - -table#change-history { - width: 100%; -} - -table#change-history tbody th { - width: 16em; -} - -/* PAGE STRUCTURE */ - -#container { - position: relative; - width: 100%; - min-width: 980px; - padding: 0; - display: flex; - flex-direction: column; - height: 100%; -} - -#container > div { - flex-shrink: 0; -} - -#container > .main { - display: flex; - flex: 1 0 auto; -} - -.main > .content { - flex: 1 0; - max-width: 100%; -} - -#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; -} - -#footer { - clear: both; - padding: 10px; -} - -/* 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); - overflow: hidden; -} - -#header a:link, #header a:visited { - color: var(--header-link-color); -} - -#header a:focus , #header a:hover { - text-decoration: underline; -} - -#branding { - float: left; -} - -#branding h1 { - padding: 0; - margin: 0 20px 0 0; - font-weight: 300; - font-size: 24px; - color: var(--accent); -} - -#branding h1, #branding h1 a:link, #branding h1 a:visited { - color: var(--accent); -} - -#branding h2 { - padding: 0 10px; - font-size: 14px; - margin: -8px 0 8px 0; - font-weight: normal; - color: var(--header-color); -} - -#branding a:hover { - text-decoration: none; -} - -#user-tools { - float: right; - padding: 0; - margin: 0 0 0 20px; - font-weight: 300; - font-size: 11px; - letter-spacing: 0.5px; - text-transform: uppercase; - text-align: right; -} - -#user-tools a { - border-bottom: 1px solid rgba(255, 255, 255, 0.25); -} - -#user-tools a:focus, #user-tools a:hover { - text-decoration: none; - border-bottom-color: var(--primary); - color: var(--primary); -} - -/* 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: 13px; -} - -#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: 18px; - 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: 15px; - line-height: 15px; - 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; -} diff --git a/static/src/admin/css/changelists.css b/static/src/admin/css/changelists.css deleted file mode 100644 index a4baf32..0000000 --- a/static/src/admin/css/changelists.css +++ /dev/null @@ -1,355 +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: 14px; - padding: 5px; - color: var(--body-fg); -} - -#toolbar #searchbar { - height: 19px; - border: 1px solid var(--border-color); - padding: 2px 5px; - margin: 0; - vertical-align: top; - font-size: 13px; - 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: 13px; - 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; -} - -#changelist-filter h2 { - font-size: 14px; - text-transform: uppercase; - letter-spacing: 0.5px; - padding: 5px 15px; - margin-bottom: 12px; - border-bottom: none; -} - -#changelist-filter h3 { - font-weight: 400; - padding: 0 15px; - margin-bottom: 10px; -} - -#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); - text-overflow: ellipsis; - overflow-x: hidden; -} - -#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-clear a { - font-size: 13px; - padding-bottom: 10px; - border-bottom: 1px solid var(--hairline-color); -} - -/* DATE DRILLDOWN */ - -.change-list ul.toplinks { - display: block; - float: left; - padding: 0; - margin: 0; - width: 100%; -} - -.change-list ul.toplinks li { - padding: 3px 6px; - font-weight: bold; - list-style-type: none; - display: inline-block; -} - -.change-list ul.toplinks .date-back a { - color: var(--body-quiet-color); -} - -.change-list ul.toplinks .date-back a:focus, -.change-list ul.toplinks .date-back a:hover { - color: var(--link-hover-color); -} - -/* PAGINATOR */ - -.paginator { - font-size: 13px; - padding-top: 10px; - padding-bottom: 10px; - line-height: 22px; - margin: 0; - border-top: 1px solid var(--hairline-color); - width: 100%; -} - -.paginator a:link, .paginator a:visited { - padding: 2px 6px; - background: var(--button-bg); - text-decoration: none; - color: var(--button-fg); -} - -.paginator a.showall { - border: none; - background: none; - color: var(--link-fg); -} - -.paginator a.showall:focus, .paginator a.showall:hover { - background: none; - color: var(--link-hover-color); -} - -.paginator .end { - margin-right: 6px; -} - -.paginator .this-page { - padding: 2px 6px; - font-weight: bold; - font-size: 13px; - vertical-align: top; -} - -.paginator a:focus, .paginator a:hover { - color: white; - background: var(--link-hover-color); -} - -/* ACTIONS */ - -.filtered .actions { - border-right: none; -} - -#changelist table input { - margin: 0; - vertical-align: baseline; -} - -#changelist table tbody tr.selected { - background-color: var(--selected-row); -} - -#changelist .actions { - padding: 10px; - background: var(--body-bg); - border-top: none; - border-bottom: none; - line-height: 24px; - color: var(--body-quiet-color); - width: 100%; -} - -#changelist .actions.selected { /* XXX Probably unused? */ - background: var(--body-bg); - border-top: 1px solid var(--body-bg); - border-bottom: 1px solid #edecd6; -} - -#changelist .actions span.all, -#changelist .actions span.action-counter, -#changelist .actions span.clear, -#changelist .actions span.question { - font-size: 13px; - margin: 0 0.5em; -} - -#changelist .actions:last-child { - border-bottom: none; -} - -#changelist .actions select { - vertical-align: top; - height: 24px; - color: var(--body-fg); - border: 1px solid var(--border-color); - border-radius: 4px; - font-size: 14px; - 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: 13px; -} - -#changelist .actions .button { - font-size: 13px; - 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: 24px; - 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/src/admin/css/dashboard.css b/static/src/admin/css/dashboard.css deleted file mode 100644 index 91d6efd..0000000 --- a/static/src/admin/css/dashboard.css +++ /dev/null @@ -1,26 +0,0 @@ -/* DASHBOARD */ - -.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/src/admin/css/fonts.css b/static/src/admin/css/fonts.css deleted file mode 100644 index c837e01..0000000 --- a/static/src/admin/css/fonts.css +++ /dev/null @@ -1,20 +0,0 @@ -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Bold-webfont.woff'); - font-weight: 700; - font-style: normal; -} - -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Regular-webfont.woff'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Light-webfont.woff'); - font-weight: 300; - font-style: normal; -} diff --git a/static/src/admin/css/forms.css b/static/src/admin/css/forms.css deleted file mode 100644 index bb44be7..0000000 --- a/static/src/admin/css/forms.css +++ /dev/null @@ -1,527 +0,0 @@ -@import url('widgets.css'); - -/* FORM ROWS */ - -.form-row { - overflow: hidden; - padding: 10px; - font-size: 13px; - 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; -} - -/* FORM LABELS */ - -label { - font-weight: normal; - color: var(--body-quiet-color); - font-size: 13px; -} - -.required label, label.required { - font-weight: bold; - color: var(--body-fg); -} - -/* 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; -} - -/* ALIGNED FIELDSETS */ - -.aligned label { - display: block; - padding: 4px 10px 0 0; - float: left; - width: 160px; - word-wrap: break-word; - line-height: 1; -} - -.aligned label:not(.vCheckboxLabel):after { - content: ''; - display: inline-block; - vertical-align: middle; - height: 26px; -} - -.aligned label + p, .aligned label + div.help, .aligned label + div.readonly { - padding: 6px 0; - margin-top: 0; - margin-bottom: 0; - margin-left: 170px; - 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 { - clear: left; - margin-top: 0; - margin-left: 160px; - padding-left: 10px; -} - -form .aligned label + p.help, -form .aligned label + div.help { - margin-left: 0; - padding-left: 0; -} - -form .aligned p.help:last-child, -form .aligned div.help:last-child { - margin-bottom: 0; - padding-bottom: 0; -} - -form .aligned input + p.help, -form .aligned textarea + p.help, -form .aligned select + p.help, -form .aligned input + div.help, -form .aligned textarea + div.help, -form .aligned select + div.help { - margin-left: 160px; - padding-left: 10px; -} - -form .aligned ul li { - list-style: none; -} - -form .aligned table p { - margin-left: 0; - padding-left: 0; -} - -.aligned .vCheckboxLabel { - float: none; - width: auto; - display: inline-block; - vertical-align: -3px; - padding: 0 0 5px 5px; -} - -.aligned .vCheckboxLabel + p.help, -.aligned .vCheckboxLabel + div.help { - margin-top: -4px; -} - -.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { - width: 610px; -} - -.checkbox-row p.help, -.checkbox-row div.help { - margin-left: 0; - padding-left: 0; -} - -fieldset .fieldBox { - float: left; - margin-right: 20px; -} - -/* WIDE FIELDSETS */ - -.wide label { - width: 200px; -} - -form .wide p, -form .wide input + p.help, -form .wide input + div.help { - margin-left: 200px; -} - -form .wide p.help, -form .wide div.help { - padding-left: 38px; -} - -form div.help ul { - padding-left: 0; - margin-left: 0; -} - -.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { - width: 450px; -} - -/* COLLAPSED FIELDSETS */ - -fieldset.collapsed * { - display: none; -} - -fieldset.collapsed h2, fieldset.collapsed { - display: block; -} - -fieldset.collapsed { - border: 1px solid var(--hairline-color); - border-radius: 4px; - overflow: hidden; -} - -fieldset.collapsed h2 { - background: var(--darkened-bg); - color: var(--body-quiet-color); -} - -fieldset .collapse-toggle { - color: var(--header-link-color); -} - -fieldset.collapsed .collapse-toggle { - background: transparent; - display: inline; - color: var(--link-fg); -} - -/* MONOSPACE TEXTAREAS */ - -fieldset.monospace textarea { - font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; -} - -/* SUBMIT ROW */ - -.submit-row { - padding: 12px 14px; - margin: 0 0 20px; - background: var(--darkened-bg); - border: 1px solid var(--hairline-color); - border-radius: 4px; - text-align: right; - overflow: hidden; -} - -body.popup .submit-row { - overflow: auto; -} - -.submit-row input { - height: 35px; - line-height: 15px; - margin: 0 0 0 5px; -} - -.submit-row input.default { - margin: 0 0 0 8px; - text-transform: uppercase; -} - -.submit-row p { - margin: 0.3em; -} - -.submit-row p.deletelink-box { - float: left; - margin: 0; -} - -.submit-row a.deletelink { - display: block; - background: var(--delete-button-bg); - border-radius: 4px; - padding: 10px 15px; - height: 15px; - line-height: 15px; - color: var(--button-fg); -} - -.submit-row a.closelink { - display: inline-block; - background: var(--close-button-bg); - border-radius: 4px; - padding: 10px 15px; - height: 15px; - line-height: 15px; - margin: 0 0 0 5px; - 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); -} - -.submit-row a.closelink:focus, -.submit-row a.closelink:hover, -.submit-row a.closelink:active { - background: var(--close-button-hover-bg); -} - -/* 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; -} - -.vTextField, .vUUIDField { - width: 20em; -} - -.vIntegerField { - width: 5em; -} - -.vBigIntegerField { - width: 10em; -} - -.vForeignKeyRawIdAdminField { - width: 5em; -} - -/* 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 h3 { - margin: 0; - color: var(--body-quiet-color); - padding: 5px; - font-size: 13px; - background: var(--darkened-bg); - border-top: 1px solid var(--hairline-color); - border-bottom: 1px solid var(--hairline-color); -} - -.inline-related h3 span.delete { - float: right; -} - -.inline-related h3 span.delete label { - margin-left: 2px; - font-size: 11px; -} - -.inline-related fieldset { - margin: 0; - background: var(--body-bg); - border: none; - width: 100%; -} - -.inline-related fieldset.module h3 { - margin: 0; - padding: 2px 5px 3px 5px; - font-size: 11px; - text-align: left; - font-weight: bold; - background: #bcd; - color: var(--body-bg); -} - -.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: 9px; - font-weight: bold; - color: var(--body-quiet-color); - _width: 700px; -} - -.inline-group ul.tools { - padding: 0; - margin: 0; - list-style: none; -} - -.inline-group ul.tools li { - display: inline; - padding: 0 5px; -} - -.inline-group div.add-row, -.inline-group .tabular tr.add-row td { - color: var(--body-quiet-color); - background: var(--darkened-bg); - padding: 8px 10px; - border-bottom: 1px solid var(--hairline-color); -} - -.inline-group .tabular tr.add-row td { - padding: 8px 10px; - border-bottom: 1px solid var(--hairline-color); -} - -.inline-group ul.tools a.add, -.inline-group div.add-row a, -.inline-group .tabular tr.add-row td a { - background: url(../img/icon-addlink.svg) 0 1px no-repeat; - padding-left: 16px; - font-size: 12px; -} - -.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: 16px; - height: 16px; - 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/src/admin/css/login.css b/static/src/admin/css/login.css deleted file mode 100644 index bf4ba8d..0000000 --- a/static/src/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: 18px; - margin: 0; -} - -.login #header h1 a { - color: var(--header-link-color); -} - -.login #content { - padding: 20px 20px 0; -} - -.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/src/admin/css/nav_sidebar.css b/static/src/admin/css/nav_sidebar.css deleted file mode 100644 index 0c590ff..0000000 --- a/static/src/admin/css/nav_sidebar.css +++ /dev/null @@ -1,139 +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: 20px; - 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.shifted > #nav-sidebar { - margin-left: 0; -} - -[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); -} - -.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/src/admin/css/responsive.css b/static/src/admin/css/responsive.css deleted file mode 100644 index 5779c5a..0000000 --- a/static/src/admin/css/responsive.css +++ /dev/null @@ -1,1004 +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: 14px; - } - - .small { - font-size: 12px; - } - - /* Layout */ - - #container { - min-width: 0; - } - - #content { - padding: 20px 30px 30px; - } - - div.breadcrumbs { - padding: 10px 30px; - } - - /* Header */ - - #header { - flex-direction: column; - padding: 15px 30px; - justify-content: flex-start; - } - - #branding h1 { - margin: 0 0 8px; - font-size: 20px; - 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: 13px; - } - - /* Changelist */ - - #toolbar { - border: none; - padding: 15px; - } - - #changelist-search > div { - display: flex; - flex-wrap: nowrap; - max-width: 480px; - } - - #changelist-search label { - line-height: 22px; - } - - #toolbar form #searchbar { - flex: 1 0 auto; - width: 0; - height: 22px; - 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.selected { - border: none; - } - - #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: 11px; - 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: 14px; - } - - .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: 36px; - font-size: 14px; - } - - .form-row select { - height: 36px; - } - - .form-row select[multiple] { - height: auto; - min-height: 0; - } - - fieldset .fieldBox { - float: none; - margin: 0 -10px; - padding: 0 10px; - } - - 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; - } - - /* Related widget */ - - .related-widget-wrapper { - float: none; - } - - .related-widget-wrapper-link + .selector { - max-width: calc(100% - 30px); - margin-right: 15px; - } - - select + .related-widget-wrapper-link, - .related-widget-wrapper-link + .related-widget-wrapper-link { - margin-left: 10px; - } - - /* Selector */ - - .selector { - display: flex; - width: 100%; - } - - .selector .selector-filter { - display: flex; - align-items: center; - } - - .selector .selector-filter label { - margin: 0 8px 0 0; - } - - .selector .selector-filter input { - width: auto; - min-height: 0; - flex: 1 1; - } - - .selector-available, .selector-chosen { - width: auto; - flex: 1 1; - display: flex; - flex-direction: column; - } - - .selector select { - width: 100%; - flex: 1 0 auto; - margin-bottom: 5px; - } - - .selector ul.selector-chooser { - width: 26px; - height: 52px; - padding: 2px 0; - margin: auto 15px; - border-radius: 20px; - transform: translateY(-10px); - } - - .selector-add, .selector-remove { - width: 20px; - height: 20px; - background-size: 20px auto; - } - - .selector-add { - background-position: 0 -120px; - } - - .selector-remove { - background-position: 0 -80px; - } - - a.selector-chooseall, a.selector-clearall { - align-self: center; - } - - .stacked { - flex-direction: column; - max-width: 480px; - } - - .stacked > * { - flex: 0 1 auto; - } - - .stacked select { - margin-bottom: 0; - } - - .stacked .selector-available, .stacked .selector-chosen { - width: auto; - } - - .stacked ul.selector-chooser { - width: 52px; - height: 26px; - padding: 0 2px; - margin: 15px auto; - transform: none; - } - - .stacked .selector-chooser li { - padding: 3px; - } - - .stacked .selector-add, .stacked .selector-remove { - background-size: 20px auto; - } - - .stacked .selector-add { - background-position: 0 -40px; - } - - .stacked .active.selector-add { - background-position: 0 -40px; - } - - .active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -140px; - } - - .stacked .active.selector-add:focus, .stacked .active.selector-add:hover { - background-position: 0 -60px; - } - - .stacked .selector-remove { - background-position: 0 0; - } - - .stacked .active.selector-remove { - background-position: 0 0; - } - - .active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -100px; - } - - .stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover { - background-position: 0 -20px; - } - - .help-tooltip, .selector .help-icon { - display: none; - } - - form .form-row p.datetime { - width: 100%; - } - - .datetime input { - width: 50%; - max-width: 120px; - } - - .datetime span { - font-size: 13px; - } - - .datetime .timezonewarning { - display: block; - font-size: 11px; - 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 #branding h1 { - 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, #footer { - padding: 15px; - } - - #footer:empty { - padding: 0; - } - - 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: 16px; - } - - /* 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 { - display: flex; - flex-wrap: wrap; - max-width: 100vw; - } - - .aligned .form-row > div { - width: calc(100vw - 30px); - } - - textarea { - max-width: none; - } - - .vURLField { - width: auto; - } - - fieldset .fieldBox + .fieldBox { - margin-top: 15px; - padding-top: 15px; - } - - fieldset.collapsed .form-row { - display: none; - } - - .aligned label { - width: 100%; - 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 { - align-items: center; - } - - .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 { - margin-left: 0; - font-size: 13px; - } - - span.clearable-file-input { - margin-left: 15px; - } - - span.clearable-file-input label { - font-size: 13px; - 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 { - margin-left: 0; - padding-left: 0; - } - - form .aligned div.radiolist { - margin-top: 5px; - margin-right: 15px; - margin-bottom: -3px; - } - - form .aligned div.radiolist:not(.inline) div + div { - margin-top: 5px; - } - - /* Related widget */ - - .related-widget-wrapper { - width: 100%; - display: flex; - align-items: flex-start; - } - - .related-widget-wrapper .selector { - order: 1; - } - - .related-widget-wrapper > a { - order: 2; - } - - .related-widget-wrapper .radiolist ~ a { - align-self: flex-end; - } - - .related-widget-wrapper > select ~ a { - align-self: center; - } - - select + .related-widget-wrapper-link, - .related-widget-wrapper-link + .related-widget-wrapper-link { - margin-left: 15px; - } - - /* Selector */ - - .selector { - flex-direction: column; - } - - .selector > * { - float: none; - } - - .selector-available, .selector-chosen { - margin-bottom: 0; - flex: 1 1 auto; - } - - .selector select { - max-height: 96px; - } - - .selector ul.selector-chooser { - display: block; - float: none; - width: 52px; - height: 26px; - padding: 0 2px; - margin: 15px auto 20px; - transform: none; - } - - .selector ul.selector-chooser li { - float: left; - } - - .selector-remove { - background-position: 0 0; - } - - .active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -20px; - } - - .selector-add { - background-position: 0 -40px; - } - - .active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -60px; - } - - /* Inlines */ - - .inline-group[data-inline-type="stacked"] .inline-related { - border: 1px solid var(--hairline-color); - border-radius: 4px; - margin-top: 15px; - overflow: auto; - } - - .inline-group[data-inline-type="stacked"] .inline-related > * { - box-sizing: border-box; - } - - .inline-group[data-inline-type="stacked"] .inline-related .module { - padding: 0 10px; - } - - .inline-group[data-inline-type="stacked"] .inline-related .module .form-row { - border-top: 1px solid var(--hairline-color); - border-bottom: none; - } - - .inline-group[data-inline-type="stacked"] .inline-related .module .form-row:first-child { - border-top: none; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 { - padding: 10px; - border-top-width: 0; - border-bottom-width: 2px; - display: flex; - flex-wrap: wrap; - align-items: center; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 .inline_label { - margin-right: auto; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 span.delete { - float: none; - flex: 1 1 100%; - margin-top: 5px; - } - - .inline-group[data-inline-type="stacked"] .aligned .form-row > div:not([class]) { - width: 100%; - } - - .inline-group[data-inline-type="stacked"] .aligned label { - width: 100%; - } - - .inline-group[data-inline-type="stacked"] div.add-row { - margin-top: 15px; - border: 1px solid var(--hairline-color); - border-radius: 4px; - } - - .inline-group div.add-row, - .inline-group .tabular tr.add-row td { - padding: 0; - } - - .inline-group div.add-row a, - .inline-group .tabular tr.add-row td a { - display: block; - padding: 8px 10px 8px 26px; - background-position: 8px 9px; - } - - /* Submit row */ - - .submit-row { - padding: 10px 10px 0; - margin: 0 0 15px; - display: flex; - flex-direction: column; - } - - .submit-row > * { - width: 100%; - } - - .submit-row input, .submit-row input.default, .submit-row a, .submit-row a.closelink { - float: none; - margin: 0 0 10px; - text-align: center; - } - - .submit-row a.closelink { - padding: 10px 0; - } - - .submit-row p.deletelink-box { - order: 4; - } - - /* 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: 13px; - } - - /* 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: 12px; - line-height: 12px; - } - - .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: 13px; - word-break: break-word; - } - - table#change-history tbody th { - width: auto; - } - - /* Docs */ - - table.model tbody th, table.model tbody td { - font-size: 13px; - word-break: break-word; - } -} diff --git a/static/src/admin/css/responsive_rtl.css b/static/src/admin/css/responsive_rtl.css deleted file mode 100644 index 66d3c2f..0000000 --- a/static/src/admin/css/responsive_rtl.css +++ /dev/null @@ -1,80 +0,0 @@ -/* TABLETS */ - -@media (max-width: 1024px) { - [dir="rtl"] .colMS { - margin-right: 0; - } - - [dir="rtl"] #user-tools { - text-align: right; - } - - [dir="rtl"] #changelist .actions label { - padding-left: 10px; - padding-right: 0; - } - - [dir="rtl"] #changelist .actions select { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .change-list .filtered .results, - [dir="rtl"] .change-list .filtered .paginator, - [dir="rtl"] .filtered #toolbar, - [dir="rtl"] .filtered div.xfull, - [dir="rtl"] .filtered .actions, - [dir="rtl"] #changelist-filter { - margin-left: 0; - } - - [dir="rtl"] .inline-group ul.tools a.add, - [dir="rtl"] .inline-group div.add-row a, - [dir="rtl"] .inline-group .tabular tr.add-row td a { - padding: 8px 26px 8px 10px; - background-position: calc(100% - 8px) 9px; - } - - [dir="rtl"] .related-widget-wrapper-link + .selector { - margin-right: 0; - margin-left: 15px; - } - - [dir="rtl"] .selector .selector-filter label { - margin-right: 0; - margin-left: 8px; - } - - [dir="rtl"] .object-tools li { - float: right; - } - - [dir="rtl"] .object-tools li + li { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .dashboard .module table td a { - padding-left: 0; - padding-right: 16px; - } -} - -/* MOBILE */ - -@media (max-width: 767px) { - [dir="rtl"] .aligned .related-lookup, - [dir="rtl"] .aligned .datetimeshortcuts { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .aligned ul { - margin-right: 0; - } - - [dir="rtl"] #changelist-filter { - margin-left: 0; - margin-right: 0; - } -} diff --git a/static/src/admin/css/rtl.css b/static/src/admin/css/rtl.css deleted file mode 100644 index 0447f89..0000000 --- a/static/src/admin/css/rtl.css +++ /dev/null @@ -1,227 +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 { - 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; -} - -/* FORMS */ - -.aligned label { - padding: 0 0 3px 1em; - float: right; -} - -.submit-row { - text-align: left -} - -.submit-row p.deletelink-box { - float: right; -} - -.submit-row input.default { - margin-left: 0; -} - -.vDateField, .vTimeField { - margin-left: 2px; -} - -.aligned .form-row input { - margin-left: 5px; -} - -form .aligned p.help, form .aligned div.help { - clear: right; -} - -form .aligned ul { - margin-right: 163px; - margin-left: 0; -} - -form ul.inline li { - float: right; - padding-right: 0; - padding-left: 7px; -} - -input[type=submit].default, .submit-row input.default { - float: left; -} - -fieldset .fieldBox { - float: right; - 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; -} - -.calendarnav-next { - top: 0; - right: auto; - left: 10px; -} - -.calendar caption, .calendarbox h2 { - text-align: center; -} - -.selector { - float: right; -} - -.selector .selector-filter { - text-align: right; -} - -.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; -} diff --git a/static/src/admin/css/vendor/select2/LICENSE-SELECT2.md b/static/src/admin/css/vendor/select2/LICENSE-SELECT2.md deleted file mode 100644 index 8cb8a2b..0000000 --- a/static/src/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/src/admin/css/vendor/select2/select2.css b/static/src/admin/css/vendor/select2/select2.css deleted file mode 100644 index 750b320..0000000 --- a/static/src/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/src/admin/css/vendor/select2/select2.min.css b/static/src/admin/css/vendor/select2/select2.min.css deleted file mode 100644 index 7c18ad5..0000000 --- a/static/src/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/src/admin/css/widgets.css b/static/src/admin/css/widgets.css deleted file mode 100644 index c7d6456..0000000 --- a/static/src/admin/css/widgets.css +++ /dev/null @@ -1,574 +0,0 @@ -/* SELECTOR (FILTER INTERFACE) */ - -.selector { - width: 800px; - float: left; -} - -.selector select { - width: 380px; - height: 17.2em; -} - -.selector-available, .selector-chosen { - float: left; - width: 380px; - text-align: center; - margin-bottom: 5px; -} - -.selector-chosen select { - border-top: none; -} - -.selector-available h2, .selector-chosen h2 { - border: 1px solid var(--border-color); - border-radius: 4px 4px 0 0; -} - -.selector-chosen h2 { - background: var(--primary); - color: var(--header-link-color); -} - -.selector .selector-available h2 { - background: var(--darkened-bg); - color: var(--body-quiet-color); -} - -.selector .selector-filter { - border: 1px solid var(--border-color); - border-width: 0 1px; - padding: 8px; - color: var(--body-quiet-color); - font-size: 10px; - margin: 0; - text-align: left; -} - -.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; -} - -.selector .selector-available input { - width: 320px; - margin-left: 8px; -} - -.selector ul.selector-chooser { - float: left; - width: 22px; - background-color: var(--selected-bg); - border-radius: 10px; - margin: 10em 5px 0 5px; - padding: 0; -} - -.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-add, .selector-remove { - width: 16px; - height: 16px; - display: block; - text-indent: -3000px; - overflow: hidden; - cursor: default; - opacity: 0.55; -} - -.active.selector-add, .active.selector-remove { - opacity: 1; -} - -.active.selector-add:hover, .active.selector-remove:hover { - cursor: pointer; -} - -.selector-add { - background: url(../img/selector-icons.svg) 0 -96px no-repeat; -} - -.active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -112px; -} - -.selector-remove { - background: url(../img/selector-icons.svg) 0 -64px no-repeat; -} - -.active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -80px; -} - -a.selector-chooseall, a.selector-clearall { - display: inline-block; - height: 16px; - text-align: left; - margin: 1px auto 3px; - overflow: hidden; - font-weight: bold; - line-height: 16px; - color: var(--body-quiet-color); - text-decoration: none; - opacity: 0.55; -} - -a.active.selector-chooseall:focus, a.active.selector-clearall:focus, -a.active.selector-chooseall:hover, a.active.selector-clearall:hover { - color: var(--link-fg); -} - -a.active.selector-chooseall, a.active.selector-clearall { - opacity: 1; -} - -a.active.selector-chooseall:hover, a.active.selector-clearall:hover { - cursor: pointer; -} - -a.selector-chooseall { - padding: 0 18px 0 0; - background: url(../img/selector-icons.svg) right -160px no-repeat; - cursor: default; -} - -a.active.selector-chooseall:focus, a.active.selector-chooseall:hover { - background-position: 100% -176px; -} - -a.selector-clearall { - padding: 0 0 0 18px; - background: url(../img/selector-icons.svg) 0 -128px no-repeat; - cursor: default; -} - -a.active.selector-clearall:focus, a.active.selector-clearall:hover { - background-position: 0 -144px; -} - -/* STACKED SELECTORS */ - -.stacked { - float: left; - width: 490px; -} - -.stacked select { - width: 480px; - height: 10.1em; -} - -.stacked .selector-available, .stacked .selector-chosen { - width: 480px; -} - -.stacked .selector-available { - margin-bottom: 0; -} - -.stacked .selector-available input { - width: 422px; -} - -.stacked ul.selector-chooser { - height: 22px; - width: 50px; - margin: 0 0 10px 40%; - background-color: #eee; - border-radius: 10px; -} - -.stacked .selector-chooser li { - float: left; - padding: 3px 3px 3px 5px; -} - -.stacked .selector-chooseall, .stacked .selector-clearall { - display: none; -} - -.stacked .selector-add { - background: url(../img/selector-icons.svg) 0 -32px no-repeat; - cursor: default; -} - -.stacked .active.selector-add { - background-position: 0 -32px; - cursor: pointer; -} - -.stacked .active.selector-add:focus, .stacked .active.selector-add:hover { - background-position: 0 -48px; - cursor: pointer; -} - -.stacked .selector-remove { - background: url(../img/selector-icons.svg) 0 0 no-repeat; - cursor: default; -} - -.stacked .active.selector-remove { - background-position: 0 0px; - cursor: pointer; -} - -.stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover { - background-position: 0 -16px; - cursor: pointer; -} - -.selector .help-icon { - background: url(../img/icon-unknown.svg) 0 0 no-repeat; - display: inline-block; - vertical-align: middle; - margin: -2px 0 0 2px; - width: 13px; - height: 13px; -} - -.selector .selector-chosen .help-icon { - background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat; -} - -.selector .search-label-icon { - background: url(../img/search.svg) 0 0 no-repeat; - display: inline-block; - height: 18px; - width: 18px; -} - -/* 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: 11px; - 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: 11px; - margin-left: 0; - padding-left: 0; -} - -.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon { - position: relative; - display: inline-block; - vertical-align: middle; - height: 16px; - width: 16px; - overflow: hidden; -} - -.datetimeshortcuts .clock-icon { - background: url(../img/icon-clock.svg) 0 0 no-repeat; -} - -.datetimeshortcuts a:focus .clock-icon, -.datetimeshortcuts a:hover .clock-icon { - background-position: 0 -16px; -} - -.datetimeshortcuts .date-icon { - background: url(../img/icon-calendar.svg) 0 0 no-repeat; - top: -1px; -} - -.datetimeshortcuts a:focus .date-icon, -.datetimeshortcuts a:hover .date-icon { - background-position: 0 -16px; -} - -.timezonewarning { - font-size: 11px; - color: var(--body-quiet-color); -} - -/* URL */ - -p.url { - line-height: 20px; - margin: 0; - padding: 0; - color: var(--body-quiet-color); - font-size: 11px; - 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: 11px; - font-weight: bold; -} - -.aligned p.file-upload { - margin-left: 170px; -} - -.file-upload a { - font-weight: normal; -} - -.file-upload .deletelink { - margin-left: 5px; -} - -span.clearable-file-input label { - color: var(--body-fg); - font-size: 11px; - display: inline; - float: none; -} - -/* CALENDARS & CLOCKS */ - -.calendarbox, .clockbox { - margin: 5px auto; - font-size: 12px; - 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: 12px; - 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: 12px; - text-align: center; - color: var(--body-quiet-color); -} - -.calendar td { - font-weight: 400; - font-size: 12px; - text-align: center; - padding: 0; - border-top: 1px solid var(--hairline-color); - border-bottom: none; -} - -.calendar td.selected a { - background: var(--primary); - 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: 10px; - 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: 11px; - line-height: 11px; - 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; -} - -.calendarbox .calendarnav-previous:focus, -.calendarbox .calendarnav-previous:hover { - background-position: 0 -15px; -} - -.calendarnav-next { - right: 10px; - background: url(../img/calendar-icons.svg) 0 -30px no-repeat; -} - -.calendarbox .calendarnav-next:focus, -.calendarbox .calendarnav-next:hover { - background-position: 0 -45px; -} - -.calendar-cancel { - margin: 0; - padding: 4px 0; - font-size: 12px; - background: #eee; - border-top: 1px solid var(--border-color); - color: var(--body-fg); -} - -.calendar-cancel:focus, .calendar-cancel:hover { - background: #ddd; -} - -.calendar-cancel a { - color: black; - display: block; -} - -ul.timelist, .timelist li { - list-style-type: none; - margin: 0; - padding: 0; -} - -.timelist a { - padding: 2px; -} - -/* EDIT INLINE */ - -.inline-deletelink { - float: right; - text-indent: -9999px; - background: url(../img/inline-delete.svg) 0 0 no-repeat; - width: 16px; - height: 16px; - border: 0px none; -} - -.inline-deletelink:focus, .inline-deletelink:hover { - cursor: pointer; -} - -/* RELATED WIDGET WRAPPER */ -.related-widget-wrapper { - float: left; /* display properly in form rows with multiple fields */ - overflow: hidden; /* clear floated contents */ -} - -.related-widget-wrapper-link { - opacity: 0.3; -} - -.related-widget-wrapper-link:link { - opacity: .8; -} - -.related-widget-wrapper-link:link:focus, -.related-widget-wrapper-link:link:hover { - opacity: 1; -} - -select + .related-widget-wrapper-link, -.related-widget-wrapper-link + .related-widget-wrapper-link { - margin-left: 7px; -} diff --git a/static/src/admin/fonts/LICENSE.txt b/static/src/admin/fonts/LICENSE.txt deleted file mode 100644 index d645695..0000000 --- a/static/src/admin/fonts/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/static/src/admin/fonts/README.txt b/static/src/admin/fonts/README.txt deleted file mode 100644 index b247bef..0000000 --- a/static/src/admin/fonts/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -Roboto webfont source: https://www.google.com/fonts/specimen/Roboto -WOFF files extracted using https://github.com/majodev/google-webfonts-helper -Weights used in this project: Light (300), Regular (400), Bold (700) diff --git a/static/src/admin/fonts/Roboto-Bold-webfont.woff b/static/src/admin/fonts/Roboto-Bold-webfont.woff deleted file mode 100644 index 6e0f56267035c2321ca6b590adcfc0fc93b7dc51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86184 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 diff --git a/static/src/admin/fonts/Roboto-Light-webfont.woff b/static/src/admin/fonts/Roboto-Light-webfont.woff deleted file mode 100644 index b9e99185c8300c786fa77a0490fefdd26ab2e99e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85692 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

-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 z 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 WsO{O{pqkviFa7yR{$QEVNelpC{qWcT diff --git a/static/src/admin/img/LICENSE b/static/src/admin/img/LICENSE deleted file mode 100644 index a4faaa1..0000000 --- a/static/src/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/src/admin/img/README.txt b/static/src/admin/img/README.txt deleted file mode 100644 index 4eb2e49..0000000 --- a/static/src/admin/img/README.txt +++ /dev/null @@ -1,7 +0,0 @@ -All icons are taken from Font Awesome (http://fontawesome.io/) 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/src/admin/img/calendar-icons.svg b/static/src/admin/img/calendar-icons.svg deleted file mode 100644 index dbf21c3..0000000 --- a/static/src/admin/img/calendar-icons.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/static/src/admin/img/gis/move_vertex_off.svg b/static/src/admin/img/gis/move_vertex_off.svg deleted file mode 100644 index 228854f..0000000 --- a/static/src/admin/img/gis/move_vertex_off.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/src/admin/img/gis/move_vertex_on.svg b/static/src/admin/img/gis/move_vertex_on.svg deleted file mode 100644 index 96b87fd..0000000 --- a/static/src/admin/img/gis/move_vertex_on.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/src/admin/img/icon-addlink.svg b/static/src/admin/img/icon-addlink.svg deleted file mode 100644 index e004fb1..0000000 --- a/static/src/admin/img/icon-addlink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/src/admin/img/icon-alert.svg b/static/src/admin/img/icon-alert.svg deleted file mode 100644 index e51ea83..0000000 --- a/static/src/admin/img/icon-alert.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/src/admin/img/icon-calendar.svg b/static/src/admin/img/icon-calendar.svg deleted file mode 100644 index 97910a9..0000000 --- a/static/src/admin/img/icon-calendar.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/static/src/admin/img/icon-changelink.svg b/static/src/admin/img/icon-changelink.svg deleted file mode 100644 index bbb137a..0000000 --- a/static/src/admin/img/icon-changelink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/src/admin/img/icon-clock.svg b/static/src/admin/img/icon-clock.svg deleted file mode 100644 index bf9985d..0000000 --- a/static/src/admin/img/icon-clock.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/static/src/admin/img/icon-deletelink.svg b/static/src/admin/img/icon-deletelink.svg deleted file mode 100644 index 4059b15..0000000 --- a/static/src/admin/img/icon-deletelink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/src/admin/img/icon-no.svg b/static/src/admin/img/icon-no.svg deleted file mode 100644 index 2e0d383..0000000 --- a/static/src/admin/img/icon-no.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/src/admin/img/icon-unknown-alt.svg b/static/src/admin/img/icon-unknown-alt.svg deleted file mode 100644 index 1c6b99f..0000000 --- a/static/src/admin/img/icon-unknown-alt.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/src/admin/img/icon-unknown.svg b/static/src/admin/img/icon-unknown.svg deleted file mode 100644 index 50b4f97..0000000 --- a/static/src/admin/img/icon-unknown.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/src/admin/img/icon-viewlink.svg b/static/src/admin/img/icon-viewlink.svg deleted file mode 100644 index a1ca1d3..0000000 --- a/static/src/admin/img/icon-viewlink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/src/admin/img/icon-yes.svg b/static/src/admin/img/icon-yes.svg deleted file mode 100644 index 5883d87..0000000 --- a/static/src/admin/img/icon-yes.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/src/admin/img/inline-delete.svg b/static/src/admin/img/inline-delete.svg deleted file mode 100644 index 17d1ad6..0000000 --- a/static/src/admin/img/inline-delete.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/src/admin/img/search.svg b/static/src/admin/img/search.svg deleted file mode 100644 index c8c69b2..0000000 --- a/static/src/admin/img/search.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/src/admin/img/selector-icons.svg b/static/src/admin/img/selector-icons.svg deleted file mode 100644 index 926b8e2..0000000 --- a/static/src/admin/img/selector-icons.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/src/admin/img/sorting-icons.svg b/static/src/admin/img/sorting-icons.svg deleted file mode 100644 index 7c31ec9..0000000 --- a/static/src/admin/img/sorting-icons.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/static/src/admin/img/tooltag-add.svg b/static/src/admin/img/tooltag-add.svg deleted file mode 100644 index 1ca64ae..0000000 --- a/static/src/admin/img/tooltag-add.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/src/admin/img/tooltag-arrowright.svg b/static/src/admin/img/tooltag-arrowright.svg deleted file mode 100644 index b664d61..0000000 --- a/static/src/admin/img/tooltag-arrowright.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/static/src/admin/js/SelectBox.js b/static/src/admin/js/SelectBox.js deleted file mode 100644 index ace6d9d..0000000 --- a/static/src/admin/js/SelectBox.js +++ /dev/null @@ -1,112 +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); - }, - 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/src/admin/js/SelectFilter2.js b/static/src/admin/js/SelectFilter2.js deleted file mode 100644 index 6c709a0..0000000 --- a/static/src/admin/js/SelectFilter2.js +++ /dev/null @@ -1,236 +0,0 @@ -/*global SelectBox, gettext, interpolate, quickElement, SelectFilter*/ -/* -SelectFilter2 - Turns a multiple-select box into a filter interface. - -Requires core.js and SelectBox.js. -*/ -'use strict'; -{ - window.SelectFilter = { - init: function(field_id, field_name, is_stacked) { - if (field_id.match(/__prefix__/)) { - // Don't initialize on empty forms. - return; - } - const from_box = document.getElementById(field_id); - from_box.id += '_from'; // change its ID - from_box.className = 'filtered'; - - for (const p of from_box.parentNode.getElementsByTagName('p')) { - if (p.classList.contains("info")) { - // Remove

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

or
- const selector_div = quickElement('div', from_box.parentNode); - selector_div.className = is_stacked ? 'selector stacked' : 'selector'; - - //
- const selector_available = quickElement('div', selector_div); - selector_available.className = 'selector-available'; - const title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name])); - quickElement( - 'span', title_available, '', - 'class', 'help help-tooltip help-icon', - 'title', interpolate( - gettext( - 'This is the list of available %s. You may choose some by ' + - 'selecting them in the box below and then clicking the ' + - '"Choose" arrow between the two boxes.' - ), - [field_name] - ) - ); - - const filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); - filter_p.className = 'selector-filter'; - - const search_filter_label = quickElement('label', filter_p, '', 'for', field_id + '_input'); - - quickElement( - 'span', search_filter_label, '', - 'class', 'help-tooltip search-label-icon', - 'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name]) - ); - - filter_p.appendChild(document.createTextNode(' ')); - - const filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter")); - filter_input.id = field_id + '_input'; - - selector_available.appendChild(from_box); - const choose_all = quickElement('a', selector_available, gettext('Choose all'), 'title', interpolate(gettext('Click to choose all %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_add_all_link'); - choose_all.className = 'selector-chooseall'; - - //
    - const selector_chooser = quickElement('ul', selector_div); - selector_chooser.className = 'selector-chooser'; - const add_link = quickElement('a', quickElement('li', selector_chooser), gettext('Choose'), 'title', gettext('Choose'), 'href', '#', 'id', field_id + '_add_link'); - add_link.className = 'selector-add'; - const remove_link = quickElement('a', quickElement('li', selector_chooser), gettext('Remove'), 'title', gettext('Remove'), 'href', '#', 'id', field_id + '_remove_link'); - remove_link.className = 'selector-remove'; - - //
    - const selector_chosen = quickElement('div', selector_div); - selector_chosen.className = 'selector-chosen'; - const title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name])); - quickElement( - 'span', title_chosen, '', - 'class', 'help help-tooltip help-icon', - 'title', interpolate( - gettext( - 'This is the list of chosen %s. You may remove some by ' + - 'selecting them in the box below and then clicking the ' + - '"Remove" arrow between the two boxes.' - ), - [field_name] - ) - ); - - const to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', '', 'size', from_box.size, 'name', from_box.name); - to_box.className = 'filtered'; - const clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_remove_all_link'); - clear_all.className = 'selector-clearall'; - - from_box.name = from_box.name + '_old'; - - // Set up the JavaScript event handlers for the select box filter interface - const move_selection = function(e, elem, move_func, from, to) { - if (elem.classList.contains('active')) { - move_func(from, to); - SelectFilter.refresh_icons(field_id); - } - e.preventDefault(); - }; - choose_all.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move_all, field_id + '_from', field_id + '_to'); - }); - add_link.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move, field_id + '_from', field_id + '_to'); - }); - remove_link.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move, field_id + '_to', field_id + '_from'); - }); - clear_all.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move_all, field_id + '_to', field_id + '_from'); - }); - filter_input.addEventListener('keypress', function(e) { - SelectFilter.filter_key_press(e, field_id); - }); - filter_input.addEventListener('keyup', function(e) { - SelectFilter.filter_key_up(e, field_id); - }); - filter_input.addEventListener('keydown', function(e) { - SelectFilter.filter_key_down(e, field_id); - }); - 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.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'); - - if (!is_stacked) { - // In horizontal mode, give the same height to the two boxes. - const j_from_box = document.getElementById(field_id + '_from'); - const j_to_box = document.getElementById(field_id + '_to'); - let height = filter_p.offsetHeight + j_from_box.offsetHeight; - - const j_to_box_style = window.getComputedStyle(j_to_box); - if (j_to_box_style.getPropertyValue('box-sizing') === 'border-box') { - // Add the padding and border to the final height. - height += parseInt(j_to_box_style.getPropertyValue('padding-top'), 10) - + parseInt(j_to_box_style.getPropertyValue('padding-bottom'), 10) - + parseInt(j_to_box_style.getPropertyValue('border-top-width'), 10) - + parseInt(j_to_box_style.getPropertyValue('border-bottom-width'), 10); - } - - j_to_box.style.height = height + 'px'; - } - - // 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_icons: function(field_id) { - const from = document.getElementById(field_id + '_from'); - const to = document.getElementById(field_id + '_to'); - // Active if at least one item is selected - document.getElementById(field_id + '_add_link').classList.toggle('active', SelectFilter.any_selected(from)); - document.getElementById(field_id + '_remove_link').classList.toggle('active', SelectFilter.any_selected(to)); - // Active if the corresponding box isn't empty - document.getElementById(field_id + '_add_all_link').classList.toggle('active', from.querySelector('option')); - document.getElementById(field_id + '_remove_all_link').classList.toggle('active', to.querySelector('option')); - }, - filter_key_press: function(event, field_id) { - const from = document.getElementById(field_id + '_from'); - // don't submit form if user pressed Enter - if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) { - from.selectedIndex = 0; - SelectBox.move(field_id + '_from', field_id + '_to'); - from.selectedIndex = 0; - event.preventDefault(); - } - }, - filter_key_up: function(event, field_id) { - const from = document.getElementById(field_id + '_from'); - const temp = from.selectedIndex; - SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value); - from.selectedIndex = temp; - }, - filter_key_down: function(event, field_id) { - const from = document.getElementById(field_id + '_from'); - // right arrow -- move across - if ((event.which && event.which === 39) || (event.keyCode && event.keyCode === 39)) { - const old_index = from.selectedIndex; - SelectBox.move(field_id + '_from', field_id + '_to'); - from.selectedIndex = (old_index === from.length) ? from.length - 1 : old_index; - return; - } - // down arrow -- wrap around - if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) { - from.selectedIndex = (from.length === from.selectedIndex + 1) ? 0 : from.selectedIndex + 1; - } - // up arrow -- wrap around - if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) { - from.selectedIndex = (from.selectedIndex === 0) ? from.length - 1 : from.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/src/admin/js/actions.js b/static/src/admin/js/actions.js deleted file mode 100644 index 20a5c14..0000000 --- a/static/src/admin/js/actions.js +++ /dev/null @@ -1,201 +0,0 @@ -/*global gettext, interpolate, ngettext*/ -'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(); - } - } - }); - } - }; - - // 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/src/admin/js/admin/DateTimeShortcuts.js b/static/src/admin/js/admin/DateTimeShortcuts.js deleted file mode 100644 index 9bad0f5..0000000 --- a/static/src/admin/js/admin/DateTimeShortcuts.js +++ /dev/null @@ -1,415 +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('span'); - warning.className = warningClass; - warning.textContent = message; - inp.parentNode.appendChild(document.createElement('br')); - 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) { - let format = get_format('DATE_INPUT_FORMATS')[0]; - // the format needs to be escaped a little - format = format.replace('\\', '\\\\') - .replace('\r', '\\r') - .replace('\n', '\\n') - .replace('\t', '\\t') - .replace("'", "\\'"); - 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/src/admin/js/admin/RelatedObjectLookups.js b/static/src/admin/js/admin/RelatedObjectLookups.js deleted file mode 100644 index 289e1ce..0000000 --- a/static/src/admin/js/admin/RelatedObjectLookups.js +++ /dev/null @@ -1,155 +0,0 @@ -/*global SelectBox, interpolate*/ -// Handles related-objects functionality: lookup link for raw_id_fields -// and Add Another links. -'use strict'; -{ - const $ = django.jQuery; - - function showAdminPopup(triggeringLink, name_regexp, add_popup) { - const name = 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'); - win.focus(); - return false; - } - - function showRelatedObjectLookupPopup(triggeringLink) { - return showAdminPopup(triggeringLink, /^lookup_/, true); - } - - function dismissRelatedLookupPopup(win, chosenId) { - const name = win.name; - const elem = document.getElementById(name); - if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { - elem.value += ',' + chosenId; - } else { - document.getElementById(name).value = chosenId; - } - 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)); - }); - } else { - siblings.removeAttr('href'); - } - } - - function dismissAddRelatedObjectPopup(win, newId, newRepr) { - const name = 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); - } else if (elemName === 'INPUT') { - if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { - elem.value += ',' + newId; - } else { - elem.value = newId; - } - } - // Trigger a change event to update related links if required. - $(elem).trigger('change'); - } else { - const toId = name + "_to"; - const o = new Option(newRepr, newId); - SelectBox.add_to_cache(toId, o); - SelectBox.redisplay(toId); - } - win.close(); - } - - function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { - const id = 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; - } - }); - 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; - }); - win.close(); - } - - function dismissDeleteRelatedObjectPopup(win, objId) { - const id = 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'); - win.close(); - } - - window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; - window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; - window.showRelatedObjectPopup = showRelatedObjectPopup; - window.updateRelatedObjectLinks = updateRelatedObjectLinks; - window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; - window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; - window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; - - // Kept for backward compatibility - window.showAddAnotherPopup = showRelatedObjectPopup; - window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; - - $(document).ready(function() { - $("a[data-popup-opener]").on('click', function(event) { - event.preventDefault(); - opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); - }); - $('body').on('click', '.related-widget-wrapper-link', 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/src/admin/js/autocomplete.js b/static/src/admin/js/autocomplete.js deleted file mode 100644 index 6095abe..0000000 --- a/static/src/admin/js/autocomplete.js +++ /dev/null @@ -1,35 +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).on('formset:added', (function() { - return function(event, $newFormset) { - return $newFormset.find('.admin-autocomplete').djangoAdminSelect2(); - }; - })(this)); -} diff --git a/static/src/admin/js/calendar.js b/static/src/admin/js/calendar.js deleted file mode 100644 index a62d10a..0000000 --- a/static/src/admin/js/calendar.js +++ /dev/null @@ -1,221 +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: [ - 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.daysOfWeek[(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/src/admin/js/cancel.js b/static/src/admin/js/cancel.js deleted file mode 100644 index 3069c6f..0000000 --- a/static/src/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/src/admin/js/change_form.js b/static/src/admin/js/change_form.js deleted file mode 100644 index 96a4c62..0000000 --- a/static/src/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/src/admin/js/collapse.js b/static/src/admin/js/collapse.js deleted file mode 100644 index c6c7b0f..0000000 --- a/static/src/admin/js/collapse.js +++ /dev/null @@ -1,43 +0,0 @@ -/*global gettext*/ -'use strict'; -{ - window.addEventListener('load', function() { - // Add anchor tag for Show/Hide link - const fieldsets = document.querySelectorAll('fieldset.collapse'); - for (const [i, elem] of fieldsets.entries()) { - // Don't hide if fields in this fieldset have errors - if (elem.querySelectorAll('div.errors, ul.errorlist').length === 0) { - elem.classList.add('collapsed'); - const h2 = elem.querySelector('h2'); - const link = document.createElement('a'); - link.id = 'fieldsetcollapser' + i; - link.className = 'collapse-toggle'; - link.href = '#'; - link.textContent = gettext('Show'); - h2.appendChild(document.createTextNode(' (')); - h2.appendChild(link); - h2.appendChild(document.createTextNode(')')); - } - } - // Add toggle to hide/show anchor tag - const toggleFunc = function(ev) { - if (ev.target.matches('.collapse-toggle')) { - ev.preventDefault(); - ev.stopPropagation(); - const fieldset = ev.target.closest('fieldset'); - if (fieldset.classList.contains('collapsed')) { - // Show - ev.target.textContent = gettext('Hide'); - fieldset.classList.remove('collapsed'); - } else { - // Hide - ev.target.textContent = gettext('Show'); - fieldset.classList.add('collapsed'); - } - } - }; - document.querySelectorAll('fieldset.module').forEach(function(el) { - el.addEventListener('click', toggleFunc); - }); - }); -} diff --git a/static/src/admin/js/core.js b/static/src/admin/js/core.js deleted file mode 100644 index afdae28..0000000 --- a/static/src/admin/js/core.js +++ /dev/null @@ -1,170 +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.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 = { - 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 = result + fields[format.charAt(i + 1)]; - ++i; - } - else { - result = 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/src/admin/js/inlines.js b/static/src/admin/js/inlines.js deleted file mode 100644 index d9a9032..0000000 --- a/static/src/admin/js/inlines.js +++ /dev/null @@ -1,344 +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); - } - $(document).trigger('formset:added', [row, 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).trigger('formset:removed', [row, 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) { - dependencies.push('#' + row.find('.form-row .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", - 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/src/admin/js/jquery.init.js b/static/src/admin/js/jquery.init.js deleted file mode 100644 index f40b27f..0000000 --- a/static/src/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/src/admin/js/nav_sidebar.js b/static/src/admin/js/nav_sidebar.js deleted file mode 100644 index 86cb1cf..0000000 --- a/static/src/admin/js/nav_sidebar.js +++ /dev/null @@ -1,93 +0,0 @@ -'use strict'; -{ - const toggleNavSidebar = document.getElementById('toggle-nav-sidebar'); - if (toggleNavSidebar !== null) { - const navLinks = document.querySelectorAll('#nav-sidebar a'); - function disableNavLinkTabbing() { - for (const navLink of navLinks) { - navLink.tabIndex = -1; - } - } - function enableNavLinkTabbing() { - for (const navLink of navLinks) { - navLink.tabIndex = 0; - } - } - - const main = document.getElementById('main'); - let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen'); - if (navSidebarIsOpen === null) { - navSidebarIsOpen = 'true'; - } - if (navSidebarIsOpen === 'false') { - disableNavLinkTabbing(); - } - main.classList.toggle('shifted', navSidebarIsOpen === 'true'); - - toggleNavSidebar.addEventListener('click', function() { - if (navSidebarIsOpen === 'true') { - navSidebarIsOpen = 'false'; - disableNavLinkTabbing(); - } else { - navSidebarIsOpen = 'true'; - enableNavLinkTabbing(); - } - localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen); - main.classList.toggle('shifted'); - }); - } - - 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/src/admin/js/popup_response.js b/static/src/admin/js/popup_response.js deleted file mode 100644 index 2b1d3dd..0000000 --- a/static/src/admin/js/popup_response.js +++ /dev/null @@ -1,16 +0,0 @@ -/*global opener */ -'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/src/admin/js/prepopulate.js b/static/src/admin/js/prepopulate.js deleted file mode 100644 index 89e95ab..0000000 --- a/static/src/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/src/admin/js/prepopulate_init.js b/static/src/admin/js/prepopulate_init.js deleted file mode 100644 index 72ebdcf..0000000 --- a/static/src/admin/js/prepopulate_init.js +++ /dev/null @@ -1,11 +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).addClass('prepopulated_field'); - $(field.id).data('dependency_list', field.dependency_list).prepopulate( - field.dependency_ids, field.maxLength, field.allowUnicode - ); - }); -} diff --git a/static/src/admin/js/urlify.js b/static/src/admin/js/urlify.js deleted file mode 100644 index 61dedb2..0000000 --- a/static/src/admin/js/urlify.js +++ /dev/null @@ -1,170 +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 - s = s.replace(/-+$/g, ''); // trim any trailing hyphens - return s; - } - window.URLify = URLify; -} diff --git a/static/src/admin/js/vendor/jquery/LICENSE.txt b/static/src/admin/js/vendor/jquery/LICENSE.txt deleted file mode 100644 index f642c3f..0000000 --- a/static/src/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/src/admin/js/vendor/jquery/jquery.js b/static/src/admin/js/vendor/jquery/jquery.js deleted file mode 100644 index fc6c299..0000000 --- a/static/src/admin/js/vendor/jquery/jquery.js +++ /dev/null @@ -1,10881 +0,0 @@ -/*! - * jQuery JavaScript Library v3.6.0 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright OpenJS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2021-03-02T17:08Z - */ -( 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 #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.6.0", - - // 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; - }, - - // 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 ); - }, - - // 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; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.6 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2021-02-16 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // 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: http://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" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = 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" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://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; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - 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 - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( 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; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// 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: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( 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, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - 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 ) || rcombinators.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. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } 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( rtrim, "$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 Issue #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 Sizzle - * @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; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "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 - /* jshint -W018 */ - 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 Sizzle 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; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, 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; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // 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 ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // 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 ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // 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" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // 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 + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // 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: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - 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 && - 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 && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( 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 Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.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 contains( context, elem ); -}; - -Sizzle.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 (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = 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 += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // 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 ] ) { - Sizzle.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 ] ) { - Sizzle.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 nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "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 = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "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, uniqueCache, 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 ? - node.nodeName.toLowerCase() === 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 - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ 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 ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ 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 ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ 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 - // http://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() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle 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( 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( rtrim, "$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 (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( 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." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.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 === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || 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 - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://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 ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // 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 = argument < 0 ? - argument + length : - argument > length ? - length : - 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(); - -tokenize = Sizzle.tokenize = function( 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 = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - 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 - return parseOnly ? - soFar.length : - soFar ? - Sizzle.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, uniqueCache, 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 ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ 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 - uniqueCache[ 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++ ) { - Sizzle( 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, - 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, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // 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( 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( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #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( rtrim, "$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: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - 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 ) ) { - results.push( 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 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( 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 Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( 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 - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// 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; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -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; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -} -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 (#9521) - // Strict HTML recognition (#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 Sizzle - 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.stackTrace ); - } - - // 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 stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = 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$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // 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, stack ); - } -}; - - - - -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 #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 (#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 #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 (#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 (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#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 (#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 (#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 (#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; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -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 (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #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 (#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", returnTrue ); - } - - // 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, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - 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 notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // 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 - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - - // Support: Chrome 86+ - // In Chrome, if an element having a focusout handler is blurred by - // clicking outside of it, it invokes the handler synchronously. If - // that handler calls `.remove()` on the element, the data is cleared, - // leaving `result` undefined. We need to guard against this. - return result && result.value; - } - - // 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.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -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 (#504, #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 ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // 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; - }, - - // Suppress native focus or blur as it's already being fired - // in leverageNative. - _default: function() { - return true; - }, - - delegateType: delegateType - }; -} ); - -// 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 (#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; - - // Reenable 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 { - 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 Sizzle 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 getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #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 (#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 = "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, - - // 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, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - 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]).+)/, - rcustomProp = /^--/, - 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; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += 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; -} - -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, - "columnCount": true, - "fillOpacity": 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, - "widows": true, - "zIndex": true, - "zoom": 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 (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#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 )` (#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. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -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 - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#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 classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( 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 (#14686, #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 (#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 - - -support.focusin = "onfocusin" in window; - - -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 (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#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 (#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 ); - } - } -} ); - - -// 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 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -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 - 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, - - // #7653, #8125, #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 (#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 #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 (#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 #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 (#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; - - // #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 (#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 - // #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 #8605, #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 ) { - - // #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( "