From 1b61a447eda409be774e20feb1c6f23253bdb7d9 Mon Sep 17 00:00:00 2001 From: Ayush Patel Date: Sat, 20 Feb 2021 20:58:28 +0530 Subject: [PATCH 1/2] start --- Team#23 - 5/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Team#23 - 5/README.md diff --git a/Team#23 - 5/README.md b/Team#23 - 5/README.md new file mode 100644 index 0000000..0f293f5 --- /dev/null +++ b/Team#23 - 5/README.md @@ -0,0 +1 @@ +Team 23 \ No newline at end of file From 5444631f7ac5e30bea6dec6c8fc2f6a359a552b9 Mon Sep 17 00:00:00 2001 From: Darshan Hande Date: Sun, 21 Feb 2021 00:53:52 +0530 Subject: [PATCH 2/2] added frontend --- Team#23 - 5/README.md | 12 +- Team#23 - 5/css/main.css | 981 ++ Team#23 - 5/images/marshmello.jpg | Bin 0 -> 116115 bytes Team#23 - 5/index.html | 31 + Team#23 - 5/js/extention/choices.js | 6207 ++++++++ .../js/extention/custom-materialize.js | 12373 ++++++++++++++++ Team#23 - 5/js/extention/flatpickr.js | 4 + Team#23 - 5/js/main.js | 2 + 8 files changed, 19609 insertions(+), 1 deletion(-) create mode 100644 Team#23 - 5/css/main.css create mode 100644 Team#23 - 5/images/marshmello.jpg create mode 100644 Team#23 - 5/index.html create mode 100644 Team#23 - 5/js/extention/choices.js create mode 100644 Team#23 - 5/js/extention/custom-materialize.js create mode 100644 Team#23 - 5/js/extention/flatpickr.js create mode 100644 Team#23 - 5/js/main.js diff --git a/Team#23 - 5/README.md b/Team#23 - 5/README.md index 0f293f5..7427025 100644 --- a/Team#23 - 5/README.md +++ b/Team#23 - 5/README.md @@ -1 +1,11 @@ -Team 23 \ No newline at end of file +Team 23 + +Theme - 5. Entertainment + +A website where users can view the lyrics and details of popular songs by searching them. Search by song name, artist name, album name, it will display the lyrics of the songs related to the searched keyword. So no more humming the lyrics! + + +References: + +Frontend search bar template : https://colorlib.com/wp/bootstrap-search-bar/ + diff --git a/Team#23 - 5/css/main.css b/Team#23 - 5/css/main.css new file mode 100644 index 0000000..0442ce4 --- /dev/null +++ b/Team#23 - 5/css/main.css @@ -0,0 +1,981 @@ +html { + line-height: 1.15; + /* 1 */ + -ms-text-size-adjust: 100%; + /* 2 */ + -webkit-text-size-adjust: 100%; + /* 2 */ +} + +/* Sections + ========================================================================== */ +/** + * Remove the margin in all browsers (opinionated). + */ +body { + margin: 0; +} + +/** + * Add the correct display in IE 9-. + */ +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ +/** + * Add the correct display in IE 9-. + * 1. Add the correct display in IE. + */ +figcaption, +figure, +main { + /* 1 */ + display: block; +} + +/** + * Add the correct margin in IE 8. + */ +figure { + margin: 1em 40px; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +hr { + box-sizing: content-box; + /* 1 */ + height: 0; + /* 1 */ + overflow: visible; + /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +pre { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ +a { + background-color: transparent; + /* 1 */ + -webkit-text-decoration-skip: objects; + /* 2 */ +} + +/** + * 1. Remove the bottom border in Chrome 57- and Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +abbr[title] { + border-bottom: none; + /* 1 */ + text-decoration: underline; + /* 2 */ + text-decoration: underline dotted; + /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +code, +kbd, +samp { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/** + * Add the correct font style in Android 4.3-. + */ +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; + /* 1 */ + font-size: 100%; + /* 1 */ + line-height: 1.15; + /* 1 */ + margin: 0; + /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; + /* 2 */ +} + +/** + * Remove the inner border and padding in Firefox. + */ +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ +legend { + box-sizing: border-box; + /* 1 */ + color: inherit; + /* 2 */ + display: table; + /* 1 */ + max-width: 100%; + /* 1 */ + padding: 0; + /* 3 */ + white-space: normal; + /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +progress { + display: inline-block; + /* 1 */ + vertical-align: baseline; + /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* Interactive + ========================================================================== */ +/* + * Add the correct display in IE 9-. + * 1. Add the correct display in Edge, IE, and Firefox. + */ +details, +menu { + display: block; +} + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; +} + +/* Scripting + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ +template { + display: none; +} + +/* Hidden + ========================================================================== */ +/** + * Add the correct display in IE 10-. + */ +[hidden] { + display: none; +} + +html { + height: 100%; +} + +fieldset { + margin: 0; + padding: 0; + -webkit-margin-start: 0; + -webkit-margin-end: 0; + -webkit-padding-before: 0; + -webkit-padding-start: 0; + -webkit-padding-end: 0; + -webkit-padding-after: 0; + border: 0; +} + +legend { + margin: 0; + padding: 0; + display: block; + -webkit-padding-start: 0; + -webkit-padding-end: 0; +} + +/*=============================== += Choices = +===============================*/ +.choices { + position: relative; + margin-bottom: 24px; + font-size: 16px; +} + +.choices:focus { + outline: none; +} + +.choices:last-child { + margin-bottom: 0; +} + +.choices.is-disabled .choices__inner, .choices.is-disabled .choices__input { + background-color: #EAEAEA; + cursor: not-allowed; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.choices.is-disabled .choices__item { + cursor: not-allowed; +} + +.choices[data-type*="select-one"] { + cursor: pointer; +} + +.choices[data-type*="select-one"] .choices__inner { + padding-bottom: 7.5px; +} + +.choices[data-type*="select-one"] .choices__input { + display: block; + width: 100%; + padding: 10px; + border-bottom: 1px solid #DDDDDD; + background-color: #FFFFFF; + margin: 0; +} + +.choices[data-type*="select-one"] .choices__button { + background-image: url("../../icons/cross-inverse.svg"); + padding: 0; + background-size: 8px; + height: 100%; + position: absolute; + top: 50%; + right: 0; + margin-top: -10px; + margin-right: 25px; + height: 20px; + width: 20px; + border-radius: 10em; + opacity: .5; +} + +.choices[data-type*="select-one"] .choices__button:hover, .choices[data-type*="select-one"] .choices__button:focus { + opacity: 1; +} + +.choices[data-type*="select-one"] .choices__button:focus { + box-shadow: 0px 0px 0px 2px #00BCD4; +} + +.choices[data-type*="select-one"]:after { + content: ""; + height: 0; + width: 0; + border-style: solid; + border-color: #333333 transparent transparent transparent; + border-width: 5px; + position: absolute; + right: 11.5px; + top: 50%; + margin-top: -2.5px; + pointer-events: none; +} + +.choices[data-type*="select-one"].is-open:after { + border-color: transparent transparent #333333 transparent; + margin-top: -7.5px; +} + +.choices[data-type*="select-one"][dir="rtl"]:after { + left: 11.5px; + right: auto; +} + +.choices[data-type*="select-one"][dir="rtl"] .choices__button { + right: auto; + left: 0; + margin-left: 25px; + margin-right: 0; +} + +.choices[data-type*="select-multiple"] .choices__inner, .choices[data-type*="text"] .choices__inner { + cursor: text; +} + +.choices[data-type*="select-multiple"] .choices__button, .choices[data-type*="text"] .choices__button { + position: relative; + display: inline-block; + margin-top: 0; + margin-right: -4px; + margin-bottom: 0; + margin-left: 8px; + padding-left: 16px; + border-left: 1px solid #008fa1; + background-image: url("../../icons/cross.svg"); + background-size: 8px; + width: 8px; + line-height: 1; + opacity: .75; +} + +.choices[data-type*="select-multiple"] .choices__button:hover, .choices[data-type*="select-multiple"] .choices__button:focus, .choices[data-type*="text"] .choices__button:hover, .choices[data-type*="text"] .choices__button:focus { + opacity: 1; +} + +.choices__inner { + display: inline-block; + vertical-align: top; + width: 100%; + background-color: #f9f9f9; + padding: 7.5px 7.5px 3.75px; + border: 1px solid #DDDDDD; + border-radius: 2.5px; + font-size: 14px; + min-height: 44px; + overflow: hidden; +} + +.is-focused .choices__inner, .is-open .choices__inner { + border-color: #b7b7b7; +} + +.is-open .choices__inner { + border-radius: 2.5px 2.5px 0 0; +} + +.is-flipped.is-open .choices__inner { + border-radius: 0 0 2.5px 2.5px; +} + +.choices__list { + margin: 0; + padding-left: 0; + list-style: none; +} + +.choices__list--single { + display: inline-block; + padding: 4px 16px 4px 4px; + width: 100%; +} + +[dir="rtl"] .choices__list--single { + padding-right: 4px; + padding-left: 16px; +} + +.choices__list--single .choices__item { + width: 100%; +} + +.choices__list--multiple { + display: inline; +} + +.choices__list--multiple .choices__item { + display: inline-block; + vertical-align: middle; + border-radius: 20px; + padding: 4px 10px; + font-size: 12px; + font-weight: 500; + margin-right: 3.75px; + margin-bottom: 3.75px; + background-color: #00BCD4; + border: 1px solid #00a5bb; + color: #FFFFFF; + word-break: break-all; +} + +.choices__list--multiple .choices__item[data-deletable] { + padding-right: 5px; +} + +[dir="rtl"] .choices__list--multiple .choices__item { + margin-right: 0; + margin-left: 3.75px; +} + +.choices__list--multiple .choices__item.is-highlighted { + background-color: #00a5bb; + border: 1px solid #008fa1; +} + +.is-disabled .choices__list--multiple .choices__item { + background-color: #aaaaaa; + border: 1px solid #919191; +} + +.choices__list--dropdown { + display: none; + z-index: 1; + position: absolute; + width: 100%; + background-color: #FFFFFF; + border: 1px solid #DDDDDD; + top: 100%; + margin-top: -1px; + border-bottom-left-radius: 2.5px; + border-bottom-right-radius: 2.5px; + overflow: hidden; + word-break: break-all; +} + +.choices__list--dropdown.is-active { + display: block; +} + +.is-open .choices__list--dropdown { + border-color: #b7b7b7; +} + +.is-flipped .choices__list--dropdown { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: -1px; + border-radius: .25rem .25rem 0 0; +} + +.choices__list--dropdown .choices__list { + position: relative; + max-height: 300px; + overflow: auto; + -webkit-overflow-scrolling: touch; + will-change: scroll-position; +} + +.choices__list--dropdown .choices__item { + position: relative; + padding: 10px; + font-size: 14px; +} + +[dir="rtl"] .choices__list--dropdown .choices__item { + text-align: right; +} + +@media (min-width: 640px) { + .choices__list--dropdown .choices__item--selectable { + padding-right: 100px; + } + .choices__list--dropdown .choices__item--selectable:after { + content: attr(data-select-text); + font-size: 12px; + opacity: 0; + position: absolute; + right: 10px; + top: 50%; + transform: translateY(-50%); + } + [dir="rtl"] .choices__list--dropdown .choices__item--selectable { + text-align: right; + padding-left: 100px; + padding-right: 10px; + } + [dir="rtl"] .choices__list--dropdown .choices__item--selectable:after { + right: auto; + left: 10px; + } +} + +.choices__list--dropdown .choices__item--selectable.is-highlighted { + background-color: #f2f2f2; +} + +.choices__list--dropdown .choices__item--selectable.is-highlighted:after { + opacity: .5; +} + +.choices__item { + cursor: default; +} + +.choices__item--selectable { + cursor: pointer; +} + +.choices__item--disabled { + cursor: not-allowed; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + opacity: .5; +} + +.choices__heading { + font-weight: 600; + font-size: 12px; + padding: 10px; + border-bottom: 1px solid #f7f7f7; + color: gray; +} + +.choices__button { + text-indent: -9999px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: 0; + background-color: transparent; + background-repeat: no-repeat; + background-position: center; + cursor: pointer; +} + +.choices__button:focus { + outline: none; +} + +.choices__input { + display: inline-block; + vertical-align: baseline; + background-color: #f9f9f9; + font-size: 14px; + margin-bottom: 5px; + border: 0; + border-radius: 0; + max-width: 100%; + padding: 4px 0 4px 2px; +} + +.choices__input:focus { + outline: 0; +} + +[dir="rtl"] .choices__input { + padding-right: 2px; + padding-left: 0; +} + +.choices__placeholder { + opacity: .5; +} + +/*===== End of Choices ======*/ +input, +button { + font-family: 'Poppins', sans-serif; +} + +* { + box-sizing: border-box; +} + +.s130 { + min-height: 100vh; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: center; + justify-content: center; + font-family: 'Poppins', sans-serif; + background: url("../images/marshmello.jpg"); + background-position: bottom right; + background-repeat: no-repeat; + background-size: 100%; + padding: 15px; +} + +.s130 form { + width: 100%; + max-width: 790px; + padding-top: 24vh; +} + +.s130 form .inner-form { + display: -ms-flexbox; + display: flex; + width: 100%; + -ms-flex-pack: justify; + justify-content: space-between; + -ms-flex-align: center; + align-items: center; + box-shadow: 0px 8px 20px 0px rgba(0, 0, 0, 0.15); + border-radius: 34px; + overflow: hidden; + margin-bottom: 30px; +} + +.s130 form .inner-form .input-field { + height: 68px; +} + +.s130 form .inner-form .input-field input { + height: 100%; + background: transparent; + border: 0; + display: block; + width: 100%; + padding: 10px 0; + font-size: 16px; + color: #000; +} + +.s130 form .inner-form .input-field input.placeholder { + color: #222; + font-size: 16px; +} + +.s130 form .inner-form .input-field input:-moz-placeholder { + color: #222; + font-size: 16px; +} + +.s130 form .inner-form .input-field input::-webkit-input-placeholder { + color: #222; + font-size: 16px; +} + +.s130 form .inner-form .input-field input:hover, .s130 form .inner-form .input-field input:focus { + box-shadow: none; + outline: 0; +} + +.s130 form .inner-form .input-field.first-wrap { + -ms-flex-positive: 1; + flex-grow: 1; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + background: #d9f1e3; +} + +.s130 form .inner-form .input-field.first-wrap input { + -ms-flex-positive: 1; + flex-grow: 1; +} + +.s130 form .inner-form .input-field.first-wrap .svg-wrapper { + min-width: 80px; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: center; + justify-content: center; + -ms-flex-align: center; + align-items: center; +} + +.s130 form .inner-form .input-field.first-wrap svg { + width: 36px; + height: 36px; + fill: #222; +} + +.s130 form .inner-form .input-field.second-wrap { + min-width: 216px; +} + +.s130 form .inner-form .input-field.second-wrap .btn-search { + height: 100%; + width: 100%; + white-space: nowrap; + font-size: 16px; + color: #fff; + border: 0; + cursor: pointer; + position: relative; + z-index: 0; + background: #00ad5f; + transition: all .2s ease-out, color .2s ease-out; + font-weight: 300; +} + +.s130 form .inner-form .input-field.second-wrap .btn-search:hover { + background: #009451; +} + +.s130 form .inner-form .input-field.second-wrap .btn-search:focus { + outline: 0; + box-shadow: none; +} + +.s130 form .info { + font-size: 15px; + color: #314e52; + padding-left: 26px; +} + +@media screen and (max-width: 992px) { + .s130 form .inner-form .input-field { + height: 50px; + } +} + +@media screen and (max-width: 767px) { + .s130 form .inner-form .input-field.first-wrap .svg-wrapper { + min-width: 40px; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: center; + justify-content: center; + -ms-flex-align: center; + align-items: center; + padding: 0 10px; + } + .s130 form .inner-form .input-field.first-wrap svg { + width: 26px; + height: 26px; + fill: #222; + } + .s130 form .inner-form .input-field.second-wrap { + min-width: 100px; + } + .s130 form .inner-form .input-field.second-wrap .btn-search { + font-size: 13px; + } +} + diff --git a/Team#23 - 5/images/marshmello.jpg b/Team#23 - 5/images/marshmello.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ef3cfd4ce1c1f7c919c960c622446e89c0da65a7 GIT binary patch literal 116115 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
=BQNe@+7uizK>dGk^Coe`U(S6fB<1SUNruZ~} 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 BuD1XH literal 0 HcmV?d00001 diff --git a/Team#23 - 5/index.html b/Team#23 - 5/index.html new file mode 100644 index 0000000..42e222d --- /dev/null +++ b/Team#23 - 5/index.html @@ -0,0 +1,31 @@ + + + + + + + + + + +
+
+
+
+
+ + + +
+ +
+
+ +
+
+ ex. Shape of You, Perfect, Happier, Friends etc. +
+
+ + + diff --git a/Team#23 - 5/js/extention/choices.js b/Team#23 - 5/js/extention/choices.js new file mode 100644 index 0000000..5603886 --- /dev/null +++ b/Team#23 - 5/js/extention/choices.js @@ -0,0 +1,6207 @@ + + +/*! choices.js v3.0.4 | (c) 2018 Josh Johnson | https://github.com/jshjohnson/Choices#readme */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Choices"] = factory(); + else + root["Choices"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = "/assets/scripts/dist/"; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + module.exports = __webpack_require__(1); + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + var _fuse = __webpack_require__(2); + + var _fuse2 = _interopRequireDefault(_fuse); + + var _classnames = __webpack_require__(3); + + var _classnames2 = _interopRequireDefault(_classnames); + + var _index = __webpack_require__(4); + + var _index2 = _interopRequireDefault(_index); + + var _index3 = __webpack_require__(31); + + var _utils = __webpack_require__(32); + + __webpack_require__(33); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + /** + * Choices + */ + var Choices = function () { + function Choices() { + var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-choice]'; + var userConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, Choices); + + // If there are multiple elements, create a new instance + // for each element besides the first one (as that already has an instance) + if ((0, _utils.isType)('String', element)) { + var elements = document.querySelectorAll(element); + if (elements.length > 1) { + for (var i = 1; i < elements.length; i++) { + var el = elements[i]; + new Choices(el, userConfig); + } + } + } + + var defaultConfig = { + silent: false, + items: [], + choices: [], + renderChoiceLimit: -1, + maxItemCount: -1, + addItems: true, + removeItems: true, + removeItemButton: false, + editItems: false, + duplicateItems: true, + delimiter: ',', + paste: true, + searchEnabled: true, + searchChoices: true, + searchFloor: 1, + searchResultLimit: 4, + searchFields: ['label', 'value'], + position: 'auto', + resetScrollPosition: true, + regexFilter: null, + shouldSort: true, + shouldSortItems: false, + sortFilter: _utils.sortByAlpha, + placeholder: true, + placeholderValue: null, + searchPlaceholderValue: null, + prependValue: null, + appendValue: null, + renderSelectedChoices: 'auto', + loadingText: 'Loading...', + noResultsText: 'No results found', + noChoicesText: 'No choices to choose from', + itemSelectText: 'Press to select', + addItemText: function addItemText(value) { + return 'Press Enter to add "' + (0, _utils.stripHTML)(value) + '"'; + }, + maxItemText: function maxItemText(maxItemCount) { + return 'Only ' + maxItemCount + ' values can be added.'; + }, + itemComparer: function itemComparer(choice, item) { + return choice === item; + }, + uniqueItemText: 'Only unique values can be added.', + classNames: { + containerOuter: 'choices', + containerInner: 'choices__inner', + input: 'choices__input', + inputCloned: 'choices__input--cloned', + list: 'choices__list', + listItems: 'choices__list--multiple', + listSingle: 'choices__list--single', + listDropdown: 'choices__list--dropdown', + item: 'choices__item', + itemSelectable: 'choices__item--selectable', + itemDisabled: 'choices__item--disabled', + itemChoice: 'choices__item--choice', + placeholder: 'choices__placeholder', + group: 'choices__group', + groupHeading: 'choices__heading', + button: 'choices__button', + activeState: 'is-active', + focusState: 'is-focused', + openState: 'is-open', + disabledState: 'is-disabled', + highlightedState: 'is-highlighted', + hiddenState: 'is-hidden', + flippedState: 'is-flipped', + loadingState: 'is-loading', + noResults: 'has-no-results', + noChoices: 'has-no-choices' + }, + fuseOptions: { + include: 'score' + }, + callbackOnInit: null, + callbackOnCreateTemplates: null + }; + + this.idNames = { + itemChoice: 'item-choice' + }; + + // Merge options with user options + this.config = (0, _utils.extend)(defaultConfig, userConfig); + + if (this.config.renderSelectedChoices !== 'auto' && this.config.renderSelectedChoices !== 'always') { + if (!this.config.silent) { + console.warn('renderSelectedChoices: Possible values are \'auto\' and \'always\'. Falling back to \'auto\'.'); + } + this.config.renderSelectedChoices = 'auto'; + } + + // Create data store + this.store = new _index2.default(this.render); + + // State tracking + this.initialised = false; + this.currentState = {}; + this.prevState = {}; + this.currentValue = ''; + + // Retrieve triggering element (i.e. element with 'data-choice' trigger) + this.element = element; + this.passedElement = (0, _utils.isType)('String', element) ? document.querySelector(element) : element; + + if (!this.passedElement) { + if (!this.config.silent) { + console.error('Passed element not found'); + } + return; + } + + this.isTextElement = this.passedElement.type === 'text'; + this.isSelectOneElement = this.passedElement.type === 'select-one'; + this.isSelectMultipleElement = this.passedElement.type === 'select-multiple'; + this.isSelectElement = this.isSelectOneElement || this.isSelectMultipleElement; + this.isValidElementType = this.isTextElement || this.isSelectElement; + this.isIe11 = !!(navigator.userAgent.match(/Trident/) && navigator.userAgent.match(/rv[ :]11/)); + this.isScrollingOnIe = false; + + if (this.config.shouldSortItems === true && this.isSelectOneElement) { + if (!this.config.silent) { + console.warn('shouldSortElements: Type of passed element is \'select-one\', falling back to false.'); + } + } + + this.highlightPosition = 0; + this.canSearch = this.config.searchEnabled; + + this.placeholder = false; + if (!this.isSelectOneElement) { + this.placeholder = this.config.placeholder ? this.config.placeholderValue || this.passedElement.getAttribute('placeholder') : false; + } + + // Assign preset choices from passed object + this.presetChoices = this.config.choices; + + // Assign preset items from passed object first + this.presetItems = this.config.items; + + // Then add any values passed from attribute + if (this.passedElement.value) { + this.presetItems = this.presetItems.concat(this.passedElement.value.split(this.config.delimiter)); + } + + // Set unique base Id + this.baseId = (0, _utils.generateId)(this.passedElement, 'choices-'); + + // Bind methods + this.render = this.render.bind(this); + + // Bind event handlers + this._onFocus = this._onFocus.bind(this); + this._onBlur = this._onBlur.bind(this); + this._onKeyUp = this._onKeyUp.bind(this); + this._onKeyDown = this._onKeyDown.bind(this); + this._onClick = this._onClick.bind(this); + this._onTouchMove = this._onTouchMove.bind(this); + this._onTouchEnd = this._onTouchEnd.bind(this); + this._onMouseDown = this._onMouseDown.bind(this); + this._onMouseOver = this._onMouseOver.bind(this); + this._onPaste = this._onPaste.bind(this); + this._onInput = this._onInput.bind(this); + + // Monitor touch taps/scrolls + this.wasTap = true; + + // Cutting the mustard + var cuttingTheMustard = 'classList' in document.documentElement; + if (!cuttingTheMustard && !this.config.silent) { + console.error('Choices: Your browser doesn\'t support Choices'); + } + + var canInit = (0, _utils.isElement)(this.passedElement) && this.isValidElementType; + + if (canInit) { + // If element has already been initialised with Choices + if (this.passedElement.getAttribute('data-choice') === 'active') { + return; + } + + // Let's go + this.init(); + } else if (!this.config.silent) { + console.error('Incompatible input passed'); + } + } + + /*======================================== + = Public functions = + ========================================*/ + + /** + * Initialise Choices + * @return + * @public + */ + + + _createClass(Choices, [{ + key: 'init', + value: function init() { + if (this.initialised === true) { + return; + } + + var callback = this.config.callbackOnInit; + + // Set initialise flag + this.initialised = true; + // Create required elements + this._createTemplates(); + // Generate input markup + this._createInput(); + // Subscribe store to render method + this.store.subscribe(this.render); + // Render any items + this.render(); + // Trigger event listeners + this._addEventListeners(); + + // Run callback if it is a function + if (callback) { + if ((0, _utils.isType)('Function', callback)) { + callback.call(this); + } + } + } + + /** + * Destroy Choices and nullify values + * @return + * @public + */ + + }, { + key: 'destroy', + value: function destroy() { + if (this.initialised === false) { + return; + } + + // Remove all event listeners + this._removeEventListeners(); + + // Reinstate passed element + this.passedElement.classList.remove(this.config.classNames.input, this.config.classNames.hiddenState); + this.passedElement.removeAttribute('tabindex'); + // Recover original styles if any + var origStyle = this.passedElement.getAttribute('data-choice-orig-style'); + if (Boolean(origStyle)) { + this.passedElement.removeAttribute('data-choice-orig-style'); + this.passedElement.setAttribute('style', origStyle); + } else { + this.passedElement.removeAttribute('style'); + } + this.passedElement.removeAttribute('aria-hidden'); + this.passedElement.removeAttribute('data-choice'); + + // Re-assign values - this is weird, I know + this.passedElement.value = this.passedElement.value; + + // Move passed element back to original position + this.containerOuter.parentNode.insertBefore(this.passedElement, this.containerOuter); + // Remove added elements + this.containerOuter.parentNode.removeChild(this.containerOuter); + + // Clear data store + this.clearStore(); + + // Nullify instance-specific data + this.config.templates = null; + + // Uninitialise + this.initialised = false; + } + + /** + * Render group choices into a DOM fragment and append to choice list + * @param {Array} groups Groups to add to list + * @param {Array} choices Choices to add to groups + * @param {DocumentFragment} fragment Fragment to add groups and options to (optional) + * @return {DocumentFragment} Populated options fragment + * @private + */ + + }, { + key: 'renderGroups', + value: function renderGroups(groups, choices, fragment) { + var _this = this; + + var groupFragment = fragment || document.createDocumentFragment(); + var filter = this.config.sortFilter; + + // If sorting is enabled, filter groups + if (this.config.shouldSort) { + groups.sort(filter); + } + + groups.forEach(function (group) { + // Grab options that are children of this group + var groupChoices = choices.filter(function (choice) { + if (_this.isSelectOneElement) { + return choice.groupId === group.id; + } + return choice.groupId === group.id && !choice.selected; + }); + + if (groupChoices.length >= 1) { + var dropdownGroup = _this._getTemplate('choiceGroup', group); + groupFragment.appendChild(dropdownGroup); + _this.renderChoices(groupChoices, groupFragment, true); + } + }); + + return groupFragment; + } + + /** + * Render choices into a DOM fragment and append to choice list + * @param {Array} choices Choices to add to list + * @param {DocumentFragment} fragment Fragment to add choices to (optional) + * @return {DocumentFragment} Populated choices fragment + * @private + */ + + }, { + key: 'renderChoices', + value: function renderChoices(choices, fragment) { + var _this2 = this; + + var withinGroup = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + // Create a fragment to store our list items (so we don't have to update the DOM for each item) + var choicesFragment = fragment || document.createDocumentFragment(); + var _config = this.config, + renderSelectedChoices = _config.renderSelectedChoices, + searchResultLimit = _config.searchResultLimit, + renderChoiceLimit = _config.renderChoiceLimit; + + var filter = this.isSearching ? _utils.sortByScore : this.config.sortFilter; + var appendChoice = function appendChoice(choice) { + var shouldRender = renderSelectedChoices === 'auto' ? _this2.isSelectOneElement || !choice.selected : true; + if (shouldRender) { + var dropdownItem = _this2._getTemplate('choice', choice); + choicesFragment.appendChild(dropdownItem); + } + }; + + var rendererableChoices = choices; + + if (renderSelectedChoices === 'auto' && !this.isSelectOneElement) { + rendererableChoices = choices.filter(function (choice) { + return !choice.selected; + }); + } + + // Split array into placeholders and "normal" choices + + var _rendererableChoices$ = rendererableChoices.reduce(function (acc, choice) { + if (choice.placeholder) { + acc.placeholderChoices.push(choice); + } else { + acc.normalChoices.push(choice); + } + return acc; + }, { placeholderChoices: [], normalChoices: [] }), + placeholderChoices = _rendererableChoices$.placeholderChoices, + normalChoices = _rendererableChoices$.normalChoices; + + // If sorting is enabled or the user is searching, filter choices + + + if (this.config.shouldSort || this.isSearching) { + normalChoices.sort(filter); + } + + var choiceLimit = rendererableChoices.length; + + // Prepend placeholeder + var sortedChoices = [].concat(_toConsumableArray(placeholderChoices), _toConsumableArray(normalChoices)); + + if (this.isSearching) { + choiceLimit = searchResultLimit; + } else if (renderChoiceLimit > 0 && !withinGroup) { + choiceLimit = renderChoiceLimit; + } + + // Add each choice to dropdown within range + for (var i = 0; i < choiceLimit; i++) { + if (sortedChoices[i]) { + appendChoice(sortedChoices[i]); + } + }; + + return choicesFragment; + } + + /** + * Render items into a DOM fragment and append to items list + * @param {Array} items Items to add to list + * @param {DocumentFragment} [fragment] Fragment to add items to (optional) + * @return + * @private + */ + + }, { + key: 'renderItems', + value: function renderItems(items) { + var _this3 = this; + + var fragment = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + // Create fragment to add elements to + var itemListFragment = fragment || document.createDocumentFragment(); + + // If sorting is enabled, filter items + if (this.config.shouldSortItems && !this.isSelectOneElement) { + items.sort(this.config.sortFilter); + } + + if (this.isTextElement) { + // Simplify store data to just values + var itemsFiltered = this.store.getItemsReducedToValues(items); + var itemsFilteredString = itemsFiltered.join(this.config.delimiter); + // Update the value of the hidden input + this.passedElement.setAttribute('value', itemsFilteredString); + this.passedElement.value = itemsFilteredString; + } else { + var selectedOptionsFragment = document.createDocumentFragment(); + + // Add each list item to list + items.forEach(function (item) { + // Create a standard select option + var option = _this3._getTemplate('option', item); + // Append it to fragment + selectedOptionsFragment.appendChild(option); + }); + + // Update selected choices + this.passedElement.innerHTML = ''; + this.passedElement.appendChild(selectedOptionsFragment); + } + + // Add each list item to list + items.forEach(function (item) { + // Create new list element + var listItem = _this3._getTemplate('item', item); + // Append it to list + itemListFragment.appendChild(listItem); + }); + + return itemListFragment; + } + + /** + * Render DOM with values + * @return + * @private + */ + + }, { + key: 'render', + value: function render() { + if (this.store.isLoading()) { + return; + } + + this.currentState = this.store.getState(); + + // Only render if our state has actually changed + if (this.currentState !== this.prevState) { + // Choices + if (this.currentState.choices !== this.prevState.choices || this.currentState.groups !== this.prevState.groups || this.currentState.items !== this.prevState.items) { + if (this.isSelectElement) { + // Get active groups/choices + var activeGroups = this.store.getGroupsFilteredByActive(); + var activeChoices = this.store.getChoicesFilteredByActive(); + + var choiceListFragment = document.createDocumentFragment(); + + // Clear choices + this.choiceList.innerHTML = ''; + + // Scroll back to top of choices list + if (this.config.resetScrollPosition) { + this.choiceList.scrollTop = 0; + } + + // If we have grouped options + if (activeGroups.length >= 1 && this.isSearching !== true) { + choiceListFragment = this.renderGroups(activeGroups, activeChoices, choiceListFragment); + } else if (activeChoices.length >= 1) { + choiceListFragment = this.renderChoices(activeChoices, choiceListFragment); + } + + var activeItems = this.store.getItemsFilteredByActive(); + var canAddItem = this._canAddItem(activeItems, this.input.value); + + // If we have choices to show + if (choiceListFragment.childNodes && choiceListFragment.childNodes.length > 0) { + // ...and we can select them + if (canAddItem.response) { + // ...append them and highlight the first choice + this.choiceList.appendChild(choiceListFragment); + this._highlightChoice(); + } else { + // ...otherwise show a notice + this.choiceList.appendChild(this._getTemplate('notice', canAddItem.notice)); + } + } else { + // Otherwise show a notice + var dropdownItem = void 0; + var notice = void 0; + + if (this.isSearching) { + notice = (0, _utils.isType)('Function', this.config.noResultsText) ? this.config.noResultsText() : this.config.noResultsText; + + dropdownItem = this._getTemplate('notice', notice, 'no-results'); + } else { + notice = (0, _utils.isType)('Function', this.config.noChoicesText) ? this.config.noChoicesText() : this.config.noChoicesText; + + dropdownItem = this._getTemplate('notice', notice, 'no-choices'); + } + + this.choiceList.appendChild(dropdownItem); + } + } + } + + // Items + if (this.currentState.items !== this.prevState.items) { + // Get active items (items that can be selected) + var _activeItems = this.store.getItemsFilteredByActive(); + + // Clear list + this.itemList.innerHTML = ''; + + if (_activeItems && _activeItems) { + // Create a fragment to store our list items + // (so we don't have to update the DOM for each item) + var itemListFragment = this.renderItems(_activeItems); + + // If we have items to add + if (itemListFragment.childNodes) { + // Update list + this.itemList.appendChild(itemListFragment); + } + } + } + + this.prevState = this.currentState; + } + } + + /** + * Select item (a selected item can be deleted) + * @param {Element} item Element to select + * @param {Boolean} [runEvent=true] Whether to trigger 'highlightItem' event + * @return {Object} Class instance + * @public + */ + + }, { + key: 'highlightItem', + value: function highlightItem(item) { + var runEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + if (!item) { + return this; + } + + var id = item.id; + var groupId = item.groupId; + var group = groupId >= 0 ? this.store.getGroupById(groupId) : null; + + this.store.dispatch((0, _index3.highlightItem)(id, true)); + + if (runEvent) { + if (group && group.value) { + (0, _utils.triggerEvent)(this.passedElement, 'highlightItem', { + id: id, + value: item.value, + label: item.label, + groupValue: group.value + }); + } else { + (0, _utils.triggerEvent)(this.passedElement, 'highlightItem', { + id: id, + value: item.value, + label: item.label + }); + } + } + + return this; + } + + /** + * Deselect item + * @param {Element} item Element to de-select + * @return {Object} Class instance + * @public + */ + + }, { + key: 'unhighlightItem', + value: function unhighlightItem(item) { + if (!item) { + return this; + } + + var id = item.id; + var groupId = item.groupId; + var group = groupId >= 0 ? this.store.getGroupById(groupId) : null; + + this.store.dispatch((0, _index3.highlightItem)(id, false)); + + if (group && group.value) { + (0, _utils.triggerEvent)(this.passedElement, 'unhighlightItem', { + id: id, + value: item.value, + label: item.label, + groupValue: group.value + }); + } else { + (0, _utils.triggerEvent)(this.passedElement, 'unhighlightItem', { + id: id, + value: item.value, + label: item.label + }); + } + + return this; + } + + /** + * Highlight items within store + * @return {Object} Class instance + * @public + */ + + }, { + key: 'highlightAll', + value: function highlightAll() { + var _this4 = this; + + var items = this.store.getItems(); + items.forEach(function (item) { + _this4.highlightItem(item); + }); + + return this; + } + + /** + * Deselect items within store + * @return {Object} Class instance + * @public + */ + + }, { + key: 'unhighlightAll', + value: function unhighlightAll() { + var _this5 = this; + + var items = this.store.getItems(); + items.forEach(function (item) { + _this5.unhighlightItem(item); + }); + + return this; + } + + /** + * Remove an item from the store by its value + * @param {String} value Value to search for + * @return {Object} Class instance + * @public + */ + + }, { + key: 'removeItemsByValue', + value: function removeItemsByValue(value) { + var _this6 = this; + + if (!value || !(0, _utils.isType)('String', value)) { + return this; + } + + var items = this.store.getItemsFilteredByActive(); + + items.forEach(function (item) { + if (item.value === value) { + _this6._removeItem(item); + } + }); + + return this; + } + + /** + * Remove all items from store array + * @note Removed items are soft deleted + * @param {Number} excludedId Optionally exclude item by ID + * @return {Object} Class instance + * @public + */ + + }, { + key: 'removeActiveItems', + value: function removeActiveItems(excludedId) { + var _this7 = this; + + var items = this.store.getItemsFilteredByActive(); + + items.forEach(function (item) { + if (item.active && excludedId !== item.id) { + _this7._removeItem(item); + } + }); + + return this; + } + + /** + * Remove all selected items from store + * @note Removed items are soft deleted + * @return {Object} Class instance + * @public + */ + + }, { + key: 'removeHighlightedItems', + value: function removeHighlightedItems() { + var _this8 = this; + + var runEvent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + var items = this.store.getItemsFilteredByActive(); + + items.forEach(function (item) { + if (item.highlighted && item.active) { + _this8._removeItem(item); + // If this action was performed by the user + // trigger the event + if (runEvent) { + _this8._triggerChange(item.value); + } + } + }); + + return this; + } + + /** + * Show dropdown to user by adding active state class + * @return {Object} Class instance + * @public + */ + + }, { + key: 'showDropdown', + value: function showDropdown() { + var focusInput = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + var body = document.body; + var html = document.documentElement; + var winHeight = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight); + + this.containerOuter.classList.add(this.config.classNames.openState); + this.containerOuter.setAttribute('aria-expanded', 'true'); + this.dropdown.classList.add(this.config.classNames.activeState); + this.dropdown.setAttribute('aria-expanded', 'true'); + + var dimensions = this.dropdown.getBoundingClientRect(); + var dropdownPos = Math.ceil(dimensions.top + window.scrollY + this.dropdown.offsetHeight); + + // If flip is enabled and the dropdown bottom position is greater than the window height flip the dropdown. + var shouldFlip = false; + if (this.config.position === 'auto') { + shouldFlip = dropdownPos >= winHeight; + } else if (this.config.position === 'top') { + shouldFlip = true; + } + + if (shouldFlip) { + this.containerOuter.classList.add(this.config.classNames.flippedState); + } + + // Optionally focus the input if we have a search input + if (focusInput && this.canSearch && document.activeElement !== this.input) { + this.input.focus(); + } + + (0, _utils.triggerEvent)(this.passedElement, 'showDropdown', {}); + + return this; + } + + /** + * Hide dropdown from user + * @return {Object} Class instance + * @public + */ + + }, { + key: 'hideDropdown', + value: function hideDropdown() { + var blurInput = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + // A dropdown flips if it does not have space within the page + var isFlipped = this.containerOuter.classList.contains(this.config.classNames.flippedState); + + this.containerOuter.classList.remove(this.config.classNames.openState); + this.containerOuter.setAttribute('aria-expanded', 'false'); + this.dropdown.classList.remove(this.config.classNames.activeState); + this.dropdown.setAttribute('aria-expanded', 'false'); + + if (isFlipped) { + this.containerOuter.classList.remove(this.config.classNames.flippedState); + } + + // Optionally blur the input if we have a search input + if (blurInput && this.canSearch && document.activeElement === this.input) { + this.input.blur(); + } + + (0, _utils.triggerEvent)(this.passedElement, 'hideDropdown', {}); + + return this; + } + + /** + * Determine whether to hide or show dropdown based on its current state + * @return {Object} Class instance + * @public + */ + + }, { + key: 'toggleDropdown', + value: function toggleDropdown() { + var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState); + if (hasActiveDropdown) { + this.hideDropdown(); + } else { + this.showDropdown(true); + } + + return this; + } + + /** + * Get value(s) of input (i.e. inputted items (text) or selected choices (select)) + * @param {Boolean} valueOnly Get only values of selected items, otherwise return selected items + * @return {Array/String} selected value (select-one) or array of selected items (inputs & select-multiple) + * @public + */ + + }, { + key: 'getValue', + value: function getValue() { + var _this9 = this; + + var valueOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + var items = this.store.getItemsFilteredByActive(); + var selectedItems = []; + + items.forEach(function (item) { + if (_this9.isTextElement) { + selectedItems.push(valueOnly ? item.value : item); + } else if (item.active) { + selectedItems.push(valueOnly ? item.value : item); + } + }); + + if (this.isSelectOneElement) { + return selectedItems[0]; + } + + return selectedItems; + } + + /** + * Set value of input. If the input is a select box, a choice will be created and selected otherwise + * an item will created directly. + * @param {Array} args Array of value objects or value strings + * @return {Object} Class instance + * @public + */ + + }, { + key: 'setValue', + value: function setValue(args) { + var _this10 = this; + + if (this.initialised === true) { + // Convert args to an iterable array + var values = [].concat(_toConsumableArray(args)), + handleValue = function handleValue(item) { + var itemType = (0, _utils.getType)(item); + if (itemType === 'Object') { + if (!item.value) { + return; + } + + // If we are dealing with a select input, we need to create an option first + // that is then selected. For text inputs we can just add items normally. + if (!_this10.isTextElement) { + _this10._addChoice(item.value, item.label, true, false, -1, item.customProperties, item.placeholder); + } else { + _this10._addItem(item.value, item.label, item.id, undefined, item.customProperties, item.placeholder); + } + } else if (itemType === 'String') { + if (!_this10.isTextElement) { + _this10._addChoice(item, item, true, false, -1, null); + } else { + _this10._addItem(item); + } + } + }; + + if (values.length > 1) { + values.forEach(function (value) { + handleValue(value); + }); + } else { + handleValue(values[0]); + } + } + return this; + } + + /** + * Select value of select box via the value of an existing choice + * @param {Array/String} value An array of strings of a single string + * @return {Object} Class instance + * @public + */ + + }, { + key: 'setValueByChoice', + value: function setValueByChoice(value) { + var _this11 = this; + + if (!this.isTextElement) { + var choices = this.store.getChoices(); + // If only one value has been passed, convert to array + var choiceValue = (0, _utils.isType)('Array', value) ? value : [value]; + + // Loop through each value and + choiceValue.forEach(function (val) { + var foundChoice = choices.find(function (choice) { + // Check 'value' property exists and the choice isn't already selected + return _this11.config.itemComparer(choice.value, val); + }); + + if (foundChoice) { + if (!foundChoice.selected) { + _this11._addItem(foundChoice.value, foundChoice.label, foundChoice.id, foundChoice.groupId, foundChoice.customProperties, foundChoice.placeholder, foundChoice.keyCode); + } else if (!_this11.config.silent) { + console.warn('Attempting to select choice already selected'); + } + } else if (!_this11.config.silent) { + console.warn('Attempting to select choice that does not exist'); + } + }); + } + return this; + } + + /** + * Direct populate choices + * @param {Array} choices - Choices to insert + * @param {String} value - Name of 'value' property + * @param {String} label - Name of 'label' property + * @param {Boolean} replaceChoices Whether existing choices should be removed + * @return {Object} Class instance + * @public + */ + + }, { + key: 'setChoices', + value: function setChoices(choices, value, label) { + var _this12 = this; + + var replaceChoices = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + + if (this.initialised === true) { + if (this.isSelectElement) { + if (!(0, _utils.isType)('Array', choices) || !value) { + return this; + } + + // Clear choices if needed + if (replaceChoices) { + this._clearChoices(); + } + + this._setLoading(true); + + // Add choices if passed + if (choices && choices.length) { + this.containerOuter.classList.remove(this.config.classNames.loadingState); + choices.forEach(function (result) { + if (result.choices) { + _this12._addGroup(result, result.id || null, value, label); + } else { + _this12._addChoice(result[value], result[label], result.selected, result.disabled, undefined, result.customProperties, result.placeholder); + } + }); + } + + this._setLoading(false); + } + } + return this; + } + + /** + * Clear items,choices and groups + * @note Hard delete + * @return {Object} Class instance + * @public + */ + + }, { + key: 'clearStore', + value: function clearStore() { + this.store.dispatch((0, _index3.clearAll)()); + return this; + } + + /** + * Set value of input to blank + * @return {Object} Class instance + * @public + */ + + }, { + key: 'clearInput', + value: function clearInput() { + if (this.input.value) { + this.input.value = ''; + } + if (!this.isSelectOneElement) { + this._setInputWidth(); + } + if (!this.isTextElement && this.config.searchEnabled) { + this.isSearching = false; + this.store.dispatch((0, _index3.activateChoices)(true)); + } + return this; + } + + /** + * Enable interaction with Choices + * @return {Object} Class instance + */ + + }, { + key: 'enable', + value: function enable() { + if (this.initialised) { + this.passedElement.disabled = false; + var isDisabled = this.containerOuter.classList.contains(this.config.classNames.disabledState); + if (isDisabled) { + this._addEventListeners(); + this.passedElement.removeAttribute('disabled'); + this.input.removeAttribute('disabled'); + this.containerOuter.classList.remove(this.config.classNames.disabledState); + this.containerOuter.removeAttribute('aria-disabled'); + if (this.isSelectOneElement) { + this.containerOuter.setAttribute('tabindex', '0'); + } + } + } + return this; + } + + /** + * Disable interaction with Choices + * @return {Object} Class instance + * @public + */ + + }, { + key: 'disable', + value: function disable() { + if (this.initialised) { + this.passedElement.disabled = true; + var isEnabled = !this.containerOuter.classList.contains(this.config.classNames.disabledState); + if (isEnabled) { + this._removeEventListeners(); + this.passedElement.setAttribute('disabled', ''); + this.input.setAttribute('disabled', ''); + this.containerOuter.classList.add(this.config.classNames.disabledState); + this.containerOuter.setAttribute('aria-disabled', 'true'); + if (this.isSelectOneElement) { + this.containerOuter.setAttribute('tabindex', '-1'); + } + } + } + return this; + } + + /** + * Populate options via ajax callback + * @param {Function} fn Function that actually makes an AJAX request + * @return {Object} Class instance + * @public + */ + + }, { + key: 'ajax', + value: function ajax(fn) { + var _this13 = this; + + if (this.initialised === true) { + if (this.isSelectElement) { + // Show loading text + requestAnimationFrame(function () { + _this13._handleLoadingState(true); + }); + // Run callback + fn(this._ajaxCallback()); + } + } + return this; + } + + /*===== End of Public functions ======*/ + + /*============================================= + = Private functions = + =============================================*/ + + /** + * Call change callback + * @param {String} value - last added/deleted/selected value + * @return + * @private + */ + + }, { + key: '_triggerChange', + value: function _triggerChange(value) { + if (!value) { + return; + } + + (0, _utils.triggerEvent)(this.passedElement, 'change', { + value: value + }); + } + + /** + * Process enter/click of an item button + * @param {Array} activeItems The currently active items + * @param {Element} element Button being interacted with + * @return + * @private + */ + + }, { + key: '_handleButtonAction', + value: function _handleButtonAction(activeItems, element) { + if (!activeItems || !element) { + return; + } + + // If we are clicking on a button + if (this.config.removeItems && this.config.removeItemButton) { + var itemId = element.parentNode.getAttribute('data-id'); + var itemToRemove = activeItems.find(function (item) { + return item.id === parseInt(itemId, 10); + }); + + // Remove item associated with button + this._removeItem(itemToRemove); + this._triggerChange(itemToRemove.value); + + if (this.isSelectOneElement) { + this._selectPlaceholderChoice(); + } + } + } + + /** + * Select placeholder choice + */ + + }, { + key: '_selectPlaceholderChoice', + value: function _selectPlaceholderChoice() { + var placeholderChoice = this.store.getPlaceholderChoice(); + + if (placeholderChoice) { + this._addItem(placeholderChoice.value, placeholderChoice.label, placeholderChoice.id, placeholderChoice.groupId, null, placeholderChoice.placeholder); + this._triggerChange(placeholderChoice.value); + } + } + + /** + * Process click of an item + * @param {Array} activeItems The currently active items + * @param {Element} element Item being interacted with + * @param {Boolean} hasShiftKey Whether the user has the shift key active + * @return + * @private + */ + + }, { + key: '_handleItemAction', + value: function _handleItemAction(activeItems, element) { + var _this14 = this; + + var hasShiftKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + if (!activeItems || !element) { + return; + } + + // If we are clicking on an item + if (this.config.removeItems && !this.isSelectOneElement) { + var passedId = element.getAttribute('data-id'); + + // We only want to select one item with a click + // so we deselect any items that aren't the target + // unless shift is being pressed + activeItems.forEach(function (item) { + if (item.id === parseInt(passedId, 10) && !item.highlighted) { + _this14.highlightItem(item); + } else if (!hasShiftKey) { + if (item.highlighted) { + _this14.unhighlightItem(item); + } + } + }); + + // Focus input as without focus, a user cannot do anything with a + // highlighted item + if (document.activeElement !== this.input) { + this.input.focus(); + } + } + } + + /** + * Process click of a choice + * @param {Array} activeItems The currently active items + * @param {Element} element Choice being interacted with + * @return + */ + + }, { + key: '_handleChoiceAction', + value: function _handleChoiceAction(activeItems, element) { + if (!activeItems || !element) { + return; + } + + // If we are clicking on an option + var id = element.getAttribute('data-id'); + var choice = this.store.getChoiceById(id); + var passedKeyCode = activeItems[0] && activeItems[0].keyCode ? activeItems[0].keyCode : null; + var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState); + + // Update choice keyCode + choice.keyCode = passedKeyCode; + + (0, _utils.triggerEvent)(this.passedElement, 'choice', { + choice: choice + }); + + if (choice && !choice.selected && !choice.disabled) { + var canAddItem = this._canAddItem(activeItems, choice.value); + + if (canAddItem.response) { + this._addItem(choice.value, choice.label, choice.id, choice.groupId, choice.customProperties, choice.placeholder, choice.keyCode); + this._triggerChange(choice.value); + } + } + + this.clearInput(); + + // We wont to close the dropdown if we are dealing with a single select box + if (hasActiveDropdown && this.isSelectOneElement) { + this.hideDropdown(); + this.containerOuter.focus(); + } + } + + /** + * Process back space event + * @param {Array} activeItems items + * @return + * @private + */ + + }, { + key: '_handleBackspace', + value: function _handleBackspace(activeItems) { + if (this.config.removeItems && activeItems) { + var lastItem = activeItems[activeItems.length - 1]; + var hasHighlightedItems = activeItems.some(function (item) { + return item.highlighted; + }); + + // If editing the last item is allowed and there are not other selected items, + // we can edit the item value. Otherwise if we can remove items, remove all selected items + if (this.config.editItems && !hasHighlightedItems && lastItem) { + this.input.value = lastItem.value; + this._setInputWidth(); + this._removeItem(lastItem); + this._triggerChange(lastItem.value); + } else { + if (!hasHighlightedItems) { + this.highlightItem(lastItem, false); + } + this.removeHighlightedItems(true); + } + } + } + + /** + * Validates whether an item can be added by a user + * @param {Array} activeItems The currently active items + * @param {String} value Value of item to add + * @return {Object} Response: Whether user can add item + * Notice: Notice show in dropdown + */ + + }, { + key: '_canAddItem', + value: function _canAddItem(activeItems, value) { + var canAddItem = true; + var notice = (0, _utils.isType)('Function', this.config.addItemText) ? this.config.addItemText(value) : this.config.addItemText; + + if (this.isSelectMultipleElement || this.isTextElement) { + if (this.config.maxItemCount > 0 && this.config.maxItemCount <= activeItems.length) { + // If there is a max entry limit and we have reached that limit + // don't update + canAddItem = false; + notice = (0, _utils.isType)('Function', this.config.maxItemText) ? this.config.maxItemText(this.config.maxItemCount) : this.config.maxItemText; + } + } + + if (this.isTextElement && this.config.addItems && canAddItem) { + // If a user has supplied a regular expression filter + if (this.config.regexFilter) { + // Determine whether we can update based on whether + // our regular expression passes + canAddItem = this._regexFilter(value); + } + } + + // If no duplicates are allowed, and the value already exists + // in the array + var isUnique = !activeItems.some(function (item) { + if ((0, _utils.isType)('String', value)) { + return item.value === value.trim(); + } + + return item.value === value; + }); + + if (!isUnique && !this.config.duplicateItems && !this.isSelectOneElement && canAddItem) { + canAddItem = false; + notice = (0, _utils.isType)('Function', this.config.uniqueItemText) ? this.config.uniqueItemText(value) : this.config.uniqueItemText; + } + + return { + response: canAddItem, + notice: notice + }; + } + + /** + * Apply or remove a loading state to the component. + * @param {Boolean} setLoading default value set to 'true'. + * @return + * @private + */ + + }, { + key: '_handleLoadingState', + value: function _handleLoadingState() { + var setLoading = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + var placeholderItem = this.itemList.querySelector('.' + this.config.classNames.placeholder); + if (setLoading) { + this.containerOuter.classList.add(this.config.classNames.loadingState); + this.containerOuter.setAttribute('aria-busy', 'true'); + if (this.isSelectOneElement) { + if (!placeholderItem) { + placeholderItem = this._getTemplate('placeholder', this.config.loadingText); + this.itemList.appendChild(placeholderItem); + } else { + placeholderItem.innerHTML = this.config.loadingText; + } + } else { + this.input.placeholder = this.config.loadingText; + } + } else { + // Remove loading states/text + this.containerOuter.classList.remove(this.config.classNames.loadingState); + + if (this.isSelectOneElement) { + placeholderItem.innerHTML = this.placeholder || ''; + } else { + this.input.placeholder = this.placeholder || ''; + } + } + } + + /** + * Retrieve the callback used to populate component's choices in an async way. + * @returns {Function} The callback as a function. + * @private + */ + + }, { + key: '_ajaxCallback', + value: function _ajaxCallback() { + var _this15 = this; + + return function (results, value, label) { + if (!results || !value) { + return; + } + + var parsedResults = (0, _utils.isType)('Object', results) ? [results] : results; + + if (parsedResults && (0, _utils.isType)('Array', parsedResults) && parsedResults.length) { + // Remove loading states/text + _this15._handleLoadingState(false); + // Add each result as a choice + + _this15._setLoading(true); + + parsedResults.forEach(function (result) { + if (result.choices) { + var groupId = result.id || null; + _this15._addGroup(result, groupId, value, label); + } else { + _this15._addChoice(result[value], result[label], result.selected, result.disabled, undefined, result.customProperties, result.placeholder); + } + }); + + _this15._setLoading(false); + + if (_this15.isSelectOneElement) { + _this15._selectPlaceholderChoice(); + } + } else { + // No results, remove loading state + _this15._handleLoadingState(false); + } + + _this15.containerOuter.removeAttribute('aria-busy'); + }; + } + + /** + * Filter choices based on search value + * @param {String} value Value to filter by + * @return + * @private + */ + + }, { + key: '_searchChoices', + value: function _searchChoices(value) { + var newValue = (0, _utils.isType)('String', value) ? value.trim() : value; + var currentValue = (0, _utils.isType)('String', this.currentValue) ? this.currentValue.trim() : this.currentValue; + + // If new value matches the desired length and is not the same as the current value with a space + if (newValue.length >= 1 && newValue !== currentValue + ' ') { + var haystack = this.store.getSearchableChoices(); + var needle = newValue; + var keys = (0, _utils.isType)('Array', this.config.searchFields) ? this.config.searchFields : [this.config.searchFields]; + var options = Object.assign(this.config.fuseOptions, { keys: keys }); + var fuse = new _fuse2.default(haystack, options); + var results = fuse.search(needle); + + this.currentValue = newValue; + this.highlightPosition = 0; + this.isSearching = true; + this.store.dispatch((0, _index3.filterChoices)(results)); + + return results.length; + } + + return 0; + } + + /** + * Determine the action when a user is searching + * @param {String} value Value entered by user + * @return + * @private + */ + + }, { + key: '_handleSearch', + value: function _handleSearch(value) { + if (!value) { + return; + } + + var choices = this.store.getChoices(); + var hasUnactiveChoices = choices.some(function (option) { + return !option.active; + }); + + // Run callback if it is a function + if (this.input === document.activeElement) { + // Check that we have a value to search and the input was an alphanumeric character + if (value && value.length >= this.config.searchFloor) { + var resultCount = 0; + // Check flag to filter search input + if (this.config.searchChoices) { + // Filter available choices + resultCount = this._searchChoices(value); + } + // Trigger search event + (0, _utils.triggerEvent)(this.passedElement, 'search', { + value: value, + resultCount: resultCount + }); + } else if (hasUnactiveChoices) { + // Otherwise reset choices to active + this.isSearching = false; + this.store.dispatch((0, _index3.activateChoices)(true)); + } + } + } + + /** + * Trigger event listeners + * @return + * @private + */ + + }, { + key: '_addEventListeners', + value: function _addEventListeners() { + document.addEventListener('keyup', this._onKeyUp); + document.addEventListener('keydown', this._onKeyDown); + document.addEventListener('click', this._onClick); + document.addEventListener('touchmove', this._onTouchMove); + document.addEventListener('touchend', this._onTouchEnd); + document.addEventListener('mousedown', this._onMouseDown); + document.addEventListener('mouseover', this._onMouseOver); + + if (this.isSelectOneElement) { + this.containerOuter.addEventListener('focus', this._onFocus); + this.containerOuter.addEventListener('blur', this._onBlur); + } + + this.input.addEventListener('input', this._onInput); + this.input.addEventListener('paste', this._onPaste); + this.input.addEventListener('focus', this._onFocus); + this.input.addEventListener('blur', this._onBlur); + } + + /** + * Remove event listeners + * @return + * @private + */ + + }, { + key: '_removeEventListeners', + value: function _removeEventListeners() { + document.removeEventListener('keyup', this._onKeyUp); + document.removeEventListener('keydown', this._onKeyDown); + document.removeEventListener('click', this._onClick); + document.removeEventListener('touchmove', this._onTouchMove); + document.removeEventListener('touchend', this._onTouchEnd); + document.removeEventListener('mousedown', this._onMouseDown); + document.removeEventListener('mouseover', this._onMouseOver); + + if (this.isSelectOneElement) { + this.containerOuter.removeEventListener('focus', this._onFocus); + this.containerOuter.removeEventListener('blur', this._onBlur); + } + + this.input.removeEventListener('input', this._onInput); + this.input.removeEventListener('paste', this._onPaste); + this.input.removeEventListener('focus', this._onFocus); + this.input.removeEventListener('blur', this._onBlur); + } + + /** + * Set the correct input width based on placeholder + * value or input value + * @return + */ + + }, { + key: '_setInputWidth', + value: function _setInputWidth() { + if (this.placeholder) { + // If there is a placeholder, we only want to set the width of the input when it is a greater + // length than 75% of the placeholder. This stops the input jumping around. + if (this.input.value && this.input.value.length >= this.placeholder.length / 1.25) { + this.input.style.width = (0, _utils.getWidthOfInput)(this.input); + } + } else { + // If there is no placeholder, resize input to contents + this.input.style.width = (0, _utils.getWidthOfInput)(this.input); + } + } + + /** + * Key down event + * @param {Object} e Event + * @return + */ + + }, { + key: '_onKeyDown', + value: function _onKeyDown(e) { + var _this16 = this, + _keyDownActions; + + if (e.target !== this.input && !this.containerOuter.contains(e.target)) { + return; + } + + var target = e.target; + var activeItems = this.store.getItemsFilteredByActive(); + var hasFocusedInput = this.input === document.activeElement; + var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState); + var hasItems = this.itemList && this.itemList.children; + var keyString = String.fromCharCode(e.keyCode); + + var backKey = 46; + var deleteKey = 8; + var enterKey = 13; + var aKey = 65; + var escapeKey = 27; + var upKey = 38; + var downKey = 40; + var pageUpKey = 33; + var pageDownKey = 34; + var ctrlDownKey = e.ctrlKey || e.metaKey; + + // If a user is typing and the dropdown is not active + if (!this.isTextElement && /[a-zA-Z0-9-_ ]/.test(keyString) && !hasActiveDropdown) { + this.showDropdown(true); + } + + this.canSearch = this.config.searchEnabled; + + var onAKey = function onAKey() { + // If CTRL + A or CMD + A have been pressed and there are items to select + if (ctrlDownKey && hasItems) { + _this16.canSearch = false; + if (_this16.config.removeItems && !_this16.input.value && _this16.input === document.activeElement) { + // Highlight items + _this16.highlightAll(); + } + } + }; + + var onEnterKey = function onEnterKey() { + // If enter key is pressed and the input has a value + if (_this16.isTextElement && target.value) { + var value = _this16.input.value; + var canAddItem = _this16._canAddItem(activeItems, value); + + // All is good, add + if (canAddItem.response) { + if (hasActiveDropdown) { + _this16.hideDropdown(); + } + _this16._addItem(value); + _this16._triggerChange(value); + _this16.clearInput(); + } + } + + if (target.hasAttribute('data-button')) { + _this16._handleButtonAction(activeItems, target); + e.preventDefault(); + } + + if (hasActiveDropdown) { + e.preventDefault(); + var highlighted = _this16.dropdown.querySelector('.' + _this16.config.classNames.highlightedState); + + // If we have a highlighted choice + if (highlighted) { + // add enter keyCode value + if (activeItems[0]) { + activeItems[0].keyCode = enterKey; + } + _this16._handleChoiceAction(activeItems, highlighted); + } + } else if (_this16.isSelectOneElement) { + // Open single select dropdown if it's not active + if (!hasActiveDropdown) { + _this16.showDropdown(true); + e.preventDefault(); + } + } + }; + + var onEscapeKey = function onEscapeKey() { + if (hasActiveDropdown) { + _this16.toggleDropdown(); + _this16.containerOuter.focus(); + } + }; + + var onDirectionKey = function onDirectionKey() { + // If up or down key is pressed, traverse through options + if (hasActiveDropdown || _this16.isSelectOneElement) { + // Show dropdown if focus + if (!hasActiveDropdown) { + _this16.showDropdown(true); + } + + _this16.canSearch = false; + + var directionInt = e.keyCode === downKey || e.keyCode === pageDownKey ? 1 : -1; + var skipKey = e.metaKey || e.keyCode === pageDownKey || e.keyCode === pageUpKey; + + var nextEl = void 0; + if (skipKey) { + if (directionInt > 0) { + nextEl = Array.from(_this16.dropdown.querySelectorAll('[data-choice-selectable]')).pop(); + } else { + nextEl = _this16.dropdown.querySelector('[data-choice-selectable]'); + } + } else { + var currentEl = _this16.dropdown.querySelector('.' + _this16.config.classNames.highlightedState); + if (currentEl) { + nextEl = (0, _utils.getAdjacentEl)(currentEl, '[data-choice-selectable]', directionInt); + } else { + nextEl = _this16.dropdown.querySelector('[data-choice-selectable]'); + } + } + + if (nextEl) { + // We prevent default to stop the cursor moving + // when pressing the arrow + if (!(0, _utils.isScrolledIntoView)(nextEl, _this16.choiceList, directionInt)) { + _this16._scrollToChoice(nextEl, directionInt); + } + _this16._highlightChoice(nextEl); + } + + // Prevent default to maintain cursor position whilst + // traversing dropdown options + e.preventDefault(); + } + }; + + var onDeleteKey = function onDeleteKey() { + // If backspace or delete key is pressed and the input has no value + if (hasFocusedInput && !e.target.value && !_this16.isSelectOneElement) { + _this16._handleBackspace(activeItems); + e.preventDefault(); + } + }; + + // Map keys to key actions + var keyDownActions = (_keyDownActions = {}, _defineProperty(_keyDownActions, aKey, onAKey), _defineProperty(_keyDownActions, enterKey, onEnterKey), _defineProperty(_keyDownActions, escapeKey, onEscapeKey), _defineProperty(_keyDownActions, upKey, onDirectionKey), _defineProperty(_keyDownActions, pageUpKey, onDirectionKey), _defineProperty(_keyDownActions, downKey, onDirectionKey), _defineProperty(_keyDownActions, pageDownKey, onDirectionKey), _defineProperty(_keyDownActions, deleteKey, onDeleteKey), _defineProperty(_keyDownActions, backKey, onDeleteKey), _keyDownActions); + + // If keycode has a function, run it + if (keyDownActions[e.keyCode]) { + keyDownActions[e.keyCode](); + } + } + + /** + * Key up event + * @param {Object} e Event + * @return + * @private + */ + + }, { + key: '_onKeyUp', + value: function _onKeyUp(e) { + if (e.target !== this.input) { + return; + } + + var value = this.input.value; + var activeItems = this.store.getItemsFilteredByActive(); + var canAddItem = this._canAddItem(activeItems, value); + + // We are typing into a text input and have a value, we want to show a dropdown + // notice. Otherwise hide the dropdown + if (this.isTextElement) { + var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState); + if (value) { + + if (canAddItem.notice) { + var dropdownItem = this._getTemplate('notice', canAddItem.notice); + this.dropdown.innerHTML = dropdownItem.outerHTML; + } + + if (canAddItem.response === true) { + if (!hasActiveDropdown) { + this.showDropdown(); + } + } else if (!canAddItem.notice && hasActiveDropdown) { + this.hideDropdown(); + } + } else if (hasActiveDropdown) { + this.hideDropdown(); + } + } else { + var backKey = 46; + var deleteKey = 8; + + // If user has removed value... + if ((e.keyCode === backKey || e.keyCode === deleteKey) && !e.target.value) { + // ...and it is a multiple select input, activate choices (if searching) + if (!this.isTextElement && this.isSearching) { + this.isSearching = false; + this.store.dispatch((0, _index3.activateChoices)(true)); + } + } else if (this.canSearch && canAddItem.response) { + this._handleSearch(this.input.value); + } + } + // Re-establish canSearch value from changes in _onKeyDown + this.canSearch = this.config.searchEnabled; + } + + /** + * Input event + * @return + * @private + */ + + }, { + key: '_onInput', + value: function _onInput() { + if (!this.isSelectOneElement) { + this._setInputWidth(); + } + } + + /** + * Touch move event + * @return + * @private + */ + + }, { + key: '_onTouchMove', + value: function _onTouchMove() { + if (this.wasTap === true) { + this.wasTap = false; + } + } + + /** + * Touch end event + * @param {Object} e Event + * @return + * @private + */ + + }, { + key: '_onTouchEnd', + value: function _onTouchEnd(e) { + var target = e.target || e.touches[0].target; + var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState); + + // If a user tapped within our container... + if (this.wasTap === true && this.containerOuter.contains(target)) { + // ...and we aren't dealing with a single select box, show dropdown/focus input + if ((target === this.containerOuter || target === this.containerInner) && !this.isSelectOneElement) { + if (this.isTextElement) { + // If text element, we only want to focus the input (if it isn't already) + if (document.activeElement !== this.input) { + this.input.focus(); + } + } else { + if (!hasActiveDropdown) { + // If a select box, we want to show the dropdown + this.showDropdown(true); + } + } + } + // Prevents focus event firing + e.stopPropagation(); + } + + this.wasTap = true; + } + + /** + * Mouse down event + * @param {Object} e Event + * @return + * @private + */ + + }, { + key: '_onMouseDown', + value: function _onMouseDown(e) { + var target = e.target; + + // If we have our mouse down on the scrollbar and are on IE11... + if (target === this.choiceList && this.isIe11) { + this.isScrollingOnIe = true; + } + + if (this.containerOuter.contains(target) && target !== this.input) { + var foundTarget = void 0; + var activeItems = this.store.getItemsFilteredByActive(); + var hasShiftKey = e.shiftKey; + + if (foundTarget = (0, _utils.findAncestorByAttrName)(target, 'data-button')) { + this._handleButtonAction(activeItems, foundTarget); + } else if (foundTarget = (0, _utils.findAncestorByAttrName)(target, 'data-item')) { + this._handleItemAction(activeItems, foundTarget, hasShiftKey); + } else if (foundTarget = (0, _utils.findAncestorByAttrName)(target, 'data-choice')) { + this._handleChoiceAction(activeItems, foundTarget); + } + + e.preventDefault(); + } + } + + /** + * Click event + * @param {Object} e Event + * @return + * @private + */ + + }, { + key: '_onClick', + value: function _onClick(e) { + var target = e.target; + var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState); + var activeItems = this.store.getItemsFilteredByActive(); + + // If target is something that concerns us + if (this.containerOuter.contains(target)) { + // Handle button delete + if (target.hasAttribute('data-button')) { + this._handleButtonAction(activeItems, target); + } + + if (!hasActiveDropdown) { + if (this.isTextElement) { + if (document.activeElement !== this.input) { + this.input.focus(); + } + } else { + if (this.canSearch) { + this.showDropdown(true); + } else { + this.showDropdown(); + this.containerOuter.focus(); + } + } + } else if (this.isSelectOneElement && target !== this.input && !this.dropdown.contains(target)) { + this.hideDropdown(true); + } + } else { + var hasHighlightedItems = activeItems.some(function (item) { + return item.highlighted; + }); + + // De-select any highlighted items + if (hasHighlightedItems) { + this.unhighlightAll(); + } + + // Remove focus state + this.containerOuter.classList.remove(this.config.classNames.focusState); + + // Close all other dropdowns + if (hasActiveDropdown) { + this.hideDropdown(); + } + } + } + + /** + * Mouse over (hover) event + * @param {Object} e Event + * @return + * @private + */ + + }, { + key: '_onMouseOver', + value: function _onMouseOver(e) { + // If the dropdown is either the target or one of its children is the target + if (e.target === this.dropdown || this.dropdown.contains(e.target)) { + if (e.target.hasAttribute('data-choice')) this._highlightChoice(e.target); + } + } + + /** + * Paste event + * @param {Object} e Event + * @return + * @private + */ + + }, { + key: '_onPaste', + value: function _onPaste(e) { + // Disable pasting into the input if option has been set + if (e.target === this.input && !this.config.paste) { + e.preventDefault(); + } + } + + /** + * Focus event + * @param {Object} e Event + * @return + * @private + */ + + }, { + key: '_onFocus', + value: function _onFocus(e) { + var _this17 = this; + + var target = e.target; + // If target is something that concerns us + if (this.containerOuter.contains(target)) { + var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState); + var focusActions = { + text: function text() { + if (target === _this17.input) { + _this17.containerOuter.classList.add(_this17.config.classNames.focusState); + } + }, + 'select-one': function selectOne() { + _this17.containerOuter.classList.add(_this17.config.classNames.focusState); + if (target === _this17.input) { + // Show dropdown if it isn't already showing + if (!hasActiveDropdown) { + _this17.showDropdown(); + } + } + }, + 'select-multiple': function selectMultiple() { + if (target === _this17.input) { + // If element is a select box, the focused element is the container and the dropdown + // isn't already open, focus and show dropdown + _this17.containerOuter.classList.add(_this17.config.classNames.focusState); + + if (!hasActiveDropdown) { + _this17.showDropdown(true); + } + } + } + }; + + focusActions[this.passedElement.type](); + } + } + + /** + * Blur event + * @param {Object} e Event + * @return + * @private + */ + + }, { + key: '_onBlur', + value: function _onBlur(e) { + var _this18 = this; + + var target = e.target; + // If target is something that concerns us + if (this.containerOuter.contains(target) && !this.isScrollingOnIe) { + var activeItems = this.store.getItemsFilteredByActive(); + var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState); + var hasHighlightedItems = activeItems.some(function (item) { + return item.highlighted; + }); + var blurActions = { + text: function text() { + if (target === _this18.input) { + // Remove the focus state + _this18.containerOuter.classList.remove(_this18.config.classNames.focusState); + // De-select any highlighted items + if (hasHighlightedItems) { + _this18.unhighlightAll(); + } + // Hide dropdown if it is showing + if (hasActiveDropdown) { + _this18.hideDropdown(); + } + } + }, + 'select-one': function selectOne() { + _this18.containerOuter.classList.remove(_this18.config.classNames.focusState); + if (target === _this18.containerOuter) { + // Hide dropdown if it is showing + if (hasActiveDropdown && !_this18.canSearch) { + _this18.hideDropdown(); + } + } + if (target === _this18.input && hasActiveDropdown) { + // Hide dropdown if it is showing + _this18.hideDropdown(); + } + }, + 'select-multiple': function selectMultiple() { + if (target === _this18.input) { + // Remove the focus state + _this18.containerOuter.classList.remove(_this18.config.classNames.focusState); + // Hide dropdown if it is showing + if (hasActiveDropdown) { + _this18.hideDropdown(); + } + // De-select any highlighted items + if (hasHighlightedItems) { + _this18.unhighlightAll(); + } + } + } + }; + + blurActions[this.passedElement.type](); + } else { + // On IE11, clicking the scollbar blurs our input and thus + // closes the dropdown. To stop this, we refocus our input + // if we know we are on IE *and* are scrolling. + this.isScrollingOnIe = false; + this.input.focus(); + } + } + + /** + * Tests value against a regular expression + * @param {string} value Value to test + * @return {Boolean} Whether test passed/failed + * @private + */ + + }, { + key: '_regexFilter', + value: function _regexFilter(value) { + if (!value) { + return false; + } + + var regex = this.config.regexFilter; + var expression = new RegExp(regex.source, 'i'); + return expression.test(value); + } + + /** + * Scroll to an option element + * @param {HTMLElement} choice Option to scroll to + * @param {Number} direction Whether option is above or below + * @return + * @private + */ + + }, { + key: '_scrollToChoice', + value: function _scrollToChoice(choice, direction) { + var _this19 = this; + + if (!choice) { + return; + } + + var dropdownHeight = this.choiceList.offsetHeight; + var choiceHeight = choice.offsetHeight; + // Distance from bottom of element to top of parent + var choicePos = choice.offsetTop + choiceHeight; + // Scroll position of dropdown + var containerScrollPos = this.choiceList.scrollTop + dropdownHeight; + // Difference between the choice and scroll position + var endPoint = direction > 0 ? this.choiceList.scrollTop + choicePos - containerScrollPos : choice.offsetTop; + + var animateScroll = function animateScroll() { + var strength = 4; + var choiceListScrollTop = _this19.choiceList.scrollTop; + var continueAnimation = false; + var easing = void 0; + var distance = void 0; + + if (direction > 0) { + easing = (endPoint - choiceListScrollTop) / strength; + distance = easing > 1 ? easing : 1; + + _this19.choiceList.scrollTop = choiceListScrollTop + distance; + if (choiceListScrollTop < endPoint) { + continueAnimation = true; + } + } else { + easing = (choiceListScrollTop - endPoint) / strength; + distance = easing > 1 ? easing : 1; + + _this19.choiceList.scrollTop = choiceListScrollTop - distance; + if (choiceListScrollTop > endPoint) { + continueAnimation = true; + } + } + + if (continueAnimation) { + requestAnimationFrame(function (time) { + animateScroll(time, endPoint, direction); + }); + } + }; + + requestAnimationFrame(function (time) { + animateScroll(time, endPoint, direction); + }); + } + + /** + * Highlight choice + * @param {HTMLElement} [el] Element to highlight + * @return + * @private + */ + + }, { + key: '_highlightChoice', + value: function _highlightChoice() { + var _this20 = this; + + var el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + // Highlight first element in dropdown + var choices = Array.from(this.dropdown.querySelectorAll('[data-choice-selectable]')); + var passedEl = el; + + if (choices && choices.length) { + var highlightedChoices = Array.from(this.dropdown.querySelectorAll('.' + this.config.classNames.highlightedState)); + + // Remove any highlighted choices + highlightedChoices.forEach(function (choice) { + choice.classList.remove(_this20.config.classNames.highlightedState); + choice.setAttribute('aria-selected', 'false'); + }); + + if (passedEl) { + this.highlightPosition = choices.indexOf(passedEl); + } else { + // Highlight choice based on last known highlight location + if (choices.length > this.highlightPosition) { + // If we have an option to highlight + passedEl = choices[this.highlightPosition]; + } else { + // Otherwise highlight the option before + passedEl = choices[choices.length - 1]; + } + + if (!passedEl) { + passedEl = choices[0]; + } + } + + // Highlight given option, and set accessiblity attributes + passedEl.classList.add(this.config.classNames.highlightedState); + passedEl.setAttribute('aria-selected', 'true'); + this.containerOuter.setAttribute('aria-activedescendant', passedEl.id); + } + } + + /** + * Add item to store with correct value + * @param {String} value Value to add to store + * @param {String} [label] Label to add to store + * @param {Number} [choiceId=-1] ID of the associated choice that was selected + * @param {Number} [groupId=-1] ID of group choice is within. Negative number indicates no group + * @param {Object} [customProperties] Object containing user defined properties + * @return {Object} Class instance + * @public + */ + + }, { + key: '_addItem', + value: function _addItem(value) { + var label = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + var choiceId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1; + var groupId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : -1; + var customProperties = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; + var placeholder = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; + var keyCode = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null; + + var passedValue = (0, _utils.isType)('String', value) ? value.trim() : value; + var passedKeyCode = keyCode; + var items = this.store.getItems(); + var passedLabel = label || passedValue; + var passedOptionId = parseInt(choiceId, 10) || -1; + + // Get group if group ID passed + var group = groupId >= 0 ? this.store.getGroupById(groupId) : null; + + // Generate unique id + var id = items ? items.length + 1 : 1; + + // If a prepended value has been passed, prepend it + if (this.config.prependValue) { + passedValue = this.config.prependValue + passedValue.toString(); + } + + // If an appended value has been passed, append it + if (this.config.appendValue) { + passedValue += this.config.appendValue.toString(); + } + + this.store.dispatch((0, _index3.addItem)(passedValue, passedLabel, id, passedOptionId, groupId, customProperties, placeholder, passedKeyCode)); + + if (this.isSelectOneElement) { + this.removeActiveItems(id); + } + + // Trigger change event + if (group && group.value) { + (0, _utils.triggerEvent)(this.passedElement, 'addItem', { + id: id, + value: passedValue, + label: passedLabel, + groupValue: group.value, + keyCode: passedKeyCode + }); + } else { + (0, _utils.triggerEvent)(this.passedElement, 'addItem', { + id: id, + value: passedValue, + label: passedLabel, + keyCode: passedKeyCode + }); + } + + return this; + } + + /** + * Remove item from store + * @param {Object} item Item to remove + * @return {Object} Class instance + * @public + */ + + }, { + key: '_removeItem', + value: function _removeItem(item) { + if (!item || !(0, _utils.isType)('Object', item)) { + return this; + } + + var id = item.id; + var value = item.value; + var label = item.label; + var choiceId = item.choiceId; + var groupId = item.groupId; + var group = groupId >= 0 ? this.store.getGroupById(groupId) : null; + + this.store.dispatch((0, _index3.removeItem)(id, choiceId)); + + if (group && group.value) { + (0, _utils.triggerEvent)(this.passedElement, 'removeItem', { + id: id, + value: value, + label: label, + groupValue: group.value + }); + } else { + (0, _utils.triggerEvent)(this.passedElement, 'removeItem', { + id: id, + value: value, + label: label + }); + } + + return this; + } + + /** + * Add choice to dropdown + * @param {String} value Value of choice + * @param {String} [label] Label of choice + * @param {Boolean} [isSelected=false] Whether choice is selected + * @param {Boolean} [isDisabled=false] Whether choice is disabled + * @param {Number} [groupId=-1] ID of group choice is within. Negative number indicates no group + * @param {Object} [customProperties] Object containing user defined properties + * @return + * @private + */ + + }, { + key: '_addChoice', + value: function _addChoice(value) { + var label = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + var isSelected = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var isDisabled = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + var groupId = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; + var customProperties = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null; + var placeholder = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false; + var keyCode = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null; + + if (typeof value === 'undefined' || value === null) { + return; + } + + // Generate unique id + var choices = this.store.getChoices(); + var choiceLabel = label || value; + var choiceId = choices ? choices.length + 1 : 1; + var choiceElementId = this.baseId + '-' + this.idNames.itemChoice + '-' + choiceId; + + this.store.dispatch((0, _index3.addChoice)(value, choiceLabel, choiceId, groupId, isDisabled, choiceElementId, customProperties, placeholder, keyCode)); + + if (isSelected) { + this._addItem(value, choiceLabel, choiceId, undefined, customProperties, placeholder, keyCode); + } + } + + /** + * Clear all choices added to the store. + * @return + * @private + */ + + }, { + key: '_clearChoices', + value: function _clearChoices() { + this.store.dispatch((0, _index3.clearChoices)()); + } + + /** + * Add group to dropdown + * @param {Object} group Group to add + * @param {Number} id Group ID + * @param {String} [valueKey] name of the value property on the object + * @param {String} [labelKey] name of the label property on the object + * @return + * @private + */ + + }, { + key: '_addGroup', + value: function _addGroup(group, id) { + var _this21 = this; + + var valueKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'value'; + var labelKey = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'label'; + + var groupChoices = (0, _utils.isType)('Object', group) ? group.choices : Array.from(group.getElementsByTagName('OPTION')); + var groupId = id ? id : Math.floor(new Date().valueOf() * Math.random()); + var isDisabled = group.disabled ? group.disabled : false; + + if (groupChoices) { + this.store.dispatch((0, _index3.addGroup)(group.label, groupId, true, isDisabled)); + + groupChoices.forEach(function (option) { + var isOptDisabled = option.disabled || option.parentNode && option.parentNode.disabled; + _this21._addChoice(option[valueKey], (0, _utils.isType)('Object', option) ? option[labelKey] : option.innerHTML, option.selected, isOptDisabled, groupId, option.customProperties, option.placeholder); + }); + } else { + this.store.dispatch((0, _index3.addGroup)(group.label, group.id, false, group.disabled)); + } + } + + /** + * Get template from name + * @param {String} template Name of template to get + * @param {...} args Data to pass to template + * @return {HTMLElement} Template + * @private + */ + + }, { + key: '_getTemplate', + value: function _getTemplate(template) { + if (!template) { + return null; + } + var templates = this.config.templates; + + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return templates[template].apply(templates, args); + } + + /** + * Create HTML element based on type and arguments + * @return + * @private + */ + + }, { + key: '_createTemplates', + value: function _createTemplates() { + var _this22 = this; + + var globalClasses = this.config.classNames; + var templates = { + containerOuter: function containerOuter(direction) { + return (0, _utils.strToEl)('\n
and ") + ''; + } + }, { + key: "renderRow", + value: function renderRow(days, isRTL, isRowSelected) { + return '' + (isRTL ? days.reverse() : days).join('') + ''; + } + }, { + key: "renderTable", + value: function renderTable(opts, data, randId) { + return '
' + this.renderHead(opts) + this.renderBody(data) + '
'; + } + }, { + key: "renderHead", + value: function renderHead(opts) { + var i = void 0, + arr = []; + for (i = 0; i < 7; i++) { + arr.push("" + this.renderDayName(opts, i, true) + ""); + } + return '' + (opts.isRTL ? arr.reverse() : arr).join('') + ''; + } + }, { + key: "renderBody", + value: function renderBody(rows) { + return '' + rows.join('') + ''; + } + }, { + key: "renderTitle", + value: function renderTitle(instance, c, year, month, refYear, randId) { + var i = void 0, + j = void 0, + arr = void 0, + opts = this.options, + isMinYear = year === opts.minYear, + isMaxYear = year === opts.maxYear, + html = '
', + monthHtml = void 0, + yearHtml = void 0, + prev = true, + next = true; + + for (arr = [], i = 0; i < 12; i++) { + arr.push(''); + } + + monthHtml = ''; + + if ($.isArray(opts.yearRange)) { + i = opts.yearRange[0]; + j = opts.yearRange[1] + 1; + } else { + i = year - opts.yearRange; + j = 1 + year + opts.yearRange; + } + + for (arr = []; i < j && i <= opts.maxYear; i++) { + if (i >= opts.minYear) { + arr.push(""); + } + } + + yearHtml = ""; + + var leftArrow = ''; + html += ""; + + html += '
'; + if (opts.showMonthAfterYear) { + html += yearHtml + monthHtml; + } else { + html += monthHtml + yearHtml; + } + html += '
'; + + if (isMinYear && (month === 0 || opts.minMonth >= month)) { + prev = false; + } + + if (isMaxYear && (month === 11 || opts.maxMonth <= month)) { + next = false; + } + + var rightArrow = ''; + html += ""; + + return html += '
'; + } + + /** + * refresh the HTML + */ + + }, { + key: "draw", + value: function draw(force) { + if (!this.isOpen && !force) { + return; + } + var opts = this.options, + minYear = opts.minYear, + maxYear = opts.maxYear, + minMonth = opts.minMonth, + maxMonth = opts.maxMonth, + html = '', + randId = void 0; + + if (this._y <= minYear) { + this._y = minYear; + if (!isNaN(minMonth) && this._m < minMonth) { + this._m = minMonth; + } + } + if (this._y >= maxYear) { + this._y = maxYear; + if (!isNaN(maxMonth) && this._m > maxMonth) { + this._m = maxMonth; + } + } + + randId = 'datepicker-title-' + Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 2); + + for (var c = 0; c < 1; c++) { + this._renderDateDisplay(); + html += this.renderTitle(this, c, this.calendars[c].year, this.calendars[c].month, this.calendars[0].year, randId) + this.render(this.calendars[c].year, this.calendars[c].month, randId); + } + + this.destroySelects(); + + this.calendarEl.innerHTML = html; + + // Init Materialize Select + var yearSelect = this.calendarEl.querySelector('.orig-select-year'); + var monthSelect = this.calendarEl.querySelector('.orig-select-month'); + M.FormSelect.init(yearSelect, { + classes: 'select-year', + dropdownOptions: { container: document.body, constrainWidth: false } + }); + M.FormSelect.init(monthSelect, { + classes: 'select-month', + dropdownOptions: { container: document.body, constrainWidth: false } + }); + + // Add change handlers for select + yearSelect.addEventListener('change', this._handleYearChange.bind(this)); + monthSelect.addEventListener('change', this._handleMonthChange.bind(this)); + + if (typeof this.options.onDraw === 'function') { + this.options.onDraw(this); + } + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + this._handleInputKeydownBound = this._handleInputKeydown.bind(this); + this._handleInputClickBound = this._handleInputClick.bind(this); + this._handleInputChangeBound = this._handleInputChange.bind(this); + this._handleCalendarClickBound = this._handleCalendarClick.bind(this); + this._finishSelectionBound = this._finishSelection.bind(this); + this._handleMonthChange = this._handleMonthChange.bind(this); + this._closeBound = this.close.bind(this); + + this.el.addEventListener('click', this._handleInputClickBound); + this.el.addEventListener('keydown', this._handleInputKeydownBound); + this.el.addEventListener('change', this._handleInputChangeBound); + this.calendarEl.addEventListener('click', this._handleCalendarClickBound); + this.doneBtn.addEventListener('click', this._finishSelectionBound); + this.cancelBtn.addEventListener('click', this._closeBound); + + if (this.options.showClearBtn) { + this._handleClearClickBound = this._handleClearClick.bind(this); + this.clearBtn.addEventListener('click', this._handleClearClickBound); + } + } + }, { + key: "_setupVariables", + value: function _setupVariables() { + var _this56 = this; + + this.$modalEl = $(Datepicker._template); + this.modalEl = this.$modalEl[0]; + + this.calendarEl = this.modalEl.querySelector('.datepicker-calendar'); + + this.yearTextEl = this.modalEl.querySelector('.year-text'); + this.dateTextEl = this.modalEl.querySelector('.date-text'); + if (this.options.showClearBtn) { + this.clearBtn = this.modalEl.querySelector('.datepicker-clear'); + } + this.doneBtn = this.modalEl.querySelector('.datepicker-done'); + this.cancelBtn = this.modalEl.querySelector('.datepicker-cancel'); + + this.formats = { + d: function () { + return _this56.date.getDate(); + }, + dd: function () { + var d = _this56.date.getDate(); + return (d < 10 ? '0' : '') + d; + }, + ddd: function () { + return _this56.options.i18n.weekdaysShort[_this56.date.getDay()]; + }, + dddd: function () { + return _this56.options.i18n.weekdays[_this56.date.getDay()]; + }, + m: function () { + return _this56.date.getMonth() + 1; + }, + mm: function () { + var m = _this56.date.getMonth() + 1; + return (m < 10 ? '0' : '') + m; + }, + mmm: function () { + return _this56.options.i18n.monthsShort[_this56.date.getMonth()]; + }, + mmmm: function () { + return _this56.options.i18n.months[_this56.date.getMonth()]; + }, + yy: function () { + return ('' + _this56.date.getFullYear()).slice(2); + }, + yyyy: function () { + return _this56.date.getFullYear(); + } + }; + } + + /** + * Remove Event Handlers + */ + + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + this.el.removeEventListener('click', this._handleInputClickBound); + this.el.removeEventListener('keydown', this._handleInputKeydownBound); + this.el.removeEventListener('change', this._handleInputChangeBound); + this.calendarEl.removeEventListener('click', this._handleCalendarClickBound); + } + }, { + key: "_handleInputClick", + value: function _handleInputClick() { + this.open(); + } + }, { + key: "_handleInputKeydown", + value: function _handleInputKeydown(e) { + if (e.which === M.keys.ENTER) { + e.preventDefault(); + this.open(); + } + } + }, { + key: "_handleCalendarClick", + value: function _handleCalendarClick(e) { + if (!this.isOpen) { + return; + } + + var $target = $(e.target); + if (!$target.hasClass('is-disabled')) { + if ($target.hasClass('datepicker-day-button') && !$target.hasClass('is-empty') && !$target.parent().hasClass('is-disabled')) { + this.setDate(new Date(e.target.getAttribute('data-year'), e.target.getAttribute('data-month'), e.target.getAttribute('data-day'))); + if (this.options.autoClose) { + this._finishSelection(); + } + } else if ($target.closest('.month-prev').length) { + this.prevMonth(); + } else if ($target.closest('.month-next').length) { + this.nextMonth(); + } + } + } + }, { + key: "_handleClearClick", + value: function _handleClearClick() { + this.date = null; + this.setInputValue(); + this.close(); + } + }, { + key: "_handleMonthChange", + value: function _handleMonthChange(e) { + this.gotoMonth(e.target.value); + } + }, { + key: "_handleYearChange", + value: function _handleYearChange(e) { + this.gotoYear(e.target.value); + } + + /** + * change view to a specific month (zero-index, e.g. 0: January) + */ + + }, { + key: "gotoMonth", + value: function gotoMonth(month) { + if (!isNaN(month)) { + this.calendars[0].month = parseInt(month, 10); + this.adjustCalendars(); + } + } + + /** + * change view to a specific full year (e.g. "2012") + */ + + }, { + key: "gotoYear", + value: function gotoYear(year) { + if (!isNaN(year)) { + this.calendars[0].year = parseInt(year, 10); + this.adjustCalendars(); + } + } + }, { + key: "_handleInputChange", + value: function _handleInputChange(e) { + var date = void 0; + + // Prevent change event from being fired when triggered by the plugin + if (e.firedBy === this) { + return; + } + if (this.options.parse) { + date = this.options.parse(this.el.value, this.options.format); + } else { + date = new Date(Date.parse(this.el.value)); + } + + if (Datepicker._isDate(date)) { + this.setDate(date); + } + } + }, { + key: "renderDayName", + value: function renderDayName(opts, day, abbr) { + day += opts.firstDay; + while (day >= 7) { + day -= 7; + } + return abbr ? opts.i18n.weekdaysAbbrev[day] : opts.i18n.weekdays[day]; + } + + /** + * Set input value to the selected date and close Datepicker + */ + + }, { + key: "_finishSelection", + value: function _finishSelection() { + this.setInputValue(); + this.close(); + } + + /** + * Open Datepicker + */ + + }, { + key: "open", + value: function open() { + if (this.isOpen) { + return; + } + + this.isOpen = true; + if (typeof this.options.onOpen === 'function') { + this.options.onOpen.call(this); + } + this.draw(); + this.modal.open(); + return this; + } + + /** + * Close Datepicker + */ + + }, { + key: "close", + value: function close() { + if (!this.isOpen) { + return; + } + + this.isOpen = false; + if (typeof this.options.onClose === 'function') { + this.options.onClose.call(this); + } + this.modal.close(); + return this; + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(Datepicker.__proto__ || Object.getPrototypeOf(Datepicker), "init", this).call(this, this, els, options); + } + }, { + key: "_isDate", + value: function _isDate(obj) { + return (/Date/.test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime()) + ); + } + }, { + key: "_isWeekend", + value: function _isWeekend(date) { + var day = date.getDay(); + return day === 0 || day === 6; + } + }, { + key: "_setToStartOfDay", + value: function _setToStartOfDay(date) { + if (Datepicker._isDate(date)) date.setHours(0, 0, 0, 0); + } + }, { + key: "_getDaysInMonth", + value: function _getDaysInMonth(year, month) { + return [31, Datepicker._isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; + } + }, { + key: "_isLeapYear", + value: function _isLeapYear(year) { + // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951 + return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0; + } + }, { + key: "_compareDates", + value: function _compareDates(a, b) { + // weak date comparison (use setToStartOfDay(date) to ensure correct result) + return a.getTime() === b.getTime(); + } + }, { + key: "_setToStartOfDay", + value: function _setToStartOfDay(date) { + if (Datepicker._isDate(date)) date.setHours(0, 0, 0, 0); + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_Datepicker; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return Datepicker; + }(Component); + + Datepicker._template = [''].join(''); + + M.Datepicker = Datepicker; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(Datepicker, 'datepicker', 'M_Datepicker'); + } +})(cash); +;(function ($) { + 'use strict'; + + var _defaults = { + dialRadius: 135, + outerRadius: 105, + innerRadius: 70, + tickRadius: 20, + duration: 350, + container: null, + defaultTime: 'now', // default time, 'now' or '13:14' e.g. + fromNow: 0, // Millisecond offset from the defaultTime + showClearBtn: false, + + // internationalization + i18n: { + cancel: 'Cancel', + clear: 'Clear', + done: 'Ok' + }, + + autoClose: false, // auto close when minute is selected + twelveHour: true, // change to 12 hour AM/PM clock from 24 hour + vibrate: true, // vibrate the device when dragging clock hand + + // Callbacks + onOpenStart: null, + onOpenEnd: null, + onCloseStart: null, + onCloseEnd: null, + onSelect: null + }; + + /** + * @class + * + */ + + var Timepicker = function (_Component16) { + _inherits(Timepicker, _Component16); + + function Timepicker(el, options) { + _classCallCheck(this, Timepicker); + + var _this57 = _possibleConstructorReturn(this, (Timepicker.__proto__ || Object.getPrototypeOf(Timepicker)).call(this, Timepicker, el, options)); + + _this57.el.M_Timepicker = _this57; + + _this57.options = $.extend({}, Timepicker.defaults, options); + + _this57.id = M.guid(); + _this57._insertHTMLIntoDOM(); + _this57._setupModal(); + _this57._setupVariables(); + _this57._setupEventHandlers(); + + _this57._clockSetup(); + _this57._pickerSetup(); + return _this57; + } + + _createClass(Timepicker, [{ + key: "destroy", + + + /** + * Teardown component + */ + value: function destroy() { + this._removeEventHandlers(); + this.modal.destroy(); + $(this.modalEl).remove(); + this.el.M_Timepicker = undefined; + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + this._handleInputKeydownBound = this._handleInputKeydown.bind(this); + this._handleInputClickBound = this._handleInputClick.bind(this); + this._handleClockClickStartBound = this._handleClockClickStart.bind(this); + this._handleDocumentClickMoveBound = this._handleDocumentClickMove.bind(this); + this._handleDocumentClickEndBound = this._handleDocumentClickEnd.bind(this); + + this.el.addEventListener('click', this._handleInputClickBound); + this.el.addEventListener('keydown', this._handleInputKeydownBound); + this.plate.addEventListener('mousedown', this._handleClockClickStartBound); + this.plate.addEventListener('touchstart', this._handleClockClickStartBound); + + $(this.spanHours).on('click', this.showView.bind(this, 'hours')); + $(this.spanMinutes).on('click', this.showView.bind(this, 'minutes')); + } + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + this.el.removeEventListener('click', this._handleInputClickBound); + this.el.removeEventListener('keydown', this._handleInputKeydownBound); + } + }, { + key: "_handleInputClick", + value: function _handleInputClick() { + this.open(); + } + }, { + key: "_handleInputKeydown", + value: function _handleInputKeydown(e) { + if (e.which === M.keys.ENTER) { + e.preventDefault(); + this.open(); + } + } + }, { + key: "_handleClockClickStart", + value: function _handleClockClickStart(e) { + e.preventDefault(); + var clockPlateBR = this.plate.getBoundingClientRect(); + var offset = { x: clockPlateBR.left, y: clockPlateBR.top }; + + this.x0 = offset.x + this.options.dialRadius; + this.y0 = offset.y + this.options.dialRadius; + this.moved = false; + var clickPos = Timepicker._Pos(e); + this.dx = clickPos.x - this.x0; + this.dy = clickPos.y - this.y0; + + // Set clock hands + this.setHand(this.dx, this.dy, false); + + // Mousemove on document + document.addEventListener('mousemove', this._handleDocumentClickMoveBound); + document.addEventListener('touchmove', this._handleDocumentClickMoveBound); + + // Mouseup on document + document.addEventListener('mouseup', this._handleDocumentClickEndBound); + document.addEventListener('touchend', this._handleDocumentClickEndBound); + } + }, { + key: "_handleDocumentClickMove", + value: function _handleDocumentClickMove(e) { + e.preventDefault(); + var clickPos = Timepicker._Pos(e); + var x = clickPos.x - this.x0; + var y = clickPos.y - this.y0; + this.moved = true; + this.setHand(x, y, false, true); + } + }, { + key: "_handleDocumentClickEnd", + value: function _handleDocumentClickEnd(e) { + var _this58 = this; + + e.preventDefault(); + document.removeEventListener('mouseup', this._handleDocumentClickEndBound); + document.removeEventListener('touchend', this._handleDocumentClickEndBound); + var clickPos = Timepicker._Pos(e); + var x = clickPos.x - this.x0; + var y = clickPos.y - this.y0; + if (this.moved && x === this.dx && y === this.dy) { + this.setHand(x, y); + } + + if (this.currentView === 'hours') { + this.showView('minutes', this.options.duration / 2); + } else if (this.options.autoClose) { + $(this.minutesView).addClass('timepicker-dial-out'); + setTimeout(function () { + _this58.done(); + }, this.options.duration / 2); + } + + if (typeof this.options.onSelect === 'function') { + this.options.onSelect.call(this, this.hours, this.minutes); + } + + // Unbind mousemove event + document.removeEventListener('mousemove', this._handleDocumentClickMoveBound); + document.removeEventListener('touchmove', this._handleDocumentClickMoveBound); + } + }, { + key: "_insertHTMLIntoDOM", + value: function _insertHTMLIntoDOM() { + this.$modalEl = $(Timepicker._template); + this.modalEl = this.$modalEl[0]; + this.modalEl.id = 'modal-' + this.id; + + // Append popover to input by default + var containerEl = document.querySelector(this.options.container); + if (this.options.container && !!containerEl) { + this.$modalEl.appendTo(containerEl); + } else { + this.$modalEl.insertBefore(this.el); + } + } + }, { + key: "_setupModal", + value: function _setupModal() { + var _this59 = this; + + this.modal = M.Modal.init(this.modalEl, { + onOpenStart: this.options.onOpenStart, + onOpenEnd: this.options.onOpenEnd, + onCloseStart: this.options.onCloseStart, + onCloseEnd: function () { + if (typeof _this59.options.onCloseEnd === 'function') { + _this59.options.onCloseEnd.call(_this59); + } + _this59.isOpen = false; + } + }); + } + }, { + key: "_setupVariables", + value: function _setupVariables() { + this.currentView = 'hours'; + this.vibrate = navigator.vibrate ? 'vibrate' : navigator.webkitVibrate ? 'webkitVibrate' : null; + + this._canvas = this.modalEl.querySelector('.timepicker-canvas'); + this.plate = this.modalEl.querySelector('.timepicker-plate'); + + this.hoursView = this.modalEl.querySelector('.timepicker-hours'); + this.minutesView = this.modalEl.querySelector('.timepicker-minutes'); + this.spanHours = this.modalEl.querySelector('.timepicker-span-hours'); + this.spanMinutes = this.modalEl.querySelector('.timepicker-span-minutes'); + this.spanAmPm = this.modalEl.querySelector('.timepicker-span-am-pm'); + this.footer = this.modalEl.querySelector('.timepicker-footer'); + this.amOrPm = 'PM'; + } + }, { + key: "_pickerSetup", + value: function _pickerSetup() { + var $clearBtn = $("").appendTo(this.footer).on('click', this.clear.bind(this)); + if (this.options.showClearBtn) { + $clearBtn.css({ visibility: '' }); + } + + var confirmationBtnsContainer = $('
'); + $('').appendTo(confirmationBtnsContainer).on('click', this.close.bind(this)); + $('').appendTo(confirmationBtnsContainer).on('click', this.done.bind(this)); + confirmationBtnsContainer.appendTo(this.footer); + } + }, { + key: "_clockSetup", + value: function _clockSetup() { + if (this.options.twelveHour) { + this.$amBtn = $('
AM
'); + this.$pmBtn = $('
PM
'); + this.$amBtn.on('click', this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm); + this.$pmBtn.on('click', this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm); + } + + this._buildHoursView(); + this._buildMinutesView(); + this._buildSVGClock(); + } + }, { + key: "_buildSVGClock", + value: function _buildSVGClock() { + // Draw clock hands and others + var dialRadius = this.options.dialRadius; + var tickRadius = this.options.tickRadius; + var diameter = dialRadius * 2; + + var svg = Timepicker._createSVGEl('svg'); + svg.setAttribute('class', 'timepicker-svg'); + svg.setAttribute('width', diameter); + svg.setAttribute('height', diameter); + var g = Timepicker._createSVGEl('g'); + g.setAttribute('transform', 'translate(' + dialRadius + ',' + dialRadius + ')'); + var bearing = Timepicker._createSVGEl('circle'); + bearing.setAttribute('class', 'timepicker-canvas-bearing'); + bearing.setAttribute('cx', 0); + bearing.setAttribute('cy', 0); + bearing.setAttribute('r', 4); + var hand = Timepicker._createSVGEl('line'); + hand.setAttribute('x1', 0); + hand.setAttribute('y1', 0); + var bg = Timepicker._createSVGEl('circle'); + bg.setAttribute('class', 'timepicker-canvas-bg'); + bg.setAttribute('r', tickRadius); + g.appendChild(hand); + g.appendChild(bg); + g.appendChild(bearing); + svg.appendChild(g); + this._canvas.appendChild(svg); + + this.hand = hand; + this.bg = bg; + this.bearing = bearing; + this.g = g; + } + }, { + key: "_buildHoursView", + value: function _buildHoursView() { + var $tick = $('
'); + // Hours view + if (this.options.twelveHour) { + for (var i = 1; i < 13; i += 1) { + var tick = $tick.clone(); + var radian = i / 6 * Math.PI; + var radius = this.options.outerRadius; + tick.css({ + left: this.options.dialRadius + Math.sin(radian) * radius - this.options.tickRadius + 'px', + top: this.options.dialRadius - Math.cos(radian) * radius - this.options.tickRadius + 'px' + }); + tick.html(i === 0 ? '00' : i); + this.hoursView.appendChild(tick[0]); + // tick.on(mousedownEvent, mousedown); + } + } else { + for (var _i2 = 0; _i2 < 24; _i2 += 1) { + var _tick = $tick.clone(); + var _radian = _i2 / 6 * Math.PI; + var inner = _i2 > 0 && _i2 < 13; + var _radius = inner ? this.options.innerRadius : this.options.outerRadius; + _tick.css({ + left: this.options.dialRadius + Math.sin(_radian) * _radius - this.options.tickRadius + 'px', + top: this.options.dialRadius - Math.cos(_radian) * _radius - this.options.tickRadius + 'px' + }); + _tick.html(_i2 === 0 ? '00' : _i2); + this.hoursView.appendChild(_tick[0]); + // tick.on(mousedownEvent, mousedown); + } + } + } + }, { + key: "_buildMinutesView", + value: function _buildMinutesView() { + var $tick = $('
'); + // Minutes view + for (var i = 0; i < 60; i += 5) { + var tick = $tick.clone(); + var radian = i / 30 * Math.PI; + tick.css({ + left: this.options.dialRadius + Math.sin(radian) * this.options.outerRadius - this.options.tickRadius + 'px', + top: this.options.dialRadius - Math.cos(radian) * this.options.outerRadius - this.options.tickRadius + 'px' + }); + tick.html(Timepicker._addLeadingZero(i)); + this.minutesView.appendChild(tick[0]); + } + } + }, { + key: "_handleAmPmClick", + value: function _handleAmPmClick(e) { + var $btnClicked = $(e.target); + this.amOrPm = $btnClicked.hasClass('am-btn') ? 'AM' : 'PM'; + this._updateAmPmView(); + } + }, { + key: "_updateAmPmView", + value: function _updateAmPmView() { + if (this.options.twelveHour) { + this.$amBtn.toggleClass('text-primary', this.amOrPm === 'AM'); + this.$pmBtn.toggleClass('text-primary', this.amOrPm === 'PM'); + } + } + }, { + key: "_updateTimeFromInput", + value: function _updateTimeFromInput() { + // Get the time + var value = ((this.el.value || this.options.defaultTime || '') + '').split(':'); + if (this.options.twelveHour && !(typeof value[1] === 'undefined')) { + if (value[1].toUpperCase().indexOf('AM') > 0) { + this.amOrPm = 'AM'; + } else { + this.amOrPm = 'PM'; + } + value[1] = value[1].replace('AM', '').replace('PM', ''); + } + if (value[0] === 'now') { + var now = new Date(+new Date() + this.options.fromNow); + value = [now.getHours(), now.getMinutes()]; + if (this.options.twelveHour) { + this.amOrPm = value[0] >= 12 && value[0] < 24 ? 'PM' : 'AM'; + } + } + this.hours = +value[0] || 0; + this.minutes = +value[1] || 0; + this.spanHours.innerHTML = this.hours; + this.spanMinutes.innerHTML = Timepicker._addLeadingZero(this.minutes); + + this._updateAmPmView(); + } + }, { + key: "showView", + value: function showView(view, delay) { + if (view === 'minutes' && $(this.hoursView).css('visibility') === 'visible') { + // raiseCallback(this.options.beforeHourSelect); + } + var isHours = view === 'hours', + nextView = isHours ? this.hoursView : this.minutesView, + hideView = isHours ? this.minutesView : this.hoursView; + this.currentView = view; + + $(this.spanHours).toggleClass('text-primary', isHours); + $(this.spanMinutes).toggleClass('text-primary', !isHours); + + // Transition view + hideView.classList.add('timepicker-dial-out'); + $(nextView).css('visibility', 'visible').removeClass('timepicker-dial-out'); + + // Reset clock hand + this.resetClock(delay); + + // After transitions ended + clearTimeout(this.toggleViewTimer); + this.toggleViewTimer = setTimeout(function () { + $(hideView).css('visibility', 'hidden'); + }, this.options.duration); + } + }, { + key: "resetClock", + value: function resetClock(delay) { + var view = this.currentView, + value = this[view], + isHours = view === 'hours', + unit = Math.PI / (isHours ? 6 : 30), + radian = value * unit, + radius = isHours && value > 0 && value < 13 ? this.options.innerRadius : this.options.outerRadius, + x = Math.sin(radian) * radius, + y = -Math.cos(radian) * radius, + self = this; + + if (delay) { + $(this.canvas).addClass('timepicker-canvas-out'); + setTimeout(function () { + $(self.canvas).removeClass('timepicker-canvas-out'); + self.setHand(x, y); + }, delay); + } else { + this.setHand(x, y); + } + } + }, { + key: "setHand", + value: function setHand(x, y, roundBy5) { + var _this60 = this; + + var radian = Math.atan2(x, -y), + isHours = this.currentView === 'hours', + unit = Math.PI / (isHours || roundBy5 ? 6 : 30), + z = Math.sqrt(x * x + y * y), + inner = isHours && z < (this.options.outerRadius + this.options.innerRadius) / 2, + radius = inner ? this.options.innerRadius : this.options.outerRadius; + + if (this.options.twelveHour) { + radius = this.options.outerRadius; + } + + // Radian should in range [0, 2PI] + if (radian < 0) { + radian = Math.PI * 2 + radian; + } + + // Get the round value + var value = Math.round(radian / unit); + + // Get the round radian + radian = value * unit; + + // Correct the hours or minutes + if (this.options.twelveHour) { + if (isHours) { + if (value === 0) value = 12; + } else { + if (roundBy5) value *= 5; + if (value === 60) value = 0; + } + } else { + if (isHours) { + if (value === 12) { + value = 0; + } + value = inner ? value === 0 ? 12 : value : value === 0 ? 0 : value + 12; + } else { + if (roundBy5) { + value *= 5; + } + if (value === 60) { + value = 0; + } + } + } + + // Once hours or minutes changed, vibrate the device + if (this[this.currentView] !== value) { + if (this.vibrate && this.options.vibrate) { + // Do not vibrate too frequently + if (!this.vibrateTimer) { + navigator[this.vibrate](10); + this.vibrateTimer = setTimeout(function () { + _this60.vibrateTimer = null; + }, 100); + } + } + } + + this[this.currentView] = value; + if (isHours) { + this['spanHours'].innerHTML = value; + } else { + this['spanMinutes'].innerHTML = Timepicker._addLeadingZero(value); + } + + // Set clock hand and others' position + var cx1 = Math.sin(radian) * (radius - this.options.tickRadius), + cy1 = -Math.cos(radian) * (radius - this.options.tickRadius), + cx2 = Math.sin(radian) * radius, + cy2 = -Math.cos(radian) * radius; + this.hand.setAttribute('x2', cx1); + this.hand.setAttribute('y2', cy1); + this.bg.setAttribute('cx', cx2); + this.bg.setAttribute('cy', cy2); + } + }, { + key: "open", + value: function open() { + if (this.isOpen) { + return; + } + + this.isOpen = true; + this._updateTimeFromInput(); + this.showView('hours'); + + this.modal.open(); + } + }, { + key: "close", + value: function close() { + if (!this.isOpen) { + return; + } + + this.isOpen = false; + this.modal.close(); + } + + /** + * Finish timepicker selection. + */ + + }, { + key: "done", + value: function done(e, clearValue) { + // Set input value + var last = this.el.value; + var value = clearValue ? '' : Timepicker._addLeadingZero(this.hours) + ':' + Timepicker._addLeadingZero(this.minutes); + this.time = value; + if (!clearValue && this.options.twelveHour) { + value = value + " " + this.amOrPm; + } + this.el.value = value; + + // Trigger change event + if (value !== last) { + this.$el.trigger('change'); + } + + this.close(); + this.el.focus(); + } + }, { + key: "clear", + value: function clear() { + this.done(null, true); + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(Timepicker.__proto__ || Object.getPrototypeOf(Timepicker), "init", this).call(this, this, els, options); + } + }, { + key: "_addLeadingZero", + value: function _addLeadingZero(num) { + return (num < 10 ? '0' : '') + num; + } + }, { + key: "_createSVGEl", + value: function _createSVGEl(name) { + var svgNS = 'http://www.w3.org/2000/svg'; + return document.createElementNS(svgNS, name); + } + + /** + * @typedef {Object} Point + * @property {number} x The X Coordinate + * @property {number} y The Y Coordinate + */ + + /** + * Get x position of mouse or touch event + * @param {Event} e + * @return {Point} x and y location + */ + + }, { + key: "_Pos", + value: function _Pos(e) { + if (e.targetTouches && e.targetTouches.length >= 1) { + return { x: e.targetTouches[0].clientX, y: e.targetTouches[0].clientY }; + } + // mouse event + return { x: e.clientX, y: e.clientY }; + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_Timepicker; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return Timepicker; + }(Component); + + Timepicker._template = [''].join(''); + + M.Timepicker = Timepicker; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(Timepicker, 'timepicker', 'M_Timepicker'); + } +})(cash); +;(function ($) { + 'use strict'; + + var _defaults = {}; + + /** + * @class + * + */ + + var CharacterCounter = function (_Component17) { + _inherits(CharacterCounter, _Component17); + + /** + * Construct CharacterCounter instance + * @constructor + * @param {Element} el + * @param {Object} options + */ + function CharacterCounter(el, options) { + _classCallCheck(this, CharacterCounter); + + var _this61 = _possibleConstructorReturn(this, (CharacterCounter.__proto__ || Object.getPrototypeOf(CharacterCounter)).call(this, CharacterCounter, el, options)); + + _this61.el.M_CharacterCounter = _this61; + + /** + * Options for the character counter + */ + _this61.options = $.extend({}, CharacterCounter.defaults, options); + + _this61.isInvalid = false; + _this61.isValidLength = false; + _this61._setupCounter(); + _this61._setupEventHandlers(); + return _this61; + } + + _createClass(CharacterCounter, [{ + key: "destroy", + + + /** + * Teardown component + */ + value: function destroy() { + this._removeEventHandlers(); + this.el.CharacterCounter = undefined; + this._removeCounter(); + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + this._handleUpdateCounterBound = this.updateCounter.bind(this); + + this.el.addEventListener('focus', this._handleUpdateCounterBound, true); + this.el.addEventListener('input', this._handleUpdateCounterBound, true); + } + + /** + * Remove Event Handlers + */ + + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + this.el.removeEventListener('focus', this._handleUpdateCounterBound, true); + this.el.removeEventListener('input', this._handleUpdateCounterBound, true); + } + + /** + * Setup counter element + */ + + }, { + key: "_setupCounter", + value: function _setupCounter() { + this.counterEl = document.createElement('span'); + $(this.counterEl).addClass('character-counter').css({ + float: 'right', + 'font-size': '12px', + height: 1 + }); + + this.$el.parent().append(this.counterEl); + } + + /** + * Remove counter element + */ + + }, { + key: "_removeCounter", + value: function _removeCounter() { + $(this.counterEl).remove(); + } + + /** + * Update counter + */ + + }, { + key: "updateCounter", + value: function updateCounter() { + var maxLength = +this.$el.attr('data-length'), + actualLength = this.el.value.length; + this.isValidLength = actualLength <= maxLength; + var counterString = actualLength; + + if (maxLength) { + counterString += '/' + maxLength; + this._validateInput(); + } + + $(this.counterEl).html(counterString); + } + + /** + * Add validation classes + */ + + }, { + key: "_validateInput", + value: function _validateInput() { + if (this.isValidLength && this.isInvalid) { + this.isInvalid = false; + this.$el.removeClass('invalid'); + } else if (!this.isValidLength && !this.isInvalid) { + this.isInvalid = true; + this.$el.removeClass('valid'); + this.$el.addClass('invalid'); + } + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(CharacterCounter.__proto__ || Object.getPrototypeOf(CharacterCounter), "init", this).call(this, this, els, options); + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_CharacterCounter; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return CharacterCounter; + }(Component); + + M.CharacterCounter = CharacterCounter; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(CharacterCounter, 'characterCounter', 'M_CharacterCounter'); + } +})(cash); +;(function ($) { + 'use strict'; + + var _defaults = { + duration: 200, // ms + dist: -100, // zoom scale TODO: make this more intuitive as an option + shift: 0, // spacing for center image + padding: 0, // Padding between non center items + numVisible: 5, // Number of visible items in carousel + fullWidth: false, // Change to full width styles + indicators: false, // Toggle indicators + noWrap: false, // Don't wrap around and cycle through items. + onCycleTo: null // Callback for when a new slide is cycled to. + }; + + /** + * @class + * + */ + + var Carousel = function (_Component18) { + _inherits(Carousel, _Component18); + + /** + * Construct Carousel instance + * @constructor + * @param {Element} el + * @param {Object} options + */ + function Carousel(el, options) { + _classCallCheck(this, Carousel); + + var _this62 = _possibleConstructorReturn(this, (Carousel.__proto__ || Object.getPrototypeOf(Carousel)).call(this, Carousel, el, options)); + + _this62.el.M_Carousel = _this62; + + /** + * Options for the carousel + * @member Carousel#options + * @prop {Number} duration + * @prop {Number} dist + * @prop {Number} shift + * @prop {Number} padding + * @prop {Number} numVisible + * @prop {Boolean} fullWidth + * @prop {Boolean} indicators + * @prop {Boolean} noWrap + * @prop {Function} onCycleTo + */ + _this62.options = $.extend({}, Carousel.defaults, options); + + // Setup + _this62.hasMultipleSlides = _this62.$el.find('.carousel-item').length > 1; + _this62.showIndicators = _this62.options.indicators && _this62.hasMultipleSlides; + _this62.noWrap = _this62.options.noWrap || !_this62.hasMultipleSlides; + _this62.pressed = false; + _this62.dragged = false; + _this62.offset = _this62.target = 0; + _this62.images = []; + _this62.itemWidth = _this62.$el.find('.carousel-item').first().innerWidth(); + _this62.itemHeight = _this62.$el.find('.carousel-item').first().innerHeight(); + _this62.dim = _this62.itemWidth * 2 + _this62.options.padding || 1; // Make sure dim is non zero for divisions. + _this62._autoScrollBound = _this62._autoScroll.bind(_this62); + _this62._trackBound = _this62._track.bind(_this62); + + // Full Width carousel setup + if (_this62.options.fullWidth) { + _this62.options.dist = 0; + _this62._setCarouselHeight(); + + // Offset fixed items when indicators. + if (_this62.showIndicators) { + _this62.$el.find('.carousel-fixed-item').addClass('with-indicators'); + } + } + + // Iterate through slides + _this62.$indicators = $('
    '); + _this62.$el.find('.carousel-item').each(function (el, i) { + _this62.images.push(el); + if (_this62.showIndicators) { + var $indicator = $('
  • '); + + // Add active to first by default. + if (i === 0) { + $indicator[0].classList.add('active'); + } + + _this62.$indicators.append($indicator); + } + }); + if (_this62.showIndicators) { + _this62.$el.append(_this62.$indicators); + } + _this62.count = _this62.images.length; + + // Cap numVisible at count + _this62.options.numVisible = Math.min(_this62.count, _this62.options.numVisible); + + // Setup cross browser string + _this62.xform = 'transform'; + ['webkit', 'Moz', 'O', 'ms'].every(function (prefix) { + var e = prefix + 'Transform'; + if (typeof document.body.style[e] !== 'undefined') { + _this62.xform = e; + return false; + } + return true; + }); + + _this62._setupEventHandlers(); + _this62._scroll(_this62.offset); + return _this62; + } + + _createClass(Carousel, [{ + key: "destroy", + + + /** + * Teardown component + */ + value: function destroy() { + this._removeEventHandlers(); + this.el.M_Carousel = undefined; + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + var _this63 = this; + + this._handleCarouselTapBound = this._handleCarouselTap.bind(this); + this._handleCarouselDragBound = this._handleCarouselDrag.bind(this); + this._handleCarouselReleaseBound = this._handleCarouselRelease.bind(this); + this._handleCarouselClickBound = this._handleCarouselClick.bind(this); + + if (typeof window.ontouchstart !== 'undefined') { + this.el.addEventListener('touchstart', this._handleCarouselTapBound); + this.el.addEventListener('touchmove', this._handleCarouselDragBound); + this.el.addEventListener('touchend', this._handleCarouselReleaseBound); + } + + this.el.addEventListener('mousedown', this._handleCarouselTapBound); + this.el.addEventListener('mousemove', this._handleCarouselDragBound); + this.el.addEventListener('mouseup', this._handleCarouselReleaseBound); + this.el.addEventListener('mouseleave', this._handleCarouselReleaseBound); + this.el.addEventListener('click', this._handleCarouselClickBound); + + if (this.showIndicators && this.$indicators) { + this._handleIndicatorClickBound = this._handleIndicatorClick.bind(this); + this.$indicators.find('.indicator-item').each(function (el, i) { + el.addEventListener('click', _this63._handleIndicatorClickBound); + }); + } + + // Resize + var throttledResize = M.throttle(this._handleResize, 200); + this._handleThrottledResizeBound = throttledResize.bind(this); + + window.addEventListener('resize', this._handleThrottledResizeBound); + } + + /** + * Remove Event Handlers + */ + + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + var _this64 = this; + + if (typeof window.ontouchstart !== 'undefined') { + this.el.removeEventListener('touchstart', this._handleCarouselTapBound); + this.el.removeEventListener('touchmove', this._handleCarouselDragBound); + this.el.removeEventListener('touchend', this._handleCarouselReleaseBound); + } + this.el.removeEventListener('mousedown', this._handleCarouselTapBound); + this.el.removeEventListener('mousemove', this._handleCarouselDragBound); + this.el.removeEventListener('mouseup', this._handleCarouselReleaseBound); + this.el.removeEventListener('mouseleave', this._handleCarouselReleaseBound); + this.el.removeEventListener('click', this._handleCarouselClickBound); + + if (this.showIndicators && this.$indicators) { + this.$indicators.find('.indicator-item').each(function (el, i) { + el.removeEventListener('click', _this64._handleIndicatorClickBound); + }); + } + + window.removeEventListener('resize', this._handleThrottledResizeBound); + } + + /** + * Handle Carousel Tap + * @param {Event} e + */ + + }, { + key: "_handleCarouselTap", + value: function _handleCarouselTap(e) { + // Fixes firefox draggable image bug + if (e.type === 'mousedown' && $(e.target).is('img')) { + e.preventDefault(); + } + this.pressed = true; + this.dragged = false; + this.verticalDragged = false; + this.reference = this._xpos(e); + this.referenceY = this._ypos(e); + + this.velocity = this.amplitude = 0; + this.frame = this.offset; + this.timestamp = Date.now(); + clearInterval(this.ticker); + this.ticker = setInterval(this._trackBound, 100); + } + + /** + * Handle Carousel Drag + * @param {Event} e + */ + + }, { + key: "_handleCarouselDrag", + value: function _handleCarouselDrag(e) { + var x = void 0, + y = void 0, + delta = void 0, + deltaY = void 0; + if (this.pressed) { + x = this._xpos(e); + y = this._ypos(e); + delta = this.reference - x; + deltaY = Math.abs(this.referenceY - y); + if (deltaY < 30 && !this.verticalDragged) { + // If vertical scrolling don't allow dragging. + if (delta > 2 || delta < -2) { + this.dragged = true; + this.reference = x; + this._scroll(this.offset + delta); + } + } else if (this.dragged) { + // If dragging don't allow vertical scroll. + e.preventDefault(); + e.stopPropagation(); + return false; + } else { + // Vertical scrolling. + this.verticalDragged = true; + } + } + + if (this.dragged) { + // If dragging don't allow vertical scroll. + e.preventDefault(); + e.stopPropagation(); + return false; + } + } + + /** + * Handle Carousel Release + * @param {Event} e + */ + + }, { + key: "_handleCarouselRelease", + value: function _handleCarouselRelease(e) { + if (this.pressed) { + this.pressed = false; + } else { + return; + } + + clearInterval(this.ticker); + this.target = this.offset; + if (this.velocity > 10 || this.velocity < -10) { + this.amplitude = 0.9 * this.velocity; + this.target = this.offset + this.amplitude; + } + this.target = Math.round(this.target / this.dim) * this.dim; + + // No wrap of items. + if (this.noWrap) { + if (this.target >= this.dim * (this.count - 1)) { + this.target = this.dim * (this.count - 1); + } else if (this.target < 0) { + this.target = 0; + } + } + this.amplitude = this.target - this.offset; + this.timestamp = Date.now(); + requestAnimationFrame(this._autoScrollBound); + + if (this.dragged) { + e.preventDefault(); + e.stopPropagation(); + } + return false; + } + + /** + * Handle Carousel CLick + * @param {Event} e + */ + + }, { + key: "_handleCarouselClick", + value: function _handleCarouselClick(e) { + // Disable clicks if carousel was dragged. + if (this.dragged) { + e.preventDefault(); + e.stopPropagation(); + return false; + } else if (!this.options.fullWidth) { + var clickedIndex = $(e.target).closest('.carousel-item').index(); + var diff = this._wrap(this.center) - clickedIndex; + + // Disable clicks if carousel was shifted by click + if (diff !== 0) { + e.preventDefault(); + e.stopPropagation(); + } + this._cycleTo(clickedIndex); + } + } + + /** + * Handle Indicator CLick + * @param {Event} e + */ + + }, { + key: "_handleIndicatorClick", + value: function _handleIndicatorClick(e) { + e.stopPropagation(); + + var indicator = $(e.target).closest('.indicator-item'); + if (indicator.length) { + this._cycleTo(indicator.index()); + } + } + + /** + * Handle Throttle Resize + * @param {Event} e + */ + + }, { + key: "_handleResize", + value: function _handleResize(e) { + if (this.options.fullWidth) { + this.itemWidth = this.$el.find('.carousel-item').first().innerWidth(); + this.imageHeight = this.$el.find('.carousel-item.active').height(); + this.dim = this.itemWidth * 2 + this.options.padding; + this.offset = this.center * 2 * this.itemWidth; + this.target = this.offset; + this._setCarouselHeight(true); + } else { + this._scroll(); + } + } + + /** + * Set carousel height based on first slide + * @param {Booleam} imageOnly - true for image slides + */ + + }, { + key: "_setCarouselHeight", + value: function _setCarouselHeight(imageOnly) { + var _this65 = this; + + var firstSlide = this.$el.find('.carousel-item.active').length ? this.$el.find('.carousel-item.active').first() : this.$el.find('.carousel-item').first(); + var firstImage = firstSlide.find('img').first(); + if (firstImage.length) { + if (firstImage[0].complete) { + // If image won't trigger the load event + var imageHeight = firstImage.height(); + if (imageHeight > 0) { + this.$el.css('height', imageHeight + 'px'); + } else { + // If image still has no height, use the natural dimensions to calculate + var naturalWidth = firstImage[0].naturalWidth; + var naturalHeight = firstImage[0].naturalHeight; + var adjustedHeight = this.$el.width() / naturalWidth * naturalHeight; + this.$el.css('height', adjustedHeight + 'px'); + } + } else { + // Get height when image is loaded normally + firstImage.one('load', function (el, i) { + _this65.$el.css('height', el.offsetHeight + 'px'); + }); + } + } else if (!imageOnly) { + var slideHeight = firstSlide.height(); + this.$el.css('height', slideHeight + 'px'); + } + } + + /** + * Get x position from event + * @param {Event} e + */ + + }, { + key: "_xpos", + value: function _xpos(e) { + // touch event + if (e.targetTouches && e.targetTouches.length >= 1) { + return e.targetTouches[0].clientX; + } + + // mouse event + return e.clientX; + } + + /** + * Get y position from event + * @param {Event} e + */ + + }, { + key: "_ypos", + value: function _ypos(e) { + // touch event + if (e.targetTouches && e.targetTouches.length >= 1) { + return e.targetTouches[0].clientY; + } + + // mouse event + return e.clientY; + } + + /** + * Wrap index + * @param {Number} x + */ + + }, { + key: "_wrap", + value: function _wrap(x) { + return x >= this.count ? x % this.count : x < 0 ? this._wrap(this.count + x % this.count) : x; + } + + /** + * Tracks scrolling information + */ + + }, { + key: "_track", + value: function _track() { + var now = void 0, + elapsed = void 0, + delta = void 0, + v = void 0; + + now = Date.now(); + elapsed = now - this.timestamp; + this.timestamp = now; + delta = this.offset - this.frame; + this.frame = this.offset; + + v = 1000 * delta / (1 + elapsed); + this.velocity = 0.8 * v + 0.2 * this.velocity; + } + + /** + * Auto scrolls to nearest carousel item. + */ + + }, { + key: "_autoScroll", + value: function _autoScroll() { + var elapsed = void 0, + delta = void 0; + + if (this.amplitude) { + elapsed = Date.now() - this.timestamp; + delta = this.amplitude * Math.exp(-elapsed / this.options.duration); + if (delta > 2 || delta < -2) { + this._scroll(this.target - delta); + requestAnimationFrame(this._autoScrollBound); + } else { + this._scroll(this.target); + } + } + } + + /** + * Scroll to target + * @param {Number} x + */ + + }, { + key: "_scroll", + value: function _scroll(x) { + var _this66 = this; + + // Track scrolling state + if (!this.$el.hasClass('scrolling')) { + this.el.classList.add('scrolling'); + } + if (this.scrollingTimeout != null) { + window.clearTimeout(this.scrollingTimeout); + } + this.scrollingTimeout = window.setTimeout(function () { + _this66.$el.removeClass('scrolling'); + }, this.options.duration); + + // Start actual scroll + var i = void 0, + half = void 0, + delta = void 0, + dir = void 0, + tween = void 0, + el = void 0, + alignment = void 0, + zTranslation = void 0, + tweenedOpacity = void 0, + centerTweenedOpacity = void 0; + var lastCenter = this.center; + var numVisibleOffset = 1 / this.options.numVisible; + + this.offset = typeof x === 'number' ? x : this.offset; + this.center = Math.floor((this.offset + this.dim / 2) / this.dim); + delta = this.offset - this.center * this.dim; + dir = delta < 0 ? 1 : -1; + tween = -dir * delta * 2 / this.dim; + half = this.count >> 1; + + if (this.options.fullWidth) { + alignment = 'translateX(0)'; + centerTweenedOpacity = 1; + } else { + alignment = 'translateX(' + (this.el.clientWidth - this.itemWidth) / 2 + 'px) '; + alignment += 'translateY(' + (this.el.clientHeight - this.itemHeight) / 2 + 'px)'; + centerTweenedOpacity = 1 - numVisibleOffset * tween; + } + + // Set indicator active + if (this.showIndicators) { + var diff = this.center % this.count; + var activeIndicator = this.$indicators.find('.indicator-item.active'); + if (activeIndicator.index() !== diff) { + activeIndicator.removeClass('active'); + this.$indicators.find('.indicator-item').eq(diff)[0].classList.add('active'); + } + } + + // center + // Don't show wrapped items. + if (!this.noWrap || this.center >= 0 && this.center < this.count) { + el = this.images[this._wrap(this.center)]; + + // Add active class to center item. + if (!$(el).hasClass('active')) { + this.$el.find('.carousel-item').removeClass('active'); + el.classList.add('active'); + } + var transformString = alignment + " translateX(" + -delta / 2 + "px) translateX(" + dir * this.options.shift * tween * i + "px) translateZ(" + this.options.dist * tween + "px)"; + this._updateItemStyle(el, centerTweenedOpacity, 0, transformString); + } + + for (i = 1; i <= half; ++i) { + // right side + if (this.options.fullWidth) { + zTranslation = this.options.dist; + tweenedOpacity = i === half && delta < 0 ? 1 - tween : 1; + } else { + zTranslation = this.options.dist * (i * 2 + tween * dir); + tweenedOpacity = 1 - numVisibleOffset * (i * 2 + tween * dir); + } + // Don't show wrapped items. + if (!this.noWrap || this.center + i < this.count) { + el = this.images[this._wrap(this.center + i)]; + var _transformString = alignment + " translateX(" + (this.options.shift + (this.dim * i - delta) / 2) + "px) translateZ(" + zTranslation + "px)"; + this._updateItemStyle(el, tweenedOpacity, -i, _transformString); + } + + // left side + if (this.options.fullWidth) { + zTranslation = this.options.dist; + tweenedOpacity = i === half && delta > 0 ? 1 - tween : 1; + } else { + zTranslation = this.options.dist * (i * 2 - tween * dir); + tweenedOpacity = 1 - numVisibleOffset * (i * 2 - tween * dir); + } + // Don't show wrapped items. + if (!this.noWrap || this.center - i >= 0) { + el = this.images[this._wrap(this.center - i)]; + var _transformString2 = alignment + " translateX(" + (-this.options.shift + (-this.dim * i - delta) / 2) + "px) translateZ(" + zTranslation + "px)"; + this._updateItemStyle(el, tweenedOpacity, -i, _transformString2); + } + } + + // center + // Don't show wrapped items. + if (!this.noWrap || this.center >= 0 && this.center < this.count) { + el = this.images[this._wrap(this.center)]; + var _transformString3 = alignment + " translateX(" + -delta / 2 + "px) translateX(" + dir * this.options.shift * tween + "px) translateZ(" + this.options.dist * tween + "px)"; + this._updateItemStyle(el, centerTweenedOpacity, 0, _transformString3); + } + + // onCycleTo callback + var $currItem = this.$el.find('.carousel-item').eq(this._wrap(this.center)); + if (lastCenter !== this.center && typeof this.options.onCycleTo === 'function') { + this.options.onCycleTo.call(this, $currItem[0], this.dragged); + } + + // One time callback + if (typeof this.oneTimeCallback === 'function') { + this.oneTimeCallback.call(this, $currItem[0], this.dragged); + this.oneTimeCallback = null; + } + } + + /** + * Cycle to target + * @param {Element} el + * @param {Number} opacity + * @param {Number} zIndex + * @param {String} transform + */ + + }, { + key: "_updateItemStyle", + value: function _updateItemStyle(el, opacity, zIndex, transform) { + el.style[this.xform] = transform; + el.style.zIndex = zIndex; + el.style.opacity = opacity; + el.style.visibility = 'visible'; + } + + /** + * Cycle to target + * @param {Number} n + * @param {Function} callback + */ + + }, { + key: "_cycleTo", + value: function _cycleTo(n, callback) { + var diff = this.center % this.count - n; + + // Account for wraparound. + if (!this.noWrap) { + if (diff < 0) { + if (Math.abs(diff + this.count) < Math.abs(diff)) { + diff += this.count; + } + } else if (diff > 0) { + if (Math.abs(diff - this.count) < diff) { + diff -= this.count; + } + } + } + + this.target = this.dim * Math.round(this.offset / this.dim); + // Next + if (diff < 0) { + this.target += this.dim * Math.abs(diff); + + // Prev + } else if (diff > 0) { + this.target -= this.dim * diff; + } + + // Set one time callback + if (typeof callback === 'function') { + this.oneTimeCallback = callback; + } + + // Scroll + if (this.offset !== this.target) { + this.amplitude = this.target - this.offset; + this.timestamp = Date.now(); + requestAnimationFrame(this._autoScrollBound); + } + } + + /** + * Cycle to next item + * @param {Number} [n] + */ + + }, { + key: "next", + value: function next(n) { + if (n === undefined || isNaN(n)) { + n = 1; + } + + var index = this.center + n; + if (index >= this.count || index < 0) { + if (this.noWrap) { + return; + } + + index = this._wrap(index); + } + this._cycleTo(index); + } + + /** + * Cycle to previous item + * @param {Number} [n] + */ + + }, { + key: "prev", + value: function prev(n) { + if (n === undefined || isNaN(n)) { + n = 1; + } + + var index = this.center - n; + if (index >= this.count || index < 0) { + if (this.noWrap) { + return; + } + + index = this._wrap(index); + } + + this._cycleTo(index); + } + + /** + * Cycle to nth item + * @param {Number} [n] + * @param {Function} callback + */ + + }, { + key: "set", + value: function set(n, callback) { + if (n === undefined || isNaN(n)) { + n = 0; + } + + if (n > this.count || n < 0) { + if (this.noWrap) { + return; + } + + n = this._wrap(n); + } + + this._cycleTo(n, callback); + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(Carousel.__proto__ || Object.getPrototypeOf(Carousel), "init", this).call(this, this, els, options); + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_Carousel; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return Carousel; + }(Component); + + M.Carousel = Carousel; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(Carousel, 'carousel', 'M_Carousel'); + } +})(cash); +;(function ($) { + 'use strict'; + + var _defaults = { + onOpen: undefined, + onClose: undefined + }; + + /** + * @class + * + */ + + var TapTarget = function (_Component19) { + _inherits(TapTarget, _Component19); + + /** + * Construct TapTarget instance + * @constructor + * @param {Element} el + * @param {Object} options + */ + function TapTarget(el, options) { + _classCallCheck(this, TapTarget); + + var _this67 = _possibleConstructorReturn(this, (TapTarget.__proto__ || Object.getPrototypeOf(TapTarget)).call(this, TapTarget, el, options)); + + _this67.el.M_TapTarget = _this67; + + /** + * Options for the select + * @member TapTarget#options + * @prop {Function} onOpen - Callback function called when feature discovery is opened + * @prop {Function} onClose - Callback function called when feature discovery is closed + */ + _this67.options = $.extend({}, TapTarget.defaults, options); + + _this67.isOpen = false; + + // setup + _this67.$origin = $('#' + _this67.$el.attr('data-target')); + _this67._setup(); + + _this67._calculatePositioning(); + _this67._setupEventHandlers(); + return _this67; + } + + _createClass(TapTarget, [{ + key: "destroy", + + + /** + * Teardown component + */ + value: function destroy() { + this._removeEventHandlers(); + this.el.TapTarget = undefined; + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + this._handleDocumentClickBound = this._handleDocumentClick.bind(this); + this._handleTargetClickBound = this._handleTargetClick.bind(this); + this._handleOriginClickBound = this._handleOriginClick.bind(this); + + this.el.addEventListener('click', this._handleTargetClickBound); + this.originEl.addEventListener('click', this._handleOriginClickBound); + + // Resize + var throttledResize = M.throttle(this._handleResize, 200); + this._handleThrottledResizeBound = throttledResize.bind(this); + + window.addEventListener('resize', this._handleThrottledResizeBound); + } + + /** + * Remove Event Handlers + */ + + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + this.el.removeEventListener('click', this._handleTargetClickBound); + this.originEl.removeEventListener('click', this._handleOriginClickBound); + window.removeEventListener('resize', this._handleThrottledResizeBound); + } + + /** + * Handle Target Click + * @param {Event} e + */ + + }, { + key: "_handleTargetClick", + value: function _handleTargetClick(e) { + this.open(); + } + + /** + * Handle Origin Click + * @param {Event} e + */ + + }, { + key: "_handleOriginClick", + value: function _handleOriginClick(e) { + this.close(); + } + + /** + * Handle Resize + * @param {Event} e + */ + + }, { + key: "_handleResize", + value: function _handleResize(e) { + this._calculatePositioning(); + } + + /** + * Handle Resize + * @param {Event} e + */ + + }, { + key: "_handleDocumentClick", + value: function _handleDocumentClick(e) { + if (!$(e.target).closest('.tap-target-wrapper').length) { + this.close(); + e.preventDefault(); + e.stopPropagation(); + } + } + + /** + * Setup Tap Target + */ + + }, { + key: "_setup", + value: function _setup() { + // Creating tap target + this.wrapper = this.$el.parent()[0]; + this.waveEl = $(this.wrapper).find('.tap-target-wave')[0]; + this.originEl = $(this.wrapper).find('.tap-target-origin')[0]; + this.contentEl = this.$el.find('.tap-target-content')[0]; + + // Creating wrapper + if (!$(this.wrapper).hasClass('.tap-target-wrapper')) { + this.wrapper = document.createElement('div'); + this.wrapper.classList.add('tap-target-wrapper'); + this.$el.before($(this.wrapper)); + this.wrapper.append(this.el); + } + + // Creating content + if (!this.contentEl) { + this.contentEl = document.createElement('div'); + this.contentEl.classList.add('tap-target-content'); + this.$el.append(this.contentEl); + } + + // Creating foreground wave + if (!this.waveEl) { + this.waveEl = document.createElement('div'); + this.waveEl.classList.add('tap-target-wave'); + + // Creating origin + if (!this.originEl) { + this.originEl = this.$origin.clone(true, true); + this.originEl.addClass('tap-target-origin'); + this.originEl.removeAttr('id'); + this.originEl.removeAttr('style'); + this.originEl = this.originEl[0]; + this.waveEl.append(this.originEl); + } + + this.wrapper.append(this.waveEl); + } + } + + /** + * Calculate positioning + */ + + }, { + key: "_calculatePositioning", + value: function _calculatePositioning() { + // Element or parent is fixed position? + var isFixed = this.$origin.css('position') === 'fixed'; + if (!isFixed) { + var parents = this.$origin.parents(); + for (var i = 0; i < parents.length; i++) { + isFixed = $(parents[i]).css('position') == 'fixed'; + if (isFixed) { + break; + } + } + } + + // Calculating origin + var originWidth = this.$origin.outerWidth(); + var originHeight = this.$origin.outerHeight(); + var originTop = isFixed ? this.$origin.offset().top - M.getDocumentScrollTop() : this.$origin.offset().top; + var originLeft = isFixed ? this.$origin.offset().left - M.getDocumentScrollLeft() : this.$origin.offset().left; + + // Calculating screen + var windowWidth = window.innerWidth; + var windowHeight = window.innerHeight; + var centerX = windowWidth / 2; + var centerY = windowHeight / 2; + var isLeft = originLeft <= centerX; + var isRight = originLeft > centerX; + var isTop = originTop <= centerY; + var isBottom = originTop > centerY; + var isCenterX = originLeft >= windowWidth * 0.25 && originLeft <= windowWidth * 0.75; + + // Calculating tap target + var tapTargetWidth = this.$el.outerWidth(); + var tapTargetHeight = this.$el.outerHeight(); + var tapTargetTop = originTop + originHeight / 2 - tapTargetHeight / 2; + var tapTargetLeft = originLeft + originWidth / 2 - tapTargetWidth / 2; + var tapTargetPosition = isFixed ? 'fixed' : 'absolute'; + + // Calculating content + var tapTargetTextWidth = isCenterX ? tapTargetWidth : tapTargetWidth / 2 + originWidth; + var tapTargetTextHeight = tapTargetHeight / 2; + var tapTargetTextTop = isTop ? tapTargetHeight / 2 : 0; + var tapTargetTextBottom = 0; + var tapTargetTextLeft = isLeft && !isCenterX ? tapTargetWidth / 2 - originWidth : 0; + var tapTargetTextRight = 0; + var tapTargetTextPadding = originWidth; + var tapTargetTextAlign = isBottom ? 'bottom' : 'top'; + + // Calculating wave + var tapTargetWaveWidth = originWidth > originHeight ? originWidth * 2 : originWidth * 2; + var tapTargetWaveHeight = tapTargetWaveWidth; + var tapTargetWaveTop = tapTargetHeight / 2 - tapTargetWaveHeight / 2; + var tapTargetWaveLeft = tapTargetWidth / 2 - tapTargetWaveWidth / 2; + + // Setting tap target + var tapTargetWrapperCssObj = {}; + tapTargetWrapperCssObj.top = isTop ? tapTargetTop + 'px' : ''; + tapTargetWrapperCssObj.right = isRight ? windowWidth - tapTargetLeft - tapTargetWidth + 'px' : ''; + tapTargetWrapperCssObj.bottom = isBottom ? windowHeight - tapTargetTop - tapTargetHeight + 'px' : ''; + tapTargetWrapperCssObj.left = isLeft ? tapTargetLeft + 'px' : ''; + tapTargetWrapperCssObj.position = tapTargetPosition; + $(this.wrapper).css(tapTargetWrapperCssObj); + + // Setting content + $(this.contentEl).css({ + width: tapTargetTextWidth + 'px', + height: tapTargetTextHeight + 'px', + top: tapTargetTextTop + 'px', + right: tapTargetTextRight + 'px', + bottom: tapTargetTextBottom + 'px', + left: tapTargetTextLeft + 'px', + padding: tapTargetTextPadding + 'px', + verticalAlign: tapTargetTextAlign + }); + + // Setting wave + $(this.waveEl).css({ + top: tapTargetWaveTop + 'px', + left: tapTargetWaveLeft + 'px', + width: tapTargetWaveWidth + 'px', + height: tapTargetWaveHeight + 'px' + }); + } + + /** + * Open TapTarget + */ + + }, { + key: "open", + value: function open() { + if (this.isOpen) { + return; + } + + // onOpen callback + if (typeof this.options.onOpen === 'function') { + this.options.onOpen.call(this, this.$origin[0]); + } + + this.isOpen = true; + this.wrapper.classList.add('open'); + + document.body.addEventListener('click', this._handleDocumentClickBound, true); + document.body.addEventListener('touchend', this._handleDocumentClickBound); + } + + /** + * Close Tap Target + */ + + }, { + key: "close", + value: function close() { + if (!this.isOpen) { + return; + } + + // onClose callback + if (typeof this.options.onClose === 'function') { + this.options.onClose.call(this, this.$origin[0]); + } + + this.isOpen = false; + this.wrapper.classList.remove('open'); + + document.body.removeEventListener('click', this._handleDocumentClickBound, true); + document.body.removeEventListener('touchend', this._handleDocumentClickBound); + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(TapTarget.__proto__ || Object.getPrototypeOf(TapTarget), "init", this).call(this, this, els, options); + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_TapTarget; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return TapTarget; + }(Component); + + M.TapTarget = TapTarget; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(TapTarget, 'tapTarget', 'M_TapTarget'); + } +})(cash); +;(function ($) { + 'use strict'; + + var _defaults = { + classes: '', + dropdownOptions: {} + }; + + /** + * @class + * + */ + + var FormSelect = function (_Component20) { + _inherits(FormSelect, _Component20); + + /** + * Construct FormSelect instance + * @constructor + * @param {Element} el + * @param {Object} options + */ + function FormSelect(el, options) { + _classCallCheck(this, FormSelect); + + // Don't init if browser default version + var _this68 = _possibleConstructorReturn(this, (FormSelect.__proto__ || Object.getPrototypeOf(FormSelect)).call(this, FormSelect, el, options)); + + if (_this68.$el.hasClass('browser-default')) { + return _possibleConstructorReturn(_this68); + } + _this68.el.M_FormSelect = _this68; + + /** + * Options for the select + * @member FormSelect#options + */ + _this68.options = $.extend({}, FormSelect.defaults, options); + + _this68.isMultiple = _this68.$el.prop('multiple'); + + // Setup + _this68.el.tabIndex = -1; + _this68._keysSelected = {}; + _this68._valueDict = {}; // Maps key to original and generated option element. + _this68._setupDropdown(); + + _this68._setupEventHandlers(); + return _this68; + } + + _createClass(FormSelect, [{ + key: "destroy", + + + /** + * Teardown component + */ + value: function destroy() { + this._removeEventHandlers(); + this._removeDropdown(); + this.el.M_FormSelect = undefined; + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + var _this69 = this; + + this._handleSelectChangeBound = this._handleSelectChange.bind(this); + this._handleOptionClickBound = this._handleOptionClick.bind(this); + this._handleInputClickBound = this._handleInputClick.bind(this); + + $(this.dropdownOptions).find('li:not(.optgroup)').each(function (el) { + el.addEventListener('click', _this69._handleOptionClickBound); + }); + this.el.addEventListener('change', this._handleSelectChangeBound); + this.input.addEventListener('click', this._handleInputClickBound); + } + + /** + * Remove Event Handlers + */ + + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + var _this70 = this; + + $(this.dropdownOptions).find('li:not(.optgroup)').each(function (el) { + el.removeEventListener('click', _this70._handleOptionClickBound); + }); + this.el.removeEventListener('change', this._handleSelectChangeBound); + this.input.removeEventListener('click', this._handleInputClickBound); + console.log("_removeEventHandlers"); + } + + /** + * Handle Select Change + * @param {Event} e + */ + + }, { + key: "_handleSelectChange", + value: function _handleSelectChange(e) { + this._setValueToInput(); + } + + /** + * Handle Option Click + * @param {Event} e + */ + + }, { + key: "_handleOptionClick", + value: function _handleOptionClick(e) { + e.preventDefault(); + var option = $(e.target).closest('li')[0]; + var key = option.id; + + + if (!$(option).hasClass('disabled') && !$(option).hasClass('optgroup') && key.length) { + var selected = true; + + if (this.isMultiple) { + // Deselect placeholder option if still selected. + var placeholderOption = $(this.dropdownOptions).find('li.disabled.selected'); + if (placeholderOption.length) { + placeholderOption.removeClass('selected'); + placeholderOption.find('input[type="checkbox"]').prop('checked', false); + this._toggleEntryFromArray(placeholderOption[0].id); + } + selected = this._toggleEntryFromArray(key); + } else { + $(this.dropdownOptions).find('li').removeClass('selected'); + $(option).toggleClass('selected', selected); + } + + // Set selected on original select option + // Only trigger if selected state changed + var prevSelected = $(this._valueDict[key].el).prop('selected'); + if (prevSelected !== selected) { + $(this._valueDict[key].el).prop('selected', selected); + this.$el.trigger('change'); + } + } + + e.stopPropagation(); + } + + /** + * Handle Input Click + */ + + }, { + key: "_handleInputClick", + value: function _handleInputClick() { + if (this.dropdown && this.dropdown.isOpen) { + this._setValueToInput(); + this._setSelectedStates(); + } + } + + /** + * Setup dropdown + */ + + }, { + key: "_setupDropdown", + value: function _setupDropdown() { + var _this71 = this; + + this.wrapper = document.createElement('div'); + $(this.wrapper).addClass('select-wrapper ' + this.options.classes); + this.$el.before($(this.wrapper)); + this.wrapper.appendChild(this.el); + + if (this.el.disabled) { + this.wrapper.classList.add('disabled'); + } + + // Create dropdown + this.$selectOptions = this.$el.children('option, optgroup'); + this.dropdownOptions = document.createElement('ul'); + this.dropdownOptions.id = "select-options-" + M.guid(); + $(this.dropdownOptions).addClass('dropdown-content select-dropdown ' + (this.isMultiple ? 'multiple-select-dropdown' : '')); + + // Create dropdown structure. + if (this.$selectOptions.length) { + this.$selectOptions.each(function (el) { + if ($(el).is('option')) { + // Direct descendant option. + var optionEl = void 0; + if (_this71.isMultiple) { + optionEl = _this71._appendOptionWithIcon(_this71.$el, el, 'multiple'); + } else { + optionEl = _this71._appendOptionWithIcon(_this71.$el, el); + } + + _this71._addOptionToValueDict(el, optionEl); + } else if ($(el).is('optgroup')) { + // Optgroup. + var selectOptions = $(el).children('option'); + $(_this71.dropdownOptions).append($('
  • ' + el.getAttribute('label') + '
  • ')[0]); + + selectOptions.each(function (el) { + var optionEl = _this71._appendOptionWithIcon(_this71.$el, el, 'optgroup-option'); + _this71._addOptionToValueDict(el, optionEl); + }); + } + }); + } + + this.$el.after(this.dropdownOptions); + + // Add input dropdown + var placeholder = this.$el[0].getAttribute('data-placeholder'); + this.span = document.createElement('span'); + this.span.innerHTML += placeholder; + this.input = document.createElement('input'); + $(this.span).addClass('fake-label'); + $(this.input).addClass('select-dropdown dropdown-trigger'); + this.input.setAttribute('type', 'text'); + this.input.setAttribute('readonly', 'true'); + this.input.setAttribute('data-target', this.dropdownOptions.id); + if (this.el.disabled) { + $(this.input).prop('disabled', 'true'); + } + + this.$el.before(this.input); + this.$el.before(this.span); + this._setValueToInput(); + + // Add caret + var dropdownIcon = $(''); + this.$el.before(dropdownIcon[0]); + + // Initialize dropdown + if (!this.el.disabled) { + var dropdownOptions = $.extend({}, this.options.dropdownOptions); + + // Add callback for centering selected option when dropdown content is scrollable + dropdownOptions.onOpenEnd = function (el) { + var selectedOption = $(_this71.dropdownOptions).find('.selected').first(); + if (_this71.dropdown.isScrollable && selectedOption.length) { + var scrollOffset = selectedOption[0].getBoundingClientRect().top - _this71.dropdownOptions.getBoundingClientRect().top; // scroll to selected option + scrollOffset -= _this71.dropdownOptions.clientHeight / 2; // center in dropdown + _this71.dropdownOptions.scrollTop = scrollOffset; + } + }; + + if (this.isMultiple) { + dropdownOptions.closeOnClick = false; + } + this.dropdown = M.Dropdown.init(this.input, dropdownOptions); + } + + // Add initial selections + this._setSelectedStates(); + } + + /** + * Add option to value dict + * @param {Element} el original option element + * @param {Element} optionEl generated option element + */ + + }, { + key: "_addOptionToValueDict", + value: function _addOptionToValueDict(el, optionEl) { + var index = Object.keys(this._valueDict).length; + var key = this.dropdownOptions.id + index; + var obj = {}; + optionEl.id = key; + + obj.el = el; + obj.optionEl = optionEl; + this._valueDict[key] = obj; + } + + /** + * Remove dropdown + */ + + }, { + key: "_removeDropdown", + value: function _removeDropdown() { + $(this.wrapper).find('.caret').remove(); + $(this.input).remove(); + $(this.dropdownOptions).remove(); + $(this.wrapper).before(this.$el); + $(this.wrapper).remove(); + } + + /** + * Setup dropdown + * @param {Element} select select element + * @param {Element} option option element from select + * @param {String} type + * @return {Element} option element added + */ + + }, { + key: "_appendOptionWithIcon", + value: function _appendOptionWithIcon(select, option, type) { + // Add disabled attr if disabled + var disabledClass = option.disabled ? 'disabled ' : ''; + var optgroupClass = type === 'optgroup-option' ? 'optgroup-option ' : ''; + var multipleCheckbox = this.isMultiple ? "" : option.innerHTML; + var liEl = $('
  • '); + var spanEl = $(''); + spanEl.html(multipleCheckbox); + liEl.addClass(disabledClass + " " + optgroupClass); + liEl.append(spanEl); + + // add icons + var iconUrl = option.getAttribute('data-icon'); + if (!!iconUrl) { + var imgEl = $("\"\""); + liEl.prepend(imgEl); + } + + // Check for multiple type. + $(this.dropdownOptions).append(liEl[0]); + return liEl[0]; + } + + /** + * Toggle entry from option + * @param {String} key Option key + * @return {Boolean} if entry was added or removed + */ + + }, { + key: "_toggleEntryFromArray", + value: function _toggleEntryFromArray(key) { + var notAdded = !this._keysSelected.hasOwnProperty(key); + var $optionLi = $(this._valueDict[key].optionEl); + + if (notAdded) { + this._keysSelected[key] = true; + } else { + delete this._keysSelected[key]; + } + + $optionLi.toggleClass('selected', notAdded); + + // Set checkbox checked value + $optionLi.find('input[type="checkbox"]').prop('checked', notAdded); + + // use notAdded instead of true (to detect if the option is selected or not) + $optionLi.prop('selected', notAdded); + + return notAdded; + } + + /** + * Set text value to input + */ + + }, { + key: "_setValueToInput", + value: function _setValueToInput() { + var values = []; + var options = this.$el.find('option'); + var disabledData; + + options.each(function (el) { + if ($(el).prop('selected')) { + var text = $(el).text(); + var dataDisabled = $(el).attr("data-disabled"); + disabledData = dataDisabled; + values.push(text); + } + }); + + if (!values.length) { + var firstDisabled = this.$el.find('option:disabled').eq(0); + if (firstDisabled.length && firstDisabled[0].value === '') { + values.push(firstDisabled.text()); + } + } + this.input.setAttribute('data-disabled', disabledData); + this.input.value = values.join(', '); + + } + + /** + * Set selected state of dropdown to match actual select element + */ + + }, { + key: "_setSelectedStates", + value: function _setSelectedStates() { + this._keysSelected = {}; + + for (var key in this._valueDict) { + var option = this._valueDict[key]; + var optionIsSelected = $(option.el).prop('selected'); + $(option.optionEl).find('input[type="checkbox"]').prop('checked', optionIsSelected); + if (optionIsSelected) { + this._activateOption($(this.dropdownOptions), $(option.optionEl)); + this._keysSelected[key] = true; + } else { + $(option.optionEl).removeClass('selected'); + } + } + } + + /** + * Make option as selected and scroll to selected position + * @param {jQuery} collection Select options jQuery element + * @param {Element} newOption element of the new option + */ + + }, { + key: "_activateOption", + value: function _activateOption(collection, newOption) { + if (newOption) { + if (!this.isMultiple) { + collection.find('li.selected').removeClass('selected'); + } + var option = $(newOption); + option.addClass('selected'); + } + } + + /** + * Get Selected Values + * @return {Array} Array of selected values + */ + + }, { + key: "getSelectedValues", + value: function getSelectedValues() { + var selectedValues = []; + for (var key in this._keysSelected) { + selectedValues.push(this._valueDict[key].el.value); + } + return selectedValues; + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(FormSelect.__proto__ || Object.getPrototypeOf(FormSelect), "init", this).call(this, this, els, options); + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_FormSelect; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return FormSelect; + }(Component); + + M.FormSelect = FormSelect; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(FormSelect, 'formSelect', 'M_FormSelect'); + } +})(cash); +;(function ($, anim) { + 'use strict'; + + var _defaults = {}; + + /** + * @class + * + */ + + var Range = function (_Component21) { + _inherits(Range, _Component21); + + /** + * Construct Range instance + * @constructor + * @param {Element} el + * @param {Object} options + */ + function Range(el, options) { + _classCallCheck(this, Range); + + var _this72 = _possibleConstructorReturn(this, (Range.__proto__ || Object.getPrototypeOf(Range)).call(this, Range, el, options)); + + _this72.el.M_Range = _this72; + + /** + * Options for the range + * @member Range#options + */ + _this72.options = $.extend({}, Range.defaults, options); + + _this72._mousedown = false; + + // Setup + _this72._setupThumb(); + + _this72._setupEventHandlers(); + return _this72; + } + + _createClass(Range, [{ + key: "destroy", + + + /** + * Teardown component + */ + value: function destroy() { + this._removeEventHandlers(); + this._removeThumb(); + this.el.M_Range = undefined; + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + this._handleRangeChangeBound = this._handleRangeChange.bind(this); + this._handleRangeMousedownTouchstartBound = this._handleRangeMousedownTouchstart.bind(this); + this._handleRangeInputMousemoveTouchmoveBound = this._handleRangeInputMousemoveTouchmove.bind(this); + this._handleRangeMouseupTouchendBound = this._handleRangeMouseupTouchend.bind(this); + this._handleRangeBlurMouseoutTouchleaveBound = this._handleRangeBlurMouseoutTouchleave.bind(this); + + this.el.addEventListener('change', this._handleRangeChangeBound); + + this.el.addEventListener('mousedown', this._handleRangeMousedownTouchstartBound); + this.el.addEventListener('touchstart', this._handleRangeMousedownTouchstartBound); + + this.el.addEventListener('input', this._handleRangeInputMousemoveTouchmoveBound); + this.el.addEventListener('mousemove', this._handleRangeInputMousemoveTouchmoveBound); + this.el.addEventListener('touchmove', this._handleRangeInputMousemoveTouchmoveBound); + + this.el.addEventListener('mouseup', this._handleRangeMouseupTouchendBound); + this.el.addEventListener('touchend', this._handleRangeMouseupTouchendBound); + + this.el.addEventListener('blur', this._handleRangeBlurMouseoutTouchleaveBound); + this.el.addEventListener('mouseout', this._handleRangeBlurMouseoutTouchleaveBound); + this.el.addEventListener('touchleave', this._handleRangeBlurMouseoutTouchleaveBound); + } + + /** + * Remove Event Handlers + */ + + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + this.el.removeEventListener('change', this._handleRangeChangeBound); + + this.el.removeEventListener('mousedown', this._handleRangeMousedownTouchstartBound); + this.el.removeEventListener('touchstart', this._handleRangeMousedownTouchstartBound); + + this.el.removeEventListener('input', this._handleRangeInputMousemoveTouchmoveBound); + this.el.removeEventListener('mousemove', this._handleRangeInputMousemoveTouchmoveBound); + this.el.removeEventListener('touchmove', this._handleRangeInputMousemoveTouchmoveBound); + + this.el.removeEventListener('mouseup', this._handleRangeMouseupTouchendBound); + this.el.removeEventListener('touchend', this._handleRangeMouseupTouchendBound); + + this.el.removeEventListener('blur', this._handleRangeBlurMouseoutTouchleaveBound); + this.el.removeEventListener('mouseout', this._handleRangeBlurMouseoutTouchleaveBound); + this.el.removeEventListener('touchleave', this._handleRangeBlurMouseoutTouchleaveBound); + } + + /** + * Handle Range Change + * @param {Event} e + */ + + }, { + key: "_handleRangeChange", + value: function _handleRangeChange() { + $(this.value).html(this.$el.val()); + + if (!$(this.thumb).hasClass('active')) { + this._showRangeBubble(); + } + + var offsetLeft = this._calcRangeOffset(); + $(this.thumb).addClass('active').css('left', offsetLeft + 'px'); + } + + /** + * Handle Range Mousedown and Touchstart + * @param {Event} e + */ + + }, { + key: "_handleRangeMousedownTouchstart", + value: function _handleRangeMousedownTouchstart(e) { + // Set indicator value + $(this.value).html(this.$el.val()); + + this._mousedown = true; + this.$el.addClass('active'); + + if (!$(this.thumb).hasClass('active')) { + this._showRangeBubble(); + } + + if (e.type !== 'input') { + var offsetLeft = this._calcRangeOffset(); + $(this.thumb).addClass('active').css('left', offsetLeft + 'px'); + } + } + + /** + * Handle Range Input, Mousemove and Touchmove + */ + + }, { + key: "_handleRangeInputMousemoveTouchmove", + value: function _handleRangeInputMousemoveTouchmove() { + if (this._mousedown) { + if (!$(this.thumb).hasClass('active')) { + this._showRangeBubble(); + } + + var offsetLeft = this._calcRangeOffset(); + $(this.thumb).addClass('active').css('left', offsetLeft + 'px'); + $(this.value).html(this.$el.val()); + } + } + + /** + * Handle Range Mouseup and Touchend + */ + + }, { + key: "_handleRangeMouseupTouchend", + value: function _handleRangeMouseupTouchend() { + this._mousedown = false; + this.$el.removeClass('active'); + } + + /** + * Handle Range Blur, Mouseout and Touchleave + */ + + }, { + key: "_handleRangeBlurMouseoutTouchleave", + value: function _handleRangeBlurMouseoutTouchleave() { + if (!this._mousedown) { + var paddingLeft = parseInt(this.$el.css('padding-left')); + var marginLeft = 7 + paddingLeft + 'px'; + + if ($(this.thumb).hasClass('active')) { + anim.remove(this.thumb); + anim({ + targets: this.thumb, + height: 0, + width: 0, + top: 10, + easing: 'easeOutQuad', + marginLeft: marginLeft, + duration: 100 + }); + } + $(this.thumb).removeClass('active'); + } + } + + /** + * Setup dropdown + */ + + }, { + key: "_setupThumb", + value: function _setupThumb() { + this.thumb = document.createElement('span'); + this.value = document.createElement('span'); + $(this.thumb).addClass('thumb'); + $(this.value).addClass('value'); + $(this.thumb).append(this.value); + this.$el.after(this.thumb); + } + + /** + * Remove dropdown + */ + + }, { + key: "_removeThumb", + value: function _removeThumb() { + $(this.thumb).remove(); + } + + /** + * morph thumb into bubble + */ + + }, { + key: "_showRangeBubble", + value: function _showRangeBubble() { + var paddingLeft = parseInt($(this.thumb).parent().css('padding-left')); + var marginLeft = -7 + paddingLeft + 'px'; // TODO: fix magic number? + anim.remove(this.thumb); + anim({ + targets: this.thumb, + height: 30, + width: 30, + top: -30, + marginLeft: marginLeft, + duration: 300, + easing: 'easeOutQuint' + }); + } + + /** + * Calculate the offset of the thumb + * @return {Number} offset in pixels + */ + + }, { + key: "_calcRangeOffset", + value: function _calcRangeOffset() { + var width = this.$el.width() - 15; + var max = parseFloat(this.$el.attr('max')) || 100; // Range default max + var min = parseFloat(this.$el.attr('min')) || 0; // Range default min + var percent = (parseFloat(this.$el.val()) - min) / (max - min); + return percent * width; + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(Range.__proto__ || Object.getPrototypeOf(Range), "init", this).call(this, this, els, options); + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_Range; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return Range; + }(Component); + + M.Range = Range; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(Range, 'range', 'M_Range'); + } + + Range.init($('input[type=range]')); +})(cash, M.anime); diff --git a/Team#23 - 5/js/extention/flatpickr.js b/Team#23 - 5/js/extention/flatpickr.js new file mode 100644 index 0000000..f56c0f2 --- /dev/null +++ b/Team#23 - 5/js/extention/flatpickr.js @@ -0,0 +1,4 @@ + + +/* flatpickr v4.5.2,, @license MIT */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.flatpickr=t()}(this,function(){"use strict";var X=function(e){return("0"+e).slice(-2)},ee=function(e){return!0===e?1:0};function te(n,a,i){var o;return void 0===i&&(i=!1),function(){var e=this,t=arguments;null!==o&&clearTimeout(o),o=window.setTimeout(function(){o=null,i||n.apply(e,t)},a),i&&!o&&n.apply(e,t)}}var ne=function(e){return e instanceof Array?e:[e]},e=function(){},ae=function(e,t,n){return n.months[t?"shorthand":"longhand"][e]},w={D:e,F:function(e,t,n){e.setMonth(n.months.longhand.indexOf(t))},G:function(e,t){e.setHours(parseFloat(t))},H:function(e,t){e.setHours(parseFloat(t))},J:function(e,t){e.setDate(parseFloat(t))},K:function(e,t,n){e.setHours(e.getHours()%12+12*ee(new RegExp(n.amPM[1],"i").test(t)))},M:function(e,t,n){e.setMonth(n.months.shorthand.indexOf(t))},S:function(e,t){e.setSeconds(parseFloat(t))},U:function(e,t){return new Date(1e3*parseFloat(t))},W:function(e,t){var n=parseInt(t);return new Date(e.getFullYear(),0,2+7*(n-1),0,0,0,0)},Y:function(e,t){e.setFullYear(parseFloat(t))},Z:function(e,t){return new Date(t)},d:function(e,t){e.setDate(parseFloat(t))},h:function(e,t){e.setHours(parseFloat(t))},i:function(e,t){e.setMinutes(parseFloat(t))},j:function(e,t){e.setDate(parseFloat(t))},l:e,m:function(e,t){e.setMonth(parseFloat(t)-1)},n:function(e,t){e.setMonth(parseFloat(t)-1)},s:function(e,t){e.setSeconds(parseFloat(t))},w:e,y:function(e,t){e.setFullYear(2e3+parseFloat(t))}},ie={D:"(\\w+)",F:"(\\w+)",G:"(\\d\\d|\\d)",H:"(\\d\\d|\\d)",J:"(\\d\\d|\\d)\\w+",K:"",M:"(\\w+)",S:"(\\d\\d|\\d)",U:"(.+)",W:"(\\d\\d|\\d)",Y:"(\\d{4})",Z:"(.+)",d:"(\\d\\d|\\d)",h:"(\\d\\d|\\d)",i:"(\\d\\d|\\d)",j:"(\\d\\d|\\d)",l:"(\\w+)",m:"(\\d\\d|\\d)",n:"(\\d\\d|\\d)",s:"(\\d\\d|\\d)",w:"(\\d\\d|\\d)",y:"(\\d{2})"},l={Z:function(e){return e.toISOString()},D:function(e,t,n){return t.weekdays.shorthand[l.w(e,t,n)]},F:function(e,t,n){return ae(l.n(e,t,n)-1,!1,t)},G:function(e,t,n){return X(l.h(e,t,n))},H:function(e){return X(e.getHours())},J:function(e,t){return void 0!==t.ordinal?e.getDate()+t.ordinal(e.getDate()):e.getDate()},K:function(e,t){return t.amPM[ee(11Math.min(t,n)&&e",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:"auto",positionElement:void 0,prevArrow:"",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1};function fe(e,t,n){if(!0===n)return e.classList.add(t);e.classList.remove(t)}function me(e,t,n){var a=window.document.createElement(e);return t=t||"",n=n||"",a.className=t,void 0!==n&&(a.textContent=n),a}function ge(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function pe(e,t){var n=me("div","numInputWrapper"),a=me("input","numInput "+e),i=me("span","arrowUp"),o=me("span","arrowDown");if(a.type="text",a.pattern="\\d*",void 0!==t)for(var r in t)a.setAttribute(r,t[r]);return n.appendChild(a),n.appendChild(i),n.appendChild(o),n}"function"!=typeof Object.assign&&(Object.assign=function(n){if(!n)throw TypeError("Cannot convert undefined or null to object");for(var e=arguments.length,a=new Array(1o)&&(h.amPM.textContent=h.l10n.amPM[ee(h.amPM.textContent===h.l10n.amPM[0])]),n.value=X(c)}}(e);var t=h._input.value;m(),Z(),h._input.value!==t&&h._debouncedChange()}}function m(){if(void 0!==h.hourElement&&void 0!==h.minuteElement){var e,t,n=(parseInt(h.hourElement.value.slice(-2),10)||0)%24,a=(parseInt(h.minuteElement.value,10)||0)%60,i=void 0!==h.secondElement?(parseInt(h.secondElement.value,10)||0)%60:0;void 0!==h.amPM&&(e=n,t=h.amPM.textContent,n=e%12+12*ee(t===h.l10n.amPM[1]));var o=void 0!==h.config.minTime||h.config.minDate&&h.minDateHasTime&&h.latestSelectedDateObj&&0===ce(h.latestSelectedDateObj,h.config.minDate,!0);if(void 0!==h.config.maxTime||h.config.maxDate&&h.maxDateHasTime&&h.latestSelectedDateObj&&0===ce(h.latestSelectedDateObj,h.config.maxDate,!0)){var r=void 0!==h.config.maxTime?h.config.maxTime:h.config.maxDate;(n=Math.min(n,r.getHours()))===r.getHours()&&(a=Math.min(a,r.getMinutes())),a===r.getMinutes()&&(i=Math.min(i,r.getSeconds()))}if(o){var l=void 0!==h.config.minTime?h.config.minTime:h.config.minDate;(n=Math.max(n,l.getHours()))===l.getHours()&&(a=Math.max(a,l.getMinutes())),a===l.getMinutes()&&(i=Math.max(i,l.getSeconds()))}c(n,a,i)}}function i(e){var t=e||h.latestSelectedDateObj;t&&c(t.getHours(),t.getMinutes(),t.getSeconds())}function a(){var e=h.config.defaultHour,t=h.config.defaultMinute,n=h.config.defaultSeconds;if(void 0!==h.config.minDate){var a=h.config.minDate.getHours(),i=h.config.minDate.getMinutes();(e=Math.max(e,a))===a&&(t=Math.max(i,t)),e===a&&t===i&&(n=h.config.minDate.getSeconds())}if(void 0!==h.config.maxDate){var o=h.config.maxDate.getHours(),r=h.config.maxDate.getMinutes();(e=Math.min(e,o))===o&&(t=Math.min(r,t)),e===o&&t===r&&(n=h.config.maxDate.getSeconds())}c(e,t,n)}function c(e,t,n){void 0!==h.latestSelectedDateObj&&h.latestSelectedDateObj.setHours(e%24,t,n||0,0),h.hourElement&&h.minuteElement&&!h.isMobile&&(h.hourElement.value=X(h.config.time_24hr?e:(12+e)%12+12*ee(e%12==0)),h.minuteElement.value=X(t),void 0!==h.amPM&&(h.amPM.textContent=h.l10n.amPM[ee(12<=e)]),void 0!==h.secondElement&&(h.secondElement.value=X(n)))}function n(e){var t=parseInt(e.target.value)+(e.delta||0);(1h.now?h.config.minDate:h.config.maxDate&&h.config.maxDate"+h.config.getWeek(t)+""),q("onDayCreate",r),r}function b(e){e.focus(),"range"===h.config.mode&&P(e)}function w(e){for(var t=0=Math.abs(t))return b(s)}h.changeMonth(i),C(w(i),0)}(a,t):b(a)}function y(e,t){for(var n=(new Date(e,t,1).getDay()-h.l10n.firstDayOfWeek+7)%7,a=h.utils.getDaysInMonth((t-1+12)%12),i=h.utils.getDaysInMonth(t),o=window.document.createDocumentFragment(),r=1\n "+t.join("")+"\n \n "}function I(e,t){void 0===t&&(t=!0);var n=t?e:e-h.currentMonth;n<0&&!0===h._hidePrevMonthArrow||0h.config.maxDate.getFullYear())){var t=e,n=h.currentYear!==t;h.currentYear=t||h.currentYear,h.config.maxDate&&h.currentYear===h.config.maxDate.getFullYear()?h.currentMonth=Math.min(h.config.maxDate.getMonth(),h.currentMonth):h.config.minDate&&h.currentYear===h.config.minDate.getFullYear()&&(h.currentMonth=Math.max(h.config.minDate.getMonth(),h.currentMonth)),n&&(h.redraw(),q("onYearChange"))}}function N(e,t){void 0===t&&(t=!0);var n=h.parseDate(e,void 0,t);if(h.config.minDate&&n&&ce(n,h.config.minDate,void 0!==t?t:!h.minDateHasTime)<0||h.config.maxDate&&n&&0=a.from.getTime()&&n.getTime()<=a.to.getTime())return i}return!i}function F(e){return void 0!==h.daysContainer&&(-1===e.className.indexOf("hidden")&&h.daysContainer.contains(e))}function A(e){var t=e.target===h._input,n=h.config.allowInput,a=h.isOpen&&(!n||!t),i=h.config.inline&&t&&!n;if(13===e.keyCode&&t){if(n)return h.setDate(h._input.value,!0,e.target===h.altInput?h.config.altFormat:h.config.dateFormat),e.target.blur();h.open()}else if(O(e.target)||a||i){var o=!!h.timeContainer&&h.timeContainer.contains(e.target);switch(e.keyCode){case 13:o?f():B(e);break;case 27:e.preventDefault(),R();break;case 8:case 46:t&&!h.config.allowInput&&(e.preventDefault(),h.clear());break;case 37:case 39:if(o)h.hourElement&&h.hourElement.focus();else if(e.preventDefault(),void 0!==h.daysContainer&&(!1===n||F(document.activeElement))){var r=39===e.keyCode?1:-1;e.ctrlKey?(I(r),C(w(1),0)):C(void 0,r)}break;case 38:case 40:e.preventDefault();var l=40===e.keyCode?1:-1;h.daysContainer&&void 0!==e.target.$i?e.ctrlKey?(_(h.currentYear-l),C(w(1),0)):o||C(void 0,7*l):h.config.enableTime&&(!o&&h.hourElement&&h.hourElement.focus(),f(e),h._debouncedChange());break;case 9:if(!o){h.element.focus();break}var c=[h.hourElement,h.minuteElement,h.secondElement,h.amPM].filter(function(e){return e}),d=c.indexOf(e.target);if(-1!==d){var s=c[d+(e.shiftKey?-1:1)];void 0!==s?(e.preventDefault(),s.focus()):h.element.focus()}}}if(void 0!==h.amPM&&e.target===h.amPM)switch(e.key){case h.l10n.amPM[0].charAt(0):case h.l10n.amPM[0].charAt(0).toLowerCase():h.amPM.textContent=h.l10n.amPM[0],m(),Z();break;case h.l10n.amPM[1].charAt(0):case h.l10n.amPM[1].charAt(0).toLowerCase():h.amPM.textContent=h.l10n.amPM[1],m(),Z()}q("onKeyDown",e)}function P(o){if(1===h.selectedDates.length&&(!o||o.classList.contains("flatpickr-day")&&!o.classList.contains("disabled"))){for(var r=o?o.dateObj.getTime():h.days.firstElementChild.dateObj.getTime(),l=h.parseDate(h.selectedDates[0],void 0,!0).getTime(),e=Math.min(r,h.selectedDates[0].getTime()),t=Math.max(r,h.selectedDates[0].getTime()),n=h.daysContainer.lastChild.lastChild.dateObj.getTime(),c=!1,d=0,s=0,a=e;a=a||(ln,s=window.pageYOffset+l.top+(d?-n-2:t.offsetHeight+2);if(fe(h.calendarContainer,"arrowTop",!d),fe(h.calendarContainer,"arrowBottom",d),!h.config.inline){var u=window.pageXOffset+l.left-(null!=r&&"center"===r?(a-l.width)/2:0),f=window.document.body.offsetWidth-l.right,m=u+a>window.document.body.offsetWidth;fe(h.calendarContainer,"rightMost",m),h.config.static||(h.calendarContainer.style.top=s+"px",m?(h.calendarContainer.style.left="auto",h.calendarContainer.style.right=f+"px"):(h.calendarContainer.style.left=u+"px",h.calendarContainer.style.right="auto"))}}}function W(){h.config.noCalendar||h.isMobile||(G(),M())}function R(){h._input.focus(),-1!==window.navigator.userAgent.indexOf("MSIE")||void 0!==navigator.msMaxTouchPoints?setTimeout(h.close,0):h.close()}function B(e){e.preventDefault(),e.stopPropagation();var t=function e(t,n){return n(t)?t:t.parentNode?e(t.parentNode,n):void 0}(e.target,function(e){return e.classList&&e.classList.contains("flatpickr-day")&&!e.classList.contains("disabled")&&!e.classList.contains("notAllowed")});if(void 0!==t){var n=t,a=h.latestSelectedDateObj=new Date(n.dateObj.getTime()),i=(a.getMonth()h.currentMonth+h.config.showMonths-1)&&"range"!==h.config.mode;if(h.selectedDateElem=n,"single"===h.config.mode)h.selectedDates=[a];else if("multiple"===h.config.mode){var o=z(a);o?h.selectedDates.splice(parseInt(o),1):h.selectedDates.push(a)}else"range"===h.config.mode&&(2===h.selectedDates.length&&h.clear(!1),h.selectedDates.push(a),0!==ce(a,h.selectedDates[0],!0)&&h.selectedDates.sort(function(e,t){return e.getTime()-t.getTime()}));if(m(),i){var r=h.currentYear!==a.getFullYear();h.currentYear=a.getFullYear(),h.currentMonth=a.getMonth(),r&&q("onYearChange"),q("onMonthChange")}if(G(),M(),Z(),h.config.enableTime&&setTimeout(function(){return h.showTimeInput=!0},50),i||"range"===h.config.mode||1!==h.config.showMonths?h.selectedDateElem&&h.selectedDateElem.focus():b(n),void 0!==h.hourElement&&setTimeout(function(){return void 0!==h.hourElement&&h.hourElement.select()},451),h.config.closeOnSelect){var l="single"===h.config.mode&&!h.config.enableTime,c="range"===h.config.mode&&2===h.selectedDates.length&&!h.config.enableTime;(l||c)&&R()}g()}}h.parseDate=le({config:h.config,l10n:h.l10n}),h._handlers=[],h._bind=o,h._setHoursFromDate=i,h._positionCalendar=L,h.changeMonth=I,h.changeYear=_,h.clear=function(e){void 0===e&&(e=!0);h.input.value="",void 0!==h.altInput&&(h.altInput.value="");void 0!==h.mobileInput&&(h.mobileInput.value="");h.selectedDates=[],h.latestSelectedDateObj=void 0,!(h.showTimeInput=!1)===h.config.enableTime&&a();h.redraw(),e&&q("onChange")},h.close=function(){h.isOpen=!1,h.isMobile||(h.calendarContainer.classList.remove("open"),h._input.classList.remove("active"));q("onClose")},h._createElement=me,h.destroy=function(){void 0!==h.config&&q("onDestroy");for(var e=h._handlers.length;e--;){var t=h._handlers[e];t.element.removeEventListener(t.event,t.handler,t.options)}if(h._handlers=[],h.mobileInput)h.mobileInput.parentNode&&h.mobileInput.parentNode.removeChild(h.mobileInput),h.mobileInput=void 0;else if(h.calendarContainer&&h.calendarContainer.parentNode)if(h.config.static&&h.calendarContainer.parentNode){var n=h.calendarContainer.parentNode;if(n.lastChild&&n.removeChild(n.lastChild),n.parentNode){for(;n.firstChild;)n.parentNode.insertBefore(n.firstChild,n);n.parentNode.removeChild(n)}}else h.calendarContainer.parentNode.removeChild(h.calendarContainer);h.altInput&&(h.input.type="text",h.altInput.parentNode&&h.altInput.parentNode.removeChild(h.altInput),delete h.altInput);h.input&&(h.input.type=h.input._type,h.input.classList.remove("flatpickr-input"),h.input.removeAttribute("readonly"),h.input.value="");["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach(function(e){try{delete h[e]}catch(e){}})},h.isEnabled=N,h.jumpToDate=l,h.open=function(e,t){void 0===t&&(t=h._positionElement);if(!0===h.isMobile)return e&&(e.preventDefault(),e.target&&e.target.blur()),void 0!==h.mobileInput&&(h.mobileInput.focus(),h.mobileInput.click()),void q("onOpen");if(h._input.disabled||h.config.inline)return;var n=h.isOpen;h.isOpen=!0,n||(h.calendarContainer.classList.add("open"),h._input.classList.add("active"),q("onOpen"),L(t));!0===h.config.enableTime&&!0===h.config.noCalendar&&(0===h.selectedDates.length&&(h.setDate(void 0!==h.config.minDate?new Date(h.config.minDate.getTime()):new Date,!1),a(),Z()),!1!==h.config.allowInput||void 0!==e&&h.timeContainer.contains(e.relatedTarget)||setTimeout(function(){return h.hourElement.select()},50))},h.redraw=W,h.set=function(e,t){null!==e&&"object"==typeof e?Object.assign(h.config,e):(h.config[e]=t,void 0!==K[e]?K[e].forEach(function(e){return e()}):-1h.config.maxDate.getMonth():h.currentYear>h.config.maxDate.getFullYear()))}function V(t){return h.selectedDates.map(function(e){return h.formatDate(e,t)}).filter(function(e,t,n){return"range"!==h.config.mode||h.config.enableTime||n.indexOf(e)===t}).join("range"!==h.config.mode?h.config.conjunction:h.l10n.rangeSeparator)}function Z(e){if(void 0===e&&(e=!0),0===h.selectedDates.length)return h.clear(e);void 0!==h.mobileInput&&h.mobileFormatStr&&(h.mobileInput.value=void 0!==h.latestSelectedDateObj?h.formatDate(h.latestSelectedDateObj,h.mobileFormatStr):""),h.input.value=V(h.config.dateFormat),void 0!==h.altInput&&(h.altInput.value=V(h.config.altFormat)),!1!==e&&q("onValueUpdate")}function Q(e){e.preventDefault();var t=h.prevMonthNav.contains(e.target),n=h.nextMonthNav.contains(e.target);t||n?I(t?-1:1):0<=h.yearElements.indexOf(e.target)?e.target.select():e.target.classList.contains("arrowUp")?h.changeYear(h.currentYear+1):e.target.classList.contains("arrowDown")&&h.changeYear(h.currentYear-1)}return function(){h.element=h.input=d,h.isOpen=!1,function(){var e=["wrap","weekNumbers","allowInput","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],t=Object.assign({},s,JSON.parse(JSON.stringify(d.dataset||{}))),n={};h.config.parseDate=t.parseDate,h.config.formatDate=t.formatDate,Object.defineProperty(h.config,"enable",{get:function(){return h.config._enable},set:function(e){h.config._enable=U(e)}}),Object.defineProperty(h.config,"disable",{get:function(){return h.config._disable},set:function(e){h.config._disable=U(e)}});var a="time"===t.mode;t.dateFormat||!t.enableTime&&!a||(n.dateFormat=t.noCalendar||a?"H:i"+(t.enableSeconds?":S":""):ve.defaultConfig.dateFormat+" H:i"+(t.enableSeconds?":S":"")),t.altInput&&(t.enableTime||a)&&!t.altFormat&&(n.altFormat=t.noCalendar||a?"h:i"+(t.enableSeconds?":S K":" K"):ve.defaultConfig.altFormat+" h:i"+(t.enableSeconds?":S":"")+" K"),Object.defineProperty(h.config,"minDate",{get:function(){return h.config._minDate},set:Y("min")}),Object.defineProperty(h.config,"maxDate",{get:function(){return h.config._maxDate},set:Y("max")});var i=function(t){return function(e){h.config["min"===t?"_minTime":"_maxTime"]=h.parseDate(e,"H:i")}};Object.defineProperty(h.config,"minTime",{get:function(){return h.config._minTime},set:i("min")}),Object.defineProperty(h.config,"maxTime",{get:function(){return h.config._maxTime},set:i("max")}),"time"===t.mode&&(h.config.noCalendar=!0,h.config.enableTime=!0),Object.assign(h.config,n,t);for(var o=0;oh.now.getTime()?h.config.minDate:h.config.maxDate&&h.config.maxDate.getTime()