(function (window, $) { 'use strict'; if (!$) { return; } var ROOT = '#feisSettingsPage'; var adjudicatorNewIndex = 1000; var stageSaveTimer = null; function $root() { return $(ROOT); } function rootData(name, fallback) { var value = $root().attr('data-' + name); return (typeof value === 'undefined' || value === '') ? fallback : value; } function postAction(data, options) { options = options || {}; return $.ajax({ url: options.url || 'feis_settings/actions.php', type: 'POST', data: data, dataType: options.dataType || undefined, processData: options.processData, contentType: options.contentType, cache: options.cache }); } function flashButton($button, text) { if (!$button || !$button.length) { return; } var original = $button.text(); $button.prop('disabled', true).text(text || 'OK!'); window.setTimeout(function () { $button.prop('disabled', false).text(original); }, 900); } function escapeHtmlAttr(str) { return String(str == null ? '' : str) .replace(/&/g, '&') .replace(/"/g, '"') .replace(//g, '>'); } function setCurrency(elem) { var $elem = elem && elem.jquery ? elem : $(elem); return postAction({ curr: $elem.val(), action: 'set_currency' }); } function saveStageNumber(value) { value = parseInt(value, 10); if (!value || value < 1) { value = 1; } return postAction({ action: 'save_stage_number', data: value }); } function scheduleStageSave(value) { window.clearTimeout(stageSaveTimer); stageSaveTimer = window.setTimeout(function () { saveStageNumber(value); }, 250); } function initStageNumber() { var $input = $('#stage_number_spinner'); if (!$input.length) { return; } $input.off('.feisSettingsStage'); // Keep the native number input spinner only. // jQuery UI spinner would wrap the input and create a second pair of arrows. if ($input.hasClass('ui-spinner-input') && $.fn.spinner) { try { $input.spinner('destroy'); } catch (e) { // The input may carry the class from previously loaded markup without an active widget. } } $input .on('input.feisSettingsStage change.feisSettingsStage', function () { var value = parseInt($(this).val(), 10) || 1; if (value < 1) { value = 1; $(this).val(value); } scheduleStageSave(value); }); } function saveBooleanSetting($input, action) { return postAction({ checked: $input.prop('checked'), action: action }); } function set_grace_period(elem) { return saveBooleanSetting(elem && elem.jquery ? elem : $(elem), 'set_grace'); } function set_registration_closed(elem) { return saveBooleanSetting(elem && elem.jquery ? elem : $(elem), 'set_registration_closed'); } function set_grades_closed(elem) { return saveBooleanSetting(elem && elem.jquery ? elem : $(elem), 'set_grades_closed'); } function set_selfentry(elem) { return saveBooleanSetting(elem && elem.jquery ? elem : $(elem), 'set_selfentry'); } function set_split_championship_timetable(elem) { return saveBooleanSetting(elem && elem.jquery ? elem : $(elem), 'set_split_championship_timetable'); } function set_online_payment(elem) { var $elem = elem && elem.jquery ? elem : $(elem); var enabled = $elem.prop('checked'); $('.paypal_account').prop('disabled', !enabled); if (!enabled) { return postAction({ checked: false, action: 'set_online_payment' }); } return $.Deferred().resolve().promise(); } function save_paypal(elem) { var $button = elem && elem.jquery ? elem : $(elem); return postAction({ checked: $('#set_online_payment').prop('checked'), action: 'set_online_payment', paypal_account: $('#paypal_account_input').val() }).done(function () { flashButton($button, 'OK!'); }); } function save_email(elem) { var $button = elem && elem.jquery ? elem : $(elem); return postAction({ action: 'save_email', email: $('#feis_contact_email').val() }).done(function () { flashButton($button, 'OK!'); }); } function initTinyMCE(editorId) { editorId = editorId || 'WYSIWYG'; if (typeof window.tinymce === 'undefined') { return; } var textarea = document.getElementById(editorId); if (!textarea) { return; } var existingEditor = window.tinymce.get(editorId); if (existingEditor) { existingEditor.remove(); } window.tinymce.init({ selector: '#' + editorId, theme: 'modern', menubar: false, height: 360, plugins: 'lists link image code paste', toolbar1: 'insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image', toolbar2: 'code | forecolor backcolor', image_advtab: true }); } function save_feis_grading(id) { var $slider = $('#slider-grading_' + id); var $inputs = $('.handle_' + id); if (!$slider.length || !$slider.hasClass('ui-slider') || !$inputs.length) { return; } var gradingId = $slider.data('gradingid'); var minimumThreshold; var normalThreshold; var minimumPlaces; var normalPlaces; if ($inputs.length === 2) { var values = $slider.slider('values'); minimumThreshold = values[0]; normalThreshold = values[1]; minimumPlaces = $inputs.eq(0).val(); normalPlaces = $inputs.eq(1).val(); } else { minimumThreshold = $slider.slider('value'); normalThreshold = minimumThreshold; minimumPlaces = $inputs.eq(0).val(); normalPlaces = minimumPlaces; } return postAction({ action: 'save_feis_grading', grading_id: gradingId, default_minimum_threshold: minimumThreshold, default_minimum_places: minimumPlaces, default_normal_threshold: normalThreshold, default_normal_places: normalPlaces }); } function updateGradingPositions($slider) { if (!$slider || !$slider.length || !$slider.hasClass('ui-slider')) { return; } var $trackArea = $slider.closest('.fsp-grading-row__track-area'); var $handles = $slider.find('.ui-slider-handle'); if (!$trackArea.length || !$handles.length) { return; } var trackRect = $trackArea[0].getBoundingClientRect(); var handleRightEdges = []; var gap = 8; $handles.each(function () { var rect = this.getBoundingClientRect(); handleRightEdges.push(rect.right - trackRect.left); }); function setPlacePosition($place, handleRight) { if (!$place.length || typeof handleRight !== 'number' || isNaN(handleRight)) { return; } var placeWidth = $place.outerWidth() || 72; var desiredLeft = handleRight + gap; var minLeft = 0; var maxLeft = Math.max(minLeft, trackRect.width - placeWidth); var clampedLeft = Math.max(minLeft, Math.min(maxLeft, desiredLeft)); $place.css('left', clampedLeft + 'px'); } var $midPlace = $trackArea.find('[data-grading-position="mid"]'); var $rightPlace = $trackArea.find('[data-grading-position="right"]'); if (handleRightEdges.length > 1) { setPlacePosition($midPlace, handleRightEdges[0]); setPlacePosition($rightPlace, handleRightEdges[1]); } else { setPlacePosition($rightPlace, handleRightEdges[0]); } } function updateGradingHandleLabels($slider) { if (!$slider || !$slider.length || !$slider.hasClass('ui-slider')) { return; } var minValue = parseInt($slider.data('min'), 10); var maxValue = parseInt($slider.data('max'), 10); var isRange = minValue !== maxValue; var $handles = $slider.find('.ui-slider-handle'); if (isRange) { var values = $slider.slider('values'); $handles.eq(0).text(values[0]); $handles.eq(1).text(values[1]); } else { $handles.eq(0).text($slider.slider('value')); } } function initializeGradingSliders() { if (!$.fn.slider) { return; } $('.slider_grading').each(function () { var $slider = $(this); if ($slider.hasClass('ui-slider')) { updateGradingHandleLabels($slider); updateGradingPositions($slider); return; } var id = $slider.data('id'); var minValue = parseInt($slider.data('min'), 10); var maxValue = parseInt($slider.data('max'), 10); if (isNaN(minValue)) { minValue = 1; } if (isNaN(maxValue)) { maxValue = minValue; } var isRange = minValue !== maxValue; var sliderOptions = { min: 1, max: 20, range: isRange, slide: function (event, ui) { if (isRange && ui.values && ui.values[0] === ui.values[1]) { return false; } $(ui.handle).text(ui.value); window.requestAnimationFrame(function () { updateGradingPositions($slider); }); }, change: function (event) { updateGradingHandleLabels($slider); updateGradingPositions($slider); if (event && event.originalEvent) { save_feis_grading(id); } } }; if (isRange) { sliderOptions.values = [minValue, maxValue]; } else { sliderOptions.value = minValue; } $slider.slider(sliderOptions); updateGradingHandleLabels($slider); window.setTimeout(function () { updateGradingPositions($slider); }, 0); }); } function initializeGradingInputs() { $('.gradingBox').each(function () { var $input = $(this); $input.off('.feisSettingsGrading'); if ($.fn.spinner && !$input.hasClass('ui-spinner-input')) { $input.spinner({ min: 1, max: 9, step: 1 }); } $input .on('change.feisSettingsGrading spinchange.feisSettingsGrading', function () { var value = parseInt($(this).val(), 10); if (isNaN(value) || value < 1) { value = 1; } else if (value > 9) { value = 9; } $(this).val(value); var id = $(this).data('id'); if (id) { save_feis_grading(id); } }); }); } function initializeGrading() { initializeGradingInputs(); initializeGradingSliders(); } function add_adjudicator_row(name, id) { name = name || ''; id = parseInt(id, 10) || 0; adjudicatorNewIndex++; var rowClass = id > 0 ? 'adjudicator_row' : 'adjudicator_row is-new'; var rowName = id > 0 ? ('adj_name_' + id) : ('adj_name_new_' + adjudicatorNewIndex); var placeholder = $('#adjudicators_list .adjudicators_input').first().attr('placeholder') || ''; var rowHtml = '' + '