/**
 * 段落样式
 * @file
 * @since 1.2.6.1
 */

/**
 * 段落格式
 * @command paragraph
 * @method execCommand
 * @param { String } cmd 命令字符串
 * @param {String}   style               标签值为：'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'
 * @param {Object}   attrs               标签的属性
 * @example
 * ```javascript
 * editor.execCommand( 'Paragraph','h1','{
 *     class:'test'
 * }' );
 * ```
 */

/**
 * 返回选区内节点标签名
 * @command paragraph
 * @method queryCommandValue
 * @param { String } cmd 命令字符串
 * @return { String } 节点标签名
 * @example
 * ```javascript
 * editor.queryCommandValue( 'Paragraph' );
 * ```
 */

UE.plugins["paragraph"] = function () {
  var me = this,
    block = domUtils.isBlockElm,
    notExchange = ["TD", "LI", "PRE"],
    doParagraph = function (range, style, attrs, sourceCmdName) {
      var bookmark = range.createBookmark(),
        filterFn = function (node) {
          return node.nodeType == 1
            ? node.tagName.toLowerCase() != "br" &&
            !domUtils.isBookmarkNode(node)
            : !domUtils.isWhitespace(node);
        },
        para;

      range.enlarge(true);
      var bookmark2 = range.createBookmark(),
        current = domUtils.getNextDomNode(bookmark2.start, false, filterFn),
        tmpRange = range.cloneRange(),
        tmpNode;
      while (
        current &&
        !(
          domUtils.getPosition(current, bookmark2.end) &
          domUtils.POSITION_FOLLOWING
        )
      ) {
        if (current.nodeType == 3 || !block(current)) {
          tmpRange.setStartBefore(current);
          while (current && current !== bookmark2.end && !block(current)) {
            tmpNode = current;
            current = domUtils.getNextDomNode(current, false, null, function (
              node
            ) {
              return !block(node);
            });
          }
          tmpRange.setEndAfter(tmpNode);

          para = range.document.createElement(style);
          if (attrs) {
            domUtils.setAttributes(para, attrs);
            if (
              sourceCmdName &&
              sourceCmdName == "customstyle" &&
              attrs.style
            ) {
              para.style.cssText = attrs.style;
            }
          }
          para.appendChild(tmpRange.extractContents());
          //需要内容占位
          if (domUtils.isEmptyNode(para)) {
            domUtils.fillChar(range.document, para);
          }

          tmpRange.insertNode(para);

          var parent = para.parentNode;
          //如果para上一级是一个block元素且不是body,td就删除它
          if (
            block(parent) &&
            !domUtils.isBody(para.parentNode) &&
            utils.indexOf(notExchange, parent.tagName) == -1
          ) {
            //存储dir,style
            if (!(sourceCmdName && sourceCmdName == "customstyle")) {
              parent.getAttribute("dir") &&
                para.setAttribute("dir", parent.getAttribute("dir"));
              //trace:1070
              parent.style.cssText &&
                (para.style.cssText =
                  parent.style.cssText + ";" + para.style.cssText);
              //trace:1030
              parent.style.textAlign &&
                !para.style.textAlign &&
                (para.style.textAlign = parent.style.textAlign);
              parent.style.textIndent &&
                !para.style.textIndent &&
                (para.style.textIndent = parent.style.textIndent);
              parent.style.padding &&
                !para.style.padding &&
                (para.style.padding = parent.style.padding);
            }

            //trace:1706 选择的就是h1-6要删除 
            if (
              attrs &&
              /h\d/i.test(parent.tagName) &&
              !/h\d/i.test(para.tagName)
            ) {
              domUtils.setAttributes(parent, attrs);
              if (
                sourceCmdName &&
                sourceCmdName == "customstyle" &&
                attrs.style
              ) {
                parent.style.cssText = attrs.style;
              }
              domUtils.remove(para, true);
              para = parent;
            } else {
              domUtils.remove(para.parentNode, true);
            }
          }

          if (utils.indexOf(notExchange, parent.tagName) != -1) {
            current = parent;
          } else {
            current = para;
          }

          current = domUtils.getNextDomNode(current, false, filterFn);
        } else {
          current = domUtils.getNextDomNode(current, true, filterFn);
        }
      }
      return range.moveToBookmark(bookmark2).moveToBookmark(bookmark);
    };
  me.setOpt("paragraph", {
    p: "",
    h1: "",
    h2: "",
    h3: "",
    h4: "",
    h5: "",
    h6: ""
  });
  me.commands["paragraph"] = {
    execCommand: function (cmdName, style, attrs, sourceCmdName) {
      var range = this.selection.getRange();
      //闭合时单独处理
      if (range.collapsed) {
        var txt = this.document.createTextNode("p");
        range.insertNode(txt);
        //去掉冗余的fillchar
        if (browser.ie) {
          var node = txt.previousSibling;
          if (node && domUtils.isWhitespace(node)) {
            domUtils.remove(node);
          }
          node = txt.nextSibling;
          if (node && domUtils.isWhitespace(node)) {
            domUtils.remove(node);
          }
        }
      }
      range = doParagraph(range, style, attrs, sourceCmdName);
      if (txt) {
        range.setStartBefore(txt).collapse(true);
        pN = txt.parentNode;

        domUtils.remove(txt);

        if (domUtils.isBlockElm(pN) && domUtils.isEmptyNode(pN)) {
          domUtils.fillNode(this.document, pN);
        }
      }

      if (
        browser.gecko &&
        range.collapsed &&
        range.startContainer.nodeType == 1
      ) {
        var child = range.startContainer.childNodes[range.startOffset];
        if (
          child &&
          child.nodeType == 1 &&
          child.tagName.toLowerCase() == style
        ) {
          range.setStart(child, 0).collapse(true);
        }
      }
      //trace:1097 原来有true，原因忘了，但去了就不能清除多余的占位符了
      range.select();

      return true;
    },
    queryCommandValue: function () {
      var node = domUtils.filterNodeList(
        this.selection.getStartElementPath(),
        "p h1 h2 h3 h4 h5 h6"
      );
      return node ? node.tagName.toLowerCase() : "";
    }
  };
};
