! function($, window, document) { "use strict"; function Wickedpicker(e, t) { this.element = $(e), this.options = $.extend({}, defaults, t), this.element.addClass("hasWickedpicker"), this.element.attr("onkeypress", "return false;"), this.element.attr("aria-showingpicker", "false"), this.createPicker(), this.timepicker = $(".wickedpicker"), this.up = $("." + this.options.upArrow.split(/\s+/) .join(".")), this.down = $("." + this.options.downArrow.split(/\s+/) .join(".")), this.separator = $(".wickedpicker__controls__control--separator"), this.hoursElem = $(".wickedpicker__controls__control--hours"), this.minutesElem = $(".wickedpicker__controls__control--minutes"), this.secondsElem = $(".wickedpicker__controls__control--seconds"), this.meridiemElem = $(".wickedpicker__controls__control--meridiem"), this.close = $("." + this.options.close.split(/\s+/) .join(".")); var i = this.timeArrayFromString(this.options.now); this.options.now = new Date(today.getFullYear(), today.getMonth(), today.getDate(), i[0], i[1], i[2]), this.selectedHour = this.parseHours(this.options.now.getHours()), this.selectedMin = this.parseSecMin(this.options.now.getMinutes()), this.selectedSec = this.parseSecMin(this.options.now.getSeconds()), this.selectedMeridiem = this.parseMeridiem(this.options.now.getHours()), this.setHoverState(), this.attach(e), this.setText(e) } "function" != typeof String.prototype.endsWith && (String.prototype.endsWith = function(e) { return e.length > 0 && this.substring(this.length - e.length, this.length) === e }); var isMobile = function() { return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) }, today = new Date, pluginName = "wickedpicker", defaults = { now: today.getHours() + ":" + today.getMinutes(), twentyFour: !1, upArrow: "wickedpicker__controls__control-up", downArrow: "wickedpicker__controls__control-down", close: "wickedpicker__close", hoverState: "hover-state", title: "Timepicker", showSeconds: !1, timeSeparator: " : ", secondsInterval: 1, minutesInterval: 1, beforeShow: null, afterShow: null, show: null, clearable: !1, closeOnClickOutside: !0, onClickOutside: function() {} }; $.extend(Wickedpicker.prototype, { showPicker: function(e) { "function" == typeof this.options.beforeShow && this.options.beforeShow(e, this.timepicker); var t = $(e) .offset(); if($(e) .attr({ "aria-showingpicker": "true", tabindex: -1 }), this.setText(e), this.showHideMeridiemControl(), this.getText(e) !== this.getTime()) { var i = this.getText(e), s = /\s[ap]m$/i, o = s.test(i) ? i.substr(-2, 2) : null, n = i.replace(s, "") .split(this.options.timeSeparator), r = {}; r.hours = n[0], r.minutes = n[1], r.meridiem = o, this.options.showSeconds && (r.seconds = n[2]), this.setTime(r) } this.timepicker.css({ "z-index": this.element.css("z-index") + 1, position: "absolute", left: t.left, top: t.top + $(e)[0].offsetHeight }) .show(), "function" == typeof this.options.show && this.options.show(e, this.timepicker), this.handleTimeAdjustments(e) }, hideTimepicker: function(e) { this.timepicker.hide(), "function" == typeof this.options.afterShow && this.options.afterShow(e, this.timepicker), { start: function() { var e = $.Deferred(); return $('[aria-showingpicker="true"]') .attr("aria-showingpicker", "false"), e.promise() } }.start() .then(function(e) { setTimeout(function() { $('[aria-showingpicker="false"]') .attr("tabindex", e) }, 400) }(0)) }, createPicker: function() { if(0 === $(".wickedpicker") .length) { var e = '

' + this.options.title + '

', $("body") .append(e), this.attachKeyboardEvents() } }, showHideMeridiemControl: function() { !1 === this.options.twentyFour ? $(this.meridiemElem) .parent() .show() : $(this.meridiemElem) .parent() .hide() }, showHideSecondsControl: function() { this.options.showSeconds ? $(this.secondsElem) .parent() .show() : $(this.secondsElem) .parent() .hide() }, attach: function(e) { var t = this; this.options.clearable && t.makePickerInputClearable(e), $(e) .attr("tabindex", 0), $(e) .on("click focus", function(e) { $(t.timepicker) .is(":hidden") && (t.showPicker($(this)), window.lastTimePickerControl = $(this), $(t.hoursElem) .focus()) }); var i = function(e) { if($(t.timepicker) .is(":visible")) { if($(e.target) .is(t.close)) t.hideTimepicker(window.lastTimePickerControl); else if($(e.target) .closest(t.timepicker) .length || $(e.target) .closest($(".hasWickedpicker")) .length) e.stopPropagation(); else { if("function" == typeof t.options.onClickOutside ? t.options.onClickOutside() : console.warn("Type of onClickOutside must be a function"), !t.options.closeOnClickOutside) return; t.hideTimepicker(window.lastTimePickerControl) } window.lastTimePickerControl = null } }; $(document) .off("click", i) .on("click", i) }, attachKeyboardEvents: function() { $(document) .on("keydown", $.proxy(function(e) { switch(e.keyCode) { case 9: "hasWickedpicker" !== e.target.className && $(this.close) .trigger("click"); break; case 27: $(this.close) .trigger("click"); break; case 37: e.target.className !== this.hoursElem[0].className ? $(e.target) .parent() .prevAll("li") .not(this.separator.selector) .first() .children()[1].focus() : $(e.target) .parent() .siblings(":last") .children()[1].focus(); break; case 39: e.target.className !== this.meridiemElem[0].className ? $(e.target) .parent() .nextAll("li") .not(this.separator.selector) .first() .children()[1].focus() : $(e.target) .parent() .siblings(":first") .children()[1].focus(); break; case 38: $(":focus") .prev() .trigger("click"); break; case 40: $(":focus") .next() .trigger("click") } }, this)) }, setTime: function(e) { this.setHours(e.hours), this.setMinutes(e.minutes), this.setMeridiem(e.meridiem), this.options.showSeconds && this.setSeconds(e.seconds) }, getTime: function() { return [this.formatTime(this.getHours(), this.getMinutes(), this.getMeridiem(), this.getSeconds())] }, setHours: function(e) { var t = new Date; t.setHours(e); var i = this.parseHours(t.getHours()); this.hoursElem.text(i), this.selectedHour = i }, getHours: function() { var e = new Date; return e.setHours(this.hoursElem.text()), e.getHours() }, parseHours: function(e) { return !1 === this.options.twentyFour ? (e + 11) % 12 + 1 : e < 10 ? "0" + e : e }, setMinutes: function(e) { var t = new Date; t.setMinutes(e); var i = t.getMinutes(), s = this.parseSecMin(i); this.minutesElem.text(s), this.selectedMin = s }, getMinutes: function() { var e = new Date; return e.setMinutes(this.minutesElem.text()), e.getMinutes() }, parseSecMin: function(e) { return (e < 10 ? "0" : "") + e }, setMeridiem: function(e) { var t = ""; t = void 0 === e ? "PM" === this.getMeridiem() ? "AM" : "PM" : e, this.meridiemElem.text(t), this.selectedMeridiem = t }, getMeridiem: function() { return this.meridiemElem.text() }, setSeconds: function(e) { var t = new Date; t.setSeconds(e); var i = t.getSeconds(), s = this.parseSecMin(i); this.secondsElem.text(s), this.selectedSec = s }, getSeconds: function() { var e = new Date; return e.setSeconds(this.secondsElem.text()), e.getSeconds() }, parseMeridiem: function(e) { return e > 11 ? "PM" : "AM" }, handleTimeAdjustments: function(e) { var t = 0; $(this.up) .add(this.down) .off("mousedown click touchstart") .on("mousedown click", { Wickedpicker: this, input: e }, function(e) { if(1 != e.which) return !1; var i = this.className.indexOf("up") > -1 ? "+" : "-", s = e.data; "mousedown" == e.type ? t = setInterval($.proxy(function(e) { e.Wickedpicker.changeValue(i, e.input, this) }, this, { Wickedpicker: s.Wickedpicker, input: s.input }), 200) : s.Wickedpicker.changeValue(i, s.input, this) }) .bind("mouseup touchend", function() { clearInterval(t) }) }, changeValue: function(operator, input, clicked) { var target = "+" === operator ? clicked.nextSibling : clicked.previousSibling, targetClass = $(target) .attr("class"); targetClass.endsWith("hours") ? this.setHours(eval(this.getHours() + operator + 1)) : targetClass.endsWith("minutes") ? this.setMinutes(eval(this.getMinutes() + operator + this.options.minutesInterval)) : targetClass.endsWith("seconds") ? this.setSeconds(eval(this.getSeconds() + operator + this.options.secondsInterval)) : this.setMeridiem(), this.setText(input) }, setText: function(e) { $(e) .val(this.formatTime(this.selectedHour, this.selectedMin, this.selectedMeridiem, this.selectedSec)) .change() }, getText: function(e) { return $(e) .val() }, formatTime: function(e, t, i, s) { var o = e + this.options.timeSeparator + t; return this.options.showSeconds && (o += this.options.timeSeparator + s), !1 === this.options.twentyFour && (o += " " + i), o }, setHoverState: function() { var e = this; isMobile() || $(this.up) .add(this.down) .add(this.close) .hover(function() { $(this) .toggleClass(e.options.hoverState) }) }, makePickerInputClearable: function(e) { $(e) .wrap('
') .after("×"), $("[data-clear-picker]") .on("click", function(e) { $(this) .siblings(".hasWickedpicker") .val("") }) }, timeArrayFromString: function(e) { if(e.length) { var t = e.split(":"); return t[2] = t.length < 3 ? "00" : t[2], t } return !1 }, _time: function() { var e = $(this.element) .val(); return "" === e ? this.formatTime(this.selectedHour, this.selectedMin, this.selectedMeridiem, this.selectedSec) : e }, _hide: function() { this.hideTimepicker(this.element) } }), $.fn[pluginName] = function(e, t) { return $.isFunction(Wickedpicker.prototype["_" + e]) ? $(this) .hasClass("hasWickedpicker") ? void 0 !== t ? $.data($(this)[t], "plugin_" + pluginName)["_" + e]() : $.data($(this)[0], "plugin_" + pluginName)["_" + e]() : void 0 : this.each(function() { $.data(this, "plugin_" + pluginName) || $.data(this, "plugin_" + pluginName, new Wickedpicker(this, e)) }) } }(jQuery, window, document);