(function() {
  var DOUBLE_CLICK_MS, _deprecationLogged, activate, cleanUp, cmsFieldAndPastedContent, finishEditing, getCurrentContent, isNewlineAllowed, onBlur, onFocus, onInput, onKey, prepareForEditing, save;

  onKey = function(event) {
    var cmsField, key;
    cmsField = $(event.currentTarget);
    key = event.keyCode || event.which;
    switch (key) {
      case 13:
        if (!isNewlineAllowed(cmsField)) {
          event.preventDefault();
          return cmsField.blur();
        }
        break;
      case 27:
        event.stopPropagation();
        return cmsField.blur();
    }
  };

  onInput = function(event) {
    var cmsField;
    cmsField = $(event.currentTarget);
    return save(cmsField);
  };

  onFocus = function(event) {
    var cmsField;
    cmsField = $(event.currentTarget);
    return prepareForEditing(cmsField);
  };

  onBlur = function(event) {
    var cmsField;
    cmsField = $(event.currentTarget);
    save(cmsField).done(function() {
      return cmsField.trigger('scrivito_editors:blur');
    });
    return finishEditing(cmsField);
  };

  save = function(cmsField) {
    var content;
    content = getCurrentContent(cmsField);
    if (content !== cmsField.scrivito('content')) {
      return cmsField.scrivito('save', content).done(function() {
        return cmsField.trigger('save.scrivito_editors');
      });
    } else {
      return $.Deferred().resolve();
    }
  };

  getCurrentContent = function(cmsField) {
    var clone, content;
    cleanUp(cmsField);
    clone = cmsFieldAndPastedContent(cmsField).clone();
    clone.find('div:not(:has(br)),p:not(:first)').before('\n');
    clone.find('br').replaceWith('\n');
    content = clone.text();
    clone.remove();
    return content;
  };

  cleanUp = function(cmsField) {
    var pasted, siblings;
    siblings = cmsFieldAndPastedContent(cmsField);
    pasted = siblings.not(cmsField);
    if (pasted.length > 0) {
      pasted.remove();
      return cmsField.text(siblings.text());
    }
  };

  cmsFieldAndPastedContent = function(cmsField) {
    var needsReset, siblings, siblingsBefore;
    siblingsBefore = cmsField.data('scrivito_editors_siblings_before_edit');
    siblings = cmsField.siblings();
    needsReset = !siblingsBefore || siblings.filter(siblingsBefore).length < siblingsBefore.length;
    if (needsReset) {
      return cmsField.data('scrivito_editors_siblings_before_edit', siblings);
    } else {
      return cmsField.siblings().addBack().not(siblingsBefore);
    }
  };

  _deprecationLogged = false;

  isNewlineAllowed = function(cmsField) {
    if (cmsField.data('editor') === 'text') {
      if (!_deprecationLogged) {
        console.warn('Scrivito editors: data-editor="text" is deprecated, please use {data: {scrivito_editors_multiline: true}}, editor: "string" instead.');
        _deprecationLogged = true;
      }
      return true;
    }
    if (cmsField.data('scrivitoEditorsMultiline') === true) {
      return true;
    }
    if (cmsField.data('scrivitoEditorsMultiline') === false) {
      return false;
    }
    return cmsField.css('white-space').match(/pre/);
  };

  prepareForEditing = function(cmsField) {
    var html, htmlNl2Br;
    if (isNewlineAllowed(cmsField) && !cmsField.data('scrivito_editors_prepared_for_editing')) {
      cmsField.data('scrivito_editors_prepared_for_editing', true);
      html = cmsField.html();
      htmlNl2Br = html.replace(/\n/g, '<br />');
      if (html !== htmlNl2Br) {
        return cmsField.html(htmlNl2Br);
      }
    }
  };

  finishEditing = function(cmsField) {
    cmsField.data('scrivito_editors_prepared_for_editing', false);
    return cmsField.text(cmsField.scrivito('content'));
  };

  DOUBLE_CLICK_MS = 300;

  activate = function(element) {
    var cmsField;
    cmsField = $(element);
    cmsField.attr('contenteditable', true).blur(onBlur).focus(onFocus).keypress(onKey).keyup(onKey);
    if (cmsField.attr('data-scrivito-editors-autosave') !== 'false') {
      cmsField.on('cut input keypress keyup paste', onInput);
    }
    prepareForEditing(cmsField);
    return cmsField.on('click', function(event) {
      cmsField.attr('contenteditable', true);
      cleanUp(cmsField);
      if (!(event.timeStamp - cmsField.data('scrivito_editors_last_click') < DOUBLE_CLICK_MS)) {
        event.preventDefault();
      }
      return cmsField.data('scrivito_editors_last_click', event.timeStamp);
    });
  };

  scrivito.editors.string_editor = {
    can_edit: function(element) {
      return $(element).is('[data-scrivito-field-type=string]');
    },
    activate: function(element) {
      return activate(element);
    }
  };

  scrivito.on('load', function() {
    return scrivito.define_editor('string', scrivito.editors.string_editor);
  });

}).call(this);