(function($) {

/**
 * Attach this editor to a target element.
 */
Drupal.wysiwyg.editor.attach.nicedit = function(context, params, settings) {
  // Intercept and ignore submit handlers or they will revert changes made
  // since the instance was removed. The handlers are anonymous and hidden out
  // of scope in a closure so we can't unbind them. The same operations are
  // performed when the instance is detached anyway.
  var oldAddEvent = bkLib.addEvent;
  bkLib.addEvent = function(obj, type, fn) {
    if (type != 'submit') {
      oldAddEvent(obj, type, fn);
    }
  }
  // Attach editor.
  var editor = new nicEditor(settings);
  editor.panelInstance(params.field);
  // The old addEvent() must be restored after creating a new instance, as
  // plugins with dialogs use it to bind submit handlers to their forms.
  bkLib.addEvent = oldAddEvent;
  editor.addEvent('focus', function () {
    Drupal.wysiwyg.activeId = params.field;
  });
};

/**
 * Detach a single or all editors.
 *
 * See Drupal.wysiwyg.editor.detach.none() for a full description of this hook.
 */
Drupal.wysiwyg.editor.detach.nicedit = function (context, params, trigger) {
  if (typeof params != 'undefined') {
    var instance = nicEditors.findEditor(params.field);
    if (instance) {
      if (trigger == 'serialize') {
        instance.saveContent();
      }
      else {
        instance.ne.removeInstance(params.field);
        instance.ne.removePanel();
      }
    }
  }
  else {
    for (var e in nicEditors.editors) {
      // Save contents of all editors back into textareas.
      var instances = nicEditors.editors[e].nicInstances;
      for (var i = 0; i < instances.length; i++) {
        if (trigger == 'serialize') {
          instances[i].saveContent();
        }
        else {
          instances[i].remove();
        }
      }
      // Remove all editor instances.
      if (trigger != 'serialize') {
        nicEditors.editors[e].nicInstances = [];
      }
    }
  }
};

/**
 * Instance methods for nicEdit.
 */
Drupal.wysiwyg.editor.instance.nicedit = {
  insert: function (content) {
    var instance = nicEditors.findEditor(this.field);
    var editingArea = instance.getElm();
    var sel = instance.getSel();
    // IE.
    if (document.selection) {
      editingArea.focus();
      sel.createRange().pasteHTML(content);
    }
    else {
      // Convert selection to a range.
      var range;
      // W3C compatible.
      if (sel.getRangeAt) {
        range = sel.getRangeAt(0);
      }
      // Safari.
      else {
        range = editingArea.ownerDocument.createRange();
        range.setStart(sel.anchorNode, sel.anchorOffset);
        range.setEnd(sel.focusNode, userSeletion.focusOffset);
      }
      // The code below doesn't work in IE, but it never gets here.
      var fragment = editingArea.ownerDocument.createDocumentFragment();
      // Fragments don't support innerHTML.
      var wrapper = editingArea.ownerDocument.createElement('div');
      wrapper.innerHTML = content;
      while (wrapper.firstChild) {
        fragment.appendChild(wrapper.firstChild);
      }
      range.deleteContents();
      // Only fragment children are inserted.
      range.insertNode(fragment);
    }
  },

  setContent: function (content) {
    nicEditors.findEditor(this.field).setContent(content);
  },

  getContent: function () {
    return nicEditors.findEditor(this.field).getContent();
  }
};

})(jQuery);
