"use strict"; var version = "1.1.0"; var namespace = "yearpicker"; if (!jQuery) { alert(namespace + " " + version + " requires jQuery"); } var defaults = { // The Initial Date year: null, // Start Date startYear: null, // End Date endYear: null, // A element tag items itemTag: "li", //css class selected date item selectedClass: "selected", // css class disabled disabledClass: "disabled", hideClass: "hide", template: "
\n
\n
이전
\n
SelectedYear
\n
다음
\n
\n
\n\n
\n
\n", // Event shortcuts onShow: null, onHide: null, onChange: null }; var event_click = "click."; var event_focus = "focus."; var event_keyup = "keyup."; var event_selected = "selected."; var event_show = "show."; var event_hide = "hide."; var methods = { // Show datepicker showView: function showView() { var $this = this; if (!$this.build) { $this.init(); } if ($this.show) { return; } $this.show = true; var $template = $this.$template, options = $this.options; $template.removeClass(options.hideClass).on(event_click, $.proxy($this.click, $this)); $(document).on(event_click, this.onGlobalClick = $.proxy($this.globalClick, $this)); if (options.onShow && $.isFunction(options.onShow)) { options.onShow($this.year); } }, // Hide the datepicker hideView: function hideView() { var $this = this; if (!$this.show) { return; } // if ($this.trigger(event_hide).isDefaultPrevented()) { // return; // } var $template = $this.$template, options = $this.options; $template.addClass(options.hideClass).off(event_click, $this.click); $(document).off(event_click, $this.onGlobalClick); $this.show = false; if (options.onHide && $.isFunction(options.onHide)) { options.onHide($this.year); } }, // toggle show and hide toggle: function toggle() { if (this.show) { this.hideView(); } else { this.show(); } } }; var handlers = { click: function click(e) { var $target = $(e.target), viewYear = this.viewYear; if ($target.hasClass("disabled")) { return; } var view = $target.data("view"); switch (view) { case "yearpicker-prev": var year = viewYear - 12; this.viewYear = year; this.renderYear(); break; case "yearpicker-next": var year = viewYear + 12; this.viewYear = year; this.renderYear(); break; case "yearpicker-items": this.year = parseInt($target.html()); this.renderYear(); this.hideView(); break; default: break; } }, globalClick: function globalClick(_ref) { var target = _ref.target; var element = this.element; var hidden = true; if (target !== document) { while (target === element || $(target).closest(".yearpicker-header").length === 1) { hidden = false; break; } target = target.parentNode; } if (hidden) { this.hideView(); } } }; var render = { renderYear: function renderYear() { var $this = this, options = this.options, startYear = options.startYear, endYear = options.endYear; var disabledClass = options.disabledClass, viewYear = $this.viewYear, selectedYear = ($this.year == null) ? '선택' : $this.year, now = new Date(), thisYear = now.getFullYear(), start = -5, end = 6, items = []; var prevDisabled = false; var nextDisabled = false; var i = void 0; for (i = start; i <= end; i++) { var year = viewYear + i; var disabled = false; if (startYear) { disabled = year < startYear; if (i === start) { prevDisabled = disabled; } } if (!disabled && endYear) { disabled = year > endYear; if (i === end) { nextDisabled = disabled; } } // check for this is a selected year var isSelectedYear = year === selectedYear; var view = isSelectedYear ? "yearpicker-items" : "yearpicker-items"; items.push($this.createItem({ selected: isSelectedYear, disabled: disabled, text: viewYear + i, //view: disabled ? "yearpicker disabled" : view, view: disabled ? "yearpicker-items disabled" : view, highlighted: year === thisYear })); } $this.yearsPrev.toggleClass(disabledClass, prevDisabled); $this.yearsNext.toggleClass(disabledClass, nextDisabled); $this.yearsCurrent.html(selectedYear); $this.yearsBody.html(items.join(" ")); $this.setValue(); } }; var Yearpicker = function () { function YearPicker(element, options) { var $this = this; $this.options = $.extend({}, defaults, options); $this.$element = $(element); $this.element = element; $this.build = false; $this.show = false; $this.startYear = null; $this.endYear = null; $this.$template = $($this.options.template); $this.init(); } YearPicker.prototype = { /** * constructor * configure the yearpicker before initialize * @returns {null} */ init: function init() { var $this = this, $element = this.$element, options = this.options; if (this.build) { return; } $this.build = true; var startYear = options.startYear, endYear = options.endYear, defaultYear = $this.getValue(), $template = $this.$template; var year = options.year; $this.isInput = $element.is("input") || $element.is("textarea"); $this.initialValue = defaultYear; $this.oldValue = defaultYear; var currentYear = new Date().getFullYear(); // set the defaultyear year = year || defaultYear || null; // set the startyear if (startYear) { if (year && year < startYear) { year = startYear; } $this.startYear = startYear; } // set the endyear if (endYear) { if (year && year > endYear) { year = endYear; } $this.endYear = endYear; } $this.year = year; $this.viewYear = year || currentYear; $this.initialYear = year || currentYear; $this.bind(); $this.yearsPrev = $template.find(".yearpicker-prev"); $this.yearsCurrent = $template.find(".yearpicker-current"); $this.yearsNext = $template.find(".yearpicker-next"); $this.yearsBody = $template.find(".yearpicker-year"); $template.addClass(options.hideClass); $element.after($template.addClass(namespace + "-dropdown")); $this.renderYear(); }, // assign a events bind: function bind() { var $this = this, $element = this.$element, options = this.options; if ($.isFunction(options.show)) { $element.on(event_show, options.show); } if ($.isFunction(options.hide)) { $element.on(event_hide, options.hide); } if ($.isFunction(options.click)) { $element.on(event_click, options.click); } if ($this.isInput) { $element.on(event_focus, $.proxy($this.showView, $this)); } else { $element.on(event_click, $.proxy($this.showView, $this)); } }, getValue: function getValue() { var $this = this, $element = this.$element; var value = $this.isInput ? $element.val() : $element.text(); return parseInt(value); }, setValue: function setValue() { var $this = this, $element = this.$element, options = this.options, value = this.year; var previousValue = $this.isInput ? $element.val() : $element.text(); if ($this.isInput) { $element.val(value); } else { $element.html(value); } if (previousValue != value) { if (options.onChange && $.isFunction(options.onChange)) { options.onChange($this.year); } } $element.trigger("change"); }, trigger: function trigger(type, data) { data = data || this.year; var e = $.Event(type, data); this.$element.trigger(e); return e; }, createItem: function createItem(data) { var options = this.options, itemTag = options.itemTag, classes = []; var items = { text: "", view: "", selected: false, disabled: false, highlighted: false }; $.extend(items, data); if (items.selected) { classes.push(options.selectedClass); } if (items.disabled) { classes.push(options.disabledClass); } return "<" + itemTag + " class=\"" + items.view + " " + classes.join(" ") + "\" data-view=\"" + items.view + "\">" + items.text + ""; } }; return YearPicker; }(); if ($.extend) { $.extend(Yearpicker.prototype, methods, render, handlers); } if ($.fn) { $.fn.yearpicker = function jQueryYearpicker(options) { var result = void 0; this.each(function (index, element) { var $element = $(element); var isDestory = options === "destroy"; var yearpicker = $element.data(namespace); if (!yearpicker) { if (isDestory) { return; } yearpicker = new Yearpicker(element, options); $element.data(namespace, yearpicker); } if (typeof options === "string") { var fn = yearpicker[options]; if ($.isFunction(fn)) { result = fn.apply(yearpicker, args); if (isDestory) { $element.removeData(namespace); } } } }); return !result ? result : this; }; $.fn.yearpicker.constractor = Yearpicker; }