$(function () { /* * -------------------------- * Set up all our required plugins * -------------------------- */ /* Datepicker */ $(document).ajaxComplete(function () { $('#DatePicker').remove(); var $div = $("
", {id: "DatePicker"}); $("body").append($div); $div.DateTimePicker({ dateTimeFormat: Attendize.DateTimeFormat, dateSeparator: Attendize.DateSeparator }); }); /* Responsive sidebar */ $(document.body).on('click', '.toggleSidebar', function (e) { $('html').toggleClass('sidebar-open-ltr'); e.preventDefault(); }); /* Scroll to top */ $(window).scroll(function () { if ($(this).scrollTop() > 100) { $('.totop').fadeIn(); } else { $('.totop').fadeOut(); } }); $(".totop").click(function () { $("html, body").animate({ scrollTop: 0 }, 200); }); /* * -------------------- * Ajaxify those forms * -------------------- * * All forms with the 'ajax' class will automatically handle showing errors etc. * */ $('form.ajax').ajaxForm({ delegation: true, beforeSubmit: function (formData, jqForm, options) { $(jqForm[0]) .find('.error.help-block') .remove(); $(jqForm[0]).find('.has-error') .removeClass('has-error'); var $submitButton = $(jqForm[0]).find('input[type=submit]'); toggleSubmitDisabled($submitButton); }, uploadProgress: function (event, position, total, percentComplete) { $('.uploadProgress').show().html('Uploading Images - ' + percentComplete + '% Complete... '); }, error: function (data, statusText, xhr, $form) { // Form validation error. if (422 == data.status) { processFormErrors($form, $.parseJSON(data.responseText)); return; } showMessage('Whoops!, it looks like the server returned an error.'); var $submitButton = $form.find('input[type=submit]'); toggleSubmitDisabled($submitButton); $('.uploadProgress').hide(); }, success: function (data, statusText, xhr, $form) { switch (data.status) { case 'success': if ($form.hasClass('reset')) { $form.resetForm(); } if ($form.hasClass('closeModalAfter')) { $('.modal, .modal-backdrop').fadeOut().remove(); } var $submitButton = $form.find('input[type=submit]'); toggleSubmitDisabled($submitButton); if (typeof data.message !== 'undefined') { showMessage(data.message); } if (typeof data.runThis !== 'undefined') { eval(data.runThis); } if (typeof data.redirectUrl !== 'undefined') { window.location.href = data.redirectUrl; } break; case 'error': processFormErrors($form, data.messages); break; default: break; } $('.uploadProgress').hide(); }, dataType: 'json' }); /* * -------------------- * Create a simple way to show remote dynamic modals from the frontend * -------------------- * * E.g : * * Click For Modal * * */ $(document.body).on('click', '.loadModal, [data-invoke~=modal]', function (e) { var loadUrl = $(this).data('href'), cacheResult = $(this).data('cache') === 'on', $button = $(this); $('.modal').remove(); $('.modal-backdrop').remove(); $('html').addClass('working'); $.ajax({ url: loadUrl, data: {}, localCache: cacheResult, dataType: 'html', success: function (data) { hideMessage(); $('body').append(data); var $modal = $('.modal'); $modal.modal({ 'backdrop': 'static' }); $modal.modal('show'); $modal.on('hidden.bs.modal', function (e) { // window location.hash = ''; }); $('html').removeClass('working'); } }).done().fail(function (data) { $('html').removeClass('working'); showMessage(lang("whoops_and_error", {"code": data.status, "error": data.statusText})); }); e.preventDefault(); }); /* * ------------------------------------------------------------ * A slightly hackish way to close modals on back button press. * ------------------------------------------------------------ */ $(window).on('hashchange', function (e) { $('.modal').modal('hide'); }); /* * ------------------------------------------------------------- * Simple way for any type of object to be deleted. * ------------------------------------------------------------- * * E.g markup: * * Delete This Object * * */ $('.deleteThis').on('click', function (e) { /* * Confirm if the user wants to delete this object */ if ($(this).data('confirm-delete') !== 'yes') { $(this).data('original-text', $(this).html()).html('Click To Confirm?').data('confirm-delete', 'yes'); var that = $(this); setTimeout(function () { that.data('confirm-delete', 'no').html(that.data('original-text')); }, 2000); return; } var deleteId = $(this).data('id'), deleteType = $(this).data('type'), route = $(this).data('route'); $.post(route, deleteType + '_id=' + deleteId) .done(function (data) { if (typeof data.message !== 'undefined') { showMessage(data.message); } switch (data.status) { case 'success': $('#' + deleteType + '_' + deleteId).fadeOut(); break; case 'error': /* Error */ break; default: break; } }).fail(function (data) { showMessage(Attendize.GenericErrorMessages); }); e.preventDefault(); }); $(document.body).on('click', '.pauseTicketSales', function (e) { var ticketId = $(this).data('id'), route = $(this).data('route'); $.post(route, 'ticket_id=' + ticketId) .done(function (data) { if (typeof data.message !== 'undefined') { showMessage(data.message); } switch (data.status) { case 'success': setTimeout(function () { document.location.reload(); }, 300); break; case 'error': /* Error */ break; default: break; } }).fail(function (data) { showMessage(Attendize.GenericErrorMessages); }); e.preventDefault(); }); /** * Toggle checkboxes */ $(document.body).on('click', '.check-all', function (e) { var toggleClass = $(this).data('check-class'); $('.' + toggleClass).each(function () { this.checked = $(this).checked; }); }); /* * ------------------------------------------------------------ * Toggle hidden content when a.show-more-content is clicked * ------------------------------------------------------------ */ $(document.body).on('click', '.show-more-options', function (e) { var toggleClass = !$(this).data('toggle-class') ? '.more-options' : $(this).data('toggle-class'); if ($(this).hasClass('toggled')) { $(this).html($(this) .data('original-text')); } else { if (!$(this).data('original-text')) { $(this).data('original-text', $(this).html()); } $(this).html(!$(this).data('show-less-text') ? 'Show Less' : $(this).data('show-less-text')); } $(this).toggleClass('toggled'); /* * ? */ if ($(this).data('clear-field')) { $($(this).data('clear-field')).val(''); } $(toggleClass).slideToggle(); e.preventDefault(); }); /* * Sort by trigger */ $('select[name=sort_by_select]').on('change', function () { $('input[name=sort_by]').val($(this).val()).closest('form').submit(); }); /** * Custom file inputs */ $(document).on('change', '.btn-file :file', function () { var input = $(this), numFiles = input.get(0).files ? input.get(0).files.length : 1, label = input.val().replace(/\\/g, '/').replace(/.*\//, ''); input.trigger('fileselect', [ numFiles, label ]); }); $(document.body).on('fileselect', '.btn-file :file', function (event, numFiles, label) { var input = $(this).parents('.input-group').find(':text'), log = numFiles > 1 ? numFiles + ' files selected' : label; if (input.length) { input.val(log); } else { if (log) { console.log(log); } } }); /** * Scale the preview iFrames when changing the design of organiser/event pages. */ $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) { var target = $(e.target).attr("href"); if ($(target).hasClass('scale_iframe')) { var $iframe = $('iframe', target); var iframeWidth = $('.iframe_wrap').innerWidth(); var iframeHeight = $('.iframe_wrap').height(); $iframe.css({ width: 1200, height: 1400 }); var iframeScale = (iframeWidth / 1200); $iframe.css({ '-webkit-transform': 'scale(' + iframeScale + ')', '-ms-transform': 'scale(' + iframeScale + ')', 'transform': 'scale(' + iframeScale + ')', '-webkit-transform-origin': '0 0', '-ms-transform-origin': '0 0', 'transform-origin': '0 0', }); } }); $(document.body).on('click', '.markPaymentReceived', function (e) { var orderId = $(this).data('id'), route = $(this).data('route'); $.post(route, 'order_id=' + orderId) .done(function (data) { if (typeof data.message !== 'undefined') { showMessage(data.message); } switch (data.status) { case 'success': setTimeout(function () { document.location.reload(); }, 300); break; case 'error': /* Error */ break; default: break; } }).fail(function (data) { showMessage(Attendize.GenericErrorMessages); }); e.preventDefault(); }); }); function changeQuestionType(select) { var select = $(select); var selected = select.find(':selected'); if (selected.data('has-options') == '1') { $('#question-options').removeClass('hide'); } else { $('#question-options').addClass('hide'); } } function addQuestionOption() { var tbody = $('#question-options tbody'); var questionOption = $('#question-option-template').html(); tbody.append(questionOption); } function removeQuestionOption(removeBtn) { var removeBtn = $(removeBtn); var tbody = removeBtn.parents('tbody'); if (tbody.find('tr').length > 1) { removeBtn.parents('tr').remove(); } else { alert(lang("at_least_one_option")); } } function processFormErrors($form, errors) { $.each(errors, function (index, error) { var $input = $(':input[name=' + index + ']', $form); if ($input.prop('type') === 'file') { $('#input-' + $input.prop('name')).append('
' + error + '
') .parent() .addClass('has-error'); } else { $input.after('
' + error + '
') .parent() .addClass('has-error'); } }); var $submitButton = $form.find('input[type=submit]'); toggleSubmitDisabled($submitButton); } /** * * @param elm $submitButton * @returns void */ function toggleSubmitDisabled($submitButton) { if ($submitButton.hasClass('disabled')) { $submitButton.attr('disabled', false) .removeClass('disabled') .val($submitButton.data('original-text')); return; } $submitButton.data('original-text', $submitButton.val()) .attr('disabled', true) .addClass('disabled') .val('Working...'); } /** * * @returns {{}} */ $.fn.serializeObject = function() { var o = {}; var a = this.serializeArray(); $.each(a, function() { if (o[this.name] !== undefined) { if (!o[this.name].push) { o[this.name] = [o[this.name]]; } o[this.name].push(this.value || ''); } else { o[this.name] = this.value || ''; } }); return o; }; /** * Replaces a parameter in a URL with a new parameter * * @param url * @param paramName * @param paramValue * @returns {*} */ function replaceUrlParam(url, paramName, paramValue) { var pattern = new RegExp('\\b(' + paramName + '=).*?(&|$)') if (url.search(pattern) >= 0) { return url.replace(pattern, '$1' + paramValue + '$2'); } return url + (url.indexOf('?') > 0 ? '&' : '?') + paramName + '=' + paramValue } /** * Shows users a message. * Currently uses humane.js * * @param string message * @returns void */ function showMessage(message) { humane.log(message, { timeoutAfterMove: 3000, waitForMove: true }); } function showHelp(message) { humane.log(message, { timeout: 12000 }); } function hideMessage() { humane.remove(); }