(function() {
  'use strict';

  /**
   * Toggle the view/edit form visibility.
   * @param form - The jQuery form selector.
   * @param edit - True to set form to edit mode;
   * false to set form to view mode.
   */

  /* global _ filesValidator animateSpinner FileTypeEnum */

  var forms = $('form[data-for]');

  function toggleFormVisibility(form, edit) {
    var val = form.find("input[data-role='src']").val();
    if (edit) {
      form.find("[data-part='view']").hide();
      form.find("[data-part='edit']").show();
      form.find("[data-part='edit'] input:not([type='file']):not([type='submit']):first").focus();
    } else {
      form.find("[data-part='view']").show();
      form.find("[data-part='edit'] input").blur();
      form.find("[data-part='edit']").hide();

      // Clear all errors on the parent form
      form.clearFormErrors();

      // Clear any neccesary fields
      form.find("input[data-role='clear']").val('');

      // Copy field data
      form.find("input[data-role='edit']").val(val);
    }
  }


  // Add "edit form" listeners
  forms.find("[data-action='edit']").click(function(ev) {
    var $form = $(this).closest('form');
    ev.preventDefault();
    // First, hide all form edits
    _.each(forms, function() {
      toggleFormVisibility($form, false);
    });

    // Then, edit the current form
    toggleFormVisibility($form, true);
  });

  // Add "cancel form" listeners
  forms.find("[data-action='cancel']").click(function(ev) {
    var $form = $(this).closest('form');
    ev.preventDefault();

    // Hide the edit portion of the form
    toggleFormVisibility($form, false);
  });

  // Add form submit listeners
  forms.not("[data-for='avatar']")
    .on('ajax:success', function() {
      // Simply reload the page
      location.reload();
    })
    .on('ajax:error', function(ev, data) {
      // Render form errors
      $(this).renderFormErrors('user', data.responseJSON);
    });

  $('#user-avatar-field :submit').click(function(ev) {
    var $form = $(ev.target.form);
    var $fileInput = $form.find('input[type=file]');
    $form.clearFormErrors();

    if (filesValidator(ev, $fileInput, FileTypeEnum.AVATAR)) {
      // Local file uploading
      animateSpinner();
    }
    $fileInput[0].value = '';
  });
}());
