scottwillson/racing_on_rails

View on GitHub
app/assets/javascripts/application.js

Summary

Maintainability
B
5 hrs
Test Coverage
/*
 *= require jquery
 *= require jquery_ujs
 *= require jquery-ui
 *= require jquery.jeditable
 *= require bootstrap-sprockets
 *= require bootstrap-datepicker/core
 *= require raygun
 *= require select_modal
 *= require_self
*/
function bindAutocomplete() {
  if (jQuery('.autocomplete').length) {
    jQuery('.autocomplete').autocomplete({
      delay: 200,
      minLength: 3,
      source: function(request, response) {
        jQuery.getJSON('/people.json', { name: request.term }, response);
      },
      messages: {
        noResults: null,
        results: function() {}
      },
      focus: function(event, ui) {
        jQuery(this).val(ui.item.first_name + ' ' + ui.item.last_name);
        return false;
      },
      select: function(event, ui) {
        jQuery(this).val(ui.item.first_name + ' ' + ui.item.last_name);
        var idField = jQuery('#' + jQuery(this).data('id-field'));
        idField.val(ui.item.id);
        idField.change();
        return false;
      }
    });

    $('.autocomplete').each(function() {
      $(this).data('uiAutocomplete')._renderItem = function (ul, item) {
        var description = [];
        if (item && item.team_name && item.team_name !== '') {
          description.push(item.team_name);
        }
        if (item.city && jQuery.trim(item.city) !== '') {
          description.push(jQuery.trim(item.city));
        }
        if (item.state && jQuery.trim(item.state) !== '') {
          description.push(jQuery.trim(item.state));
        }

        return jQuery('<li id="person_' + item.id + '"></li>')
          .data("item.autocomplete", item)
          .append('<a>' + item.name + '<div class="informal">' + description.join(', ') + "</div></a>")
          .appendTo(ul);
      };
    });
  }
}

function bindAutocompleteTeam() {
  if (jQuery('.team_autocomplete').length) {
    jQuery('.team_autocomplete').autocomplete({
      delay: 200,
      minLength: 3,
      source: function(request, response) {
        jQuery.getJSON("/teams.json", { name: request.term }, response);
      },
      messages: {
        noResults: null,
        results: function() {}
      },
      focus: function(event, ui) {
        jQuery(this).val(ui.item.name);
        return false;
      },
      select: function(event, ui) {
        jQuery(this).val(ui.item.name);
        var idField = jQuery('#' + jQuery(this).data('id-field'));
        idField.val(ui.item.id);
        idField.change();
        return false;
      }
    })
    .data("ui-autocomplete")
    ._renderItem = function(ul, item) {
      return jQuery('<li id="team_' + item.id + '"></li>')
          .data("item.autocomplete", item)
          .append('<a>' + item.name + '</a>')
          .appendTo(ul);
    };
  }
}

function makeEditable() {
  jQuery('.editable').editable(
    function(value, settings) {
      var element = jQuery(this);
      element.find("input").attr("disabled", "disabled");
      element.addClass('saving');
      var ajaxoptions = {
        type    : 'POST',
        data    : {
          '_method': 'PATCH',
          name: element.data('attribute'),
          value: value
        },
        dataType: 'html',
        url     : element.data('url'),
        success : function(result, status, jqXHR) {
          if (jqXHR.getResponseHeader('Content-Type').indexOf('text/javascript') === -1) {
            element.html(result);
            element.removeClass('saving');
            if (!jQuery.trim(element.html())) {
              element.html(settings.placeholder);
            }
          }
          else {
            element.removeClass('saving');
            jQuery.globalEval(result);
          }
        },
        error   : function() {
          element.removeClass('saving');
          var originalColor = element.css('background-color');
          element.css({ 'background-color': 'rgb(255, 204, 204)' });
          element.animate({ 'background-color': originalColor }, 2000);
          element.html(element.data('original'));
        }
      };
      jQuery.ajax(ajaxoptions);
    },
    {
      cssclass: 'editor_field',
      method: 'POST',
      placeholder: '',
      select: true,
      onblur: 'ignore',
      onedit: function() {
        jQuery(this).addClass('editing');
        return true;
      },
      onreset: function() {
        jQuery(this).closest('.editing').removeClass('editing');
        return true;
      },
      callback: function() {
        jQuery(this).closest('.editing').removeClass('editing');
        return true;
      }
    }
  );
}

jQuery(document).bind("ajax:error", function(event, xhr, status, error) {
   alert('We\'re sorry, but something went wrong (' + error + ')');
 });

jQuery(document).ready(function() {
  makeEditable();
  bindAutocomplete();
  bindAutocompleteTeam();
  jQuery('.wants_focus:visible').select();
});