material-sass 4.0.0.beta2 → 4.0.0.beta3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/README.md +3 -3
  4. data/Rakefile +11 -9
  5. data/assets/javascripts/material.js +3278 -825
  6. data/assets/javascripts/material.min.js +17 -1
  7. data/assets/javascripts/material/{initializers/picker.js → addons/pickadate.js} +5 -23
  8. data/assets/javascripts/material/components/expansion-panel.js +9 -18
  9. data/assets/javascripts/material/components/floating-label.js +21 -24
  10. data/assets/javascripts/material/components/{navdrawer.js → nav-drawer.js} +51 -55
  11. data/assets/javascripts/material/components/selection-control-focus.js +15 -21
  12. data/assets/javascripts/material/components/tab-switch.js +13 -20
  13. data/assets/javascripts/material/components/util.js +31 -41
  14. data/assets/stylesheets/material/_functions.scss +1 -1
  15. data/assets/stylesheets/material/_print.scss +13 -2
  16. data/assets/stylesheets/material/_utilities.scss +0 -1
  17. data/assets/stylesheets/material/_variables.scss +0 -1
  18. data/assets/stylesheets/material/base/_base.scss +1 -16
  19. data/assets/stylesheets/material/bootstrap/_close.scss +4 -0
  20. data/assets/stylesheets/material/bootstrap/_code.scss +6 -0
  21. data/assets/stylesheets/material/bootstrap/_custom-form.scss +26 -28
  22. data/assets/stylesheets/material/bootstrap/_form.scss +7 -36
  23. data/assets/stylesheets/material/bootstrap/_pagination.scss +7 -2
  24. data/assets/stylesheets/material/bootstrap/_popover.scss +18 -14
  25. data/assets/stylesheets/material/material.scss +0 -1
  26. data/assets/stylesheets/material/material/_button-flat.scss +8 -8
  27. data/assets/stylesheets/material/material/_button-group.scss +26 -63
  28. data/assets/stylesheets/material/material/_button.scss +18 -18
  29. data/assets/stylesheets/material/material/_dialog.scss +6 -6
  30. data/assets/stylesheets/material/material/_expansion-panel.scss +4 -4
  31. data/assets/stylesheets/material/material/_menu.scss +2 -2
  32. data/assets/stylesheets/material/material/_picker.scss +3 -3
  33. data/assets/stylesheets/material/material/_progress.scss +2 -1
  34. data/assets/stylesheets/material/material/_selection-control.scss +88 -67
  35. data/assets/stylesheets/material/material/_text-field-input-group.scss +49 -82
  36. data/assets/stylesheets/material/material/_text-field.scss +36 -6
  37. data/assets/stylesheets/material/material/_toolbar.scss +4 -0
  38. data/assets/stylesheets/material/material/_tooltip.scss +1 -1
  39. data/assets/stylesheets/material/mixins/_breakpoint.scss +1 -1
  40. data/assets/stylesheets/material/mixins/_form.scss +79 -17
  41. data/assets/stylesheets/material/mixins/_grid-framework.scss +9 -3
  42. data/assets/stylesheets/material/mixins/_grid.scss +3 -1
  43. data/assets/stylesheets/material/mixins/_hover.scss +14 -55
  44. data/assets/stylesheets/material/mixins/_material-icons.scss +2 -4
  45. data/assets/stylesheets/material/mixins/_text-alignment.scss +2 -2
  46. data/assets/stylesheets/material/mixins/_text-hide.scss +1 -1
  47. data/assets/stylesheets/material/utilities/_border.scss +20 -0
  48. data/assets/stylesheets/material/variables/_palette.scss +2 -0
  49. data/assets/stylesheets/material/variables/_variable-bootstrap.scss +17 -0
  50. data/assets/stylesheets/material/variables/_variable-material.scss +2 -6
  51. data/lib/material-sass/version.rb +1 -1
  52. metadata +4 -12
  53. data/assets/javascripts/material/addons/picker.date.js +0 -234
  54. data/assets/javascripts/material/addons/picker.js +0 -172
  55. data/assets/javascripts/material/addons/textarea-autosize.js +0 -23
  56. data/assets/javascripts/material/addons/waves.js +0 -127
  57. data/assets/javascripts/material/initializers/textarea-autosize.js +0 -10
  58. data/assets/javascripts/material/initializers/waves.js +0 -13
  59. data/assets/stylesheets/material/material/_text-field-textarea.scss +0 -15
  60. data/assets/stylesheets/material/utilities/_waves.scss +0 -41
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ee2be286f1d82ee964a5e7e094dc905a5157af69592b92604b537dd21d38c39f
4
- data.tar.gz: 1895a839a7ad14d4eeb86f1d4ce0ffdbce719cfd9031bd8e63c8aa15b0190f7f
3
+ metadata.gz: 7975e440c98db73c6dcd55aa6636168fed1cb2e90eb163faa1a50ea03f086c60
4
+ data.tar.gz: 2e1ce900d97b2f11f14d19d60cc8156d8a30ec3e2ceaf2a2619d0b420900dd53
5
5
  SHA512:
6
- metadata.gz: e9e66ee86662d9bd6079deaf5750ecf6c3a7089c099405949edc96d8fdf4c79624d4266a07788840c6c4841e43e5851237bec858886c30870d564b16271a37fd
7
- data.tar.gz: 6b39821ada127e4d3caf5d81acc7ae7cb1f531e5368d03cc19983c6157742b5cc0f08d09631aabafef651606f807c31de541c4c00f819d4b4e70e1fe71796e38
6
+ metadata.gz: 16158469216238f4ce31a0225281a3a3fbe999baa9683ac79a20272203f2c40438f3affa6524a3dcde151a6db0b9ca6741e32fa9da35dde0a9a4c49fd7267d07
7
+ data.tar.gz: bf550e98f868743d595038c754a50eddf62fce57e90d14a7bf613bbd3fec08c97182dc151bb67b150ab9b0379d85943b8e110860716f3ca65413c28ac9f4cb3e
data/.gitignore CHANGED
@@ -22,3 +22,4 @@ tmp
22
22
  mkmf.log
23
23
  material-src/
24
24
  .scss-lint.yml
25
+ *.map
data/README.md CHANGED
@@ -22,8 +22,8 @@ Since bootstrap relies on it, install it with ```bin/yarn add jquery``` or via `
22
22
  Add this line to your application's Gemfile:
23
23
 
24
24
  ```ruby
25
- gem 'bootstrap', '~> 4.0.0.beta'
26
- gem 'material-sass', '~> 4.0.0.beta'
25
+ gem 'bootstrap', '~> 4.0.0.beta2.1'
26
+ gem 'material-sass', '~> 4.0.0.beta2'
27
27
  ```
28
28
  And then run the bundler and restart your server to make the files available through the pipeline:
29
29
 
@@ -34,7 +34,7 @@ $ bundle install
34
34
  Or install it yourself as:
35
35
 
36
36
  ```console
37
- $ gem install material-sass
37
+ $ gem install material-sass --pre
38
38
  ```
39
39
 
40
40
  ## Usage
data/Rakefile CHANGED
@@ -11,21 +11,16 @@ namespace :javascripts do
11
11
 
12
12
  desc "Copy #{source_dir}/assets/js/src"
13
13
  task :copy do
14
- src_dir = "#{source_dir}/dist/assets/js/src/."
14
+ src_dir = "#{source_dir}/js/dist/src/."
15
15
  tgt_dir = "assets/javascripts/material/components"
16
16
  mkdir_p tgt_dir
17
17
  cp_r src_dir, tgt_dir
18
18
  cp "#{source_dir}/js/material.js", "assets/javascripts/material.js"
19
19
  cp "#{source_dir}/js/material.min.js", "assets/javascripts/material.min.js"
20
20
 
21
-
22
- src_dir = "#{source_dir}/dist/assets/js/addons"
23
- tgt_dir = "assets/javascripts/material/"
24
- mkdir_p tgt_dir
25
- cp_r src_dir, tgt_dir
26
-
27
- src_dir = "#{source_dir}/dist/assets/js/addons-materialise/."
28
- tgt_dir = "assets/javascripts/material/initializers"
21
+
22
+ src_dir = "#{source_dir}/js/dist/third-party/."
23
+ tgt_dir = "assets/javascripts/material/addons"
29
24
  mkdir_p tgt_dir
30
25
  cp_r src_dir, tgt_dir
31
26
 
@@ -74,3 +69,10 @@ end
74
69
 
75
70
  desc "Setup or update assets files"
76
71
  task setup: ["javascripts:setup", "stylesheets:setup"]
72
+
73
+ desc 'Update material from upstream'
74
+ task :update, :branch do |t, args|
75
+ require './tasks/updater'
76
+ Updater.new(branch: args[:branch]).update_material
77
+ end
78
+
@@ -1,1038 +1,3491 @@
1
1
  /*!
2
- * Material v4.0.0-beta (http://daemonite.github.io/material/)
3
- * Copyright 2017 Daemon Pty Ltd
2
+ * Daemonite Material v4.0.0-beta (http://daemonite.github.io/material/)
3
+ * Copyright 2011-2018 Daemon Pty Ltd
4
4
  * Licensed under MIT (https://github.com/Daemonite/material/blob/master/LICENSE)
5
5
  */
6
6
 
7
- if (typeof jQuery === 'undefined') {
8
- throw new Error('Material\'s JavaScript requires jQuery')
7
+ (function (global, factory) {
8
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) :
9
+ typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) :
10
+ (factory((global.material = {}),global.jQuery));
11
+ }(this, (function (exports,$) { 'use strict';
12
+
13
+ $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
14
+
15
+ function createCommonjsModule(fn, module) {
16
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
9
17
  }
10
18
 
11
- +function ($) {
12
- var version = $.fn.jquery.split(' ')[0].split('.')
13
- if (version[0] < 3 || version[0] >= 4) {
14
- throw new Error('Material\'s JavaScript requires at least jQuery v3.0.0 but less than v4.0.0')
15
- }
16
- }(jQuery);
19
+ var picker = createCommonjsModule(function (module, exports) {
20
+ /*!
21
+ * pickadate.js v3.5.6, 2015/04/20
22
+ * By Amsul, http://amsul.ca
23
+ * Hosted on http://amsul.github.io/pickadate.js
24
+ * Licensed under MIT
25
+ */
17
26
 
18
- !function(a){this.Picker=a(jQuery)}(function(a){function b(f,g,i,m){function n(){return b._.node("div",b._.node("div",b._.node("div",b._.node("div",B.component.nodes(w.open),y.box),y.wrap),y.frame),y.holder,'tabindex="-1"')}function o(){z.data(g,B).addClass(y.input).val(z.data("value")?B.get("select",x.format):f.value),x.editable||z.on("focus."+w.id+" click."+w.id,function(a){a.preventDefault(),B.open()}).on("keydown."+w.id,u),e(f,{haspopup:!0,expanded:!1,readonly:!1,owns:f.id+"_root"})}function p(){e(B.$root[0],"hidden",!0)}function q(){B.$holder.on({keydown:u,"focus.toOpen":t,blur:function(){z.removeClass(y.target)},focusin:function(a){B.$root.removeClass(y.focused),a.stopPropagation()},"mousedown click":function(b){var c=b.target;c!=B.$holder[0]&&(b.stopPropagation(),"mousedown"!=b.type||a(c).is("input, select, textarea, button, option")||(b.preventDefault(),B.$holder[0].focus()))}}).on("click","[data-pick], [data-nav], [data-clear], [data-close]",function(){var b=a(this),c=b.data(),d=b.hasClass(y.navDisabled)||b.hasClass(y.disabled),e=h();e=e&&(e.type||e.href),(d||e&&!a.contains(B.$root[0],e))&&B.$holder[0].focus(),!d&&c.nav?B.set("highlight",B.component.item.highlight,{nav:c.nav}):!d&&"pick"in c?(B.set("select",c.pick),x.closeOnSelect&&B.close(!0)):c.clear?(B.clear(),x.closeOnClear&&B.close(!0)):c.close&&B.close(!0)})}function r(){var b;x.hiddenName===!0?(b=f.name,f.name=""):(b=["string"==typeof x.hiddenPrefix?x.hiddenPrefix:"","string"==typeof x.hiddenSuffix?x.hiddenSuffix:"_submit"],b=b[0]+f.name+b[1]),B._hidden=a('<input type=hidden name="'+b+'"'+(z.data("value")||f.value?' value="'+B.get("select",x.formatSubmit)+'"':"")+">")[0],z.on("change."+w.id,function(){B._hidden.value=f.value?B.get("select",x.formatSubmit):""})}function s(){v&&l?B.$holder.find("."+y.frame).one("transitionend",function(){B.$holder[0].focus()}):B.$holder[0].focus()}function t(a){a.stopPropagation(),z.addClass(y.target),B.$root.addClass(y.focused),B.open()}function u(a){var b=a.keyCode,c=/^(8|46)$/.test(b);return 27==b?(B.close(!0),!1):void((32==b||c||!w.open&&B.component.key[b])&&(a.preventDefault(),a.stopPropagation(),c?B.clear().close():B.open()))}if(!f)return b;var v=!1,w={id:f.id||"P"+Math.abs(~~(Math.random()*new Date))},x=i?a.extend(!0,{},i.defaults,m):m||{},y=a.extend({},b.klasses(),x.klass),z=a(f),A=function(){return this.start()},B=A.prototype={constructor:A,$node:z,start:function(){return w&&w.start?B:(w.methods={},w.start=!0,w.open=!1,w.type=f.type,f.autofocus=f==h(),f.readOnly=!x.editable,f.id=f.id||w.id,"text"!=f.type&&(f.type="text"),B.component=new i(B,x),B.$root=a('<div class="'+y.picker+'" id="'+f.id+'_root" />'),p(),B.$holder=a(n()).appendTo(B.$root),q(),x.formatSubmit&&r(),o(),x.containerHidden?a(x.containerHidden).append(B._hidden):z.after(B._hidden),x.container?a(x.container).append(B.$root):z.after(B.$root),B.on({start:B.component.onStart,render:B.component.onRender,stop:B.component.onStop,open:B.component.onOpen,close:B.component.onClose,set:B.component.onSet}).on({start:x.onStart,render:x.onRender,stop:x.onStop,open:x.onOpen,close:x.onClose,set:x.onSet}),v=c(B.$holder[0]),f.autofocus&&B.open(),B.trigger("start").trigger("render"))},render:function(b){return b?(B.$holder=a(n()),q(),B.$root.html(B.$holder)):B.$root.find("."+y.box).html(B.component.nodes(w.open)),B.trigger("render")},stop:function(){return w.start?(B.close(),B._hidden&&B._hidden.parentNode.removeChild(B._hidden),B.$root.remove(),z.removeClass(y.input).removeData(g),setTimeout(function(){z.off("."+w.id)},0),f.type=w.type,f.readOnly=!1,B.trigger("stop"),w.methods={},w.start=!1,B):B},open:function(c){return w.open?B:(z.addClass(y.active),e(f,"expanded",!0),setTimeout(function(){B.$root.addClass(y.opened),e(B.$root[0],"hidden",!1)},0),c!==!1&&(w.open=!0,v&&k.css("overflow","hidden").css("padding-right","+="+d()),s(),j.on("click."+w.id+" focusin."+w.id,function(a){var b=a.target;b!=f&&b!=document&&3!=a.which&&B.close(b===B.$holder[0])}).on("keydown."+w.id,function(c){var d=c.keyCode,e=B.component.key[d],f=c.target;27==d?B.close(!0):f!=B.$holder[0]||!e&&13!=d?a.contains(B.$root[0],f)&&13==d&&(c.preventDefault(),f.click()):(c.preventDefault(),e?b._.trigger(B.component.key.go,B,[b._.trigger(e)]):B.$root.find("."+y.highlighted).hasClass(y.disabled)||(B.set("select",B.component.item.highlight),x.closeOnSelect&&B.close(!0)))})),B.trigger("open"))},close:function(a){return a&&(x.editable?f.focus():(B.$holder.off("focus.toOpen").focus(),setTimeout(function(){B.$holder.on("focus.toOpen",t)},0))),z.removeClass(y.active),e(f,"expanded",!1),setTimeout(function(){B.$root.removeClass(y.opened+" "+y.focused),e(B.$root[0],"hidden",!0)},0),w.open?(w.open=!1,v&&k.css("overflow","").css("padding-right","-="+d()),j.off("."+w.id),B.trigger("close")):B},clear:function(a){return B.set("clear",null,a)},set:function(b,c,d){var e,f,g=a.isPlainObject(b),h=g?b:{};if(d=g&&a.isPlainObject(c)?c:d||{},b){g||(h[b]=c);for(e in h)f=h[e],e in B.component.item&&(void 0===f&&(f=null),B.component.set(e,f,d)),("select"==e||"clear"==e)&&z.val("clear"==e?"":B.get(e,x.format)).trigger("change");B.render()}return d.muted?B:B.trigger("set",h)},get:function(a,c){if(a=a||"value",null!=w[a])return w[a];if("valueSubmit"==a){if(B._hidden)return B._hidden.value;a="value"}if("value"==a)return f.value;if(a in B.component.item){if("string"==typeof c){var d=B.component.get(a);return d?b._.trigger(B.component.formats.toString,B.component,[c,d]):""}return B.component.get(a)}},on:function(b,c,d){var e,f,g=a.isPlainObject(b),h=g?b:{};if(b){g||(h[b]=c);for(e in h)f=h[e],d&&(e="_"+e),w.methods[e]=w.methods[e]||[],w.methods[e].push(f)}return B},off:function(){var a,b,c=arguments;for(a=0,namesCount=c.length;a<namesCount;a+=1)b=c[a],b in w.methods&&delete w.methods[b];return B},trigger:function(a,c){var d=function(a){var d=w.methods[a];d&&d.map(function(a){b._.trigger(a,B,[c])})};return d("_"+a),d(a),B}};return new A}function c(a){var b,c="position";return a.currentStyle?b=a.currentStyle[c]:window.getComputedStyle&&(b=getComputedStyle(a)[c]),"fixed"==b}function d(){if(k.height()<=i.height())return 0;var b=a('<div style="visibility:hidden;width:100px" />').appendTo("body"),c=b[0].offsetWidth;b.css("overflow","scroll");var d=a('<div style="width:100%" />').appendTo(b),e=d[0].offsetWidth;return b.remove(),c-e}function e(b,c,d){if(a.isPlainObject(c))for(var e in c)f(b,e,c[e]);else f(b,c,d)}function f(a,b,c){a.setAttribute(("role"==b?"":"aria-")+b,c)}function g(b,c){a.isPlainObject(b)||(b={attribute:c}),c="";for(var d in b){var e=("role"==d?"":"aria-")+d,f=b[d];c+=null==f?"":e+'="'+b[d]+'"'}return c}function h(){try{return document.activeElement}catch(a){}}var i=a(window),j=a(document),k=a(document.documentElement),l=null!=document.documentElement.style.transition;return b.klasses=function(a){return a=a||"picker",{picker:a,opened:a+"--opened",focused:a+"--focused",input:a+"__input",active:a+"__input--active",target:a+"__input--target",holder:a+"__holder",frame:a+"__frame",wrap:a+"__wrap",box:a+"__box"}},b._={group:function(a){for(var c,d="",e=b._.trigger(a.min,a);e<=b._.trigger(a.max,a,[e]);e+=a.i)c=b._.trigger(a.item,a,[e]),d+=b._.node(a.node,c[0],c[1],c[2]);return d},node:function(b,c,d,e){return c?(c=a.isArray(c)?c.join(""):c,d=d?' class="'+d+'"':"",e=e?" "+e:"","<"+b+d+e+">"+c+"</"+b+">"):""},lead:function(a){return(10>a?"0":"")+a},trigger:function(a,b,c){return"function"==typeof a?a.apply(b,c||[]):a},digits:function(a){return/\d/.test(a[1])?2:1},isDate:function(a){return{}.toString.call(a).indexOf("Date")>-1&&this.isInteger(a.getDate())},isInteger:function(a){return{}.toString.call(a).indexOf("Number")>-1&&a%1===0},ariaAttr:g},b.extend=function(c,d){a.fn[c]=function(e,f){var g=this.data(c);return"picker"==e?g:g&&"string"==typeof e?b._.trigger(g[e],g,[f]):this.each(function(){var f=a(this);f.data(c)||new b(this,c,d,e)})},a.fn[c].defaults=d.defaults},b});
19
- !function(a){a(Picker,jQuery)}(function(a,b){function c(a,b){var c=this,d=a.$node[0],e=d.value,f=a.$node.data("value"),g=f||e,h=f?b.formatSubmit:b.format,i=function(){return d.currentStyle?"rtl"==d.currentStyle.direction:"rtl"==getComputedStyle(a.$root[0]).direction};c.settings=b,c.$node=a.$node,c.queue={min:"measure create",max:"measure create",now:"now create",select:"parse create validate",highlight:"parse navigate create validate",view:"parse create validate viewset",disable:"deactivate",enable:"activate"},c.item={},c.item.clear=null,c.item.disable=(b.disable||[]).slice(0),c.item.enable=-function(a){return a[0]===!0?a.shift():-1}(c.item.disable),c.set("min",b.min).set("max",b.max).set("now"),g?c.set("select",g,{format:h,defaultValue:!0}):c.set("select",null).set("highlight",c.item.now),c.key={40:7,38:-7,39:function(){return i()?-1:1},37:function(){return i()?1:-1},go:function(a){var b=c.item.highlight,d=new Date(b.year,b.month,b.date+a);c.set("highlight",d,{interval:a}),this.render()}},a.on("render",function(){a.$root.find("."+b.klass.selectMonth).on("change",function(){var c=this.value;c&&(a.set("highlight",[a.get("view").year,c,a.get("highlight").date]),a.$root.find("."+b.klass.selectMonth).trigger("focus"))}),a.$root.find("."+b.klass.selectYear).on("change",function(){var c=this.value;c&&(a.set("highlight",[c,a.get("view").month,a.get("highlight").date]),a.$root.find("."+b.klass.selectYear).trigger("focus"))})},1).on("open",function(){var d="";c.disabled(c.get("now"))&&(d=":not(."+b.klass.buttonToday+")"),a.$root.find("button"+d+", select").attr("disabled",!1)},1).on("close",function(){a.$root.find("button, select").attr("disabled",!0)},1)}var d=7,e=6,f=a._;c.prototype.set=function(a,b,c){var d=this,e=d.item;return null===b?("clear"==a&&(a="select"),e[a]=b,d):(e["enable"==a?"disable":"flip"==a?"enable":a]=d.queue[a].split(" ").map(function(e){return b=d[e](a,b,c)}).pop(),"select"==a?d.set("highlight",e.select,c):"highlight"==a?d.set("view",e.highlight,c):a.match(/^(flip|min|max|disable|enable)$/)&&(e.select&&d.disabled(e.select)&&d.set("select",e.select,c),e.highlight&&d.disabled(e.highlight)&&d.set("highlight",e.highlight,c)),d)},c.prototype.get=function(a){return this.item[a]},c.prototype.create=function(a,c,d){var e,g=this;return c=void 0===c?a:c,c==-(1/0)||c==1/0?e=c:b.isPlainObject(c)&&f.isInteger(c.pick)?c=c.obj:b.isArray(c)?(c=new Date(c[0],c[1],c[2]),c=f.isDate(c)?c:g.create().obj):c=f.isInteger(c)||f.isDate(c)?g.normalize(new Date(c),d):g.now(a,c,d),{year:e||c.getFullYear(),month:e||c.getMonth(),date:e||c.getDate(),day:e||c.getDay(),obj:e||c,pick:e||c.getTime()}},c.prototype.createRange=function(a,c){var d=this,e=function(a){return a===!0||b.isArray(a)||f.isDate(a)?d.create(a):a};return f.isInteger(a)||(a=e(a)),f.isInteger(c)||(c=e(c)),f.isInteger(a)&&b.isPlainObject(c)?a=[c.year,c.month,c.date+a]:f.isInteger(c)&&b.isPlainObject(a)&&(c=[a.year,a.month,a.date+c]),{from:e(a),to:e(c)}},c.prototype.withinRange=function(a,b){return a=this.createRange(a.from,a.to),b.pick>=a.from.pick&&b.pick<=a.to.pick},c.prototype.overlapRanges=function(a,b){var c=this;return a=c.createRange(a.from,a.to),b=c.createRange(b.from,b.to),c.withinRange(a,b.from)||c.withinRange(a,b.to)||c.withinRange(b,a.from)||c.withinRange(b,a.to)},c.prototype.now=function(a,b,c){return b=new Date,c&&c.rel&&b.setDate(b.getDate()+c.rel),this.normalize(b,c)},c.prototype.navigate=function(a,c,d){var e,f,g,h,i=b.isArray(c),j=b.isPlainObject(c),k=this.item.view;if(i||j){for(j?(f=c.year,g=c.month,h=c.date):(f=+c[0],g=+c[1],h=+c[2]),d&&d.nav&&k&&k.month!==g&&(f=k.year,g=k.month),e=new Date(f,g+(d&&d.nav?d.nav:0),1),f=e.getFullYear(),g=e.getMonth();new Date(f,g,h).getMonth()!==g;)h-=1;c=[f,g,h]}return c},c.prototype.normalize=function(a){return a.setHours(0,0,0,0),a},c.prototype.measure=function(a,b){var c=this;return b?"string"==typeof b?b=c.parse(a,b):f.isInteger(b)&&(b=c.now(a,b,{rel:b})):b="min"==a?-(1/0):1/0,b},c.prototype.viewset=function(a,b){return this.create([b.year,b.month,1])},c.prototype.validate=function(a,c,d){var e,g,h,i,j=this,k=c,l=d&&d.interval?d.interval:1,m=-1===j.item.enable,n=j.item.min,o=j.item.max,p=m&&j.item.disable.filter(function(a){if(b.isArray(a)){var d=j.create(a).pick;d<c.pick?e=!0:d>c.pick&&(g=!0)}return f.isInteger(a)}).length;if((!d||!d.nav&&!d.defaultValue)&&(!m&&j.disabled(c)||m&&j.disabled(c)&&(p||e||g)||!m&&(c.pick<=n.pick||c.pick>=o.pick)))for(m&&!p&&(!g&&l>0||!e&&0>l)&&(l*=-1);j.disabled(c)&&(Math.abs(l)>1&&(c.month<k.month||c.month>k.month)&&(c=k,l=l>0?1:-1),c.pick<=n.pick?(h=!0,l=1,c=j.create([n.year,n.month,n.date+(c.pick===n.pick?0:-1)])):c.pick>=o.pick&&(i=!0,l=-1,c=j.create([o.year,o.month,o.date+(c.pick===o.pick?0:1)])),!h||!i);)c=j.create([c.year,c.month,c.date+l]);return c},c.prototype.disabled=function(a){var c=this,d=c.item.disable.filter(function(d){return f.isInteger(d)?a.day===(c.settings.firstDay?d:d-1)%7:b.isArray(d)||f.isDate(d)?a.pick===c.create(d).pick:b.isPlainObject(d)?c.withinRange(d,a):void 0});return d=d.length&&!d.filter(function(a){return b.isArray(a)&&"inverted"==a[3]||b.isPlainObject(a)&&a.inverted}).length,-1===c.item.enable?!d:d||a.pick<c.item.min.pick||a.pick>c.item.max.pick},c.prototype.parse=function(a,b,c){var d=this,e={};return b&&"string"==typeof b?(c&&c.format||(c=c||{},c.format=d.settings.format),d.formats.toArray(c.format).map(function(a){var c=d.formats[a],g=c?f.trigger(c,d,[b,e]):a.replace(/^!/,"").length;c&&(e[a]=b.substr(0,g)),b=b.substr(g)}),[e.yyyy||e.yy,+(e.mm||e.m)-1,e.dd||e.d]):b},c.prototype.formats=function(){function a(a,b,c){var d=a.match(/[^\x00-\x7F]+|\w+/)[0];return c.mm||c.m||(c.m=b.indexOf(d)+1),d.length}function b(a){return a.match(/\w+/)[0].length}return{d:function(a,b){return a?f.digits(a):b.date},dd:function(a,b){return a?2:f.lead(b.date)},ddd:function(a,c){return a?b(a):this.settings.weekdaysShort[c.day]},dddd:function(a,c){return a?b(a):this.settings.weekdaysFull[c.day]},m:function(a,b){return a?f.digits(a):b.month+1},mm:function(a,b){return a?2:f.lead(b.month+1)},mmm:function(b,c){var d=this.settings.monthsShort;return b?a(b,d,c):d[c.month]},mmmm:function(b,c){var d=this.settings.monthsFull;return b?a(b,d,c):d[c.month]},yy:function(a,b){return a?2:(""+b.year).slice(2)},yyyy:function(a,b){return a?4:b.year},toArray:function(a){return a.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g)},toString:function(a,b){var c=this;return c.formats.toArray(a).map(function(a){return f.trigger(c.formats[a],c,[0,b])||a.replace(/^!/,"")}).join("")}}}(),c.prototype.isDateExact=function(a,c){var d=this;return f.isInteger(a)&&f.isInteger(c)||"boolean"==typeof a&&"boolean"==typeof c?a===c:(f.isDate(a)||b.isArray(a))&&(f.isDate(c)||b.isArray(c))?d.create(a).pick===d.create(c).pick:b.isPlainObject(a)&&b.isPlainObject(c)?d.isDateExact(a.from,c.from)&&d.isDateExact(a.to,c.to):!1},c.prototype.isDateOverlap=function(a,c){var d=this,e=d.settings.firstDay?1:0;return f.isInteger(a)&&(f.isDate(c)||b.isArray(c))?(a=a%7+e,a===d.create(c).day+1):f.isInteger(c)&&(f.isDate(a)||b.isArray(a))?(c=c%7+e,c===d.create(a).day+1):b.isPlainObject(a)&&b.isPlainObject(c)?d.overlapRanges(a,c):!1},c.prototype.flipEnable=function(a){var b=this.item;b.enable=a||(-1==b.enable?1:-1)},c.prototype.deactivate=function(a,c){var d=this,e=d.item.disable.slice(0);return"flip"==c?d.flipEnable():c===!1?(d.flipEnable(1),e=[]):c===!0?(d.flipEnable(-1),e=[]):c.map(function(a){for(var c,g=0;g<e.length;g+=1)if(d.isDateExact(a,e[g])){c=!0;break}c||(f.isInteger(a)||f.isDate(a)||b.isArray(a)||b.isPlainObject(a)&&a.from&&a.to)&&e.push(a)}),e},c.prototype.activate=function(a,c){var d=this,e=d.item.disable,g=e.length;return"flip"==c?d.flipEnable():c===!0?(d.flipEnable(1),e=[]):c===!1?(d.flipEnable(-1),e=[]):c.map(function(a){var c,h,i,j;for(i=0;g>i;i+=1){if(h=e[i],d.isDateExact(h,a)){c=e[i]=null,j=!0;break}if(d.isDateOverlap(h,a)){b.isPlainObject(a)?(a.inverted=!0,c=a):b.isArray(a)?(c=a,c[3]||c.push("inverted")):f.isDate(a)&&(c=[a.getFullYear(),a.getMonth(),a.getDate(),"inverted"]);break}}if(c)for(i=0;g>i;i+=1)if(d.isDateExact(e[i],a)){e[i]=null;break}if(j)for(i=0;g>i;i+=1)if(d.isDateOverlap(e[i],a)){e[i]=null;break}c&&e.push(c)}),e.filter(function(a){return null!=a})},c.prototype.nodes=function(a){var b=this,c=b.settings,g=b.item,h=g.now,i=g.select,j=g.highlight,k=g.view,l=g.disable,m=g.min,n=g.max,o=function(a,b){return c.firstDay&&(a.push(a.shift()),b.push(b.shift())),f.node("thead",f.node("tr",f.group({min:0,max:d-1,i:1,node:"th",item:function(d){return[a[d],c.klass.weekdays,'scope=col title="'+b[d]+'"']}})))}((c.showWeekdaysFull?c.weekdaysFull:c.weekdaysShort).slice(0),c.weekdaysFull.slice(0)),p=function(a){return f.node("div"," ",c.klass["nav"+(a?"Next":"Prev")]+(a&&k.year>=n.year&&k.month>=n.month||!a&&k.year<=m.year&&k.month<=m.month?" "+c.klass.navDisabled:""),"data-nav="+(a||-1)+" "+f.ariaAttr({role:"button",controls:b.$node[0].id+"_table"})+' title="'+(a?c.labelMonthNext:c.labelMonthPrev)+'"')},q=function(){var d=c.showMonthsShort?c.monthsShort:c.monthsFull;return c.selectMonths?f.node("select",f.group({min:0,max:11,i:1,node:"option",item:function(a){return[d[a],0,"value="+a+(k.month==a?" selected":"")+(k.year==m.year&&a<m.month||k.year==n.year&&a>n.month?" disabled":"")]}}),c.klass.selectMonth,(a?"":"disabled")+" "+f.ariaAttr({controls:b.$node[0].id+"_table"})+' title="'+c.labelMonthSelect+'"'):f.node("div",d[k.month],c.klass.month)},r=function(){var d=k.year,e=c.selectYears===!0?5:~~(c.selectYears/2);if(e){var g=m.year,h=n.year,i=d-e,j=d+e;if(g>i&&(j+=g-i,i=g),j>h){var l=i-g,o=j-h;i-=l>o?o:l,j=h}return f.node("select",f.group({min:i,max:j,i:1,node:"option",item:function(a){return[a,0,"value="+a+(d==a?" selected":"")]}}),c.klass.selectYear,(a?"":"disabled")+" "+f.ariaAttr({controls:b.$node[0].id+"_table"})+' title="'+c.labelYearSelect+'"')}return f.node("div",d,c.klass.year)};return f.node("div",(c.selectYears?r()+q():q()+r())+p()+p(1),c.klass.header)+f.node("table",o+f.node("tbody",f.group({min:0,max:e-1,i:1,node:"tr",item:function(a){var e=c.firstDay&&0===b.create([k.year,k.month,1]).day?-7:0;return[f.group({min:d*a-k.day+e+1,max:function(){return this.min+d-1},i:1,node:"td",item:function(a){a=b.create([k.year,k.month,a+(c.firstDay?1:0)]);var d=i&&i.pick==a.pick,e=j&&j.pick==a.pick,g=l&&b.disabled(a)||a.pick<m.pick||a.pick>n.pick,o=f.trigger(b.formats.toString,b,[c.format,a]);return[f.node("div",a.date,function(b){return b.push(k.month==a.month?c.klass.infocus:c.klass.outfocus),h.pick==a.pick&&b.push(c.klass.now),d&&b.push(c.klass.selected),e&&b.push(c.klass.highlighted),g&&b.push(c.klass.disabled),b.join(" ")}([c.klass.day]),"data-pick="+a.pick+" "+f.ariaAttr({role:"gridcell",label:o,selected:d&&b.$node.val()===o?!0:null,activedescendant:e?!0:null,disabled:g?!0:null})),"",f.ariaAttr({role:"presentation"})]}})]}})),c.klass.table,'id="'+b.$node[0].id+'_table" '+f.ariaAttr({role:"grid",controls:b.$node[0].id,readonly:!0}))+f.node("div",f.node("button",c.today,c.klass.buttonToday,"type=button data-pick="+h.pick+(a&&!b.disabled(h)?"":" disabled")+" "+f.ariaAttr({controls:b.$node[0].id}))+f.node("button",c.clear,c.klass.buttonClear,"type=button data-clear=1"+(a?"":" disabled")+" "+f.ariaAttr({controls:b.$node[0].id}))+f.node("button",c.close,c.klass.buttonClose,"type=button data-close=true "+(a?"":" disabled")+" "+f.ariaAttr({controls:b.$node[0].id})),c.klass.footer)},c.defaults=function(a){return{labelMonthNext:"Next month",labelMonthPrev:"Previous month",labelMonthSelect:"Select a month",labelYearSelect:"Select a year",monthsFull:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],weekdaysFull:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],today:"Today",clear:"Clear",close:"Close",closeOnSelect:!0,closeOnClear:!0,format:"d mmmm, yyyy",klass:{table:a+"table",header:a+"header",navPrev:a+"nav--prev",navNext:a+"nav--next",navDisabled:a+"nav--disabled",month:a+"month",year:a+"year",selectMonth:a+"select--month",selectYear:a+"select--year",weekdays:a+"weekday",day:a+"day",disabled:a+"day--disabled",selected:a+"day--selected",highlighted:a+"day--highlighted",now:a+"day--today",infocus:a+"day--infocus",outfocus:a+"day--outfocus",footer:a+"footer",buttonClear:a+"button--clear",buttonToday:a+"button--today",buttonClose:a+"button--close"}}}(a.klasses().picker+"__"),a.extend("pickadate",c)});
20
- !function(a,b,c,d){function h(b,c){this.element=b,this.$element=a(b),this.init()}var e="textareaAutoSize",f="plugin_"+e,g=function(a){return a.replace(/\s/g,"").length>0};h.prototype={init:function(){var c=parseInt(this.$element.css("paddingBottom"))+parseInt(this.$element.css("paddingTop"))+parseInt(this.$element.css("borderTopWidth"))+parseInt(this.$element.css("borderBottomWidth"))||0;g(this.element.value)&&this.$element.height(this.element.scrollHeight-c),this.$element.on("input keyup",function(d){var e=a(b),f=e.scrollTop();a(this).height(0).height(this.scrollHeight-c),e.scrollTop(f)})}},a.fn[e]=function(b){return this.each(function(){a.data(this,f)||a.data(this,f,new h(this,b))}),this}}(jQuery,window,document);
27
+ (function ( factory ) {
21
28
 
22
- !function(a,b){"use strict";"function"==typeof define&&define.amd?define([],function(){return b.apply(a)}):"object"==typeof exports?module.exports=b.call(a):a.Waves=b.call(a)}("object"==typeof global?global:this,function(){"use strict";function e(a){return null!==a&&a===a.window}function f(a){return e(a)?a:9===a.nodeType&&a.defaultView}function g(a){var b=typeof a;return"function"===b||"object"===b&&!!a}function h(a){return g(a)&&a.nodeType>0}function i(a){var d=c.call(a);return"[object String]"===d?b(a):g(a)&&/^\[object (HTMLCollection|NodeList|Object)\]$/.test(d)&&a.hasOwnProperty("length")?a:h(a)?[a]:[]}function j(a){var b,c,d={top:0,left:0},e=a&&a.ownerDocument;return b=e.documentElement,"undefined"!=typeof a.getBoundingClientRect&&(d=a.getBoundingClientRect()),c=f(e),{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}}function k(a){var b="";for(var c in a)a.hasOwnProperty(c)&&(b+=c+":"+a[c]+";");return b}function n(a,b,c,d){if(c){d.classList.remove("waves-wrapping"),c.classList.remove("waves-rippling");var e=c.getAttribute("data-x"),f=c.getAttribute("data-y"),g=c.getAttribute("data-scale"),h=c.getAttribute("data-translate"),i=Date.now()-Number(c.getAttribute("data-hold")),j=350-i;0>j&&(j=0),"mousemove"===a.type&&(j=150);var m="mousemove"===a.type?2500:l.duration;setTimeout(function(){var a={top:f+"px",left:e+"px",opacity:"0","-webkit-transition-duration":m+"ms","-moz-transition-duration":m+"ms","-o-transition-duration":m+"ms","transition-duration":m+"ms","-webkit-transform":g+" "+h,"-moz-transform":g+" "+h,"-ms-transform":g+" "+h,"-o-transform":g+" "+h,transform:g+" "+h};c.setAttribute("style",k(a)),setTimeout(function(){try{d.removeChild(c),b.removeChild(d)}catch(a){return!1}},m)},j)}}function p(a){if(o.allowEvent(a)===!1)return null;for(var b=null,c=a.target||a.srcElement;null!==c.parentElement;){if(c.classList.contains("waves-effect")&&!(c instanceof SVGElement)){b=c;break}c=c.parentElement}return b}function q(a){var b=p(a);if(null!==b){if(b.disabled||b.getAttribute("disabled")||b.classList.contains("disabled"))return;if(o.registerEvent(a),"touchstart"===a.type&&l.delay){var c=!1,e=setTimeout(function(){e=null,l.show(a,b)},l.delay),f=function(d){e&&(clearTimeout(e),e=null,l.show(a,b)),c||(c=!0,l.hide(d,b))},g=function(a){e&&(clearTimeout(e),e=null),f(a)};b.addEventListener("touchmove",g,!1),b.addEventListener("touchend",f,!1),b.addEventListener("touchcancel",f,!1)}else l.show(a,b),d&&(b.addEventListener("touchend",l.hide,!1),b.addEventListener("touchcancel",l.hide,!1)),b.addEventListener("mouseup",l.hide,!1),b.addEventListener("mouseleave",l.hide,!1)}}var a=a||{},b=document.querySelectorAll.bind(document),c=Object.prototype.toString,d="ontouchstart"in window,l={duration:750,delay:200,show:function(a,b,c){if(2===a.button)return!1;b=b||this;var d=document.createElement("div");d.className="waves-wrap waves-wrapping",b.appendChild(d);var e=document.createElement("div");e.className="waves-ripple waves-rippling",d.appendChild(e);var f=j(b),g=0,h=0;"touches"in a&&a.touches.length?(g=a.touches[0].pageY-f.top,h=a.touches[0].pageX-f.left):(g=a.pageY-f.top,h=a.pageX-f.left),h=h>=0?h:0,g=g>=0?g:0;var i="scale("+b.clientWidth/100*3+")",m="translate(0,0)";c&&(m="translate("+c.x+"px, "+c.y+"px)"),e.setAttribute("data-hold",Date.now()),e.setAttribute("data-x",h),e.setAttribute("data-y",g),e.setAttribute("data-scale",i),e.setAttribute("data-translate",m);var n={top:g+"px",left:h+"px"};e.classList.add("waves-notransition"),e.setAttribute("style",k(n)),e.classList.remove("waves-notransition"),n["-webkit-transform"]=i+" "+m,n["-moz-transform"]=i+" "+m,n["-ms-transform"]=i+" "+m,n["-o-transform"]=i+" "+m,n.transform=i+" "+m,n.opacity="1";var o="mousemove"===a.type?2500:l.duration;n["-webkit-transition-duration"]=o+"ms",n["-moz-transition-duration"]=o+"ms",n["-o-transition-duration"]=o+"ms",n["transition-duration"]=o+"ms",e.setAttribute("style",k(n))},hide:function(a,b){b=b||this;for(var c=b.getElementsByClassName("waves-wrapping"),d=b.getElementsByClassName("waves-rippling"),e=0,f=d.length;f>e;e++)n(a,b,d[e],c[e])}},m={input:function(a){var b=a.parentNode;if("i"!==b.tagName.toLowerCase()||!b.classList.contains("waves-effect")){var c=document.createElement("i");c.className=a.className+" waves-input-wrapper",a.className="waves-button-input",b.replaceChild(c,a),c.appendChild(a);var d=window.getComputedStyle(a,null),e=d.color,f=d.backgroundColor;c.setAttribute("style","color:"+e+";background:"+f),a.setAttribute("style","background-color:rgba(0,0,0,0);")}},img:function(a){var b=a.parentNode;if("i"!==b.tagName.toLowerCase()||!b.classList.contains("waves-effect")){var c=document.createElement("i");b.replaceChild(c,a),c.appendChild(a)}}},o={touches:0,allowEvent:function(a){var b=!0;return/^(mousedown|mousemove)$/.test(a.type)&&o.touches&&(b=!1),b},registerEvent:function(a){var b=a.type;"touchstart"===b?o.touches+=1:/^(touchend|touchcancel)$/.test(b)&&setTimeout(function(){o.touches&&(o.touches-=1)},500)}};return a.init=function(a){var b=document.body;a=a||{},"duration"in a&&(l.duration=a.duration),"delay"in a&&(l.delay=a.delay),d&&(b.addEventListener("touchstart",q,!1),b.addEventListener("touchcancel",o.registerEvent,!1),b.addEventListener("touchend",o.registerEvent,!1)),b.addEventListener("mousedown",q,!1)},a.attach=function(a,b){a=i(a),"[object Array]"===c.call(b)&&(b=b.join(" ")),b=b?" "+b:"";for(var d,e,f=0,g=a.length;g>f;f++)d=a[f],e=d.tagName.toLowerCase(),-1!==["input","img"].indexOf(e)&&(m[e](d),d=d.parentElement),-1===d.className.indexOf("waves-effect")&&(d.className+=" waves-effect"+b)},a.ripple=function(a,b){a=i(a);var c=a.length;if(b=b||{},b.wait=b.wait||0,b.position=b.position||null,c)for(var d,e,f,g={},h=0,k={type:"mousedown",button:1},m=function(a,b){return function(){l.hide(a,b)}};c>h;h++)if(d=a[h],e=b.position||{x:d.clientWidth/2,y:d.clientHeight/2},f=j(d),g.x=f.left+e.x,g.y=f.top+e.y,k.pageX=g.x,k.pageY=g.y,l.show(k,d),b.wait>=0&&null!==b.wait){var n={type:"mouseup",button:1};setTimeout(m(n,d),b.wait)}},a.calm=function(a){a=i(a);for(var b={type:"mouseup",button:1},c=0,d=a.length;d>c;c++)l.hide(b,a[c])},a.displayEffect=function(b){console.error("Waves.displayEffect() has been deprecated and will be removed in future version. Please use Waves.init() to initialize Waves effect"),a.init(b)},a});
29
+ // AMD.
30
+ if ( typeof undefined == 'function' && undefined.amd )
31
+ undefined( 'picker', ['jquery'], factory );
23
32
 
24
- +function ($) {
33
+ // Node.js/browserify.
34
+ else module.exports = factory( $ );
25
35
 
26
- 'use strict'
36
+ }(function( $$$1 ) {
27
37
 
28
- var Datepicker = function (element, options) {
29
- this._element = element
30
- this._options = options
31
- }
38
+ var $window = $$$1( window );
39
+ var $document = $$$1( document );
40
+ var $html = $$$1( document.documentElement );
41
+ var supportsTransitions = document.documentElement.style.transition != null;
32
42
 
33
- if (typeof $.fn.pickadate === 'undefined') {
34
- throw new Error('Material\'s JavaScript requires pickadate.js')
35
- }
36
43
 
37
- Datepicker.DEFAULTS = {
38
- cancel : 'Cancel',
39
- closeOnCancel : true,
40
- closeOnSelect : false,
41
- container : 'body',
42
- disable : [],
43
- firstDay : 0,
44
- format : 'd/m/yyyy',
45
- formatSubmit : '',
46
- klass : {
47
- // button
48
- buttonClear : 'btn btn-outline-primary picker-button-clear',
49
- buttonClose : 'btn btn-outline-primary picker-button-close',
50
- buttonToday : 'btn btn-outline-primary picker-button-today',
44
+ /**
45
+ * The picker constructor that creates a blank picker.
46
+ */
47
+ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
51
48
 
52
- // day
53
- day : 'picker-day',
54
- disabled : 'picker-day-disabled',
55
- highlighted : 'picker-day-highlighted',
56
- infocus : 'picker-day-infocus',
57
- now : 'picker-day-today',
58
- outfocus : 'picker-day-outfocus',
59
- selected : 'picker-day-selected',
60
- weekdays : 'picker-weekday',
49
+ // If there’s no element, return the picker constructor.
50
+ if ( !ELEMENT ) return PickerConstructor
61
51
 
62
- // element
63
- box : 'picker-box',
64
- footer : 'picker-footer',
65
- frame : 'picker-frame',
66
- header : 'picker-header',
67
- holder : 'picker-holder',
68
- table : 'picker-table',
69
- wrap : 'picker-wrap',
70
52
 
71
- // input element
72
- active : 'picker-input-active',
73
- input : 'picker-input',
53
+ var
54
+ IS_DEFAULT_THEME = false,
74
55
 
75
- // month and year nav
76
- month : 'picker-month',
77
- navDisabled : 'picker-nav-disabled',
78
- navNext : 'material-icons picker-nav-next',
79
- navPrev : 'material-icons picker-nav-prev',
80
- selectMonth : 'picker-select-month',
81
- selectYear : 'picker-select-year',
82
- year : 'picker-year',
83
56
 
84
- // root picker
85
- focused : 'picker-focused',
86
- opened : 'picker-opened',
87
- picker : 'picker'
88
- },
89
- max : false,
90
- min : false,
91
- monthsFull : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
92
- monthsShort : ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
93
- ok : 'OK',
94
- onClose : false,
95
- onOpen : false,
96
- onRender : false,
97
- onSet : false,
98
- onStart : false,
99
- onStop : false,
100
- selectMonths : false,
101
- selectYears : false,
102
- today : '',
103
- weekdaysFull : ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
104
- weekdaysShort : ['S', 'M', 'T', 'W', 'T', 'F', 'S']
105
- }
57
+ // The state of the picker.
58
+ STATE = {
59
+ id: ELEMENT.id || 'P' + Math.abs( ~~(Math.random() * new Date()) )
60
+ },
106
61
 
107
- Datepicker.prototype.display = function (datepickerApi, datepickerRoot, datepickerValue) {
108
- $('.picker-date-display', datepickerRoot).remove()
109
-
110
- $('.picker-wrap', datepickerRoot).prepend('<div class="picker-date-display">' +
111
- '<div class="picker-date-display-top">' +
112
- '<span class="picker-year-display">' + datepickerApi.get(datepickerValue, 'yyyy') + '</span>' +
113
- '</div>' +
114
- '<div class="picker-date-display-bottom">' +
115
- '<span class="picker-weekday-display">' + datepickerApi.get(datepickerValue, 'dddd') + '</span>' +
116
- '<span class="picker-day-display">' + datepickerApi.get(datepickerValue, 'd') + '</span>' +
117
- '<span class="picker-month-display">' + datepickerApi.get(datepickerValue, 'mmm') + '</span>' +
118
- '</div>' +
119
- '</div>')
120
- }
121
62
 
122
- Datepicker.prototype.show = function () {
123
- var that = this
124
-
125
- $(this._element).pickadate({
126
- clear : that._options.cancel,
127
- close : that._options.ok,
128
- closeOnClear : that._options.closeOnCancel,
129
- closeOnSelect : that._options.closeOnSelect,
130
- container : that._options.container,
131
- disable : that._options.disable,
132
- firstDay : that._options.firstDay,
133
- format : that._options.format,
134
- formatSubmit : that._options.formatSubmit,
135
- klass : that._options.klass,
136
- max : that._options.max,
137
- min : that._options.min,
138
- monthsFull : that._options.monthsFull,
139
- monthsShort : that._options.monthsShort,
140
- onClose : that._options.onClose,
141
- onOpen : that._options.onOpen,
142
- onRender : that._options.onRender,
143
- onSet : that._options.onSet,
144
- onStart : that._options.onStart,
145
- onStop : that._options.onStop,
146
- selectMonths : that._options.selectMonths,
147
- selectYears : that._options.selectYears,
148
- today : that._options.today,
149
- weekdaysFull : that._options.weekdaysFull,
150
- weekdaysShort : that._options.weekdaysShort
151
- })
152
-
153
- var datepickerApi = $(this._element).pickadate('picker'),
154
- datepickerNode = datepickerApi.$node,
155
- datepickerRoot = datepickerApi.$root
63
+ // Merge the defaults and options passed.
64
+ SETTINGS = COMPONENT ? $$$1.extend( true, {}, COMPONENT.defaults, OPTIONS ) : OPTIONS || {},
156
65
 
157
- datepickerApi.on({
158
- close: function () {
159
- $(document.activeElement).blur()
160
- },
161
- open: function () {
162
- if (!$('.picker__date-display', datepickerRoot).length) {
163
- that.display(datepickerApi, datepickerRoot, 'highlight')
164
- }
165
- },
166
- set: function () {
167
- if (datepickerApi.get('select') !== null) {
168
- that.display(datepickerApi, datepickerRoot, 'select')
169
- }
170
- }
171
- })
172
- }
173
66
 
174
- function Plugin (option) {
175
- return this.each(function () {
176
- var data = $(this).data('bs.pickdate')
177
- var options = $.extend({}, Datepicker.DEFAULTS, $(this).data(), typeof option == 'object' && option)
67
+ // Merge the default classes with the settings classes.
68
+ CLASSES = $$$1.extend( {}, PickerConstructor.klasses(), SETTINGS.klass ),
178
69
 
179
- if (!data) {
180
- $(this).data('bs.pickdate', (data = new Datepicker(this, options)))
181
- }
182
70
 
183
- data.show()
184
- })
185
- }
71
+ // The element node wrapper into a jQuery object.
72
+ $ELEMENT = $$$1( ELEMENT ),
186
73
 
187
- var old = $.fn.pickdate
188
74
 
189
- $.fn.pickdate = Plugin
190
- $.fn.pickdate.Constructor = Datepicker
75
+ // Pseudo picker constructor.
76
+ PickerInstance = function() {
77
+ return this.start()
78
+ },
191
79
 
192
- $.fn.pickdate.noConflict = function () {
193
- $.fn.pickdate = old
194
- return this
195
- }
196
80
 
197
- }(jQuery)
81
+ // The picker prototype.
82
+ P = PickerInstance.prototype = {
198
83
 
199
- $(function () {
200
- if ($('.textarea-autosize').length && (typeof $.fn.textareaAutoSize !== 'undefined')) {
201
- $('.textarea-autosize').textareaAutoSize()
202
- }
203
- })
204
-
205
- $(function () {
206
- if ($('.waves-attach').length && (typeof Waves !== 'undefined')) {
207
- Waves.attach('.waves-attach')
208
- Waves.init({
209
- duration: 300
210
- })
211
- }
212
- })
84
+ constructor: PickerInstance,
213
85
 
214
- var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
86
+ $node: $ELEMENT,
215
87
 
216
- 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; }; }();
217
88
 
218
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
89
+ /**
90
+ * Initialize everything
91
+ */
92
+ start: function() {
219
93
 
220
- +function () {
221
- /*
222
- * expansion panel
223
- * upon selecting the collapsed panel,
224
- * it expands to display in full
225
- */
94
+ // If it’s already started, do nothing.
95
+ if ( STATE && STATE.start ) return P
226
96
 
227
- var ExpansionPanel = function ($) {
228
97
 
229
- // constants >>>
230
- var DATA_KEY = 'bs.collapse';
231
- var EVENT_KEY = '.' + DATA_KEY;
98
+ // Update the picker states.
99
+ STATE.methods = {};
100
+ STATE.start = true;
101
+ STATE.open = false;
102
+ STATE.type = ELEMENT.type;
232
103
 
233
- var ClassName = {
234
- SHOW: 'show',
235
- SHOW_PREDECESSOR: 'show-predecessor'
236
- };
237
104
 
238
- var Event = {
239
- HIDE: 'hide' + EVENT_KEY,
240
- SHOW: 'show' + EVENT_KEY
241
- };
105
+ // Confirm focus state, convert into text input to remove UA stylings,
106
+ // and set as readonly to prevent keyboard popup.
107
+ ELEMENT.autofocus = ELEMENT == getActiveElement();
108
+ ELEMENT.readOnly = !SETTINGS.editable;
109
+ ELEMENT.id = ELEMENT.id || STATE.id;
110
+ if ( ELEMENT.type != 'text' ) {
111
+ ELEMENT.type = 'text';
112
+ }
242
113
 
243
- var Selector = {
244
- PANEL: '.expansion-panel',
245
- PANEL_BODY: '.expansion-panel .collapse'
246
- };
247
- // <<< constants
248
114
 
249
- $(document).on('' + Event.HIDE, Selector.PANEL_BODY, function (event) {
250
- var target = $(event.target).closest(Selector.PANEL);
115
+ // Create a new picker component with the settings.
116
+ P.component = new COMPONENT(P, SETTINGS);
251
117
 
252
- target.removeClass(ClassName.SHOW);
253
118
 
254
- var predecessor = target.prev(Selector.PANEL);
119
+ // Create the picker root and then prepare it.
120
+ P.$root = $$$1( '<div class="' + CLASSES.picker + '" id="' + ELEMENT.id + '_root" />' );
121
+ prepareElementRoot();
255
122
 
256
- if (predecessor.length) {
257
- predecessor.removeClass(ClassName.SHOW_PREDECESSOR);
258
- }
259
- }).on('' + Event.SHOW, Selector.PANEL_BODY, function (event) {
260
- var target = $(event.target).closest(Selector.PANEL);
261
123
 
262
- target.addClass(ClassName.SHOW);
124
+ // Create the picker holder and then prepare it.
125
+ P.$holder = $$$1( createWrappedComponent() ).appendTo( P.$root );
126
+ prepareElementHolder();
263
127
 
264
- var predecessor = target.prev(Selector.PANEL);
265
128
 
266
- if (predecessor.length) {
267
- predecessor.addClass(ClassName.SHOW_PREDECESSOR);
268
- }
269
- });
270
- }(jQuery);
129
+ // If there’s a format for the hidden input element, create the element.
130
+ if ( SETTINGS.formatSubmit ) {
131
+ prepareElementHidden();
132
+ }
271
133
 
272
- /*
273
- * floating label
274
- * when a user engages with the text input field,
275
- * the floating inline labels move to float above the field
276
- */
277
134
 
278
- var FloatingLabel = function ($) {
135
+ // Prepare the input element.
136
+ prepareElement();
279
137
 
280
- // constants >>>
281
- var DATA_KEY = 'md.floatinglabel';
282
- var EVENT_KEY = '.' + DATA_KEY;
283
- var NAME = 'floatinglabel';
284
- var NO_CONFLICT = $.fn[NAME];
285
138
 
286
- var ClassName = {
287
- IS_FOCUSED: 'is-focused',
288
- HAS_VALUE: 'has-value'
289
- };
139
+ // Insert the hidden input as specified in the settings.
140
+ if ( SETTINGS.containerHidden ) $$$1( SETTINGS.containerHidden ).append( P._hidden );
141
+ else $ELEMENT.after( P._hidden );
290
142
 
291
- var Event = {
292
- CHANGE: 'change' + EVENT_KEY,
293
- FOCUSIN: 'focusin' + EVENT_KEY,
294
- FOCUSOUT: 'focusout' + EVENT_KEY
295
- };
296
143
 
297
- var Selector = {
298
- DATA_PARENT: '.floating-label',
299
- DATA_TOGGLE: '.floating-label .form-control'
300
- };
301
- // <<< constants
144
+ // Insert the root as specified in the settings.
145
+ if ( SETTINGS.container ) $$$1( SETTINGS.container ).append( P.$root );
146
+ else $ELEMENT.after( P.$root );
302
147
 
303
- var FloatingLabel = function () {
304
- function FloatingLabel(element) {
305
- _classCallCheck(this, FloatingLabel);
306
148
 
307
- this._element = element;
308
- }
149
+ // Bind the default component and settings events.
150
+ P.on({
151
+ start: P.component.onStart,
152
+ render: P.component.onRender,
153
+ stop: P.component.onStop,
154
+ open: P.component.onOpen,
155
+ close: P.component.onClose,
156
+ set: P.component.onSet
157
+ }).on({
158
+ start: SETTINGS.onStart,
159
+ render: SETTINGS.onRender,
160
+ stop: SETTINGS.onStop,
161
+ open: SETTINGS.onOpen,
162
+ close: SETTINGS.onClose,
163
+ set: SETTINGS.onSet
164
+ });
309
165
 
310
- FloatingLabel.prototype.change = function change(relatedTarget) {
311
- if ($(this._element).val() || $(this._element).is('select') && $('option:first-child', $(this._element)).html().replace(' ', '') !== '') {
312
- $(relatedTarget).addClass(ClassName.HAS_VALUE);
313
- } else {
314
- $(relatedTarget).removeClass(ClassName.HAS_VALUE);
315
- }
316
- };
317
166
 
318
- FloatingLabel.prototype.focusin = function focusin(relatedTarget) {
319
- $(relatedTarget).addClass(ClassName.IS_FOCUSED);
320
- };
167
+ // Once we’re all set, check the theme in use.
168
+ IS_DEFAULT_THEME = isUsingDefaultTheme( P.$holder[0] );
321
169
 
322
- FloatingLabel.prototype.focusout = function focusout(relatedTarget) {
323
- $(relatedTarget).removeClass(ClassName.IS_FOCUSED);
324
- };
325
170
 
326
- FloatingLabel._jQueryInterface = function _jQueryInterface(event) {
327
- return this.each(function () {
328
- var _event = event ? event : 'change';
329
- var data = $(this).data(DATA_KEY);
171
+ // If the element has autofocus, open the picker.
172
+ if ( ELEMENT.autofocus ) {
173
+ P.open();
174
+ }
330
175
 
331
- if (!data) {
332
- data = new FloatingLabel(this);
333
- $(this).data(DATA_KEY, data);
334
- }
335
176
 
336
- if (typeof _event === 'string') {
337
- if (data[_event] === undefined) {
338
- throw new Error('No method named "' + _event + '"');
339
- }
177
+ // Trigger queued the “start” and “render” events.
178
+ return P.trigger( 'start' ).trigger( 'render' )
179
+ }, //start
340
180
 
341
- data[_event]($(this).closest(Selector.DATA_PARENT));
342
- }
343
- });
344
- };
345
181
 
346
- return FloatingLabel;
347
- }();
182
+ /**
183
+ * Render a new picker
184
+ */
185
+ render: function( entireComponent ) {
348
186
 
349
- $(document).on(Event.CHANGE + ' ' + Event.FOCUSIN + ' ' + Event.FOCUSOUT, Selector.DATA_TOGGLE, function (event) {
350
- FloatingLabel._jQueryInterface.call($(this), event.type);
351
- });
187
+ // Insert a new component holder in the root or box.
188
+ if ( entireComponent ) {
189
+ P.$holder = $$$1( createWrappedComponent() );
190
+ prepareElementHolder();
191
+ P.$root.html( P.$holder );
192
+ }
193
+ else P.$root.find( '.' + CLASSES.box ).html( P.component.nodes( STATE.open ) );
352
194
 
353
- $.fn[NAME] = FloatingLabel._jQueryInterface;
354
- $.fn[NAME].Constructor = FloatingLabel;
355
- $.fn[NAME].noConflict = function () {
356
- $.fn[NAME] = NO_CONFLICT;
357
- return FloatingLabel._jQueryInterface;
358
- };
195
+ // Trigger the queued “render” events.
196
+ return P.trigger( 'render' )
197
+ }, //render
359
198
 
360
- return FloatingLabel;
361
- }(jQuery);
362
-
363
- /*
364
- * navigation drawer
365
- * based on bootstrap's (v4.0.0-beta) modal.js
366
- */
367
-
368
- var NavDrawer = function ($) {
369
-
370
- // constants >>>
371
- var DATA_API_KEY = '.data-api';
372
- var DATA_KEY = 'md.navdrawer';
373
- var ESCAPE_KEYCODE = 27;
374
- var EVENT_KEY = '.' + DATA_KEY;
375
- var NAME = 'navdrawer';
376
- var NO_CONFLICT = $.fn[NAME];
377
- var TRANSITION_DURATION = 292.5;
378
- var TRANSITION_DURATION_BACKDROP = 487.5;
379
-
380
- var ClassName = {
381
- BACKDROP: 'navdrawer-backdrop',
382
- OPEN: 'navdrawer-open',
383
- SHOW: 'show'
384
- };
385
199
 
386
- var Default = {
387
- breakpoint: 1280,
388
- keyboard: true,
389
- show: true,
390
- type: 'default'
391
- };
200
+ /**
201
+ * Destroy everything
202
+ */
203
+ stop: function() {
392
204
 
393
- var DefaultType = {
394
- keyboard: 'boolean',
395
- show: 'boolean',
396
- type: 'string'
397
- };
205
+ // If it’s already stopped, do nothing.
206
+ if ( !STATE.start ) return P
398
207
 
399
- var Event = {
400
- CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
401
- CLICK_DISMISS: 'click.dismiss' + EVENT_KEY,
402
- FOCUSIN: 'focusin' + EVENT_KEY,
403
- HIDDEN: 'hidden' + EVENT_KEY,
404
- HIDE: 'hide' + EVENT_KEY,
405
- KEYDOWN_DISMISS: 'keydown.dismiss' + EVENT_KEY,
406
- MOUSEDOWN_DISMISS: 'mousedown.dismiss' + EVENT_KEY,
407
- MOUSEUP_DISMISS: 'mouseup.dismiss' + EVENT_KEY,
408
- SHOW: 'show' + EVENT_KEY,
409
- SHOWN: 'shown' + EVENT_KEY
410
- };
208
+ // Then close the picker.
209
+ P.close();
411
210
 
412
- var Selector = {
413
- CONTENT: '.navdrawer-content',
414
- DATA_DISMISS: '[data-dismiss="navdrawer"]',
415
- DATA_TOGGLE: '[data-toggle="navdrawer"]'
416
- };
417
- // <<< constants
211
+ // Remove the hidden field.
212
+ if ( P._hidden ) {
213
+ P._hidden.parentNode.removeChild( P._hidden );
214
+ }
418
215
 
419
- var NavDrawer = function () {
420
- function NavDrawer(element, config) {
421
- _classCallCheck(this, NavDrawer);
216
+ // Remove the root.
217
+ P.$root.remove();
422
218
 
423
- this._backdrop = null;
424
- this._config = this._getConfig(config);
425
- this._content = $(element).find(Selector.CONTENT)[0];
426
- this._element = element;
427
- this._ignoreBackdropClick = false;
428
- this._isShown = false;
429
- }
219
+ // Remove the input class, remove the stored data, and unbind
220
+ // the events (after a tick for IE - see `P.close`).
221
+ $ELEMENT.removeClass( CLASSES.input ).removeData( NAME );
222
+ setTimeout( function() {
223
+ $ELEMENT.off( '.' + STATE.id );
224
+ }, 0);
430
225
 
431
- NavDrawer.prototype.hide = function hide(event) {
432
- if (event) {
433
- event.preventDefault();
434
- }
226
+ // Restore the element state
227
+ ELEMENT.type = STATE.type;
228
+ ELEMENT.readOnly = false;
435
229
 
436
- var hideClassName = ClassName.OPEN + '-' + this._config.type;
437
- var hideEvent = $.Event(Event.HIDE);
230
+ // Trigger the queued “stop” events.
231
+ P.trigger( 'stop' );
438
232
 
439
- $(this._element).trigger(hideEvent);
233
+ // Reset the picker states.
234
+ STATE.methods = {};
235
+ STATE.start = false;
440
236
 
441
- if (!this._isShown || hideEvent.isDefaultPrevented()) {
442
- return;
443
- }
237
+ return P
238
+ }, //stop
444
239
 
445
- this._isShown = false;
446
- this._setEscapeEvent();
447
- $(document).off(Event.FOCUSIN);
448
- $(this._content).off(Event.MOUSEDOWN_DISMISS);
449
240
 
450
- $(this._element).off(Event.CLICK_DISMISS).removeClass(ClassName.SHOW);
241
+ /**
242
+ * Open up the picker
243
+ */
244
+ open: function( dontGiveFocus ) {
451
245
 
452
- this._hideNavdrawer(hideClassName);
453
- };
246
+ // If it’s already open, do nothing.
247
+ if ( STATE.open ) return P
454
248
 
455
- NavDrawer.prototype.show = function show(relatedTarget) {
456
- var _this = this;
249
+ // Add the “active” class.
250
+ $ELEMENT.addClass( CLASSES.active );
251
+ aria( ELEMENT, 'expanded', true );
457
252
 
458
- var showEvent = $.Event(Event.SHOW, {
459
- relatedTarget: relatedTarget
460
- });
253
+ // * A Firefox bug, when `html` has `overflow:hidden`, results in
254
+ // killing transitions :(. So add the “opened” state on the next tick.
255
+ // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=625289
256
+ setTimeout( function() {
461
257
 
462
- $(this._element).trigger(showEvent);
258
+ // Add the “opened” class to the picker root.
259
+ P.$root.addClass( CLASSES.opened );
260
+ aria( P.$root[0], 'hidden', false );
463
261
 
464
- if (this._isShown || showEvent.isDefaultPrevented()) {
465
- return;
466
- }
262
+ }, 0 );
467
263
 
468
- this._isShown = true;
469
- $(document.body).addClass(ClassName.OPEN + '-' + this._config.type);
470
- this._setEscapeEvent();
471
- $(this._element).addClass(NAME + '-' + this._config.type);
472
- $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, $.proxy(this.hide, this));
264
+ // If we have to give focus, bind the element and doc events.
265
+ if ( dontGiveFocus !== false ) {
473
266
 
474
- $(this._content).on(Event.MOUSEDOWN_DISMISS, function () {
475
- $(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
476
- if ($(event.target).is(_this._element)) {
477
- _this._ignoreBackdropClick = true;
478
- }
479
- });
480
- });
267
+ // Set it as open.
268
+ STATE.open = true;
481
269
 
482
- this._showBackdrop();
483
- this._showElement(relatedTarget);
484
- };
270
+ // Prevent the page from scrolling.
271
+ if ( IS_DEFAULT_THEME ) {
272
+ $html.
273
+ css( 'overflow', 'hidden' ).
274
+ css( 'padding-right', '+=' + getScrollbarWidth() );
275
+ }
276
+
277
+ // Pass focus to the root element’s jQuery object.
278
+ focusPickerOnceOpened();
279
+
280
+ // Bind the document events.
281
+ $document.on( 'click.' + STATE.id + ' focusin.' + STATE.id, function( event ) {
282
+
283
+ var target = event.target;
284
+
285
+ // If the target of the event is not the element, close the picker picker.
286
+ // * Don’t worry about clicks or focusins on the root because those don’t bubble up.
287
+ // Also, for Firefox, a click on an `option` element bubbles up directly
288
+ // to the doc. So make sure the target wasn't the doc.
289
+ // * In Firefox stopPropagation() doesn’t prevent right-click events from bubbling,
290
+ // which causes the picker to unexpectedly close when right-clicking it. So make
291
+ // sure the event wasn’t a right-click.
292
+ if ( target != ELEMENT && target != document && event.which != 3 ) {
485
293
 
486
- NavDrawer.prototype.toggle = function toggle(relatedTarget) {
487
- return this._isShown ? this.hide() : this.show(relatedTarget);
488
- };
294
+ // If the target was the holder that covers the screen,
295
+ // keep the element focused to maintain tabindex.
296
+ P.close( target === P.$holder[0] );
297
+ }
489
298
 
490
- NavDrawer.prototype._enforceFocus = function _enforceFocus() {
491
- var _this2 = this;
299
+ }).on( 'keydown.' + STATE.id, function( event ) {
300
+
301
+ var
302
+ // Get the keycode.
303
+ keycode = event.keyCode,
492
304
 
493
- $(document).off(Event.FOCUSIN).on(Event.FOCUSIN, function (event) {
494
- if (_this2._config.type === 'default' || $(window).width() <= _this2._config.breakpoint) {
495
- if (_this2._element !== event.target && !$(_this2._element).has(event.target).length) {
496
- _this2._element.focus();
497
- }
498
- }
499
- });
500
- };
305
+ // Translate that to a selection change.
306
+ keycodeToMove = P.component.key[ keycode ],
307
+
308
+ // Grab the target.
309
+ target = event.target;
310
+
311
+
312
+ // On escape, close the picker and give focus.
313
+ if ( keycode == 27 ) {
314
+ P.close( true );
315
+ }
501
316
 
502
- NavDrawer.prototype._getConfig = function _getConfig(config) {
503
- config = $.extend({}, Default, config);
504
- Util.typeCheckConfig(NAME, config, DefaultType);
505
- return config;
506
- };
507
317
 
508
- NavDrawer.prototype._hideNavdrawer = function _hideNavdrawer(className) {
509
- var _this3 = this;
318
+ // Check if there is a key movement or “enter” keypress on the element.
319
+ else if ( target == P.$holder[0] && ( keycodeToMove || keycode == 13 ) ) {
320
+
321
+ // Prevent the default action to stop page movement.
322
+ event.preventDefault();
510
323
 
511
- this._showBackdrop(function () {
512
- $(document.body).removeClass(className);
324
+ // Trigger the key movement action.
325
+ if ( keycodeToMove ) {
326
+ PickerConstructor._.trigger( P.component.key.go, P, [ PickerConstructor._.trigger( keycodeToMove ) ] );
327
+ }
513
328
 
514
- _this3._element.setAttribute('aria-hidden', 'true');
515
- _this3._element.style.display = 'none';
329
+ // On “enter”, if the highlighted item isn’t disabled, set the value and close.
330
+ else if ( !P.$root.find( '.' + CLASSES.highlighted ).hasClass( CLASSES.disabled ) ) {
331
+ P.set( 'select', P.component.item.highlight );
332
+ if ( SETTINGS.closeOnSelect ) {
333
+ P.close( true );
334
+ }
335
+ }
336
+ }
516
337
 
517
- $(_this3._element).trigger(Event.HIDDEN);
518
- });
519
- };
520
338
 
521
- NavDrawer.prototype._removeBackdrop = function _removeBackdrop() {
522
- if (this._backdrop) {
523
- $(this._backdrop).remove();
524
- this._backdrop = null;
525
- }
526
- };
339
+ // If the target is within the root and “enter” is pressed,
340
+ // prevent the default action and trigger a click on the target instead.
341
+ else if ( $$$1.contains( P.$root[0], target ) && keycode == 13 ) {
342
+ event.preventDefault();
343
+ target.click();
344
+ }
345
+ });
346
+ }
347
+
348
+ // Trigger the queued “open” events.
349
+ return P.trigger( 'open' )
350
+ }, //open
351
+
352
+
353
+ /**
354
+ * Close the picker
355
+ */
356
+ close: function( giveFocus ) {
357
+
358
+ // If we need to give focus, do it before changing states.
359
+ if ( giveFocus ) {
360
+ if ( SETTINGS.editable ) {
361
+ ELEMENT.focus();
362
+ }
363
+ else {
364
+ // ....ah yes! It would’ve been incomplete without a crazy workaround for IE :|
365
+ // The focus is triggered *after* the close has completed - causing it
366
+ // to open again. So unbind and rebind the event at the next tick.
367
+ P.$holder.off( 'focus.toOpen' ).focus();
368
+ setTimeout( function() {
369
+ P.$holder.on( 'focus.toOpen', handleFocusToOpenEvent );
370
+ }, 0 );
371
+ }
372
+ }
373
+
374
+ // Remove the “active” class.
375
+ $ELEMENT.removeClass( CLASSES.active );
376
+ aria( ELEMENT, 'expanded', false );
377
+
378
+ // * A Firefox bug, when `html` has `overflow:hidden`, results in
379
+ // killing transitions :(. So remove the “opened” state on the next tick.
380
+ // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=625289
381
+ setTimeout( function() {
382
+
383
+ // Remove the “opened” and “focused” class from the picker root.
384
+ P.$root.removeClass( CLASSES.opened + ' ' + CLASSES.focused );
385
+ aria( P.$root[0], 'hidden', true );
386
+
387
+ }, 0 );
388
+
389
+ // If it’s already closed, do nothing more.
390
+ if ( !STATE.open ) return P
391
+
392
+ // Set it as closed.
393
+ STATE.open = false;
394
+
395
+ // Allow the page to scroll.
396
+ if ( IS_DEFAULT_THEME ) {
397
+ $html.
398
+ css( 'overflow', '' ).
399
+ css( 'padding-right', '-=' + getScrollbarWidth() );
400
+ }
401
+
402
+ // Unbind the document events.
403
+ $document.off( '.' + STATE.id );
404
+
405
+ // Trigger the queued “close” events.
406
+ return P.trigger( 'close' )
407
+ }, //close
408
+
409
+
410
+ /**
411
+ * Clear the values
412
+ */
413
+ clear: function( options ) {
414
+ return P.set( 'clear', null, options )
415
+ }, //clear
416
+
417
+
418
+ /**
419
+ * Set something
420
+ */
421
+ set: function( thing, value, options ) {
422
+
423
+ var thingItem, thingValue,
424
+ thingIsObject = $$$1.isPlainObject( thing ),
425
+ thingObject = thingIsObject ? thing : {};
426
+
427
+ // Make sure we have usable options.
428
+ options = thingIsObject && $$$1.isPlainObject( value ) ? value : options || {};
429
+
430
+ if ( thing ) {
431
+
432
+ // If the thing isn’t an object, make it one.
433
+ if ( !thingIsObject ) {
434
+ thingObject[ thing ] = value;
435
+ }
436
+
437
+ // Go through the things of items to set.
438
+ for ( thingItem in thingObject ) {
439
+
440
+ // Grab the value of the thing.
441
+ thingValue = thingObject[ thingItem ];
442
+
443
+ // First, if the item exists and there’s a value, set it.
444
+ if ( thingItem in P.component.item ) {
445
+ if ( thingValue === undefined ) thingValue = null;
446
+ P.component.set( thingItem, thingValue, options );
447
+ }
448
+
449
+ // Then, check to update the element value and broadcast a change.
450
+ if ( thingItem == 'select' || thingItem == 'clear' ) {
451
+ $ELEMENT.
452
+ val( thingItem == 'clear' ? '' : P.get( thingItem, SETTINGS.format ) ).
453
+ trigger( 'change' );
454
+ }
455
+ }
456
+
457
+ // Render a new picker.
458
+ P.render();
459
+ }
460
+
461
+ // When the method isn’t muted, trigger queued “set” events and pass the `thingObject`.
462
+ return options.muted ? P : P.trigger( 'set', thingObject )
463
+ }, //set
464
+
465
+
466
+ /**
467
+ * Get something
468
+ */
469
+ get: function( thing, format ) {
470
+
471
+ // Make sure there’s something to get.
472
+ thing = thing || 'value';
473
+
474
+ // If a picker state exists, return that.
475
+ if ( STATE[ thing ] != null ) {
476
+ return STATE[ thing ]
477
+ }
478
+
479
+ // Return the submission value, if that.
480
+ if ( thing == 'valueSubmit' ) {
481
+ if ( P._hidden ) {
482
+ return P._hidden.value
483
+ }
484
+ thing = 'value';
485
+ }
486
+
487
+ // Return the value, if that.
488
+ if ( thing == 'value' ) {
489
+ return ELEMENT.value
490
+ }
491
+
492
+ // Check if a component item exists, return that.
493
+ if ( thing in P.component.item ) {
494
+ if ( typeof format == 'string' ) {
495
+ var thingValue = P.component.get( thing );
496
+ return thingValue ?
497
+ PickerConstructor._.trigger(
498
+ P.component.formats.toString,
499
+ P.component,
500
+ [ format, thingValue ]
501
+ ) : ''
502
+ }
503
+ return P.component.get( thing )
504
+ }
505
+ }, //get
506
+
507
+
508
+
509
+ /**
510
+ * Bind events on the things.
511
+ */
512
+ on: function( thing, method, internal ) {
513
+
514
+ var thingName, thingMethod,
515
+ thingIsObject = $$$1.isPlainObject( thing ),
516
+ thingObject = thingIsObject ? thing : {};
517
+
518
+ if ( thing ) {
519
+
520
+ // If the thing isn’t an object, make it one.
521
+ if ( !thingIsObject ) {
522
+ thingObject[ thing ] = method;
523
+ }
524
+
525
+ // Go through the things to bind to.
526
+ for ( thingName in thingObject ) {
527
+
528
+ // Grab the method of the thing.
529
+ thingMethod = thingObject[ thingName ];
530
+
531
+ // If it was an internal binding, prefix it.
532
+ if ( internal ) {
533
+ thingName = '_' + thingName;
534
+ }
535
+
536
+ // Make sure the thing methods collection exists.
537
+ STATE.methods[ thingName ] = STATE.methods[ thingName ] || [];
538
+
539
+ // Add the method to the relative method collection.
540
+ STATE.methods[ thingName ].push( thingMethod );
541
+ }
542
+ }
543
+
544
+ return P
545
+ }, //on
546
+
547
+
548
+
549
+ /**
550
+ * Unbind events on the things.
551
+ */
552
+ off: function() {
553
+ var i, thingName,
554
+ names = arguments;
555
+ for ( i = 0, namesCount = names.length; i < namesCount; i += 1 ) {
556
+ thingName = names[i];
557
+ if ( thingName in STATE.methods ) {
558
+ delete STATE.methods[thingName];
559
+ }
560
+ }
561
+ return P
562
+ },
527
563
 
528
- NavDrawer.prototype._setEscapeEvent = function _setEscapeEvent() {
529
- var _this4 = this;
530
564
 
531
- if (this._isShown && this._config.keyboard) {
532
- $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
533
- if (event.which === ESCAPE_KEYCODE) {
534
- _this4.hide();
535
- }
536
- });
537
- } else if (!this._isShown) {
538
- $(this._element).off(Event.KEYDOWN_DISMISS);
539
- }
540
- };
565
+ /**
566
+ * Fire off method events.
567
+ */
568
+ trigger: function( name, data ) {
569
+ var _trigger = function( name ) {
570
+ var methodList = STATE.methods[ name ];
571
+ if ( methodList ) {
572
+ methodList.map( function( method ) {
573
+ PickerConstructor._.trigger( method, P, [ data ] );
574
+ });
575
+ }
576
+ };
577
+ _trigger( '_' + name );
578
+ _trigger( name );
579
+ return P
580
+ } //trigger
581
+ }; //PickerInstance.prototype
582
+
541
583
 
542
- NavDrawer.prototype._showBackdrop = function _showBackdrop(callback) {
543
- var _this5 = this;
584
+ /**
585
+ * Wrap the picker holder components together.
586
+ */
587
+ function createWrappedComponent() {
544
588
 
545
- var supportsTransition = Util.supportsTransitionEnd();
589
+ // Create a picker wrapper holder
590
+ return PickerConstructor._.node( 'div',
546
591
 
547
- if (this._isShown) {
548
- this._backdrop = document.createElement('div');
592
+ // Create a picker wrapper node
593
+ PickerConstructor._.node( 'div',
549
594
 
550
- $(this._backdrop).addClass(ClassName.BACKDROP).addClass(ClassName.BACKDROP + '-' + this._config.type).appendTo(document.body);
595
+ // Create a picker frame
596
+ PickerConstructor._.node( 'div',
551
597
 
552
- $(this._element).on(Event.CLICK_DISMISS, function (event) {
553
- if (_this5._ignoreBackdropClick) {
554
- _this5._ignoreBackdropClick = false;
555
- return;
556
- }
598
+ // Create a picker box node
599
+ PickerConstructor._.node( 'div',
557
600
 
558
- if (event.target !== event.currentTarget) {
559
- return;
560
- }
601
+ // Create the components nodes.
602
+ P.component.nodes( STATE.open ),
561
603
 
562
- _this5.hide();
563
- });
604
+ // The picker box class
605
+ CLASSES.box
606
+ ),
564
607
 
565
- if (supportsTransition) {
566
- Util.reflow(this._backdrop);
567
- }
608
+ // Picker wrap class
609
+ CLASSES.wrap
610
+ ),
568
611
 
569
- $(this._backdrop).addClass(ClassName.SHOW);
612
+ // Picker frame class
613
+ CLASSES.frame
614
+ ),
570
615
 
571
- if (!callback) {
572
- return;
573
- }
616
+ // Picker holder class
617
+ CLASSES.holder,
574
618
 
575
- if (!supportsTransition) {
576
- callback();
577
- return;
578
- }
619
+ 'tabindex="-1"'
620
+ ) //endreturn
621
+ } //createWrappedComponent
579
622
 
580
- $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(TRANSITION_DURATION_BACKDROP);
581
- } else if (this._backdrop && !this._isShown) {
582
- $(this._backdrop).removeClass(ClassName.SHOW);
583
623
 
584
- var callbackRemove = function callbackRemove() {
585
- _this5._removeBackdrop();
586
624
 
587
- if (callback) {
588
- callback();
589
- }
590
- };
625
+ /**
626
+ * Prepare the input element with all bindings.
627
+ */
628
+ function prepareElement() {
591
629
 
592
- if (supportsTransition) {
593
- $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(TRANSITION_DURATION_BACKDROP);
594
- } else {
595
- callbackRemove();
596
- }
597
- } else if (callback) {
598
- callback();
599
- }
600
- };
630
+ $ELEMENT.
601
631
 
602
- NavDrawer.prototype._showElement = function _showElement(relatedTarget) {
603
- var _this6 = this;
632
+ // Store the picker data by component name.
633
+ data(NAME, P).
604
634
 
605
- var supportsTransition = Util.supportsTransitionEnd();
635
+ // Add the “input” class name.
636
+ addClass(CLASSES.input).
606
637
 
607
- if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
608
- document.body.appendChild(this._element);
609
- }
638
+ // If there’s a `data-value`, update the value of the element.
639
+ val( $ELEMENT.data('value') ?
640
+ P.get('select', SETTINGS.format) :
641
+ ELEMENT.value
642
+ );
610
643
 
611
- this._element.removeAttribute('aria-hidden');
612
- this._element.style.display = 'block';
613
644
 
614
- if (supportsTransition) {
615
- Util.reflow(this._element);
645
+ // Only bind keydown events if the element isn’t editable.
646
+ if ( !SETTINGS.editable ) {
647
+
648
+ $ELEMENT.
649
+
650
+ // On focus/click, open the picker.
651
+ on( 'focus.' + STATE.id + ' click.' + STATE.id, function(event) {
652
+ event.preventDefault();
653
+ P.open();
654
+ }).
655
+
656
+ // Handle keyboard event based on the picker being opened or not.
657
+ on( 'keydown.' + STATE.id, handleKeydownEvent );
616
658
  }
617
659
 
618
- $(this._element).addClass(ClassName.SHOW);
619
- this._enforceFocus();
620
660
 
621
- var shownEvent = $.Event(Event.SHOWN, {
622
- relatedTarget: relatedTarget
661
+ // Update the aria attributes.
662
+ aria(ELEMENT, {
663
+ haspopup: true,
664
+ expanded: false,
665
+ readonly: false,
666
+ owns: ELEMENT.id + '_root'
623
667
  });
668
+ }
624
669
 
625
- var transitionComplete = function transitionComplete() {
626
- _this6._element.focus();
627
- $(_this6._element).trigger(shownEvent);
628
- };
629
670
 
630
- if (supportsTransition) {
631
- $(this._content).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);
632
- } else {
633
- transitionComplete();
634
- }
635
- };
671
+ /**
672
+ * Prepare the root picker element with all bindings.
673
+ */
674
+ function prepareElementRoot() {
675
+ aria( P.$root[0], 'hidden', true );
676
+ }
636
677
 
637
- NavDrawer._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
638
- return this.each(function () {
639
- var _config = $.extend({}, NavDrawer.Default, $(this).data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config);
640
678
 
641
- var data = $(this).data(DATA_KEY);
679
+ /**
680
+ * Prepare the holder picker element with all bindings.
681
+ */
682
+ function prepareElementHolder() {
642
683
 
643
- if (!data) {
644
- data = new NavDrawer(this, _config);
645
- $(this).data(DATA_KEY, data);
646
- }
684
+ P.$holder.
647
685
 
648
- if (typeof config === 'string') {
649
- if (data[config] === undefined) {
650
- throw new Error('No method named "' + config + '"');
651
- }
686
+ on({
652
687
 
653
- data[config](relatedTarget);
654
- } else if (_config.show) {
655
- data.show(relatedTarget);
656
- }
657
- });
658
- };
688
+ // For iOS8.
689
+ keydown: handleKeydownEvent,
659
690
 
660
- _createClass(NavDrawer, null, [{
661
- key: 'Default',
662
- get: function get() {
663
- return Default;
664
- }
665
- }]);
691
+ 'focus.toOpen': handleFocusToOpenEvent,
666
692
 
667
- return NavDrawer;
668
- }();
693
+ blur: function() {
694
+ // Remove the “target” class.
695
+ $ELEMENT.removeClass( CLASSES.target );
696
+ },
669
697
 
670
- $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
671
- var _this7 = this;
698
+ // When something within the holder is focused, stop from bubbling
699
+ // to the doc and remove the “focused” state from the root.
700
+ focusin: function( event ) {
701
+ P.$root.removeClass( CLASSES.focused );
702
+ event.stopPropagation();
703
+ },
672
704
 
673
- var selector = Util.getSelectorFromElement(this);
674
- var target = void 0;
705
+ // When something within the holder is clicked, stop it
706
+ // from bubbling to the doc.
707
+ 'mousedown click': function( event ) {
675
708
 
676
- if (selector) {
677
- target = $(selector)[0];
678
- }
709
+ var target = event.target;
679
710
 
680
- var config = $(target).data(DATA_KEY) ? 'toggle' : $.extend({}, $(target).data(), $(this).data());
711
+ // Make sure the target isn’t the root holder so it can bubble up.
712
+ if ( target != P.$holder[0] ) {
681
713
 
682
- if (this.tagName === 'A') {
683
- event.preventDefault();
684
- }
714
+ event.stopPropagation();
685
715
 
686
- var $target = $(target).one(Event.SHOW, function (showEvent) {
687
- if (showEvent.isDefaultPrevented()) {
688
- return;
689
- }
716
+ // * For mousedown events, cancel the default action in order to
717
+ // prevent cases where focus is shifted onto external elements
718
+ // when using things like jQuery mobile or MagnificPopup (ref: #249 & #120).
719
+ // Also, for Firefox, don’t prevent action on the `option` element.
720
+ if ( event.type == 'mousedown' && !$$$1( target ).is( 'input, select, textarea, button, option' )) {
690
721
 
691
- $target.one(Event.HIDDEN, function () {
692
- if ($(_this7).is(':visible')) {
693
- _this7.focus();
694
- }
695
- });
696
- });
722
+ event.preventDefault();
697
723
 
698
- NavDrawer._jQueryInterface.call($(target), config, this);
699
- });
724
+ // Re-focus onto the holder so that users can click away
725
+ // from elements focused within the picker.
726
+ P.$holder[0].focus();
727
+ }
728
+ }
729
+ }
700
730
 
701
- $.fn[NAME] = NavDrawer._jQueryInterface;
702
- $.fn[NAME].Constructor = NavDrawer;
703
- $.fn[NAME].noConflict = function () {
704
- $.fn[NAME] = NO_CONFLICT;
705
- return NavDrawer._jQueryInterface;
706
- };
731
+ }).
707
732
 
708
- return NavDrawer;
709
- }(jQuery);
733
+ // If there’s a click on an actionable element, carry out the actions.
734
+ on( 'click', '[data-pick], [data-nav], [data-clear], [data-close]', function() {
710
735
 
711
- /*
712
- * selection control focus
713
- * chrome persists the focus style on checkboxes/radio buttons after clicking
714
- */
736
+ var $target = $$$1( this ),
737
+ targetData = $target.data(),
738
+ targetDisabled = $target.hasClass( CLASSES.navDisabled ) || $target.hasClass( CLASSES.disabled ),
715
739
 
716
- var ControlFocus = function ($) {
740
+ // * For IE, non-focusable elements can be active elements as well
741
+ // (http://stackoverflow.com/a/2684561).
742
+ activeElement = getActiveElement();
743
+ activeElement = activeElement && ( activeElement.type || activeElement.href );
717
744
 
718
- // constants >>>
719
- var DATA_KEY = 'md.controlfocus';
720
- var EVENT_KEY = '.' + DATA_KEY;
745
+ // If it’s disabled or nothing inside is actively focused, re-focus the element.
746
+ if ( targetDisabled || activeElement && !$$$1.contains( P.$root[0], activeElement ) ) {
747
+ P.$holder[0].focus();
748
+ }
721
749
 
722
- var ClassName = {
723
- FOCUS: 'focus'
724
- };
750
+ // If something is superficially changed, update the `highlight` based on the `nav`.
751
+ if ( !targetDisabled && targetData.nav ) {
752
+ P.set( 'highlight', P.component.item.highlight, { nav: targetData.nav } );
753
+ }
725
754
 
726
- var LastInteraction = {
727
- IS_MOUSEDOWN: false
728
- };
755
+ // If something is picked, set `select` then close with focus.
756
+ else if ( !targetDisabled && 'pick' in targetData ) {
757
+ P.set( 'select', targetData.pick );
758
+ if ( SETTINGS.closeOnSelect ) {
759
+ P.close( true );
760
+ }
761
+ }
729
762
 
730
- var Event = {
731
- BLUR: 'blur' + EVENT_KEY,
732
- FOCUS: 'focus' + EVENT_KEY,
733
- MOUSEDOWN: 'mousedown' + EVENT_KEY,
734
- MOUSEUP: 'mouseup' + EVENT_KEY
735
- };
763
+ // If a “clear” button is pressed, empty the values and close with focus.
764
+ else if ( targetData.clear ) {
765
+ P.clear();
766
+ if ( SETTINGS.closeOnClear ) {
767
+ P.close( true );
768
+ }
769
+ }
736
770
 
737
- var Selector = {
738
- CONTROL: '.custom-control',
739
- INPUT: '.custom-control-input'
740
- };
741
- // <<< constants
771
+ else if ( targetData.close ) {
772
+ P.close( true );
773
+ }
742
774
 
743
- $(document).on('' + Event.BLUR, Selector.INPUT, function (event) {
744
- $(event.target).removeClass(ClassName.FOCUS);
745
- }).on('' + Event.FOCUS, Selector.INPUT, function (event) {
746
- if (LastInteraction.IS_MOUSEDOWN === false) {
747
- $(event.target).addClass(ClassName.FOCUS);
748
- }
749
- }).on('' + Event.MOUSEDOWN, Selector.CONTROL, function () {
750
- LastInteraction.IS_MOUSEDOWN = true;
751
- }).on('' + Event.MOUSEUP, Selector.CONTROL, function () {
752
- setTimeout(function () {
753
- LastInteraction.IS_MOUSEDOWN = false;
754
- }, 1);
755
- });
756
- }(jQuery);
757
-
758
- /*
759
- * tab indicator animation
760
- * requires bootstrap's (v4.0.0-beta) tab.js
761
- */
762
-
763
- var TabSwitch = function ($) {
764
-
765
- // constants >>>
766
- var DATA_KEY = 'md.tabswitch';
767
- var NAME = 'tabswitch';
768
- var NO_CONFLICT = $.fn[NAME];
769
- var TRANSITION_DURATION = 390;
770
-
771
- var ClassName = {
772
- ANIMATE: 'animate',
773
- DROPDOWN_ITEM: 'dropdown-item',
774
- INDICATOR: 'nav-tabs-indicator',
775
- MATERIAL: 'nav-tabs-material',
776
- SCROLLABLE: 'nav-tabs-scrollable',
777
- SHOW: 'show'
778
- };
775
+ }); //P.$holder
779
776
 
780
- var Event = {
781
- SHOW_BS_TAB: 'show.bs.tab'
782
- };
777
+ }
783
778
 
784
- var Selector = {
785
- DATA_TOGGLE: '.nav-tabs [data-toggle="tab"]',
786
- DROPDOWN: '.dropdown',
787
- NAV: '.nav-tabs'
788
- };
789
- // <<< constants
790
779
 
791
- var TabSwitch = function () {
792
- function TabSwitch(nav) {
793
- _classCallCheck(this, TabSwitch);
780
+ /**
781
+ * Prepare the hidden input element along with all bindings.
782
+ */
783
+ function prepareElementHidden() {
794
784
 
795
- if (typeof $.fn.tab === 'undefined') {
796
- throw new Error('Material\'s JavaScript requires Bootstrap\'s tab.js');
785
+ var name;
786
+
787
+ if ( SETTINGS.hiddenName === true ) {
788
+ name = ELEMENT.name;
789
+ ELEMENT.name = '';
790
+ }
791
+ else {
792
+ name = [
793
+ typeof SETTINGS.hiddenPrefix == 'string' ? SETTINGS.hiddenPrefix : '',
794
+ typeof SETTINGS.hiddenSuffix == 'string' ? SETTINGS.hiddenSuffix : '_submit'
795
+ ];
796
+ name = name[0] + ELEMENT.name + name[1];
797
797
  }
798
798
 
799
- this._nav = nav;
800
- this._navindicator = null;
801
- }
799
+ P._hidden = $$$1(
800
+ '<input ' +
801
+ 'type=hidden ' +
802
+
803
+ // Create the name using the original input’s with a prefix and suffix.
804
+ 'name="' + name + '"' +
805
+
806
+ // If the element has a value, set the hidden value as well.
807
+ (
808
+ $ELEMENT.data('value') || ELEMENT.value ?
809
+ ' value="' + P.get('select', SETTINGS.formatSubmit) + '"' :
810
+ ''
811
+ ) +
812
+ '>'
813
+ )[0];
814
+
815
+ $ELEMENT.
816
+
817
+ // If the value changes, update the hidden input with the correct format.
818
+ on('change.' + STATE.id, function() {
819
+ P._hidden.value = ELEMENT.value ?
820
+ P.get('select', SETTINGS.formatSubmit) :
821
+ '';
822
+ });
823
+ }
802
824
 
803
- TabSwitch.prototype.switch = function _switch(element, relatedTarget) {
804
- var _this8 = this;
805
825
 
806
- var navLeft = $(this._nav).offset().left;
807
- var navScrollLeft = $(this._nav).scrollLeft();
808
- var navWidth = $(this._nav).outerWidth();
809
- var supportsTransition = Util.supportsTransitionEnd();
826
+ // Wait for transitions to end before focusing the holder. Otherwise, while
827
+ // using the `container` option, the view jumps to the container.
828
+ function focusPickerOnceOpened() {
810
829
 
811
- if (!this._navindicator) {
812
- this._createIndicator(navLeft, navScrollLeft, navWidth, relatedTarget);
830
+ if (IS_DEFAULT_THEME && supportsTransitions) {
831
+ P.$holder.find('.' + CLASSES.frame).one('transitionend', function() {
832
+ P.$holder[0].focus();
833
+ });
813
834
  }
814
-
815
- if ($(element).hasClass(ClassName.DROPDOWN_ITEM)) {
816
- element = $(element).closest(Selector.DROPDOWN);
835
+ else {
836
+ P.$holder[0].focus();
817
837
  }
838
+ }
818
839
 
819
- var elLeft = $(element).offset().left;
820
- var elWidth = $(element).outerWidth();
821
840
 
822
- $(this._navindicator).addClass(ClassName.SHOW);
823
- Util.reflow(this._navindicator);
841
+ function handleFocusToOpenEvent(event) {
824
842
 
825
- if (supportsTransition) {
826
- $(this._nav).addClass(ClassName.ANIMATE);
827
- }
843
+ // Stop the event from propagating to the doc.
844
+ event.stopPropagation();
828
845
 
829
- $(this._navindicator).css({
830
- left: elLeft + navScrollLeft - navLeft,
831
- right: navWidth - (elLeft + navScrollLeft - navLeft + elWidth)
832
- });
846
+ // Add the “target” class.
847
+ $ELEMENT.addClass( CLASSES.target );
833
848
 
834
- var complete = function complete() {
835
- $(_this8._nav).removeClass(ClassName.ANIMATE);
836
- $(_this8._navindicator).removeClass(ClassName.SHOW);
837
- };
849
+ // Add the “focused” class to the root.
850
+ P.$root.addClass( CLASSES.focused );
838
851
 
839
- if (!supportsTransition) {
840
- complete();
841
- return;
842
- }
852
+ // And then finally open the picker.
853
+ P.open();
854
+ }
843
855
 
844
- $(this._navindicator).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
845
- };
846
856
 
847
- TabSwitch.prototype._createIndicator = function _createIndicator(navLeft, navScrollLeft, navWidth, relatedTarget) {
848
- this._navindicator = document.createElement('div');
857
+ // For iOS8.
858
+ function handleKeydownEvent( event ) {
849
859
 
850
- $(this._navindicator).addClass(ClassName.INDICATOR).appendTo(this._nav);
860
+ var keycode = event.keyCode,
851
861
 
852
- if (relatedTarget !== undefined) {
853
- if ($(relatedTarget).hasClass(ClassName.DROPDOWN_ITEM)) {
854
- relatedTarget = $(relatedTarget).closest(Selector.DROPDOWN);
855
- }
862
+ // Check if one of the delete keys was pressed.
863
+ isKeycodeDelete = /^(8|46)$/.test(keycode);
856
864
 
857
- var relatedLeft = $(relatedTarget).offset().left;
858
- var relatedWidth = $(relatedTarget).outerWidth();
865
+ // For some reason IE clears the input value on “escape”.
866
+ if ( keycode == 27 ) {
867
+ P.close( true );
868
+ return false
869
+ }
870
+
871
+ // Check if `space` or `delete` was pressed or the picker is closed with a key movement.
872
+ if ( keycode == 32 || isKeycodeDelete || !STATE.open && P.component.key[keycode] ) {
859
873
 
860
- $(this._navindicator).css({
861
- left: relatedLeft + navScrollLeft - navLeft,
862
- right: navWidth - (relatedLeft + navScrollLeft - navLeft + relatedWidth)
863
- });
874
+ // Prevent it from moving the page and bubbling to doc.
875
+ event.preventDefault();
876
+ event.stopPropagation();
877
+
878
+ // If `delete` was pressed, clear the values and close the picker.
879
+ // Otherwise open the picker.
880
+ if ( isKeycodeDelete ) { P.clear().close(); }
881
+ else { P.open(); }
864
882
  }
883
+ }
865
884
 
866
- $(this._nav).addClass(ClassName.MATERIAL);
867
- };
868
885
 
869
- TabSwitch._jQueryInterface = function _jQueryInterface(relatedTarget) {
870
- return this.each(function () {
871
- var nav = $(this).closest(Selector.NAV)[0];
886
+ // Return a new picker instance.
887
+ return new PickerInstance()
888
+ } //PickerConstructor
872
889
 
873
- if (!nav) {
874
- return;
875
- }
876
890
 
877
- var data = $(nav).data(DATA_KEY);
878
891
 
879
- if (!data) {
880
- data = new TabSwitch(nav);
881
- $(nav).data(DATA_KEY, data);
882
- }
892
+ /**
893
+ * The default classes and prefix to use for the HTML classes.
894
+ */
895
+ PickerConstructor.klasses = function( prefix ) {
896
+ prefix = prefix || 'picker';
897
+ return {
883
898
 
884
- data.switch(this, relatedTarget);
885
- });
886
- };
899
+ picker: prefix,
900
+ opened: prefix + '--opened',
901
+ focused: prefix + '--focused',
887
902
 
888
- return TabSwitch;
889
- }();
903
+ input: prefix + '__input',
904
+ active: prefix + '__input--active',
905
+ target: prefix + '__input--target',
890
906
 
891
- $(document).on(Event.SHOW_BS_TAB, Selector.DATA_TOGGLE, function (event) {
892
- TabSwitch._jQueryInterface.call($(event.target), event.relatedTarget);
893
- });
907
+ holder: prefix + '__holder',
894
908
 
895
- $.fn[NAME] = TabSwitch._jQueryInterface;
896
- $.fn[NAME].Constructor = TabSwitch;
897
- $.fn[NAME].noConflict = function () {
898
- $.fn[NAME] = NO_CONFLICT;
899
- return TabSwitch._jQueryInterface;
900
- };
909
+ frame: prefix + '__frame',
910
+ wrap: prefix + '__wrap',
901
911
 
902
- return TabSwitch;
903
- }(jQuery);
912
+ box: prefix + '__box'
913
+ }
914
+ }; //PickerConstructor.klasses
904
915
 
905
- /*
906
- * global util js
907
- * based on bootstrap's (v4.0.0-beta) util.js
908
- */
909
916
 
910
- var Util = function ($) {
911
917
 
912
- var MAX_UID = 1000000;
913
- var transition = false;
918
+ /**
919
+ * Check if the default theme is being used.
920
+ */
921
+ function isUsingDefaultTheme( element ) {
914
922
 
915
- var TransitionEndEvent = {
916
- WebkitTransition: 'webkitTransitionEnd',
917
- MozTransition: 'transitionend',
918
- OTransition: 'oTransitionEnd otransitionend',
919
- transition: 'transitionend'
920
- };
923
+ var theme,
924
+ prop = 'position';
921
925
 
922
- function getSpecialTransitionEndEvent() {
923
- return {
924
- bindType: transition.end,
925
- delegateType: transition.end,
926
- handle: function handle(event) {
927
- if ($(event.target).is(this)) {
928
- // eslint-disable-next-line prefer-rest-params
929
- return event.handleObj.handler.apply(this, arguments);
930
- }
931
- return undefined;
932
- }
933
- };
926
+ // For IE.
927
+ if ( element.currentStyle ) {
928
+ theme = element.currentStyle[prop];
934
929
  }
935
930
 
936
- function isElement(obj) {
937
- return (obj[0] || obj).nodeType;
931
+ // For normal browsers.
932
+ else if ( window.getComputedStyle ) {
933
+ theme = getComputedStyle( element )[prop];
938
934
  }
939
935
 
940
- function setTransitionEndSupport() {
941
- transition = transitionEndTest();
936
+ return theme == 'fixed'
937
+ }
942
938
 
943
- $.fn.emulateTransitionEnd = transitionEndEmulator;
944
939
 
945
- if (Util.supportsTransitionEnd()) {
946
- $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
947
- }
948
- }
949
940
 
950
- function toType(obj) {
951
- return {}.toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
941
+ /**
942
+ * Get the width of the browser’s scrollbar.
943
+ * Taken from: https://github.com/VodkaBears/Remodal/blob/master/src/jquery.remodal.js
944
+ */
945
+ function getScrollbarWidth() {
946
+
947
+ if ( $html.height() <= $window.height() ) {
948
+ return 0
952
949
  }
953
950
 
954
- function transitionEndEmulator(duration) {
955
- var _this9 = this;
951
+ var $outer = $$$1( '<div style="visibility:hidden;width:100px" />' ).
952
+ appendTo( 'body' );
956
953
 
957
- var called = false;
954
+ // Get the width without scrollbars.
955
+ var widthWithoutScroll = $outer[0].offsetWidth;
958
956
 
959
- $(this).one(Util.TRANSITION_END, function () {
960
- called = true;
961
- });
957
+ // Force adding scrollbars.
958
+ $outer.css( 'overflow', 'scroll' );
959
+
960
+ // Add the inner div.
961
+ var $inner = $$$1( '<div style="width:100%" />' ).appendTo( $outer );
962
962
 
963
- setTimeout(function () {
964
- if (!called) {
965
- Util.triggerTransitionEnd(_this9);
963
+ // Get the width with scrollbars.
964
+ var widthWithScroll = $inner[0].offsetWidth;
965
+
966
+ // Remove the divs.
967
+ $outer.remove();
968
+
969
+ // Return the difference between the widths.
970
+ return widthWithoutScroll - widthWithScroll
971
+ }
972
+
973
+
974
+
975
+ /**
976
+ * PickerConstructor helper methods.
977
+ */
978
+ PickerConstructor._ = {
979
+
980
+ /**
981
+ * Create a group of nodes. Expects:
982
+ * `
983
+ {
984
+ min: {Integer},
985
+ max: {Integer},
986
+ i: {Integer},
987
+ node: {String},
988
+ item: {Function}
966
989
  }
967
- }, duration);
990
+ * `
991
+ */
992
+ group: function( groupObject ) {
968
993
 
969
- return this;
970
- }
994
+ var
995
+ // Scope for the looped object
996
+ loopObjectScope,
971
997
 
972
- function transitionEndTest() {
973
- if (window.QUnit) {
974
- return false;
975
- }
998
+ // Create the nodes list
999
+ nodesList = '',
1000
+
1001
+ // The counter starts from the `min`
1002
+ counter = PickerConstructor._.trigger( groupObject.min, groupObject );
1003
+
1004
+
1005
+ // Loop from the `min` to `max`, incrementing by `i`
1006
+ for ( ; counter <= PickerConstructor._.trigger( groupObject.max, groupObject, [ counter ] ); counter += groupObject.i ) {
976
1007
 
977
- var el = document.createElement('material');
1008
+ // Trigger the `item` function within scope of the object
1009
+ loopObjectScope = PickerConstructor._.trigger( groupObject.item, groupObject, [ counter ] );
978
1010
 
979
- for (var name in TransitionEndEvent) {
980
- if (el.style[name] !== undefined) {
981
- return {
982
- end: TransitionEndEvent[name]
983
- };
1011
+ // Splice the subgroup and create nodes out of the sub nodes
1012
+ nodesList += PickerConstructor._.node(
1013
+ groupObject.node,
1014
+ loopObjectScope[ 0 ], // the node
1015
+ loopObjectScope[ 1 ], // the classes
1016
+ loopObjectScope[ 2 ] // the attributes
1017
+ );
984
1018
  }
985
- }
986
1019
 
987
- return false;
988
- }
1020
+ // Return the list of nodes
1021
+ return nodesList
1022
+ }, //group
1023
+
1024
+
1025
+ /**
1026
+ * Create a dom node string
1027
+ */
1028
+ node: function( wrapper, item, klass, attribute ) {
1029
+
1030
+ // If the item is false-y, just return an empty string
1031
+ if ( !item ) return ''
1032
+
1033
+ // If the item is an array, do a join
1034
+ item = $$$1.isArray( item ) ? item.join( '' ) : item;
1035
+
1036
+ // Check for the class
1037
+ klass = klass ? ' class="' + klass + '"' : '';
1038
+
1039
+ // Check for any attributes
1040
+ attribute = attribute ? ' ' + attribute : '';
1041
+
1042
+ // Return the wrapped item
1043
+ return '<' + wrapper + klass + attribute + '>' + item + '</' + wrapper + '>'
1044
+ }, //node
1045
+
1046
+
1047
+ /**
1048
+ * Lead numbers below 10 with a zero.
1049
+ */
1050
+ lead: function( number ) {
1051
+ return ( number < 10 ? '0': '' ) + number
1052
+ },
1053
+
1054
+
1055
+ /**
1056
+ * Trigger a function otherwise return the value.
1057
+ */
1058
+ trigger: function( callback, scope, args ) {
1059
+ return typeof callback == 'function' ? callback.apply( scope, args || [] ) : callback
1060
+ },
1061
+
1062
+
1063
+ /**
1064
+ * If the second character is a digit, length is 2 otherwise 1.
1065
+ */
1066
+ digits: function( string ) {
1067
+ return ( /\d/ ).test( string[ 1 ] ) ? 2 : 1
1068
+ },
1069
+
1070
+
1071
+ /**
1072
+ * Tell if something is a date object.
1073
+ */
1074
+ isDate: function( value ) {
1075
+ return {}.toString.call( value ).indexOf( 'Date' ) > -1 && this.isInteger( value.getDate() )
1076
+ },
1077
+
1078
+
1079
+ /**
1080
+ * Tell if something is an integer.
1081
+ */
1082
+ isInteger: function( value ) {
1083
+ return {}.toString.call( value ).indexOf( 'Number' ) > -1 && value % 1 === 0
1084
+ },
1085
+
1086
+
1087
+ /**
1088
+ * Create ARIA attribute strings.
1089
+ */
1090
+ ariaAttr: ariaAttr
1091
+ }; //PickerConstructor._
1092
+
989
1093
 
990
- var Util = {
991
- TRANSITION_END: 'mdTransitionEnd',
992
1094
 
993
- getSelectorFromElement: function getSelectorFromElement(element) {
994
- var selector = element.getAttribute('data-target');
1095
+ /**
1096
+ * Extend the picker with a component and defaults.
1097
+ */
1098
+ PickerConstructor.extend = function( name, Component ) {
1099
+
1100
+ // Extend jQuery.
1101
+ $$$1.fn[ name ] = function( options, action ) {
995
1102
 
996
- if (!selector) {
997
- selector = element.getAttribute('href') || '';
998
- selector = /^#[a-z]/i.test(selector) ? selector : null;
1103
+ // Grab the component data.
1104
+ var componentData = this.data( name );
1105
+
1106
+ // If the picker is requested, return the data object.
1107
+ if ( options == 'picker' ) {
1108
+ return componentData
999
1109
  }
1000
1110
 
1001
- return selector;
1002
- },
1003
- getUID: function getUID(prefix) {
1004
- do {
1005
- // eslint-disable-next-line no-bitwise
1006
- prefix += ~~(Math.random() * MAX_UID);
1007
- } while (document.getElementById(prefix));
1008
- return prefix;
1009
- },
1010
- reflow: function reflow(element) {
1011
- new Function('md', 'return md')(element.offsetHeight);
1012
- },
1013
- supportsTransitionEnd: function supportsTransitionEnd() {
1014
- return Boolean(transition);
1015
- },
1016
- triggerTransitionEnd: function triggerTransitionEnd(element) {
1017
- $(element).trigger(transition.end);
1018
- },
1019
- typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
1020
- for (var property in configTypes) {
1021
- if (configTypes.hasOwnProperty(property)) {
1022
- var expectedTypes = configTypes[property];
1023
- var value = config[property];
1024
- var valueType = value && isElement(value) ? 'element' : toType(value);
1025
-
1026
- if (!new RegExp(expectedTypes).test(valueType)) {
1027
- throw new Error(componentName.toUpperCase() + ': ' + ('Option "' + property + '" provided type "' + valueType + '" ') + ('but expected type "' + expectedTypes + '".'));
1028
- }
1029
- }
1111
+ // If the component data exists and `options` is a string, carry out the action.
1112
+ if ( componentData && typeof options == 'string' ) {
1113
+ return PickerConstructor._.trigger( componentData[ options ], componentData, [ action ] )
1030
1114
  }
1031
- }
1115
+
1116
+ // Otherwise go through each matched element and if the component
1117
+ // doesn’t exist, create a new picker using `this` element
1118
+ // and merging the defaults and options with a deep copy.
1119
+ return this.each( function() {
1120
+ var $this = $$$1( this );
1121
+ if ( !$this.data( name ) ) {
1122
+ new PickerConstructor( this, name, Component, options );
1123
+ }
1124
+ })
1032
1125
  };
1033
1126
 
1034
- setTransitionEndSupport();
1127
+ // Set the defaults.
1128
+ $$$1.fn[ name ].defaults = Component.defaults;
1129
+ }; //PickerConstructor.extend
1130
+
1131
+
1132
+
1133
+ function aria(element, attribute, value) {
1134
+ if ( $$$1.isPlainObject(attribute) ) {
1135
+ for ( var key in attribute ) {
1136
+ ariaSet(element, key, attribute[key]);
1137
+ }
1138
+ }
1139
+ else {
1140
+ ariaSet(element, attribute, value);
1141
+ }
1142
+ }
1143
+ function ariaSet(element, attribute, value) {
1144
+ element.setAttribute(
1145
+ (attribute == 'role' ? '' : 'aria-') + attribute,
1146
+ value
1147
+ );
1148
+ }
1149
+ function ariaAttr(attribute, data) {
1150
+ if ( !$$$1.isPlainObject(attribute) ) {
1151
+ attribute = { attribute: data };
1152
+ }
1153
+ data = '';
1154
+ for ( var key in attribute ) {
1155
+ var attr = (key == 'role' ? '' : 'aria-') + key,
1156
+ attrVal = attribute[key];
1157
+ data += attrVal == null ? '' : attr + '="' + attribute[key] + '"';
1158
+ }
1159
+ return data
1160
+ }
1161
+
1162
+ // IE8 bug throws an error for activeElements within iframes.
1163
+ function getActiveElement() {
1164
+ try {
1165
+ return document.activeElement
1166
+ } catch ( err ) { }
1167
+ }
1168
+
1169
+
1170
+
1171
+ // Expose the picker constructor.
1172
+ return PickerConstructor
1173
+
1174
+
1175
+ }));
1176
+ });
1177
+
1178
+ var picker_date = createCommonjsModule(function (module, exports) {
1179
+ /*!
1180
+ * Date picker for pickadate.js v3.5.6
1181
+ * http://amsul.github.io/pickadate.js/date.htm
1182
+ */
1183
+
1184
+ (function ( factory ) {
1185
+
1186
+ // AMD.
1187
+ if ( typeof undefined == 'function' && undefined.amd )
1188
+ undefined( ['picker', 'jquery'], factory );
1189
+
1190
+ // Node.js/browserify.
1191
+ else module.exports = factory( picker, $ );
1192
+
1193
+ }(function( Picker, $$$1 ) {
1194
+
1195
+
1196
+ /**
1197
+ * Globals and constants
1198
+ */
1199
+ var DAYS_IN_WEEK = 7,
1200
+ WEEKS_IN_CALENDAR = 6,
1201
+ _ = Picker._;
1202
+
1203
+
1204
+
1205
+ /**
1206
+ * The date picker constructor
1207
+ */
1208
+ function DatePicker( picker$$1, settings ) {
1209
+
1210
+ var calendar = this,
1211
+ element = picker$$1.$node[ 0 ],
1212
+ elementValue = element.value,
1213
+ elementDataValue = picker$$1.$node.data( 'value' ),
1214
+ valueString = elementDataValue || elementValue,
1215
+ formatString = elementDataValue ? settings.formatSubmit : settings.format,
1216
+ isRTL = function() {
1217
+
1218
+ return element.currentStyle ?
1219
+
1220
+ // For IE.
1221
+ element.currentStyle.direction == 'rtl' :
1222
+
1223
+ // For normal browsers.
1224
+ getComputedStyle( picker$$1.$root[0] ).direction == 'rtl'
1225
+ };
1226
+
1227
+ calendar.settings = settings;
1228
+ calendar.$node = picker$$1.$node;
1229
+
1230
+ // The queue of methods that will be used to build item objects.
1231
+ calendar.queue = {
1232
+ min: 'measure create',
1233
+ max: 'measure create',
1234
+ now: 'now create',
1235
+ select: 'parse create validate',
1236
+ highlight: 'parse navigate create validate',
1237
+ view: 'parse create validate viewset',
1238
+ disable: 'deactivate',
1239
+ enable: 'activate'
1240
+ };
1241
+
1242
+ // The component's item object.
1243
+ calendar.item = {};
1244
+
1245
+ calendar.item.clear = null;
1246
+ calendar.item.disable = ( settings.disable || [] ).slice( 0 );
1247
+ calendar.item.enable = -(function( collectionDisabled ) {
1248
+ return collectionDisabled[ 0 ] === true ? collectionDisabled.shift() : -1
1249
+ })( calendar.item.disable );
1250
+
1251
+ calendar.
1252
+ set( 'min', settings.min ).
1253
+ set( 'max', settings.max ).
1254
+ set( 'now' );
1255
+
1256
+ // When there’s a value, set the `select`, which in turn
1257
+ // also sets the `highlight` and `view`.
1258
+ if ( valueString ) {
1259
+ calendar.set( 'select', valueString, {
1260
+ format: formatString,
1261
+ defaultValue: true
1262
+ });
1263
+ }
1264
+
1265
+ // If there’s no value, default to highlighting “today”.
1266
+ else {
1267
+ calendar.
1268
+ set( 'select', null ).
1269
+ set( 'highlight', calendar.item.now );
1270
+ }
1271
+
1272
+
1273
+ // The keycode to movement mapping.
1274
+ calendar.key = {
1275
+ 40: 7, // Down
1276
+ 38: -7, // Up
1277
+ 39: function() { return isRTL() ? -1 : 1 }, // Right
1278
+ 37: function() { return isRTL() ? 1 : -1 }, // Left
1279
+ go: function( timeChange ) {
1280
+ var highlightedObject = calendar.item.highlight,
1281
+ targetDate = new Date( highlightedObject.year, highlightedObject.month, highlightedObject.date + timeChange );
1282
+ calendar.set(
1283
+ 'highlight',
1284
+ targetDate,
1285
+ { interval: timeChange }
1286
+ );
1287
+ this.render();
1288
+ }
1289
+ };
1290
+
1291
+
1292
+ // Bind some picker events.
1293
+ picker$$1.
1294
+ on( 'render', function() {
1295
+ picker$$1.$root.find( '.' + settings.klass.selectMonth ).on( 'change', function() {
1296
+ var value = this.value;
1297
+ if ( value ) {
1298
+ picker$$1.set( 'highlight', [ picker$$1.get( 'view' ).year, value, picker$$1.get( 'highlight' ).date ] );
1299
+ picker$$1.$root.find( '.' + settings.klass.selectMonth ).trigger( 'focus' );
1300
+ }
1301
+ });
1302
+ picker$$1.$root.find( '.' + settings.klass.selectYear ).on( 'change', function() {
1303
+ var value = this.value;
1304
+ if ( value ) {
1305
+ picker$$1.set( 'highlight', [ value, picker$$1.get( 'view' ).month, picker$$1.get( 'highlight' ).date ] );
1306
+ picker$$1.$root.find( '.' + settings.klass.selectYear ).trigger( 'focus' );
1307
+ }
1308
+ });
1309
+ }, 1 ).
1310
+ on( 'open', function() {
1311
+ var includeToday = '';
1312
+ if ( calendar.disabled( calendar.get('now') ) ) {
1313
+ includeToday = ':not(.' + settings.klass.buttonToday + ')';
1314
+ }
1315
+ picker$$1.$root.find( 'button' + includeToday + ', select' ).attr( 'disabled', false );
1316
+ }, 1 ).
1317
+ on( 'close', function() {
1318
+ picker$$1.$root.find( 'button, select' ).attr( 'disabled', true );
1319
+ }, 1 );
1320
+
1321
+ } //DatePicker
1322
+
1323
+
1324
+ /**
1325
+ * Set a datepicker item object.
1326
+ */
1327
+ DatePicker.prototype.set = function( type, value, options ) {
1328
+
1329
+ var calendar = this,
1330
+ calendarItem = calendar.item;
1331
+
1332
+ // If the value is `null` just set it immediately.
1333
+ if ( value === null ) {
1334
+ if ( type == 'clear' ) type = 'select';
1335
+ calendarItem[ type ] = value;
1336
+ return calendar
1337
+ }
1338
+
1339
+ // Otherwise go through the queue of methods, and invoke the functions.
1340
+ // Update this as the time unit, and set the final value as this item.
1341
+ // * In the case of `enable`, keep the queue but set `disable` instead.
1342
+ // And in the case of `flip`, keep the queue but set `enable` instead.
1343
+ calendarItem[ ( type == 'enable' ? 'disable' : type == 'flip' ? 'enable' : type ) ] = calendar.queue[ type ].split( ' ' ).map( function( method ) {
1344
+ value = calendar[ method ]( type, value, options );
1345
+ return value
1346
+ }).pop();
1347
+
1348
+ // Check if we need to cascade through more updates.
1349
+ if ( type == 'select' ) {
1350
+ calendar.set( 'highlight', calendarItem.select, options );
1351
+ }
1352
+ else if ( type == 'highlight' ) {
1353
+ calendar.set( 'view', calendarItem.highlight, options );
1354
+ }
1355
+ else if ( type.match( /^(flip|min|max|disable|enable)$/ ) ) {
1356
+ if ( calendarItem.select && calendar.disabled( calendarItem.select ) ) {
1357
+ calendar.set( 'select', calendarItem.select, options );
1358
+ }
1359
+ if ( calendarItem.highlight && calendar.disabled( calendarItem.highlight ) ) {
1360
+ calendar.set( 'highlight', calendarItem.highlight, options );
1361
+ }
1362
+ }
1363
+
1364
+ return calendar
1365
+ }; //DatePicker.prototype.set
1366
+
1367
+
1368
+ /**
1369
+ * Get a datepicker item object.
1370
+ */
1371
+ DatePicker.prototype.get = function( type ) {
1372
+ return this.item[ type ]
1373
+ }; //DatePicker.prototype.get
1374
+
1375
+
1376
+ /**
1377
+ * Create a picker date object.
1378
+ */
1379
+ DatePicker.prototype.create = function( type, value, options ) {
1380
+
1381
+ var isInfiniteValue,
1382
+ calendar = this;
1383
+
1384
+ // If there’s no value, use the type as the value.
1385
+ value = value === undefined ? type : value;
1386
+
1387
+
1388
+ // If it’s infinity, update the value.
1389
+ if ( value == -Infinity || value == Infinity ) {
1390
+ isInfiniteValue = value;
1391
+ }
1392
+
1393
+ // If it’s an object, use the native date object.
1394
+ else if ( $$$1.isPlainObject( value ) && _.isInteger( value.pick ) ) {
1395
+ value = value.obj;
1396
+ }
1397
+
1398
+ // If it’s an array, convert it into a date and make sure
1399
+ // that it’s a valid date – otherwise default to today.
1400
+ else if ( $$$1.isArray( value ) ) {
1401
+ value = new Date( value[ 0 ], value[ 1 ], value[ 2 ] );
1402
+ value = _.isDate( value ) ? value : calendar.create().obj;
1403
+ }
1404
+
1405
+ // If it’s a number or date object, make a normalized date.
1406
+ else if ( _.isInteger( value ) || _.isDate( value ) ) {
1407
+ value = calendar.normalize( new Date( value ), options );
1408
+ }
1409
+
1410
+ // If it’s a literal true or any other case, set it to now.
1411
+ else /*if ( value === true )*/ {
1412
+ value = calendar.now( type, value, options );
1413
+ }
1414
+
1415
+ // Return the compiled object.
1416
+ return {
1417
+ year: isInfiniteValue || value.getFullYear(),
1418
+ month: isInfiniteValue || value.getMonth(),
1419
+ date: isInfiniteValue || value.getDate(),
1420
+ day: isInfiniteValue || value.getDay(),
1421
+ obj: isInfiniteValue || value,
1422
+ pick: isInfiniteValue || value.getTime()
1423
+ }
1424
+ }; //DatePicker.prototype.create
1425
+
1426
+
1427
+ /**
1428
+ * Create a range limit object using an array, date object,
1429
+ * literal “true”, or integer relative to another time.
1430
+ */
1431
+ DatePicker.prototype.createRange = function( from, to ) {
1432
+
1433
+ var calendar = this,
1434
+ createDate = function( date ) {
1435
+ if ( date === true || $$$1.isArray( date ) || _.isDate( date ) ) {
1436
+ return calendar.create( date )
1437
+ }
1438
+ return date
1439
+ };
1440
+
1441
+ // Create objects if possible.
1442
+ if ( !_.isInteger( from ) ) {
1443
+ from = createDate( from );
1444
+ }
1445
+ if ( !_.isInteger( to ) ) {
1446
+ to = createDate( to );
1447
+ }
1448
+
1449
+ // Create relative dates.
1450
+ if ( _.isInteger( from ) && $$$1.isPlainObject( to ) ) {
1451
+ from = [ to.year, to.month, to.date + from ];
1452
+ }
1453
+ else if ( _.isInteger( to ) && $$$1.isPlainObject( from ) ) {
1454
+ to = [ from.year, from.month, from.date + to ];
1455
+ }
1456
+
1457
+ return {
1458
+ from: createDate( from ),
1459
+ to: createDate( to )
1460
+ }
1461
+ }; //DatePicker.prototype.createRange
1462
+
1463
+
1464
+ /**
1465
+ * Check if a date unit falls within a date range object.
1466
+ */
1467
+ DatePicker.prototype.withinRange = function( range, dateUnit ) {
1468
+ range = this.createRange(range.from, range.to);
1469
+ return dateUnit.pick >= range.from.pick && dateUnit.pick <= range.to.pick
1470
+ };
1471
+
1472
+
1473
+ /**
1474
+ * Check if two date range objects overlap.
1475
+ */
1476
+ DatePicker.prototype.overlapRanges = function( one, two ) {
1477
+
1478
+ var calendar = this;
1479
+
1480
+ // Convert the ranges into comparable dates.
1481
+ one = calendar.createRange( one.from, one.to );
1482
+ two = calendar.createRange( two.from, two.to );
1483
+
1484
+ return calendar.withinRange( one, two.from ) || calendar.withinRange( one, two.to ) ||
1485
+ calendar.withinRange( two, one.from ) || calendar.withinRange( two, one.to )
1486
+ };
1487
+
1488
+
1489
+ /**
1490
+ * Get the date today.
1491
+ */
1492
+ DatePicker.prototype.now = function( type, value, options ) {
1493
+ value = new Date();
1494
+ if ( options && options.rel ) {
1495
+ value.setDate( value.getDate() + options.rel );
1496
+ }
1497
+ return this.normalize( value, options )
1498
+ };
1499
+
1500
+
1501
+ /**
1502
+ * Navigate to next/prev month.
1503
+ */
1504
+ DatePicker.prototype.navigate = function( type, value, options ) {
1505
+
1506
+ var targetDateObject,
1507
+ targetYear,
1508
+ targetMonth,
1509
+ targetDate,
1510
+ isTargetArray = $$$1.isArray( value ),
1511
+ isTargetObject = $$$1.isPlainObject( value ),
1512
+ viewsetObject = this.item.view;/*,
1513
+ safety = 100*/
1514
+
1515
+
1516
+ if ( isTargetArray || isTargetObject ) {
1517
+
1518
+ if ( isTargetObject ) {
1519
+ targetYear = value.year;
1520
+ targetMonth = value.month;
1521
+ targetDate = value.date;
1522
+ }
1523
+ else {
1524
+ targetYear = +value[0];
1525
+ targetMonth = +value[1];
1526
+ targetDate = +value[2];
1527
+ }
1528
+
1529
+ // If we’re navigating months but the view is in a different
1530
+ // month, navigate to the view’s year and month.
1531
+ if ( options && options.nav && viewsetObject && viewsetObject.month !== targetMonth ) {
1532
+ targetYear = viewsetObject.year;
1533
+ targetMonth = viewsetObject.month;
1534
+ }
1535
+
1536
+ // Figure out the expected target year and month.
1537
+ targetDateObject = new Date( targetYear, targetMonth + ( options && options.nav ? options.nav : 0 ), 1 );
1538
+ targetYear = targetDateObject.getFullYear();
1539
+ targetMonth = targetDateObject.getMonth();
1540
+
1541
+ // If the month we’re going to doesn’t have enough days,
1542
+ // keep decreasing the date until we reach the month’s last date.
1543
+ while ( /*safety &&*/ new Date( targetYear, targetMonth, targetDate ).getMonth() !== targetMonth ) {
1544
+ targetDate -= 1;
1545
+ /*safety -= 1
1546
+ if ( !safety ) {
1547
+ throw 'Fell into an infinite loop while navigating to ' + new Date( targetYear, targetMonth, targetDate ) + '.'
1548
+ }*/
1549
+ }
1550
+
1551
+ value = [ targetYear, targetMonth, targetDate ];
1552
+ }
1553
+
1554
+ return value
1555
+ }; //DatePicker.prototype.navigate
1556
+
1557
+
1558
+ /**
1559
+ * Normalize a date by setting the hours to midnight.
1560
+ */
1561
+ DatePicker.prototype.normalize = function( value/*, options*/ ) {
1562
+ value.setHours( 0, 0, 0, 0 );
1563
+ return value
1564
+ };
1565
+
1566
+
1567
+ /**
1568
+ * Measure the range of dates.
1569
+ */
1570
+ DatePicker.prototype.measure = function( type, value/*, options*/ ) {
1571
+
1572
+ var calendar = this;
1573
+
1574
+ // If it’s anything false-y, remove the limits.
1575
+ if ( !value ) {
1576
+ value = type == 'min' ? -Infinity : Infinity;
1577
+ }
1578
+
1579
+ // If it’s a string, parse it.
1580
+ else if ( typeof value == 'string' ) {
1581
+ value = calendar.parse( type, value );
1582
+ }
1583
+
1584
+ // If it's an integer, get a date relative to today.
1585
+ else if ( _.isInteger( value ) ) {
1586
+ value = calendar.now( type, value, { rel: value } );
1587
+ }
1588
+
1589
+ return value
1590
+ }; ///DatePicker.prototype.measure
1591
+
1592
+
1593
+ /**
1594
+ * Create a viewset object based on navigation.
1595
+ */
1596
+ DatePicker.prototype.viewset = function( type, dateObject/*, options*/ ) {
1597
+ return this.create([ dateObject.year, dateObject.month, 1 ])
1598
+ };
1599
+
1600
+
1601
+ /**
1602
+ * Validate a date as enabled and shift if needed.
1603
+ */
1604
+ DatePicker.prototype.validate = function( type, dateObject, options ) {
1605
+
1606
+ var calendar = this,
1607
+
1608
+ // Keep a reference to the original date.
1609
+ originalDateObject = dateObject,
1610
+
1611
+ // Make sure we have an interval.
1612
+ interval = options && options.interval ? options.interval : 1,
1613
+
1614
+ // Check if the calendar enabled dates are inverted.
1615
+ isFlippedBase = calendar.item.enable === -1,
1616
+
1617
+ // Check if we have any enabled dates after/before now.
1618
+ hasEnabledBeforeTarget, hasEnabledAfterTarget,
1619
+
1620
+ // The min & max limits.
1621
+ minLimitObject = calendar.item.min,
1622
+ maxLimitObject = calendar.item.max,
1623
+
1624
+ // Check if we’ve reached the limit during shifting.
1625
+ reachedMin, reachedMax,
1626
+
1627
+ // Check if the calendar is inverted and at least one weekday is enabled.
1628
+ hasEnabledWeekdays = isFlippedBase && calendar.item.disable.filter( function( value ) {
1629
+
1630
+ // If there’s a date, check where it is relative to the target.
1631
+ if ( $$$1.isArray( value ) ) {
1632
+ var dateTime = calendar.create( value ).pick;
1633
+ if ( dateTime < dateObject.pick ) hasEnabledBeforeTarget = true;
1634
+ else if ( dateTime > dateObject.pick ) hasEnabledAfterTarget = true;
1635
+ }
1636
+
1637
+ // Return only integers for enabled weekdays.
1638
+ return _.isInteger( value )
1639
+ }).length;/*,
1640
+
1641
+ safety = 100*/
1642
+
1643
+
1644
+
1645
+ // Cases to validate for:
1646
+ // [1] Not inverted and date disabled.
1647
+ // [2] Inverted and some dates enabled.
1648
+ // [3] Not inverted and out of range.
1649
+ //
1650
+ // Cases to **not** validate for:
1651
+ // • Navigating months.
1652
+ // • Not inverted and date enabled.
1653
+ // • Inverted and all dates disabled.
1654
+ // • ..and anything else.
1655
+ if ( !options || (!options.nav && !options.defaultValue) ) if (
1656
+ /* 1 */ ( !isFlippedBase && calendar.disabled( dateObject ) ) ||
1657
+ /* 2 */ ( isFlippedBase && calendar.disabled( dateObject ) && ( hasEnabledWeekdays || hasEnabledBeforeTarget || hasEnabledAfterTarget ) ) ||
1658
+ /* 3 */ ( !isFlippedBase && (dateObject.pick <= minLimitObject.pick || dateObject.pick >= maxLimitObject.pick) )
1659
+ ) {
1660
+
1661
+
1662
+ // When inverted, flip the direction if there aren’t any enabled weekdays
1663
+ // and there are no enabled dates in the direction of the interval.
1664
+ if ( isFlippedBase && !hasEnabledWeekdays && ( ( !hasEnabledAfterTarget && interval > 0 ) || ( !hasEnabledBeforeTarget && interval < 0 ) ) ) {
1665
+ interval *= -1;
1666
+ }
1667
+
1668
+
1669
+ // Keep looping until we reach an enabled date.
1670
+ while ( /*safety &&*/ calendar.disabled( dateObject ) ) {
1671
+
1672
+ /*safety -= 1
1673
+ if ( !safety ) {
1674
+ throw 'Fell into an infinite loop while validating ' + dateObject.obj + '.'
1675
+ }*/
1676
+
1677
+
1678
+ // If we’ve looped into the next/prev month with a large interval, return to the original date and flatten the interval.
1679
+ if ( Math.abs( interval ) > 1 && ( dateObject.month < originalDateObject.month || dateObject.month > originalDateObject.month ) ) {
1680
+ dateObject = originalDateObject;
1681
+ interval = interval > 0 ? 1 : -1;
1682
+ }
1683
+
1684
+
1685
+ // If we’ve reached the min/max limit, reverse the direction, flatten the interval and set it to the limit.
1686
+ if ( dateObject.pick <= minLimitObject.pick ) {
1687
+ reachedMin = true;
1688
+ interval = 1;
1689
+ dateObject = calendar.create([
1690
+ minLimitObject.year,
1691
+ minLimitObject.month,
1692
+ minLimitObject.date + (dateObject.pick === minLimitObject.pick ? 0 : -1)
1693
+ ]);
1694
+ }
1695
+ else if ( dateObject.pick >= maxLimitObject.pick ) {
1696
+ reachedMax = true;
1697
+ interval = -1;
1698
+ dateObject = calendar.create([
1699
+ maxLimitObject.year,
1700
+ maxLimitObject.month,
1701
+ maxLimitObject.date + (dateObject.pick === maxLimitObject.pick ? 0 : 1)
1702
+ ]);
1703
+ }
1704
+
1705
+
1706
+ // If we’ve reached both limits, just break out of the loop.
1707
+ if ( reachedMin && reachedMax ) {
1708
+ break
1709
+ }
1710
+
1711
+
1712
+ // Finally, create the shifted date using the interval and keep looping.
1713
+ dateObject = calendar.create([ dateObject.year, dateObject.month, dateObject.date + interval ]);
1714
+ }
1715
+
1716
+ } //endif
1717
+
1718
+
1719
+ // Return the date object settled on.
1720
+ return dateObject
1721
+ }; //DatePicker.prototype.validate
1722
+
1723
+
1724
+ /**
1725
+ * Check if a date is disabled.
1726
+ */
1727
+ DatePicker.prototype.disabled = function( dateToVerify ) {
1728
+
1729
+ var
1730
+ calendar = this,
1731
+
1732
+ // Filter through the disabled dates to check if this is one.
1733
+ isDisabledMatch = calendar.item.disable.filter( function( dateToDisable ) {
1734
+
1735
+ // If the date is a number, match the weekday with 0index and `firstDay` check.
1736
+ if ( _.isInteger( dateToDisable ) ) {
1737
+ return dateToVerify.day === ( calendar.settings.firstDay ? dateToDisable : dateToDisable - 1 ) % 7
1738
+ }
1739
+
1740
+ // If it’s an array or a native JS date, create and match the exact date.
1741
+ if ( $$$1.isArray( dateToDisable ) || _.isDate( dateToDisable ) ) {
1742
+ return dateToVerify.pick === calendar.create( dateToDisable ).pick
1743
+ }
1744
+
1745
+ // If it’s an object, match a date within the “from” and “to” range.
1746
+ if ( $$$1.isPlainObject( dateToDisable ) ) {
1747
+ return calendar.withinRange( dateToDisable, dateToVerify )
1748
+ }
1749
+ });
1750
+
1751
+ // If this date matches a disabled date, confirm it’s not inverted.
1752
+ isDisabledMatch = isDisabledMatch.length && !isDisabledMatch.filter(function( dateToDisable ) {
1753
+ return $$$1.isArray( dateToDisable ) && dateToDisable[3] == 'inverted' ||
1754
+ $$$1.isPlainObject( dateToDisable ) && dateToDisable.inverted
1755
+ }).length;
1756
+
1757
+ // Check the calendar “enabled” flag and respectively flip the
1758
+ // disabled state. Then also check if it’s beyond the min/max limits.
1759
+ return calendar.item.enable === -1 ? !isDisabledMatch : isDisabledMatch ||
1760
+ dateToVerify.pick < calendar.item.min.pick ||
1761
+ dateToVerify.pick > calendar.item.max.pick
1762
+
1763
+ }; //DatePicker.prototype.disabled
1764
+
1765
+
1766
+ /**
1767
+ * Parse a string into a usable type.
1768
+ */
1769
+ DatePicker.prototype.parse = function( type, value, options ) {
1770
+
1771
+ var calendar = this,
1772
+ parsingObject = {};
1773
+
1774
+ // If it’s already parsed, we’re good.
1775
+ if ( !value || typeof value != 'string' ) {
1776
+ return value
1777
+ }
1778
+
1779
+ // We need a `.format` to parse the value with.
1780
+ if ( !( options && options.format ) ) {
1781
+ options = options || {};
1782
+ options.format = calendar.settings.format;
1783
+ }
1784
+
1785
+ // Convert the format into an array and then map through it.
1786
+ calendar.formats.toArray( options.format ).map( function( label ) {
1787
+
1788
+ var
1789
+ // Grab the formatting label.
1790
+ formattingLabel = calendar.formats[ label ],
1791
+
1792
+ // The format length is from the formatting label function or the
1793
+ // label length without the escaping exclamation (!) mark.
1794
+ formatLength = formattingLabel ? _.trigger( formattingLabel, calendar, [ value, parsingObject ] ) : label.replace( /^!/, '' ).length;
1795
+
1796
+ // If there's a format label, split the value up to the format length.
1797
+ // Then add it to the parsing object with appropriate label.
1798
+ if ( formattingLabel ) {
1799
+ parsingObject[ label ] = value.substr( 0, formatLength );
1800
+ }
1801
+
1802
+ // Update the value as the substring from format length to end.
1803
+ value = value.substr( formatLength );
1804
+ });
1805
+
1806
+ // Compensate for month 0index.
1807
+ return [
1808
+ parsingObject.yyyy || parsingObject.yy,
1809
+ +( parsingObject.mm || parsingObject.m ) - 1,
1810
+ parsingObject.dd || parsingObject.d
1811
+ ]
1812
+ }; //DatePicker.prototype.parse
1813
+
1814
+
1815
+ /**
1816
+ * Various formats to display the object in.
1817
+ */
1818
+ DatePicker.prototype.formats = (function() {
1819
+
1820
+ // Return the length of the first word in a collection.
1821
+ function getWordLengthFromCollection( string, collection, dateObject ) {
1822
+
1823
+ // Grab the first word from the string.
1824
+ // Regex pattern from http://stackoverflow.com/q/150033
1825
+ var word = string.match( /[^\x00-\x7F]+|\w+/ )[ 0 ];
1826
+
1827
+ // If there's no month index, add it to the date object
1828
+ if ( !dateObject.mm && !dateObject.m ) {
1829
+ dateObject.m = collection.indexOf( word ) + 1;
1830
+ }
1831
+
1832
+ // Return the length of the word.
1833
+ return word.length
1834
+ }
1835
+
1836
+ // Get the length of the first word in a string.
1837
+ function getFirstWordLength( string ) {
1838
+ return string.match( /\w+/ )[ 0 ].length
1839
+ }
1840
+
1841
+ return {
1842
+
1843
+ d: function( string, dateObject ) {
1844
+
1845
+ // If there's string, then get the digits length.
1846
+ // Otherwise return the selected date.
1847
+ return string ? _.digits( string ) : dateObject.date
1848
+ },
1849
+ dd: function( string, dateObject ) {
1850
+
1851
+ // If there's a string, then the length is always 2.
1852
+ // Otherwise return the selected date with a leading zero.
1853
+ return string ? 2 : _.lead( dateObject.date )
1854
+ },
1855
+ ddd: function( string, dateObject ) {
1856
+
1857
+ // If there's a string, then get the length of the first word.
1858
+ // Otherwise return the short selected weekday.
1859
+ return string ? getFirstWordLength( string ) : this.settings.weekdaysShort[ dateObject.day ]
1860
+ },
1861
+ dddd: function( string, dateObject ) {
1862
+
1863
+ // If there's a string, then get the length of the first word.
1864
+ // Otherwise return the full selected weekday.
1865
+ return string ? getFirstWordLength( string ) : this.settings.weekdaysFull[ dateObject.day ]
1866
+ },
1867
+ m: function( string, dateObject ) {
1868
+
1869
+ // If there's a string, then get the length of the digits
1870
+ // Otherwise return the selected month with 0index compensation.
1871
+ return string ? _.digits( string ) : dateObject.month + 1
1872
+ },
1873
+ mm: function( string, dateObject ) {
1874
+
1875
+ // If there's a string, then the length is always 2.
1876
+ // Otherwise return the selected month with 0index and leading zero.
1877
+ return string ? 2 : _.lead( dateObject.month + 1 )
1878
+ },
1879
+ mmm: function( string, dateObject ) {
1880
+
1881
+ var collection = this.settings.monthsShort;
1882
+
1883
+ // If there's a string, get length of the relevant month from the short
1884
+ // months collection. Otherwise return the selected month from that collection.
1885
+ return string ? getWordLengthFromCollection( string, collection, dateObject ) : collection[ dateObject.month ]
1886
+ },
1887
+ mmmm: function( string, dateObject ) {
1888
+
1889
+ var collection = this.settings.monthsFull;
1890
+
1891
+ // If there's a string, get length of the relevant month from the full
1892
+ // months collection. Otherwise return the selected month from that collection.
1893
+ return string ? getWordLengthFromCollection( string, collection, dateObject ) : collection[ dateObject.month ]
1894
+ },
1895
+ yy: function( string, dateObject ) {
1896
+
1897
+ // If there's a string, then the length is always 2.
1898
+ // Otherwise return the selected year by slicing out the first 2 digits.
1899
+ return string ? 2 : ( '' + dateObject.year ).slice( 2 )
1900
+ },
1901
+ yyyy: function( string, dateObject ) {
1902
+
1903
+ // If there's a string, then the length is always 4.
1904
+ // Otherwise return the selected year.
1905
+ return string ? 4 : dateObject.year
1906
+ },
1907
+
1908
+ // Create an array by splitting the formatting string passed.
1909
+ toArray: function( formatString ) { return formatString.split( /(d{1,4}|m{1,4}|y{4}|yy|!.)/g ) },
1910
+
1911
+ // Format an object into a string using the formatting options.
1912
+ toString: function ( formatString, itemObject ) {
1913
+ var calendar = this;
1914
+ return calendar.formats.toArray( formatString ).map( function( label ) {
1915
+ return _.trigger( calendar.formats[ label ], calendar, [ 0, itemObject ] ) || label.replace( /^!/, '' )
1916
+ }).join( '' )
1917
+ }
1918
+ }
1919
+ })(); //DatePicker.prototype.formats
1920
+
1921
+
1922
+
1923
+
1924
+ /**
1925
+ * Check if two date units are the exact.
1926
+ */
1927
+ DatePicker.prototype.isDateExact = function( one, two ) {
1928
+
1929
+ var calendar = this;
1930
+
1931
+ // When we’re working with weekdays, do a direct comparison.
1932
+ if (
1933
+ ( _.isInteger( one ) && _.isInteger( two ) ) ||
1934
+ ( typeof one == 'boolean' && typeof two == 'boolean' )
1935
+ ) {
1936
+ return one === two
1937
+ }
1938
+
1939
+ // When we’re working with date representations, compare the “pick” value.
1940
+ if (
1941
+ ( _.isDate( one ) || $$$1.isArray( one ) ) &&
1942
+ ( _.isDate( two ) || $$$1.isArray( two ) )
1943
+ ) {
1944
+ return calendar.create( one ).pick === calendar.create( two ).pick
1945
+ }
1946
+
1947
+ // When we’re working with range objects, compare the “from” and “to”.
1948
+ if ( $$$1.isPlainObject( one ) && $$$1.isPlainObject( two ) ) {
1949
+ return calendar.isDateExact( one.from, two.from ) && calendar.isDateExact( one.to, two.to )
1950
+ }
1951
+
1952
+ return false
1953
+ };
1954
+
1955
+
1956
+ /**
1957
+ * Check if two date units overlap.
1958
+ */
1959
+ DatePicker.prototype.isDateOverlap = function( one, two ) {
1960
+
1961
+ var calendar = this,
1962
+ firstDay = calendar.settings.firstDay ? 1 : 0;
1963
+
1964
+ // When we’re working with a weekday index, compare the days.
1965
+ if ( _.isInteger( one ) && ( _.isDate( two ) || $$$1.isArray( two ) ) ) {
1966
+ one = one % 7 + firstDay;
1967
+ return one === calendar.create( two ).day + 1
1968
+ }
1969
+ if ( _.isInteger( two ) && ( _.isDate( one ) || $$$1.isArray( one ) ) ) {
1970
+ two = two % 7 + firstDay;
1971
+ return two === calendar.create( one ).day + 1
1972
+ }
1973
+
1974
+ // When we’re working with range objects, check if the ranges overlap.
1975
+ if ( $$$1.isPlainObject( one ) && $$$1.isPlainObject( two ) ) {
1976
+ return calendar.overlapRanges( one, two )
1977
+ }
1978
+
1979
+ return false
1980
+ };
1981
+
1982
+
1983
+ /**
1984
+ * Flip the “enabled” state.
1985
+ */
1986
+ DatePicker.prototype.flipEnable = function(val) {
1987
+ var itemObject = this.item;
1988
+ itemObject.enable = val || (itemObject.enable == -1 ? 1 : -1);
1989
+ };
1990
+
1991
+
1992
+ /**
1993
+ * Mark a collection of dates as “disabled”.
1994
+ */
1995
+ DatePicker.prototype.deactivate = function( type, datesToDisable ) {
1996
+
1997
+ var calendar = this,
1998
+ disabledItems = calendar.item.disable.slice(0);
1999
+
2000
+
2001
+ // If we’re flipping, that’s all we need to do.
2002
+ if ( datesToDisable == 'flip' ) {
2003
+ calendar.flipEnable();
2004
+ }
2005
+
2006
+ else if ( datesToDisable === false ) {
2007
+ calendar.flipEnable(1);
2008
+ disabledItems = [];
2009
+ }
2010
+
2011
+ else if ( datesToDisable === true ) {
2012
+ calendar.flipEnable(-1);
2013
+ disabledItems = [];
2014
+ }
2015
+
2016
+ // Otherwise go through the dates to disable.
2017
+ else {
2018
+
2019
+ datesToDisable.map(function( unitToDisable ) {
2020
+
2021
+ var matchFound;
2022
+
2023
+ // When we have disabled items, check for matches.
2024
+ // If something is matched, immediately break out.
2025
+ for ( var index = 0; index < disabledItems.length; index += 1 ) {
2026
+ if ( calendar.isDateExact( unitToDisable, disabledItems[index] ) ) {
2027
+ matchFound = true;
2028
+ break
2029
+ }
2030
+ }
2031
+
2032
+ // If nothing was found, add the validated unit to the collection.
2033
+ if ( !matchFound ) {
2034
+ if (
2035
+ _.isInteger( unitToDisable ) ||
2036
+ _.isDate( unitToDisable ) ||
2037
+ $$$1.isArray( unitToDisable ) ||
2038
+ ( $$$1.isPlainObject( unitToDisable ) && unitToDisable.from && unitToDisable.to )
2039
+ ) {
2040
+ disabledItems.push( unitToDisable );
2041
+ }
2042
+ }
2043
+ });
2044
+ }
2045
+
2046
+ // Return the updated collection.
2047
+ return disabledItems
2048
+ }; //DatePicker.prototype.deactivate
2049
+
2050
+
2051
+ /**
2052
+ * Mark a collection of dates as “enabled”.
2053
+ */
2054
+ DatePicker.prototype.activate = function( type, datesToEnable ) {
2055
+
2056
+ var calendar = this,
2057
+ disabledItems = calendar.item.disable,
2058
+ disabledItemsCount = disabledItems.length;
2059
+
2060
+ // If we’re flipping, that’s all we need to do.
2061
+ if ( datesToEnable == 'flip' ) {
2062
+ calendar.flipEnable();
2063
+ }
2064
+
2065
+ else if ( datesToEnable === true ) {
2066
+ calendar.flipEnable(1);
2067
+ disabledItems = [];
2068
+ }
2069
+
2070
+ else if ( datesToEnable === false ) {
2071
+ calendar.flipEnable(-1);
2072
+ disabledItems = [];
2073
+ }
2074
+
2075
+ // Otherwise go through the disabled dates.
2076
+ else {
2077
+
2078
+ datesToEnable.map(function( unitToEnable ) {
2079
+
2080
+ var matchFound,
2081
+ disabledUnit,
2082
+ index,
2083
+ isExactRange;
2084
+
2085
+ // Go through the disabled items and try to find a match.
2086
+ for ( index = 0; index < disabledItemsCount; index += 1 ) {
2087
+
2088
+ disabledUnit = disabledItems[index];
2089
+
2090
+ // When an exact match is found, remove it from the collection.
2091
+ if ( calendar.isDateExact( disabledUnit, unitToEnable ) ) {
2092
+ matchFound = disabledItems[index] = null;
2093
+ isExactRange = true;
2094
+ break
2095
+ }
2096
+
2097
+ // When an overlapped match is found, add the “inverted” state to it.
2098
+ else if ( calendar.isDateOverlap( disabledUnit, unitToEnable ) ) {
2099
+ if ( $$$1.isPlainObject( unitToEnable ) ) {
2100
+ unitToEnable.inverted = true;
2101
+ matchFound = unitToEnable;
2102
+ }
2103
+ else if ( $$$1.isArray( unitToEnable ) ) {
2104
+ matchFound = unitToEnable;
2105
+ if ( !matchFound[3] ) matchFound.push( 'inverted' );
2106
+ }
2107
+ else if ( _.isDate( unitToEnable ) ) {
2108
+ matchFound = [ unitToEnable.getFullYear(), unitToEnable.getMonth(), unitToEnable.getDate(), 'inverted' ];
2109
+ }
2110
+ break
2111
+ }
2112
+ }
2113
+
2114
+ // If a match was found, remove a previous duplicate entry.
2115
+ if ( matchFound ) for ( index = 0; index < disabledItemsCount; index += 1 ) {
2116
+ if ( calendar.isDateExact( disabledItems[index], unitToEnable ) ) {
2117
+ disabledItems[index] = null;
2118
+ break
2119
+ }
2120
+ }
2121
+
2122
+ // In the event that we’re dealing with an exact range of dates,
2123
+ // make sure there are no “inverted” dates because of it.
2124
+ if ( isExactRange ) for ( index = 0; index < disabledItemsCount; index += 1 ) {
2125
+ if ( calendar.isDateOverlap( disabledItems[index], unitToEnable ) ) {
2126
+ disabledItems[index] = null;
2127
+ break
2128
+ }
2129
+ }
2130
+
2131
+ // If something is still matched, add it into the collection.
2132
+ if ( matchFound ) {
2133
+ disabledItems.push( matchFound );
2134
+ }
2135
+ });
2136
+ }
2137
+
2138
+ // Return the updated collection.
2139
+ return disabledItems.filter(function( val ) { return val != null })
2140
+ }; //DatePicker.prototype.activate
2141
+
2142
+
2143
+ /**
2144
+ * Create a string for the nodes in the picker.
2145
+ */
2146
+ DatePicker.prototype.nodes = function( isOpen ) {
2147
+
2148
+ var
2149
+ calendar = this,
2150
+ settings = calendar.settings,
2151
+ calendarItem = calendar.item,
2152
+ nowObject = calendarItem.now,
2153
+ selectedObject = calendarItem.select,
2154
+ highlightedObject = calendarItem.highlight,
2155
+ viewsetObject = calendarItem.view,
2156
+ disabledCollection = calendarItem.disable,
2157
+ minLimitObject = calendarItem.min,
2158
+ maxLimitObject = calendarItem.max,
2159
+
2160
+
2161
+ // Create the calendar table head using a copy of weekday labels collection.
2162
+ // * We do a copy so we don't mutate the original array.
2163
+ tableHead = (function( collection, fullCollection ) {
2164
+
2165
+ // If the first day should be Monday, move Sunday to the end.
2166
+ if ( settings.firstDay ) {
2167
+ collection.push( collection.shift() );
2168
+ fullCollection.push( fullCollection.shift() );
2169
+ }
2170
+
2171
+ // Create and return the table head group.
2172
+ return _.node(
2173
+ 'thead',
2174
+ _.node(
2175
+ 'tr',
2176
+ _.group({
2177
+ min: 0,
2178
+ max: DAYS_IN_WEEK - 1,
2179
+ i: 1,
2180
+ node: 'th',
2181
+ item: function( counter ) {
2182
+ return [
2183
+ collection[ counter ],
2184
+ settings.klass.weekdays,
2185
+ 'scope=col title="' + fullCollection[ counter ] + '"'
2186
+ ]
2187
+ }
2188
+ })
2189
+ )
2190
+ ) //endreturn
2191
+ })( ( settings.showWeekdaysFull ? settings.weekdaysFull : settings.weekdaysShort ).slice( 0 ), settings.weekdaysFull.slice( 0 ) ), //tableHead
2192
+
2193
+
2194
+ // Create the nav for next/prev month.
2195
+ createMonthNav = function( next ) {
2196
+
2197
+ // Otherwise, return the created month tag.
2198
+ return _.node(
2199
+ 'div',
2200
+ ' ',
2201
+ settings.klass[ 'nav' + ( next ? 'Next' : 'Prev' ) ] + (
2202
+
2203
+ // If the focused month is outside the range, disabled the button.
2204
+ ( next && viewsetObject.year >= maxLimitObject.year && viewsetObject.month >= maxLimitObject.month ) ||
2205
+ ( !next && viewsetObject.year <= minLimitObject.year && viewsetObject.month <= minLimitObject.month ) ?
2206
+ ' ' + settings.klass.navDisabled : ''
2207
+ ),
2208
+ 'data-nav=' + ( next || -1 ) + ' ' +
2209
+ _.ariaAttr({
2210
+ role: 'button',
2211
+ controls: calendar.$node[0].id + '_table'
2212
+ }) + ' ' +
2213
+ 'title="' + (next ? settings.labelMonthNext : settings.labelMonthPrev ) + '"'
2214
+ ) //endreturn
2215
+ }, //createMonthNav
2216
+
2217
+
2218
+ // Create the month label.
2219
+ createMonthLabel = function() {
2220
+
2221
+ var monthsCollection = settings.showMonthsShort ? settings.monthsShort : settings.monthsFull;
2222
+
2223
+ // If there are months to select, add a dropdown menu.
2224
+ if ( settings.selectMonths ) {
2225
+
2226
+ return _.node( 'select',
2227
+ _.group({
2228
+ min: 0,
2229
+ max: 11,
2230
+ i: 1,
2231
+ node: 'option',
2232
+ item: function( loopedMonth ) {
2233
+
2234
+ return [
2235
+
2236
+ // The looped month and no classes.
2237
+ monthsCollection[ loopedMonth ], 0,
2238
+
2239
+ // Set the value and selected index.
2240
+ 'value=' + loopedMonth +
2241
+ ( viewsetObject.month == loopedMonth ? ' selected' : '' ) +
2242
+ (
2243
+ (
2244
+ ( viewsetObject.year == minLimitObject.year && loopedMonth < minLimitObject.month ) ||
2245
+ ( viewsetObject.year == maxLimitObject.year && loopedMonth > maxLimitObject.month )
2246
+ ) ?
2247
+ ' disabled' : ''
2248
+ )
2249
+ ]
2250
+ }
2251
+ }),
2252
+ settings.klass.selectMonth,
2253
+ ( isOpen ? '' : 'disabled' ) + ' ' +
2254
+ _.ariaAttr({ controls: calendar.$node[0].id + '_table' }) + ' ' +
2255
+ 'title="' + settings.labelMonthSelect + '"'
2256
+ )
2257
+ }
2258
+
2259
+ // If there's a need for a month selector
2260
+ return _.node( 'div', monthsCollection[ viewsetObject.month ], settings.klass.month )
2261
+ }, //createMonthLabel
2262
+
2263
+
2264
+ // Create the year label.
2265
+ createYearLabel = function() {
2266
+
2267
+ var focusedYear = viewsetObject.year,
2268
+
2269
+ // If years selector is set to a literal "true", set it to 5. Otherwise
2270
+ // divide in half to get half before and half after focused year.
2271
+ numberYears = settings.selectYears === true ? 5 : ~~( settings.selectYears / 2 );
2272
+
2273
+ // If there are years to select, add a dropdown menu.
2274
+ if ( numberYears ) {
2275
+
2276
+ var
2277
+ minYear = minLimitObject.year,
2278
+ maxYear = maxLimitObject.year,
2279
+ lowestYear = focusedYear - numberYears,
2280
+ highestYear = focusedYear + numberYears;
2281
+
2282
+ // If the min year is greater than the lowest year, increase the highest year
2283
+ // by the difference and set the lowest year to the min year.
2284
+ if ( minYear > lowestYear ) {
2285
+ highestYear += minYear - lowestYear;
2286
+ lowestYear = minYear;
2287
+ }
2288
+
2289
+ // If the max year is less than the highest year, decrease the lowest year
2290
+ // by the lower of the two: available and needed years. Then set the
2291
+ // highest year to the max year.
2292
+ if ( maxYear < highestYear ) {
2293
+
2294
+ var availableYears = lowestYear - minYear,
2295
+ neededYears = highestYear - maxYear;
2296
+
2297
+ lowestYear -= availableYears > neededYears ? neededYears : availableYears;
2298
+ highestYear = maxYear;
2299
+ }
2300
+
2301
+ return _.node( 'select',
2302
+ _.group({
2303
+ min: lowestYear,
2304
+ max: highestYear,
2305
+ i: 1,
2306
+ node: 'option',
2307
+ item: function( loopedYear ) {
2308
+ return [
2309
+
2310
+ // The looped year and no classes.
2311
+ loopedYear, 0,
2312
+
2313
+ // Set the value and selected index.
2314
+ 'value=' + loopedYear + ( focusedYear == loopedYear ? ' selected' : '' )
2315
+ ]
2316
+ }
2317
+ }),
2318
+ settings.klass.selectYear,
2319
+ ( isOpen ? '' : 'disabled' ) + ' ' + _.ariaAttr({ controls: calendar.$node[0].id + '_table' }) + ' ' +
2320
+ 'title="' + settings.labelYearSelect + '"'
2321
+ )
2322
+ }
2323
+
2324
+ // Otherwise just return the year focused
2325
+ return _.node( 'div', focusedYear, settings.klass.year )
2326
+ }; //createYearLabel
2327
+
2328
+
2329
+ // Create and return the entire calendar.
2330
+ return _.node(
2331
+ 'div',
2332
+ ( settings.selectYears ? createYearLabel() + createMonthLabel() : createMonthLabel() + createYearLabel() ) +
2333
+ createMonthNav() + createMonthNav( 1 ),
2334
+ settings.klass.header
2335
+ ) + _.node(
2336
+ 'table',
2337
+ tableHead +
2338
+ _.node(
2339
+ 'tbody',
2340
+ _.group({
2341
+ min: 0,
2342
+ max: WEEKS_IN_CALENDAR - 1,
2343
+ i: 1,
2344
+ node: 'tr',
2345
+ item: function( rowCounter ) {
2346
+
2347
+ // If Monday is the first day and the month starts on Sunday, shift the date back a week.
2348
+ var shiftDateBy = settings.firstDay && calendar.create([ viewsetObject.year, viewsetObject.month, 1 ]).day === 0 ? -7 : 0;
2349
+
2350
+ return [
2351
+ _.group({
2352
+ min: DAYS_IN_WEEK * rowCounter - viewsetObject.day + shiftDateBy + 1, // Add 1 for weekday 0index
2353
+ max: function() {
2354
+ return this.min + DAYS_IN_WEEK - 1
2355
+ },
2356
+ i: 1,
2357
+ node: 'td',
2358
+ item: function( targetDate ) {
2359
+
2360
+ // Convert the time date from a relative date to a target date.
2361
+ targetDate = calendar.create([ viewsetObject.year, viewsetObject.month, targetDate + ( settings.firstDay ? 1 : 0 ) ]);
2362
+
2363
+ var isSelected = selectedObject && selectedObject.pick == targetDate.pick,
2364
+ isHighlighted = highlightedObject && highlightedObject.pick == targetDate.pick,
2365
+ isDisabled = disabledCollection && calendar.disabled( targetDate ) || targetDate.pick < minLimitObject.pick || targetDate.pick > maxLimitObject.pick,
2366
+ formattedDate = _.trigger( calendar.formats.toString, calendar, [ settings.format, targetDate ] );
2367
+
2368
+ return [
2369
+ _.node(
2370
+ 'div',
2371
+ targetDate.date,
2372
+ (function( klasses ) {
2373
+
2374
+ // Add the `infocus` or `outfocus` classes based on month in view.
2375
+ klasses.push( viewsetObject.month == targetDate.month ? settings.klass.infocus : settings.klass.outfocus );
2376
+
2377
+ // Add the `today` class if needed.
2378
+ if ( nowObject.pick == targetDate.pick ) {
2379
+ klasses.push( settings.klass.now );
2380
+ }
2381
+
2382
+ // Add the `selected` class if something's selected and the time matches.
2383
+ if ( isSelected ) {
2384
+ klasses.push( settings.klass.selected );
2385
+ }
2386
+
2387
+ // Add the `highlighted` class if something's highlighted and the time matches.
2388
+ if ( isHighlighted ) {
2389
+ klasses.push( settings.klass.highlighted );
2390
+ }
2391
+
2392
+ // Add the `disabled` class if something's disabled and the object matches.
2393
+ if ( isDisabled ) {
2394
+ klasses.push( settings.klass.disabled );
2395
+ }
2396
+
2397
+ return klasses.join( ' ' )
2398
+ })([ settings.klass.day ]),
2399
+ 'data-pick=' + targetDate.pick + ' ' + _.ariaAttr({
2400
+ role: 'gridcell',
2401
+ label: formattedDate,
2402
+ selected: isSelected && calendar.$node.val() === formattedDate ? true : null,
2403
+ activedescendant: isHighlighted ? true : null,
2404
+ disabled: isDisabled ? true : null
2405
+ })
2406
+ ),
2407
+ '',
2408
+ _.ariaAttr({ role: 'presentation' })
2409
+ ] //endreturn
2410
+ }
2411
+ })
2412
+ ] //endreturn
2413
+ }
2414
+ })
2415
+ ),
2416
+ settings.klass.table,
2417
+ 'id="' + calendar.$node[0].id + '_table' + '" ' + _.ariaAttr({
2418
+ role: 'grid',
2419
+ controls: calendar.$node[0].id,
2420
+ readonly: true
2421
+ })
2422
+ ) +
2423
+
2424
+ // * For Firefox forms to submit, make sure to set the buttons’ `type` attributes as “button”.
2425
+ _.node(
2426
+ 'div',
2427
+ _.node( 'button', settings.today, settings.klass.buttonToday,
2428
+ 'type=button data-pick=' + nowObject.pick +
2429
+ ( isOpen && !calendar.disabled(nowObject) ? '' : ' disabled' ) + ' ' +
2430
+ _.ariaAttr({ controls: calendar.$node[0].id }) ) +
2431
+ _.node( 'button', settings.clear, settings.klass.buttonClear,
2432
+ 'type=button data-clear=1' +
2433
+ ( isOpen ? '' : ' disabled' ) + ' ' +
2434
+ _.ariaAttr({ controls: calendar.$node[0].id }) ) +
2435
+ _.node('button', settings.close, settings.klass.buttonClose,
2436
+ 'type=button data-close=true ' +
2437
+ ( isOpen ? '' : ' disabled' ) + ' ' +
2438
+ _.ariaAttr({ controls: calendar.$node[0].id }) ),
2439
+ settings.klass.footer
2440
+ ) //endreturn
2441
+ }; //DatePicker.prototype.nodes
2442
+
2443
+
2444
+
2445
+
2446
+ /**
2447
+ * The date picker defaults.
2448
+ */
2449
+ DatePicker.defaults = (function( prefix ) {
2450
+
2451
+ return {
2452
+
2453
+ // The title label to use for the month nav buttons
2454
+ labelMonthNext: 'Next month',
2455
+ labelMonthPrev: 'Previous month',
2456
+
2457
+ // The title label to use for the dropdown selectors
2458
+ labelMonthSelect: 'Select a month',
2459
+ labelYearSelect: 'Select a year',
2460
+
2461
+ // Months and weekdays
2462
+ monthsFull: [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ],
2463
+ monthsShort: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ],
2464
+ weekdaysFull: [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ],
2465
+ weekdaysShort: [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ],
2466
+
2467
+ // Today and clear
2468
+ today: 'Today',
2469
+ clear: 'Clear',
2470
+ close: 'Close',
2471
+
2472
+ // Picker close behavior
2473
+ closeOnSelect: true,
2474
+ closeOnClear: true,
2475
+
2476
+ // The format to show on the `input` element
2477
+ format: 'd mmmm, yyyy',
2478
+
2479
+ // Classes
2480
+ klass: {
2481
+
2482
+ table: prefix + 'table',
2483
+
2484
+ header: prefix + 'header',
2485
+
2486
+ navPrev: prefix + 'nav--prev',
2487
+ navNext: prefix + 'nav--next',
2488
+ navDisabled: prefix + 'nav--disabled',
2489
+
2490
+ month: prefix + 'month',
2491
+ year: prefix + 'year',
2492
+
2493
+ selectMonth: prefix + 'select--month',
2494
+ selectYear: prefix + 'select--year',
2495
+
2496
+ weekdays: prefix + 'weekday',
2497
+
2498
+ day: prefix + 'day',
2499
+ disabled: prefix + 'day--disabled',
2500
+ selected: prefix + 'day--selected',
2501
+ highlighted: prefix + 'day--highlighted',
2502
+ now: prefix + 'day--today',
2503
+ infocus: prefix + 'day--infocus',
2504
+ outfocus: prefix + 'day--outfocus',
2505
+
2506
+ footer: prefix + 'footer',
2507
+
2508
+ buttonClear: prefix + 'button--clear',
2509
+ buttonToday: prefix + 'button--today',
2510
+ buttonClose: prefix + 'button--close'
2511
+ }
2512
+ }
2513
+ })( Picker.klasses().picker + '__' );
2514
+
2515
+
2516
+
2517
+
2518
+
2519
+ /**
2520
+ * Extend the picker to add the date picker.
2521
+ */
2522
+ Picker.extend( 'pickadate', DatePicker );
2523
+
2524
+
2525
+ }));
2526
+ });
2527
+
2528
+ function _defineProperties(target, props) {
2529
+ for (var i = 0; i < props.length; i++) {
2530
+ var descriptor = props[i];
2531
+ descriptor.enumerable = descriptor.enumerable || false;
2532
+ descriptor.configurable = true;
2533
+ if ("value" in descriptor) descriptor.writable = true;
2534
+ Object.defineProperty(target, descriptor.key, descriptor);
2535
+ }
2536
+ }
2537
+
2538
+ function _createClass(Constructor, protoProps, staticProps) {
2539
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
2540
+ if (staticProps) _defineProperties(Constructor, staticProps);
2541
+ return Constructor;
2542
+ }
2543
+
2544
+ /*
2545
+ * Customise pickadate JavaScript for Material
2546
+ */
2547
+ (function ($$$1) {
2548
+ var Datepicker = function Datepicker(element, options) {
2549
+ this._element = element;
2550
+ this._options = options;
2551
+ };
2552
+
2553
+ Datepicker.DEFAULTS = {
2554
+ cancel: 'Cancel',
2555
+ closeOnCancel: true,
2556
+ closeOnSelect: false,
2557
+ container: 'body',
2558
+ disable: [],
2559
+ firstDay: 0,
2560
+ format: 'd/m/yyyy',
2561
+ formatSubmit: '',
2562
+ klass: {
2563
+ // button
2564
+ buttonClear: 'btn btn-outline-primary picker-button-clear',
2565
+ buttonClose: 'btn btn-outline-primary picker-button-close',
2566
+ buttonToday: 'btn btn-outline-primary picker-button-today',
2567
+ // day
2568
+ day: 'picker-day',
2569
+ disabled: 'picker-day-disabled',
2570
+ highlighted: 'picker-day-highlighted',
2571
+ infocus: 'picker-day-infocus',
2572
+ now: 'picker-day-today',
2573
+ outfocus: 'picker-day-outfocus',
2574
+ selected: 'picker-day-selected',
2575
+ weekdays: 'picker-weekday',
2576
+ // element
2577
+ box: 'picker-box',
2578
+ footer: 'picker-footer',
2579
+ frame: 'picker-frame',
2580
+ header: 'picker-header',
2581
+ holder: 'picker-holder',
2582
+ table: 'picker-table',
2583
+ wrap: 'picker-wrap',
2584
+ // input element
2585
+ active: 'picker-input-active',
2586
+ input: 'picker-input',
2587
+ // month and year nav
2588
+ month: 'picker-month',
2589
+ navDisabled: 'picker-nav-disabled',
2590
+ navNext: 'material-icons picker-nav-next',
2591
+ navPrev: 'material-icons picker-nav-prev',
2592
+ selectMonth: 'picker-select-month',
2593
+ selectYear: 'picker-select-year',
2594
+ year: 'picker-year',
2595
+ // root picker
2596
+ focused: 'picker-focused',
2597
+ opened: 'picker-opened',
2598
+ picker: 'picker'
2599
+ },
2600
+ max: false,
2601
+ min: false,
2602
+ monthsFull: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
2603
+ monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
2604
+ ok: 'OK',
2605
+ onClose: false,
2606
+ onOpen: false,
2607
+ onRender: false,
2608
+ onSet: false,
2609
+ onStart: false,
2610
+ onStop: false,
2611
+ selectMonths: false,
2612
+ selectYears: false,
2613
+ today: '',
2614
+ weekdaysFull: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
2615
+ weekdaysShort: ['S', 'M', 'T', 'W', 'T', 'F', 'S']
2616
+ };
2617
+
2618
+ Datepicker.prototype.display = function (datepickerApi, datepickerRoot, datepickerValue) {
2619
+ $$$1('.picker-date-display', datepickerRoot).remove();
2620
+ $$$1('.picker-wrap', datepickerRoot).prepend('<div class="picker-date-display">' + '<div class="picker-date-display-top">' + '<span class="picker-year-display">' + datepickerApi.get(datepickerValue, 'yyyy') + '</span>' + '</div>' + '<div class="picker-date-display-bottom">' + '<span class="picker-weekday-display">' + datepickerApi.get(datepickerValue, 'dddd') + '</span>' + '<span class="picker-day-display">' + datepickerApi.get(datepickerValue, 'd') + '</span>' + '<span class="picker-month-display">' + datepickerApi.get(datepickerValue, 'mmm') + '</span>' + '</div>' + '</div>');
2621
+ };
2622
+
2623
+ Datepicker.prototype.show = function () {
2624
+ var that = this;
2625
+ $$$1(this._element).pickadate({
2626
+ clear: that._options.cancel,
2627
+ close: that._options.ok,
2628
+ closeOnClear: that._options.closeOnCancel,
2629
+ closeOnSelect: that._options.closeOnSelect,
2630
+ container: that._options.container,
2631
+ disable: that._options.disable,
2632
+ firstDay: that._options.firstDay,
2633
+ format: that._options.format,
2634
+ formatSubmit: that._options.formatSubmit,
2635
+ klass: that._options.klass,
2636
+ max: that._options.max,
2637
+ min: that._options.min,
2638
+ monthsFull: that._options.monthsFull,
2639
+ monthsShort: that._options.monthsShort,
2640
+ onClose: that._options.onClose,
2641
+ onOpen: that._options.onOpen,
2642
+ onRender: that._options.onRender,
2643
+ onSet: that._options.onSet,
2644
+ onStart: that._options.onStart,
2645
+ onStop: that._options.onStop,
2646
+ selectMonths: that._options.selectMonths,
2647
+ selectYears: that._options.selectYears,
2648
+ today: that._options.today,
2649
+ weekdaysFull: that._options.weekdaysFull,
2650
+ weekdaysShort: that._options.weekdaysShort
2651
+ });
2652
+ var datepickerApi = $$$1(this._element).pickadate('picker'),
2653
+ datepickerNode = datepickerApi.$node,
2654
+ datepickerRoot = datepickerApi.$root;
2655
+ datepickerApi.on({
2656
+ close: function close() {
2657
+ $$$1(document.activeElement).blur();
2658
+ },
2659
+ open: function open() {
2660
+ if (!$$$1('.picker__date-display', datepickerRoot).length) {
2661
+ that.display(datepickerApi, datepickerRoot, 'highlight');
2662
+ }
2663
+ },
2664
+ set: function set() {
2665
+ if (datepickerApi.get('select') !== null) {
2666
+ that.display(datepickerApi, datepickerRoot, 'select');
2667
+ }
2668
+ }
2669
+ });
2670
+ };
2671
+
2672
+ function Plugin(option) {
2673
+ return this.each(function () {
2674
+ var data = $$$1(this).data('bs.pickdate');
2675
+ var options = $$$1.extend({}, Datepicker.DEFAULTS, $$$1(this).data(), typeof option == 'object' && option);
2676
+
2677
+ if (!data) {
2678
+ $$$1(this).data('bs.pickdate', data = new Datepicker(this, options));
2679
+ }
2680
+
2681
+ data.show();
2682
+ });
2683
+ }
2684
+
2685
+ var old = $$$1.fn.pickdate;
2686
+ $$$1.fn.pickdate = Plugin;
2687
+ $$$1.fn.pickdate.Constructor = Datepicker;
2688
+
2689
+ $$$1.fn.pickdate.noConflict = function () {
2690
+ $$$1.fn.pickdate = old;
2691
+ return this;
2692
+ };
2693
+ })(jQuery);
2694
+
2695
+ /*
2696
+ * expansion panel
2697
+ * upon selecting the collapsed panel,
2698
+ * it expands to display in full
2699
+ */
2700
+
2701
+ var ExpansionPanel = function ($$$1) {
2702
+ // constants >>>
2703
+ var DATA_KEY = 'bs.collapse';
2704
+ var EVENT_KEY = "." + DATA_KEY;
2705
+ var ClassName = {
2706
+ SHOW: 'show',
2707
+ SHOW_PREDECESSOR: 'show-predecessor'
2708
+ };
2709
+ var Event = {
2710
+ HIDE: "hide" + EVENT_KEY,
2711
+ SHOW: "show" + EVENT_KEY
2712
+ };
2713
+ var Selector = {
2714
+ PANEL: '.expansion-panel',
2715
+ PANEL_BODY: '.expansion-panel .collapse' // <<< constants
2716
+
2717
+ };
2718
+ $$$1(document).on("" + Event.HIDE, Selector.PANEL_BODY, function (event) {
2719
+ var target = $$$1(event.target).closest(Selector.PANEL);
2720
+ target.removeClass(ClassName.SHOW);
2721
+ var predecessor = target.prev(Selector.PANEL);
2722
+
2723
+ if (predecessor.length) {
2724
+ predecessor.removeClass(ClassName.SHOW_PREDECESSOR);
2725
+ }
2726
+ }).on("" + Event.SHOW, Selector.PANEL_BODY, function (event) {
2727
+ var target = $$$1(event.target).closest(Selector.PANEL);
2728
+ target.addClass(ClassName.SHOW);
2729
+ var predecessor = target.prev(Selector.PANEL);
2730
+
2731
+ if (predecessor.length) {
2732
+ predecessor.addClass(ClassName.SHOW_PREDECESSOR);
2733
+ }
2734
+ });
2735
+ }($);
2736
+
2737
+ /*
2738
+ * floating label
2739
+ * when a user engages with the text input field,
2740
+ * the floating inline labels move to float above the field
2741
+ */
2742
+
2743
+ var FloatingLabel = function ($$$1) {
2744
+ // constants >>>
2745
+ var DATA_KEY = 'md.floatinglabel';
2746
+ var EVENT_KEY = "." + DATA_KEY;
2747
+ var NAME = 'floatinglabel';
2748
+ var NO_CONFLICT = $$$1.fn[NAME];
2749
+ var ClassName = {
2750
+ IS_FOCUSED: 'is-focused',
2751
+ HAS_VALUE: 'has-value'
2752
+ };
2753
+ var Event = {
2754
+ CHANGE: "change" + EVENT_KEY,
2755
+ FOCUSIN: "focusin" + EVENT_KEY,
2756
+ FOCUSOUT: "focusout" + EVENT_KEY
2757
+ };
2758
+ var Selector = {
2759
+ DATA_PARENT: '.floating-label',
2760
+ DATA_TOGGLE: '.floating-label .form-control' // <<< constants
2761
+
2762
+ };
2763
+
2764
+ var FloatingLabel =
2765
+ /*#__PURE__*/
2766
+ function () {
2767
+ function FloatingLabel(element) {
2768
+ this._element = element;
2769
+ }
2770
+
2771
+ var _proto = FloatingLabel.prototype;
2772
+
2773
+ _proto.change = function change(relatedTarget) {
2774
+ if ($$$1(this._element).val() || $$$1(this._element).is('select') && $$$1('option:first-child', $$$1(this._element)).html().replace(' ', '') !== '') {
2775
+ $$$1(relatedTarget).addClass(ClassName.HAS_VALUE);
2776
+ } else {
2777
+ $$$1(relatedTarget).removeClass(ClassName.HAS_VALUE);
2778
+ }
2779
+ };
2780
+
2781
+ _proto.focusin = function focusin(relatedTarget) {
2782
+ $$$1(relatedTarget).addClass(ClassName.IS_FOCUSED);
2783
+ };
2784
+
2785
+ _proto.focusout = function focusout(relatedTarget) {
2786
+ $$$1(relatedTarget).removeClass(ClassName.IS_FOCUSED);
2787
+ };
2788
+
2789
+ FloatingLabel._jQueryInterface = function _jQueryInterface(event) {
2790
+ return this.each(function () {
2791
+ var _event = event ? event : 'change';
2792
+
2793
+ var data = $$$1(this).data(DATA_KEY);
2794
+
2795
+ if (!data) {
2796
+ data = new FloatingLabel(this);
2797
+ $$$1(this).data(DATA_KEY, data);
2798
+ }
2799
+
2800
+ if (typeof _event === 'string') {
2801
+ if (data[_event] === 'undefined') {
2802
+ throw new Error("No method named \"" + _event + "\"");
2803
+ }
2804
+
2805
+ data[_event]($$$1(this).closest(Selector.DATA_PARENT));
2806
+ }
2807
+ });
2808
+ };
2809
+
2810
+ return FloatingLabel;
2811
+ }();
2812
+
2813
+ $$$1(document).on(Event.CHANGE + " " + Event.FOCUSIN + " " + Event.FOCUSOUT, Selector.DATA_TOGGLE, function (event) {
2814
+ FloatingLabel._jQueryInterface.call($$$1(this), event.type);
2815
+ });
2816
+ $$$1.fn[NAME] = FloatingLabel._jQueryInterface;
2817
+ $$$1.fn[NAME].Constructor = FloatingLabel;
2818
+
2819
+ $$$1.fn[NAME].noConflict = function () {
2820
+ $$$1.fn[NAME] = NO_CONFLICT;
2821
+ return FloatingLabel._jQueryInterface;
2822
+ };
2823
+
2824
+ return FloatingLabel;
2825
+ }($);
2826
+
2827
+ /*
2828
+ * global util js
2829
+ * based on bootstrap's (v4.0.0-beta) util.js
2830
+ */
2831
+
2832
+ var Util = function ($$$1) {
2833
+ var MAX_UID = 1000000;
2834
+ var transition = false;
2835
+
2836
+ function escapeId(selector) {
2837
+ selector = typeof $$$1.escapeSelector === 'function' ? $$$1.escapeSelector(selector).substr(1) : selector.replace(/(:|\.|\[|\]|,|=|@)/g, '\\$1');
2838
+ return selector;
2839
+ }
2840
+
2841
+ function getSpecialTransitionEndEvent() {
2842
+ return {
2843
+ bindType: transition.end,
2844
+ delegateType: transition.end,
2845
+ handle: function handle(event) {
2846
+ if ($$$1(event.target).is(this)) {
2847
+ return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
2848
+ }
2849
+
2850
+ return undefined; // eslint-disable-line no-undefined
2851
+ }
2852
+ };
2853
+ }
2854
+
2855
+ function setTransitionEndSupport() {
2856
+ transition = transitionEndTest();
2857
+ $$$1.fn.emulateTransitionEnd = transitionEndEmulator;
2858
+
2859
+ if (Util.supportsTransitionEnd()) {
2860
+ $$$1.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
2861
+ }
2862
+ }
2863
+
2864
+ function toType(obj) {
2865
+ return {}.toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
2866
+ }
2867
+
2868
+ function transitionEndEmulator(duration) {
2869
+ var _this = this;
2870
+
2871
+ var called = false;
2872
+ $$$1(this).one(Util.TRANSITION_END, function () {
2873
+ called = true;
2874
+ });
2875
+ setTimeout(function () {
2876
+ if (!called) {
2877
+ Util.triggerTransitionEnd(_this);
2878
+ }
2879
+ }, duration);
2880
+ return this;
2881
+ }
2882
+
2883
+ function transitionEndTest() {
2884
+ if (window.QUnit) {
2885
+ return false;
2886
+ }
2887
+
2888
+ return {
2889
+ end: 'transitionend'
2890
+ };
2891
+ }
2892
+
2893
+ var Util = {
2894
+ TRANSITION_END: 'mdTransitionEnd',
2895
+ getSelectorFromElement: function getSelectorFromElement(element) {
2896
+ var selector = element.getAttribute('data-target');
2897
+
2898
+ if (!selector || selector === '#') {
2899
+ selector = element.getAttribute('href') || '';
2900
+ }
2901
+
2902
+ if (selector.charAt(0) === '#') {
2903
+ selector = escapeId(selector);
2904
+ }
2905
+
2906
+ try {
2907
+ var $selector = $$$1(document).find(selector);
2908
+ return $selector.length > 0 ? selector : null;
2909
+ } catch (err) {
2910
+ return null;
2911
+ }
2912
+ },
2913
+ getUID: function getUID(prefix) {
2914
+ do {
2915
+ // eslint-disable-next-line no-bitwise
2916
+ prefix += ~~(Math.random() * MAX_UID);
2917
+ } while (document.getElementById(prefix));
2918
+
2919
+ return prefix;
2920
+ },
2921
+ isElement: function isElement(obj) {
2922
+ return (obj[0] || obj).nodeType;
2923
+ },
2924
+ reflow: function reflow(element) {
2925
+ return element.offsetHeight;
2926
+ },
2927
+ supportsTransitionEnd: function supportsTransitionEnd() {
2928
+ return Boolean(transition);
2929
+ },
2930
+ triggerTransitionEnd: function triggerTransitionEnd(element) {
2931
+ $$$1(element).trigger(transition.end);
2932
+ },
2933
+ typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
2934
+ for (var property in configTypes) {
2935
+ if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
2936
+ var expectedTypes = configTypes[property];
2937
+ var value = config[property];
2938
+ var valueType = value && Util.isElement(value) ? 'element' : toType(value);
2939
+
2940
+ if (!new RegExp(expectedTypes).test(valueType)) {
2941
+ throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
2942
+ }
2943
+ }
2944
+ }
2945
+ }
2946
+ };
2947
+ setTransitionEndSupport();
2948
+ return Util;
2949
+ }($);
2950
+
2951
+ /*
2952
+ * navigation drawer
2953
+ * based on bootstrap's (v4.0.0-beta) modal.js
2954
+ */
2955
+
2956
+ var NavDrawer = function ($$$1) {
2957
+ // constants >>>
2958
+ var DATA_API_KEY = '.data-api';
2959
+ var DATA_KEY = 'md.navdrawer';
2960
+ var ESCAPE_KEYCODE = 27;
2961
+ var EVENT_KEY = "." + DATA_KEY;
2962
+ var NAME = 'navdrawer';
2963
+ var NO_CONFLICT = $$$1.fn[NAME];
2964
+ var TRANSITION_DURATION = 292.5;
2965
+ var TRANSITION_DURATION_BACKDROP = 487.5;
2966
+ var ClassName = {
2967
+ BACKDROP: 'navdrawer-backdrop',
2968
+ OPEN: 'navdrawer-open',
2969
+ SHOW: 'show'
2970
+ };
2971
+ var Default = {
2972
+ breakpoint: 1280,
2973
+ keyboard: true,
2974
+ show: true,
2975
+ type: 'default'
2976
+ };
2977
+ var DefaultType = {
2978
+ keyboard: 'boolean',
2979
+ show: 'boolean',
2980
+ type: 'string'
2981
+ };
2982
+ var Event = {
2983
+ CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY,
2984
+ CLICK_DISMISS: "click.dismiss" + EVENT_KEY,
2985
+ FOCUSIN: "focusin" + EVENT_KEY,
2986
+ HIDDEN: "hidden" + EVENT_KEY,
2987
+ HIDE: "hide" + EVENT_KEY,
2988
+ KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY,
2989
+ MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY,
2990
+ MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY,
2991
+ SHOW: "show" + EVENT_KEY,
2992
+ SHOWN: "shown" + EVENT_KEY
2993
+ };
2994
+ var Selector = {
2995
+ CONTENT: '.navdrawer-content',
2996
+ DATA_DISMISS: '[data-dismiss="navdrawer"]',
2997
+ DATA_TOGGLE: '[data-toggle="navdrawer"]' // <<< constants
2998
+
2999
+ };
3000
+
3001
+ var NavDrawer =
3002
+ /*#__PURE__*/
3003
+ function () {
3004
+ function NavDrawer(element, config) {
3005
+ this._backdrop = null;
3006
+ this._config = this._getConfig(config);
3007
+ this._content = $$$1(element).find(Selector.CONTENT)[0];
3008
+ this._element = element;
3009
+ this._ignoreBackdropClick = false;
3010
+ this._isShown = false;
3011
+ }
3012
+
3013
+ var _proto = NavDrawer.prototype;
3014
+
3015
+ _proto.hide = function hide(event) {
3016
+ if (event) {
3017
+ event.preventDefault();
3018
+ }
3019
+
3020
+ var hideClassName = ClassName.OPEN + "-" + this._config.type;
3021
+ var hideEvent = $$$1.Event(Event.HIDE);
3022
+ $$$1(this._element).trigger(hideEvent);
3023
+
3024
+ if (!this._isShown || hideEvent.isDefaultPrevented()) {
3025
+ return;
3026
+ }
3027
+
3028
+ this._isShown = false;
3029
+
3030
+ this._setEscapeEvent();
3031
+
3032
+ $$$1(document).off(Event.FOCUSIN);
3033
+ $$$1(this._content).off(Event.MOUSEDOWN_DISMISS);
3034
+ $$$1(this._element).off(Event.CLICK_DISMISS).removeClass(ClassName.SHOW);
3035
+
3036
+ this._hideNavdrawer(hideClassName);
3037
+ };
3038
+
3039
+ _proto.show = function show(relatedTarget) {
3040
+ var _this = this;
3041
+
3042
+ var showEvent = $$$1.Event(Event.SHOW, {
3043
+ relatedTarget: relatedTarget
3044
+ });
3045
+ $$$1(this._element).trigger(showEvent);
3046
+
3047
+ if (this._isShown || showEvent.isDefaultPrevented()) {
3048
+ return;
3049
+ }
3050
+
3051
+ this._isShown = true;
3052
+ $$$1(document.body).addClass(ClassName.OPEN + "-" + this._config.type);
3053
+
3054
+ this._setEscapeEvent();
3055
+
3056
+ $$$1(this._element).addClass(NAME + "-" + this._config.type);
3057
+ $$$1(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, $$$1.proxy(this.hide, this));
3058
+ $$$1(this._content).on(Event.MOUSEDOWN_DISMISS, function () {
3059
+ $$$1(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
3060
+ if ($$$1(event.target).is(_this._element)) {
3061
+ _this._ignoreBackdropClick = true;
3062
+ }
3063
+ });
3064
+ });
3065
+
3066
+ this._showBackdrop();
3067
+
3068
+ this._showElement(relatedTarget);
3069
+ };
3070
+
3071
+ _proto.toggle = function toggle(relatedTarget) {
3072
+ return this._isShown ? this.hide() : this.show(relatedTarget);
3073
+ };
3074
+
3075
+ _proto._enforceFocus = function _enforceFocus() {
3076
+ var _this2 = this;
3077
+
3078
+ $$$1(document).off(Event.FOCUSIN).on(Event.FOCUSIN, function (event) {
3079
+ if (_this2._config.type === 'default' || $$$1(window).width() <= _this2._config.breakpoint) {
3080
+ if (_this2._element !== event.target && !$$$1(_this2._element).has(event.target).length) {
3081
+ _this2._element.focus();
3082
+ }
3083
+ }
3084
+ });
3085
+ };
3086
+
3087
+ _proto._getConfig = function _getConfig(config) {
3088
+ config = $$$1.extend({}, Default, config);
3089
+ Util.typeCheckConfig(NAME, config, DefaultType);
3090
+ return config;
3091
+ };
3092
+
3093
+ _proto._hideNavdrawer = function _hideNavdrawer(className) {
3094
+ var _this3 = this;
3095
+
3096
+ this._showBackdrop(function () {
3097
+ $$$1(document.body).removeClass(className);
3098
+
3099
+ _this3._element.setAttribute('aria-hidden', 'true');
3100
+
3101
+ _this3._element.style.display = 'none';
3102
+ $$$1(_this3._element).trigger(Event.HIDDEN);
3103
+ });
3104
+ };
3105
+
3106
+ _proto._removeBackdrop = function _removeBackdrop() {
3107
+ if (this._backdrop) {
3108
+ $$$1(this._backdrop).remove();
3109
+ this._backdrop = null;
3110
+ }
3111
+ };
3112
+
3113
+ _proto._setEscapeEvent = function _setEscapeEvent() {
3114
+ var _this4 = this;
3115
+
3116
+ if (this._isShown && this._config.keyboard) {
3117
+ $$$1(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
3118
+ if (event.which === ESCAPE_KEYCODE) {
3119
+ _this4.hide();
3120
+ }
3121
+ });
3122
+ } else if (!this._isShown) {
3123
+ $$$1(this._element).off(Event.KEYDOWN_DISMISS);
3124
+ }
3125
+ };
3126
+
3127
+ _proto._showBackdrop = function _showBackdrop(callback) {
3128
+ var _this5 = this;
3129
+
3130
+ var supportsTransition = Util.supportsTransitionEnd();
3131
+
3132
+ if (this._isShown) {
3133
+ this._backdrop = document.createElement('div');
3134
+ $$$1(this._backdrop).addClass(ClassName.BACKDROP).addClass(ClassName.BACKDROP + "-" + this._config.type).appendTo(document.body);
3135
+ $$$1(this._element).on(Event.CLICK_DISMISS, function (event) {
3136
+ if (_this5._ignoreBackdropClick) {
3137
+ _this5._ignoreBackdropClick = false;
3138
+ return;
3139
+ }
3140
+
3141
+ if (event.target !== event.currentTarget) {
3142
+ return;
3143
+ }
3144
+
3145
+ _this5.hide();
3146
+ });
3147
+
3148
+ if (supportsTransition) {
3149
+ Util.reflow(this._backdrop);
3150
+ }
3151
+
3152
+ $$$1(this._backdrop).addClass(ClassName.SHOW);
3153
+
3154
+ if (!callback) {
3155
+ return;
3156
+ }
3157
+
3158
+ if (!supportsTransition) {
3159
+ callback();
3160
+ return;
3161
+ }
3162
+
3163
+ $$$1(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(TRANSITION_DURATION_BACKDROP);
3164
+ } else if (this._backdrop && !this._isShown) {
3165
+ $$$1(this._backdrop).removeClass(ClassName.SHOW);
3166
+
3167
+ var callbackRemove = function callbackRemove() {
3168
+ _this5._removeBackdrop();
3169
+
3170
+ if (callback) {
3171
+ callback();
3172
+ }
3173
+ };
3174
+
3175
+ if (supportsTransition) {
3176
+ $$$1(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(TRANSITION_DURATION_BACKDROP);
3177
+ } else {
3178
+ callbackRemove();
3179
+ }
3180
+ } else if (callback) {
3181
+ callback();
3182
+ }
3183
+ };
3184
+
3185
+ _proto._showElement = function _showElement(relatedTarget) {
3186
+ var _this6 = this;
3187
+
3188
+ var supportsTransition = Util.supportsTransitionEnd();
3189
+
3190
+ if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
3191
+ document.body.appendChild(this._element);
3192
+ }
3193
+
3194
+ this._element.removeAttribute('aria-hidden');
3195
+
3196
+ this._element.style.display = 'block';
3197
+
3198
+ if (supportsTransition) {
3199
+ Util.reflow(this._element);
3200
+ }
3201
+
3202
+ $$$1(this._element).addClass(ClassName.SHOW);
3203
+
3204
+ this._enforceFocus();
3205
+
3206
+ var shownEvent = $$$1.Event(Event.SHOWN, {
3207
+ relatedTarget: relatedTarget
3208
+ });
3209
+
3210
+ var transitionComplete = function transitionComplete() {
3211
+ _this6._element.focus();
3212
+
3213
+ $$$1(_this6._element).trigger(shownEvent);
3214
+ };
3215
+
3216
+ if (supportsTransition) {
3217
+ $$$1(this._content).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);
3218
+ } else {
3219
+ transitionComplete();
3220
+ }
3221
+ };
3222
+
3223
+ NavDrawer._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
3224
+ return this.each(function () {
3225
+ var _config = $$$1.extend({}, NavDrawer.Default, $$$1(this).data(), typeof config === 'object' && config);
3226
+
3227
+ var data = $$$1(this).data(DATA_KEY);
3228
+
3229
+ if (!data) {
3230
+ data = new NavDrawer(this, _config);
3231
+ $$$1(this).data(DATA_KEY, data);
3232
+ }
3233
+
3234
+ if (typeof config === 'string') {
3235
+ if (data[config] === 'undefined') {
3236
+ throw new Error("No method named \"" + config + "\"");
3237
+ }
3238
+
3239
+ data[config](relatedTarget);
3240
+ } else if (_config.show) {
3241
+ data.show(relatedTarget);
3242
+ }
3243
+ });
3244
+ };
3245
+
3246
+ _createClass(NavDrawer, null, [{
3247
+ key: "Default",
3248
+ get: function get() {
3249
+ return Default;
3250
+ }
3251
+ }]);
3252
+ return NavDrawer;
3253
+ }();
3254
+
3255
+ $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
3256
+ var _this7 = this;
3257
+
3258
+ var selector = Util.getSelectorFromElement(this);
3259
+ var target;
3260
+
3261
+ if (selector) {
3262
+ target = $$$1(selector)[0];
3263
+ }
3264
+
3265
+ var config = $$$1(target).data(DATA_KEY) ? 'toggle' : $$$1.extend({}, $$$1(target).data(), $$$1(this).data());
3266
+
3267
+ if (this.tagName === 'A') {
3268
+ event.preventDefault();
3269
+ }
3270
+
3271
+ var $target = $$$1(target).one(Event.SHOW, function (showEvent) {
3272
+ if (showEvent.isDefaultPrevented()) {
3273
+ return;
3274
+ }
3275
+
3276
+ $target.one(Event.HIDDEN, function () {
3277
+ if ($$$1(_this7).is(':visible')) {
3278
+ _this7.focus();
3279
+ }
3280
+ });
3281
+ });
3282
+
3283
+ NavDrawer._jQueryInterface.call($$$1(target), config, this);
3284
+ });
3285
+ $$$1.fn[NAME] = NavDrawer._jQueryInterface;
3286
+ $$$1.fn[NAME].Constructor = NavDrawer;
3287
+
3288
+ $$$1.fn[NAME].noConflict = function () {
3289
+ $$$1.fn[NAME] = NO_CONFLICT;
3290
+ return NavDrawer._jQueryInterface;
3291
+ };
3292
+
3293
+ return NavDrawer;
3294
+ }($);
3295
+
3296
+ /*
3297
+ * selection control focus
3298
+ * chrome persists the focus style on checkboxes/radio buttons after clicking
3299
+ */
3300
+
3301
+ var SelectionControlFocus = function ($$$1) {
3302
+ // constants >>>
3303
+ var DATA_KEY = 'md.selectioncontrolfocus';
3304
+ var EVENT_KEY = "." + DATA_KEY;
3305
+ var ClassName = {
3306
+ FOCUS: 'focus'
3307
+ };
3308
+ var LastInteraction = {
3309
+ IS_MOUSEDOWN: false
3310
+ };
3311
+ var Event = {
3312
+ BLUR: "blur" + EVENT_KEY,
3313
+ FOCUS: "focus" + EVENT_KEY,
3314
+ MOUSEDOWN: "mousedown" + EVENT_KEY,
3315
+ MOUSEUP: "mouseup" + EVENT_KEY
3316
+ };
3317
+ var Selector = {
3318
+ CONTROL: '.custom-control',
3319
+ INPUT: '.custom-control-input' // <<< constants
3320
+
3321
+ };
3322
+ $$$1(document).on("" + Event.BLUR, Selector.INPUT, function (event) {
3323
+ $$$1(event.target).removeClass(ClassName.FOCUS);
3324
+ }).on("" + Event.FOCUS, Selector.INPUT, function (event) {
3325
+ if (LastInteraction.IS_MOUSEDOWN === false) {
3326
+ $$$1(event.target).addClass(ClassName.FOCUS);
3327
+ }
3328
+ }).on("" + Event.MOUSEDOWN, Selector.CONTROL, function () {
3329
+ LastInteraction.IS_MOUSEDOWN = true;
3330
+ }).on("" + Event.MOUSEUP, Selector.CONTROL, function () {
3331
+ setTimeout(function () {
3332
+ LastInteraction.IS_MOUSEDOWN = false;
3333
+ }, 1);
3334
+ });
3335
+ }($);
3336
+
3337
+ /*
3338
+ * tab indicator animation
3339
+ * requires bootstrap's (v4.0.0-beta) tab.js
3340
+ */
3341
+
3342
+ var TabSwitch = function ($$$1) {
3343
+ // constants >>>
3344
+ var DATA_KEY = 'md.tabswitch';
3345
+ var NAME = 'tabswitch';
3346
+ var NO_CONFLICT = $$$1.fn[NAME];
3347
+ var TRANSITION_DURATION = 390;
3348
+ var ClassName = {
3349
+ ANIMATE: 'animate',
3350
+ DROPDOWN_ITEM: 'dropdown-item',
3351
+ INDICATOR: 'nav-tabs-indicator',
3352
+ MATERIAL: 'nav-tabs-material',
3353
+ SCROLLABLE: 'nav-tabs-scrollable',
3354
+ SHOW: 'show'
3355
+ };
3356
+ var Event = {
3357
+ SHOW_BS_TAB: 'show.bs.tab'
3358
+ };
3359
+ var Selector = {
3360
+ DATA_TOGGLE: '.nav-tabs [data-toggle="tab"]',
3361
+ DROPDOWN: '.dropdown',
3362
+ NAV: '.nav-tabs' // <<< constants
3363
+
3364
+ };
3365
+
3366
+ var TabSwitch =
3367
+ /*#__PURE__*/
3368
+ function () {
3369
+ function TabSwitch(nav) {
3370
+ if (typeof $$$1.fn.tab === 'undefined') {
3371
+ throw new Error('Material\'s JavaScript requires Bootstrap\'s tab.js');
3372
+ }
3373
+
3374
+ this._nav = nav;
3375
+ this._navindicator = null;
3376
+ }
3377
+
3378
+ var _proto = TabSwitch.prototype;
3379
+
3380
+ _proto.switch = function _switch(element, relatedTarget) {
3381
+ var _this = this;
3382
+
3383
+ var navLeft = $$$1(this._nav).offset().left;
3384
+ var navScrollLeft = $$$1(this._nav).scrollLeft();
3385
+ var navWidth = $$$1(this._nav).outerWidth();
3386
+ var supportsTransition = Util.supportsTransitionEnd();
3387
+
3388
+ if (!this._navindicator) {
3389
+ this._createIndicator(navLeft, navScrollLeft, navWidth, relatedTarget);
3390
+ }
3391
+
3392
+ if ($$$1(element).hasClass(ClassName.DROPDOWN_ITEM)) {
3393
+ element = $$$1(element).closest(Selector.DROPDOWN);
3394
+ }
3395
+
3396
+ var elLeft = $$$1(element).offset().left;
3397
+ var elWidth = $$$1(element).outerWidth();
3398
+ $$$1(this._navindicator).addClass(ClassName.SHOW);
3399
+ Util.reflow(this._navindicator);
3400
+
3401
+ if (supportsTransition) {
3402
+ $$$1(this._nav).addClass(ClassName.ANIMATE);
3403
+ }
3404
+
3405
+ $$$1(this._navindicator).css({
3406
+ left: elLeft + navScrollLeft - navLeft,
3407
+ right: navWidth - (elLeft + navScrollLeft - navLeft + elWidth)
3408
+ });
3409
+
3410
+ var complete = function complete() {
3411
+ $$$1(_this._nav).removeClass(ClassName.ANIMATE);
3412
+ $$$1(_this._navindicator).removeClass(ClassName.SHOW);
3413
+ };
3414
+
3415
+ if (!supportsTransition) {
3416
+ complete();
3417
+ return;
3418
+ }
3419
+
3420
+ $$$1(this._navindicator).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
3421
+ };
3422
+
3423
+ _proto._createIndicator = function _createIndicator(navLeft, navScrollLeft, navWidth, relatedTarget) {
3424
+ this._navindicator = document.createElement('div');
3425
+ $$$1(this._navindicator).addClass(ClassName.INDICATOR).appendTo(this._nav);
3426
+
3427
+ if (relatedTarget !== 'undefined') {
3428
+ if ($$$1(relatedTarget).hasClass(ClassName.DROPDOWN_ITEM)) {
3429
+ relatedTarget = $$$1(relatedTarget).closest(Selector.DROPDOWN);
3430
+ }
3431
+
3432
+ var relatedLeft = $$$1(relatedTarget).offset().left;
3433
+ var relatedWidth = $$$1(relatedTarget).outerWidth();
3434
+ $$$1(this._navindicator).css({
3435
+ left: relatedLeft + navScrollLeft - navLeft,
3436
+ right: navWidth - (relatedLeft + navScrollLeft - navLeft + relatedWidth)
3437
+ });
3438
+ }
3439
+
3440
+ $$$1(this._nav).addClass(ClassName.MATERIAL);
3441
+ };
3442
+
3443
+ TabSwitch._jQueryInterface = function _jQueryInterface(relatedTarget) {
3444
+ return this.each(function () {
3445
+ var nav = $$$1(this).closest(Selector.NAV)[0];
3446
+
3447
+ if (!nav) {
3448
+ return;
3449
+ }
3450
+
3451
+ var data = $$$1(nav).data(DATA_KEY);
3452
+
3453
+ if (!data) {
3454
+ data = new TabSwitch(nav);
3455
+ $$$1(nav).data(DATA_KEY, data);
3456
+ }
3457
+
3458
+ data.switch(this, relatedTarget);
3459
+ });
3460
+ };
3461
+
3462
+ return TabSwitch;
3463
+ }();
3464
+
3465
+ $$$1(document).on(Event.SHOW_BS_TAB, Selector.DATA_TOGGLE, function (event) {
3466
+ TabSwitch._jQueryInterface.call($$$1(event.target), event.relatedTarget);
3467
+ });
3468
+ $$$1.fn[NAME] = TabSwitch._jQueryInterface;
3469
+ $$$1.fn[NAME].Constructor = TabSwitch;
3470
+
3471
+ $$$1.fn[NAME].noConflict = function () {
3472
+ $$$1.fn[NAME] = NO_CONFLICT;
3473
+ return TabSwitch._jQueryInterface;
3474
+ };
3475
+
3476
+ return TabSwitch;
3477
+ }($);
3478
+
3479
+ // Extend third party JavaScript
3480
+
3481
+ exports.Util = Util;
3482
+ exports.ExpansionPanel = ExpansionPanel;
3483
+ exports.FloatingLabel = FloatingLabel;
3484
+ exports.NavDrawer = NavDrawer;
3485
+ exports.SelectionControlFocus = SelectionControlFocus;
3486
+ exports.TabSwitch = TabSwitch;
3487
+
3488
+ Object.defineProperty(exports, '__esModule', { value: true });
1035
3489
 
1036
- return Util;
1037
- }(jQuery);
1038
- }();
3490
+ })));
3491
+ //# sourceMappingURL=material.js.map