/**
 * B、I、sub、super命令支持
 * @file
 * @since 1.2.6.1
 */

UE.plugins["basestyle"] = function() {
  /**
     * 字体加粗
     * @command bold
     * @param { String } cmd 命令字符串
     * @remind 对已加粗的文本内容执行该命令， 将取消加粗
     * @method execCommand
     * @example
     * ```javascript
     * //editor是编辑器实例
     * //对当前选中的文本内容执行加粗操作
     * //第一次执行， 文本内容加粗
     * editor.execCommand( 'bold' );
     *
     * //第二次执行， 文本内容取消加粗
     * editor.execCommand( 'bold' );
     * ```
     */

  /**
     * 字体倾斜
     * @command italic
     * @method execCommand
     * @param { String } cmd 命令字符串
     * @remind 对已倾斜的文本内容执行该命令， 将取消倾斜
     * @example
     * ```javascript
     * //editor是编辑器实例
     * //对当前选中的文本内容执行斜体操作
     * //第一次操作， 文本内容将变成斜体
     * editor.execCommand( 'italic' );
     *
     * //再次对同一文本内容执行， 则文本内容将恢复正常
     * editor.execCommand( 'italic' );
     * ```
     */

  /**
     * 下标文本，与“superscript”命令互斥
     * @command subscript
     * @method execCommand
     * @remind  把选中的文本内容切换成下标文本， 如果当前选中的文本已经是下标， 则该操作会把文本内容还原成正常文本
     * @param { String } cmd 命令字符串
     * @example
     * ```javascript
     * //editor是编辑器实例
     * //对当前选中的文本内容执行下标操作
     * //第一次操作， 文本内容将变成下标文本
     * editor.execCommand( 'subscript' );
     *
     * //再次对同一文本内容执行， 则文本内容将恢复正常
     * editor.execCommand( 'subscript' );
     * ```
     */

  /**
     * 上标文本，与“subscript”命令互斥
     * @command superscript
     * @method execCommand
     * @remind 把选中的文本内容切换成上标文本， 如果当前选中的文本已经是上标， 则该操作会把文本内容还原成正常文本
     * @param { String } cmd 命令字符串
     * @example
     * ```javascript
     * //editor是编辑器实例
     * //对当前选中的文本内容执行上标操作
     * //第一次操作， 文本内容将变成上标文本
     * editor.execCommand( 'superscript' );
     *
     * //再次对同一文本内容执行， 则文本内容将恢复正常
     * editor.execCommand( 'superscript' );
     * ```
     */
  var basestyles = {
    bold: ["strong", "b"],
    italic: ["em", "i"],
    subscript: ["sub"],
    superscript: ["sup"]
  },
    getObj = function(editor, tagNames) {
      return domUtils.filterNodeList(
        editor.selection.getStartElementPath(),
        tagNames
      );
    },
    me = this;
  //添加快捷键
  me.addshortcutkey({
    Bold: "ctrl+66", //^B
    Italic: "ctrl+73", //^I
    Underline: "ctrl+85" //^U
  });
  me.addInputRule(function(root) {
    utils.each(root.getNodesByTagName("b i"), function(node) {
      switch (node.tagName) {
        case "b":
          node.tagName = "strong";
          break;
        case "i":
          node.tagName = "em";
      }
    });
  });
  for (var style in basestyles) {
    (function(cmd, tagNames) {
      me.commands[cmd] = {
        execCommand: function(cmdName) {
          var range = me.selection.getRange(),
            obj = getObj(this, tagNames);
          if (range.collapsed) {
            if (obj) {
              var tmpText = me.document.createTextNode("");
              range.insertNode(tmpText).removeInlineStyle(tagNames);
              range.setStartBefore(tmpText);
              domUtils.remove(tmpText);
            } else {
              var tmpNode = range.document.createElement(tagNames[0]);
              if (cmdName == "superscript" || cmdName == "subscript") {
                tmpText = me.document.createTextNode("");
                range
                  .insertNode(tmpText)
                  .removeInlineStyle(["sub", "sup"])
                  .setStartBefore(tmpText)
                  .collapse(true);
              }
              range.insertNode(tmpNode).setStart(tmpNode, 0);
            }
            range.collapse(true);
          } else {
            if (cmdName == "superscript" || cmdName == "subscript") {
              if (!obj || obj.tagName.toLowerCase() != cmdName) {
                range.removeInlineStyle(["sub", "sup"]);
              }
            }
            obj
              ? range.removeInlineStyle(tagNames)
              : range.applyInlineStyle(tagNames[0]);
          }
          range.select();
        },
        queryCommandState: function() {
          return getObj(this, tagNames) ? 1 : 0;
        }
      };
    })(style, basestyles[style]);
  }
};
