var Application = Class.extend({

  self: null,

  init: function() {
    self = this;
    self.setupOnce();
    self.setupOnChange();
  },

  setupOnce: function() {
    self.setupConfirms();
    self.setupXhrLinks();
    self.setupXhrForms();
    self.setupLoginForm();
  },

  setupOnChange: function() {
    self.setupForms();
  },

  setupForms: function() {
    $('fieldset input, fieldset textarea, fieldset select').each(function() {
      var field = $(this);
      if (!field.attr('setupForms')) {
        field.focus(function() {
          field.parents('fieldset').addClass('focussed');
        });
        field.blur(function() {
          field.parents('fieldset').removeClass('focussed');
        });
        field.attr('setupForms', true);
      }
    });
  },

  setupXhrLinks: function() {
    $('a[data-method]').live('click', function(event) {
      event.preventDefault();
      var link = $(this);
      self.withAuthenticityToken(function(token) {
        var form = $(document.createElement('form'));
        form.hide();
        form.attr('method', 'post');
        form.attr('action', link.attr('href'));
        var method = $(document.createElement('input'));
        method.attr('type', 'hidden').attr('name', '_method').attr('value', link.attr('data-method'));
        form.append(method);
        var authToken = $(document.createElement('input'));
        authToken.attr('type', 'hidden').attr('name', 'authenticity_token').attr('value', token);
        form.append(authToken);
        link.parent().append(form);
        form.submit();
      });
    });
  },

  setupXhrForms: function() {
    $('form[data-remote-replaces]').live('submit', function(event) {
      event.preventDefault();
      var form = $(this);
      var target = $('#' + form.attr('data-remote-replaces'));
      $.ajax({
        type: form.attr('method'),
        url: form.attr('action'),
        data: form.serialize(),
        success: function(response) {
          console.log('COMPLETE: ' + response);
          target.html(response);
        }
      });
    });
  },

  setupConfirms: function() {
    $('a[data-confirm]').live('click', function(event) {
      return confirm($(this).attr('data-confirm'));
    });
  },

  setupLoginForm: function() {
    $('#loginForm').submit(function(event) {
      event.preventDefault();
      var form  = $(this);
      var flash = form.children('.flash');
      $.ajax({
        type:     'POST',
        url:      form.attr('action'),
        datatype: 'text',
        data: form.serialize(),
        success: function(response) {
          form.attr('action', response);
          form.unbind('submit');
          form.submit();
        },
        error: function(request) {
          flash.text(request.responseText);
        }
      })
    });
  }

});

var app = null;

$(document).ready(function() {
  app = new Application();
  $(document).ajaxComplete(function() {
    app.setupOnChange();
  })
});
