(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 = '' + '
' + '
' + ' ' + '
' + ' ' + '
'; $('#adjudicators_list').append(rowHtml); } function ensure_empty_adjudicator_row() { if (!$('#adjudicators_list .adjudicator_row').length) { add_adjudicator_row('', 0); } } function remove_adjudicator_row(btn) { var $button = btn && btn.jquery ? btn : $(btn); var $row = $button.closest('.adjudicator_row'); var id = parseInt($row.attr('data-id'), 10) || 0; var $wrap = $button.closest('.adjudicators-card'); var feisId = parseInt($wrap.attr('data-feis-id'), 10) || 0; if (id <= 0) { $row.remove(); ensure_empty_adjudicator_row(); return; } if (!feisId) { return; } $button.prop('disabled', true); postAction({ action: 'delete_adjudicator', id: id, feis_id: feisId }, { dataType: 'json' }) .done(function (response) { if (response && response.status === 'ok') { $row.remove(); ensure_empty_adjudicator_row(); return; } window.alert(response && response.message ? response.message : 'Delete error'); $button.prop('disabled', false); }) .fail(function () { window.alert('Delete error'); $button.prop('disabled', false); }); } function save_adjudicators(btn) { var $button = btn && btn.jquery ? btn : $(btn); var $wrap = $button.closest('.adjudicators-card'); var feisId = parseInt($wrap.attr('data-feis-id'), 10) || 0; var rows = []; $wrap.find('#adjudicators_list .adjudicator_row').each(function () { var $row = $(this); var id = parseInt($row.attr('data-id'), 10) || 0; var name = $.trim($row.find('.adjudicators_input').val()); if (name !== '') { rows.push({ id: id, name: name }); } }); if (!feisId) { return; } $button.prop('disabled', true); postAction({ action: 'save_adjudicators', feis_id: feisId, rows: JSON.stringify(rows) }, { dataType: 'json' }) .done(function (response) { if (!response || response.status !== 'ok') { window.alert(response && response.message ? response.message : 'Save error'); return; } var savedRows = response.rows || []; var $unsavedRows = $wrap.find('.adjudicator_row[data-id="0"]').filter(function () { return $.trim($(this).find('.adjudicators_input').val()) !== ''; }); $.each(savedRows, function (index, row) { var rowId = parseInt(row.id, 10) || 0; if (!rowId) { return; } var $existing = $wrap.find('.adjudicator_row[data-id="' + rowId + '"]'); if ($existing.length) { $existing.find('.adjudicators_input').attr('name', 'adj_name_' + rowId).val(row.name || ''); return; } if ($unsavedRows.length) { var $newRow = $unsavedRows.eq(0); $unsavedRows = $unsavedRows.slice(1); $newRow.attr('data-id', rowId).removeClass('is-new'); $newRow.find('.adjudicators_input').attr('name', 'adj_name_' + rowId).val(row.name || ''); } }); ensure_empty_adjudicator_row(); flashButton($button, 'OK!'); }) .fail(function () { window.alert('Save error'); }) .always(function () { $button.prop('disabled', false); }); } function prepareUpload(event) { var files = event && event.target ? event.target.files : null; if (!files || !files.length) { return; } var data = new FormData(); $.each(files, function (key, value) { data.append(key, value); }); $.ajax({ url: 'upload.php?files', type: 'POST', data: data, cache: false, dataType: 'json', processData: false, contentType: false }).done(function (response) { if (typeof response.error === 'undefined') { window.alert('OK!'); } else { window.console.error('Upload error:', response.error); } }).fail(function (xhr, status) { window.console.error('Upload error:', status); }); } function send_teachers_message() { var sendCurrentTeachers = $('#only_current_teachers_checkbox').prop('checked'); var sendDancers = $('#send_dancers_checkbox').prop('checked'); if (!sendCurrentTeachers && !sendDancers) { window.alert(rootData('send-selection-error', '')); return; } var message = ''; if (typeof window.tinymce !== 'undefined' && window.tinymce.get('WYSIWYG')) { message = window.tinymce.get('WYSIWYG').getContent({ format: 'raw' }); } else { message = $('#WYSIWYG').val(); } if (message === null || $.trim(message) === '') { $('#message_status').html(rootData('empty-message-text', '')); return; } $('#message_status').html(rootData('sending-text', '')); postAction({ action: 'send_message', message_body: message, message_subject: $('#message_subject').val(), teachers: 'false', current_only: sendCurrentTeachers, dancers: sendDancers }).done(function (data) { $('#message_status').html(data); }); } function clear_feis_settings(feisId) { feisId = parseInt(feisId, 10) || parseInt($root().attr('data-feis-id'), 10) || 0; if (!feisId || !window.confirm(rootData('confirm-clear', ''))) { return; } postAction({ action: 'clear_feis_settings', feis_id: feisId }).done(function () { window.alert('OK!'); if (typeof window.load_organizer_tab === 'function') { window.load_organizer_tab('TAB_general_settings.php'); } }); } function initSelect2() { var $select = $('#send_message_select'); if (!$select.length || !$.fn.select2) { return; } if ($select.hasClass('select2-hidden-accessible')) { $select.select2('destroy'); } $select.select2({ width: '100%' }); } function bindEvents() { var $document = $(document); $document.off('.feisSettings'); $document.on('change.feisSettings', ROOT + ' #currencies', function () { setCurrency($(this)); }); $document.on('change.feisSettings', ROOT + ' [data-settings-action]', function () { var $input = $(this); var action = $input.attr('data-settings-action'); if (action === 'set_grace') { set_grace_period($input); } else if (action === 'set_registration_closed') { set_registration_closed($input); } else if (action === 'set_grades_closed') { set_grades_closed($input); } else if (action === 'set_selfentry') { set_selfentry($input); } else if (action === 'set_split_championship_timetable') { set_split_championship_timetable($input); } else if (action === 'online_payment') { set_online_payment($input); } }); $document.on('change.feisSettings', ROOT + ' [data-settings-control="upload"]', function (event) { prepareUpload(event); }); $document.on('click.feisSettings', ROOT + ' [data-settings-command]', function () { var $button = $(this); var command = $button.attr('data-settings-command'); if (command === 'save-email') { save_email($button); } else if (command === 'add-adjudicator') { add_adjudicator_row(); } else if (command === 'remove-adjudicator') { remove_adjudicator_row($button); } else if (command === 'save-adjudicators') { save_adjudicators($button); } else if (command === 'save-paypal') { save_paypal($button); } else if (command === 'send-message') { send_teachers_message(); } else if (command === 'clear-settings') { clear_feis_settings(); } }); $(window) .off('resize.feisSettingsGrading') .on('resize.feisSettingsGrading', function () { $('.slider_grading').each(function () { updateGradingPositions($(this)); }); }); $document.on('shown.bs.collapse.feisSettings', ROOT + ' #accordion3', function () { initializeGrading(); window.setTimeout(function () { $('.slider_grading').each(function () { updateGradingHandleLabels($(this)); updateGradingPositions($(this)); }); }, 0); }); $document.on('shown.bs.collapse.feisSettings', ROOT + ' #accordion8', function () { window.setTimeout(function () { initTinyMCE('WYSIWYG'); }, 30); }); } function initialize_feis_settings() { if (!$root().length) { return; } bindEvents(); initStageNumber(); initSelect2(); initializeGrading(); if ($('#accordion8').hasClass('show') || $('#accordion8').hasClass('in')) { initTinyMCE('WYSIWYG'); } } window.initialize_feis_settings = initialize_feis_settings; window.setCurrency = setCurrency; window.set_grace_period = set_grace_period; window.set_registration_closed = set_registration_closed; window.set_grades_closed = set_grades_closed; window.set_selfentry = set_selfentry; window.set_split_championship_timetable = set_split_championship_timetable; window.set_online_payment = set_online_payment; window.save_paypal = save_paypal; window.save_email = save_email; window.save_feis_grading = save_feis_grading; window.add_adjudicator_row = add_adjudicator_row; window.remove_adjudicator_row = remove_adjudicator_row; window.save_adjudicators = save_adjudicators; window.prepareUpload = prepareUpload; window.send_teachers_message = send_teachers_message; window.clear_feis_settings = clear_feis_settings; initialize_feis_settings(); })(window, window.jQuery);