$(function () { $(document).trigger('DOMChange'); }); $(document).on('DOMChange', function () { inicialize($('.datePickerFacade'), function ($elements) { $elements.c_ultraDatePicker(); }); inicialize($('.telephonize'), function ($elements) { $elements.c_telephonePicker(); }); inicialize($('.sliderCustomFacade'), function ($elements) { $elements.c_sliderCustomFacade(); }); inicialize($('.chosen-select'), function($elements) { $elements.c_chosenSelect(); }); inicialize($('.selectSlider'), function($elements) { $elements.c_selectSlider(); }); }); // Pro svojí funkčnost vyžaduje načtěný jQuery-UI (kvůli datepickeru od nich) a utils.js udělátko na stringy (function (window, $, undefined) { if (!String.prototype.format) { String.prototype.format = function () { var args = arguments; return this.replace(/{(\d+)}/g, function (match, number) { return typeof args[number] != 'undefined' ? args[number] : match; }); }; } $.fn.c_ultraDatePicker = function () { $.datepicker.regional['cs'] = { closeText: 'Zavřít', prevText: '<Dříve', nextText: 'Později>', currentText: 'Nyní', monthNames: ['leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec'], monthNamesShort: ['led', 'úno', 'bře', 'dub', 'kvě', 'čer', 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro'], dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'], dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'], dayNamesMin: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'], weekHeader: 'Týd', dateFormat: 'dd.mm.yy', firstDay: 1, isRTL: false, showMonthAfterYear: false, yearSuffix: '', selectPhrase: 'vyberte' }; $.datepicker.regional['en'] = { closeText: 'Done', prevText: 'Prev', nextText: 'Next', currentText: 'Today', monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'], weekHeader: 'Wk', dateFormat: 'dd/mm/yy', firstDay: 1, isRTL: false, showMonthAfterYear: false, yearSuffix: '', selectPhrase: 'select' }; $.datepicker.regional['ru'] = { closeText: 'Закрыть', prevText: '<Пред', nextText: 'След>', currentText: 'Сегодня', currentText: 'Сегодня', monthNames: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'], monthNamesShort: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'], dayNames: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'], dayNamesShort: ['вск', 'пнд', 'втр', 'срд', 'чтв', 'птн', 'сбт'], dayNamesMin: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'], weekHeader: 'Нед', dateFormat: 'dd.mm.yy', firstDay: 1, isRTL: false, showMonthAfterYear: false, yearSuffix: '', selectPhrase: 'выбрать' }; window.parseStringToDate = function (string) { var parts = string.split('.'); return new Date(Number(parts[2]), Number(parts[1]) - 1, Number(parts[0])); }; function generateSelect(values, className, selectPhrase) { var options = ["".format(selectPhrase)]; $.each(values, function (key, val) { options.push( ''.format(val, val) ); }); return "".format(className, options.join("")); } function isSet(val) { return (val != 'notset'); } var events = { innerChange: 'innerChange', change: 'change' }; var UltraDatePicker = (function () { var supportedLanguages = ['cs', 'en', 'ru']; var UltraDatePicker = function ($hidden) { this.$hidden = $hidden; this.$wrapper = this.$hidden.parent('div'); var isSupportedLanguage = supportedLanguages.indexOf(this.$hidden.attr('data-language')) !== -1; this.language = (isSupportedLanguage) ? this.$hidden.attr('data-language') : 'cs'; this.languageConfig = $.datepicker.regional[this.language]; this.range = { from: parseStringToDate(this.$hidden.attr('data-range-from')), to: parseStringToDate(this.$hidden.attr('data-range-to')) }; this.lock = false; this.generateHtml(); this.$yearSelect = this.$wrapper.find('select.year'); this.$monthSelect = this.$wrapper.find('select.month'); this.$daySelect = this.$wrapper.find('select.day'); this.$selects = this.$yearSelect.add(this.$monthSelect).add(this.$daySelect); this.initializeListeners(); var hasHiddenValue = isSet(this.$hidden.val()) && this.$hidden.val().length > 0; if (hasHiddenValue) { this.$hidden.trigger(events.innerChange); } }; UltraDatePicker.prototype.initializeListeners = function () { var self = this, settings = { buttonImage: "/StyleSheets/Kalkulator/Images/calendar.png", showOn: "button", buttonImageOnly: true, changeMonth: true, changeYear: true, minDate: this.range.from, maxDate: this.range.to, yearRange: "1800:3000", // Maximální rozmezí let, které se můžou zobrazit v selectu (omezení minDate A maxDate má větší prioritu) onSelect: function (dateString, object) { if (self.lock === false) { self.lock = true; var date = new Date(object.selectedYear, object.selectedMonth, object.selectedDay); self.updateValues(date, true); } } }, settingsWithLanguage = $.extend({}, settings, this.languageConfig); this.$hidden.datepicker(settingsWithLanguage); this.$selects.on(events.change, function () { var allSelectsAreFilled = (isSet(self.$yearSelect.val()) && isSet(self.$monthSelect.val()) && isSet(self.$daySelect.val())); if (self.lock === false && allSelectsAreFilled) { self.lock = true; var date = self.parseSelectValues(); self.updateValues(date, true); } }); this.$hidden.on(events.change, function () { self.$hidden.trigger(events.innerChange); }); this.$hidden.on(events.innerChange, function () { if (self.lock === false) { self.lock = true; var date = parseStringToDate(self.$hidden.val()); self.updateValues(date, false); } }); }; /** * Nastaví do selectů a do datepickeru nové rozmezí datumů */ UltraDatePicker.prototype.generateHtml = function () { var years = []; for (var actual = this.range.from.getFullYear(); actual <= this.range.to.getFullYear(); actual++) { years.push(actual); } var yearsHtml = generateSelect(years, 'year', this.languageConfig.selectPhrase); this.$wrapper.prepend(yearsHtml); var monthsHtml = generateSelect(this.languageConfig.monthNames, 'month', this.languageConfig.selectPhrase); this.$wrapper.prepend(monthsHtml); var days = []; for (var i = 1; i <= 31; i++) { days.push(i); } var daysHtml = generateSelect(days, 'day', this.languageConfig.selectPhrase); this.$wrapper.prepend(daysHtml); var rMin = new Date(this.range.from.getFullYear(), this.range.from.getMonth(), this.range.from.getDate()); this.$hidden.datepicker("option", "minDate", rMin); this.$hidden.datepicker("option", "maxDate", this.range.to); }; UltraDatePicker.prototype.removeComponent = function () { this.$wrapper.find('select').remove(); this.$wrapper.datepicker("destroy"); }; /** * Převede rok ze selectů na Date * @returns {Date} */ UltraDatePicker.prototype.parseSelectValues = function () { var year = parseInt(this.$yearSelect.val()), month = this.$monthSelect.val(), day = parseInt(this.$daySelect.val()), monthAsInt = 0; // 0 - leden $.each(this.languageConfig.monthNames, function (index, monthKey) { if (month == monthKey) { monthAsInt = index; } }); return new Date(year, monthAsInt, day); }; /** * Převede normální datum na speciální formát pro selecty * @param {Date} date * @return {object} {year: 2012,month:"leden",day:1} */ UltraDatePicker.prototype.parseDateToSelectValues = function (date) { return { year: date.getFullYear(), month: this.languageConfig.monthNames[date.getMonth()], day: date.getDate() }; }; /** * Nastaví selecty a datepicker na daný datum * @param {Date} date * @param {boolean} shouldNotifyHidden TRUE - hidden input se dozví o změně (důležité pro RequestTreatment) */ UltraDatePicker.prototype.updateValues = function (date, shouldNotifyHidden) { var dateAsString = date.getDate() + "." + (date.getMonth() + 1) + "." + date.getFullYear(); this.$hidden.val(dateAsString); var dateForSelect = this.parseDateToSelectValues(date); this.updateSelect(this.$yearSelect, dateForSelect.year); this.updateSelect(this.$monthSelect, dateForSelect.month); this.updateSelect(this.$daySelect, dateForSelect.day); this.removeDummyValue(); if (shouldNotifyHidden == true) { this.$hidden.trigger(events.innerChange); this.$hidden.change(); } this.lock = false; }; UltraDatePicker.prototype.removeDummyValue = function () { this.$selects.find('option[value="notset"]').remove(); }; UltraDatePicker.prototype.updateSelect = function (select, val) { select.val(val); }; return UltraDatePicker; })(); // Pokud je komponenta inicializovaná na více elementech, projdeme je a inicializujeme ji return this.each(function () { // jQuery holder na elementy (na které se inicializuje komponenta) var $hidden = $(this); var udp = new UltraDatePicker($hidden); $hidden.on('notify', function (event, params) { udp.removeComponent(); udp = new UltraDatePicker($hidden); }); }); }; $.fn.c_telephonePicker = function () { /** * Třída pro sjednocení telefonní předvolby a inputu (pro číslo) do hidden inputu * @param $hidden * @param $select * @param $input * @constructor */ var TelephonePicker = function ($hidden, $select, $input) { this.$hidden = $hidden; this.$select = $select; this.$input = $input; var self = this; $hidden.on('change', function () { self.loadValue(); }); var callback = function () { if (self.$input.val() > 0 && self.$select.val() > 0) { self.setValue(self.$select.val() + '-' + self.$input.val(), true); } }; this.$select.on('change', callback); this.$input.on('change', callback); self.loadValue(); }; TelephonePicker.prototype.loadValue = function () { var value = this.$hidden.val(); if (value.length > 0) { this.setValue(value, false); } }; TelephonePicker.prototype.setValue = function (newValue, shouldNotify) { var parts = newValue.split('-'), statePrefix = parts[0], telephoneNumber = parts[1]; this.$hidden.val(newValue); this.$select.val(statePrefix); this.$input.val(telephoneNumber); if (shouldNotify === true) { this.$hidden.change(); } }; return this.each(function () { var $hidden = $(this), $select = $hidden.parent().find('.telephonize-state'), $input = $hidden.parent().find('.telephonize-telephone'); var tp = new TelephonePicker($hidden, $select, $input); }); }; $.fn.c_sliderCustomFacade = function () { /** * Třída pro Jquery Slider rozšířený o custom funkce * @param $hidden * @param $select * @param $input * @constructor */ /* this.value = this.$hidden.attr('slider-default-value'); this.min = this.$hidden.attr('slider-min'); this.max = this.$hidden.attr('slider-max'); */ var SliderCustom = function ($hidden, $select, $input) { this.$hidden = $hidden; this.$select = $select; this.$input = $input; var hiddenSlider = this.$hidden.attr('id'); //používáme "place_" pro umístění slideru do Div var placeSlider = "#place_"+hiddenSlider; var isSetSliderMin = this.$hidden.attr('slider-min'); //pokud není nastavena velikost min, default je "0" this.min = (isSetSliderMin % 1 == 0) ? parseInt(this.$hidden.attr('slider-min')) : 0; var isSetSliderMax = this.$hidden.attr('slider-max'); //pokud není nastavena velikost max, default je "1000" this.max = (isSetSliderMax % 1 == 0) ? parseInt(this.$hidden.attr('slider-max')) : 200; var isSetSliderStep = this.$hidden.attr('slider-step'); //pokud není nastavena velikost kroku, default je "10" this.step = (isSetSliderStep % 1 == 0) ? parseInt(this.$hidden.attr('slider-step')) : 10; $(placeSlider) .slider({ min: this.min, max: this.max, value: 100, step: this.step, slide: function( event, ui ) { $( "#"+hiddenSlider ).val( ui.value ); } }) .slider("pips", { rest: "label", step: 1, prefix: "", suffix: "Kč" }); $( "#"+hiddenSlider ).val($(placeSlider).slider( "value" ) ); }; return this.each(function () { var $hidden = $(this); var tp = new SliderCustom($hidden); }); }; $.fn.c_chosenSelect = function () { //if (typeof $('.chosen-select').chosen == "function") $('.chosen-select').chosen({width: '350px'}); if (typeof $('.chosen-select').select2 == "function") $('.chosen-select').select2(); }; $.fn.c_selectSlider = function () { /** * selectSlider propojení selectu se sliderem. Obě hodnoty se mění v závislosti na druhé. * Pokud je v selectu něco zvoleno, je to nastaveno defaultně i do slideru. * @param {element} $select Select s možnostmi pro zvolení z nabídky * @return {void} */ function SelectSlider($select) { var slider = $( "
" ).insertAfter( $select ).slider({ min: 1, max: $select.find('option').length, range: "min", value: $select[0].selectedIndex + 1, slide: function( event, ui ) { $select[0].selectedIndex = ui.value - 1; $select.trigger('change'); } }); $($select).on( "change", function() { slider.slider( "value", this.selectedIndex + 1 ); }); } return this.each(function () { var $select = $(this); var ss = new SelectSlider($select); }); }; }(window, jQuery));