text: $(function () {
  
      /*
       * --------------------------
       * Set up all our required plugins
       * --------------------------
       */
  
      /* Datepicker */
      $(document).ajaxComplete(function () {
          $('#DatePicker').remove();
          var $div = $("<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 :
       * <a href='/route/to/modal' class='loadModal'>
       *  Click For Modal
       * </a>
       *
       */
      $(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:
       * <a data-route='/route/to/delete' data-id='123' data-type='objectType'>
       *  Delete This Object
       * </a>
       *
       */
      $('.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);
                  }
  
                  if (typeof data.redirectUrl !== 'undefined') {
                      window.location.href = data.redirectUrl;
                  }
  
                  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);
  
          // Try and render a better error message for checkboxes in a table
          if (index.indexOf('[]')) {
              var $formCombinedErrors = $input.closest('form').find('.form-errors');
              // $input.addClass('has-error');
              if ($formCombinedErrors.is(':visible') === false) {
                  $formCombinedErrors.append('<div class="help-block error">' + error + '</div>')
                      .removeClass('hidden')
                      .addClass('has-error');
              }
              return false;
          }
  
          if ($input.prop('type') === 'file') {
              $('#input-' + $input.prop('name')).append('<div class="help-block error">' + error + '</div>')
                  .parent()
                  .addClass('has-error');
          } else {
              $input.after('<div class="help-block error">' + error + '</div>')
                  .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();
  }
  