///import core
///commands 右键菜单
///commandsName  ContextMenu
///commandsTitle  右键菜单
/**
 * 右键菜单
 * @function
 * @name baidu.editor.plugins.contextmenu
 * @author zhanyi
 */

UE.plugins["contextmenu"] = function() {
  var me = this;

  me.setOpt("enableContextMenu", me.getOpt("enableContextMenu") || true);

  if (me.getOpt("enableContextMenu") === false) {
    return;
  }
  var lang = me.getLang("contextMenu"),
    menu,
    items = me.options.contextMenu || [
      { label: lang["selectall"], cmdName: "selectall" },
      {
        label: lang.cleardoc,
        cmdName: "cleardoc",
        exec: function() {
          if (confirm(lang.confirmclear)) {
            this.execCommand("cleardoc");
          }
        }
      },
      "-",
      {
        label: lang.unlink,
        cmdName: "unlink"
      },
      "-",
      {
        group: lang.paragraph,
        icon: "justifyjustify",
        subMenu: [
          {
            label: lang.justifyleft,
            cmdName: "justify",
            value: "left"
          },
          {
            label: lang.justifyright,
            cmdName: "justify",
            value: "right"
          },
          {
            label: lang.justifycenter,
            cmdName: "justify",
            value: "center"
          },
          {
            label: lang.justifyjustify,
            cmdName: "justify",
            value: "justify"
          }
        ]
      },
      "-",
      {
        group: lang.table,
        icon: "table",
        subMenu: [
          {
            label: lang.inserttable,
            cmdName: "inserttable"
          },
          {
            label: lang.deletetable,
            cmdName: "deletetable"
          },
          "-",
          {
            label: lang.deleterow,
            cmdName: "deleterow"
          },
          {
            label: lang.deletecol,
            cmdName: "deletecol"
          },
          {
            label: lang.insertcol,
            cmdName: "insertcol"
          },
          {
            label: lang.insertcolnext,
            cmdName: "insertcolnext"
          },
          {
            label: lang.insertrow,
            cmdName: "insertrow"
          },
          {
            label: lang.insertrownext,
            cmdName: "insertrownext"
          },
          "-",
          {
            label: lang.insertcaption,
            cmdName: "insertcaption"
          },
          {
            label: lang.deletecaption,
            cmdName: "deletecaption"
          },
          {
            label: lang.inserttitle,
            cmdName: "inserttitle"
          },
          {
            label: lang.deletetitle,
            cmdName: "deletetitle"
          },
          {
            label: lang.inserttitlecol,
            cmdName: "inserttitlecol"
          },
          {
            label: lang.deletetitlecol,
            cmdName: "deletetitlecol"
          },
          "-",
          {
            label: lang.mergecells,
            cmdName: "mergecells"
          },
          {
            label: lang.mergeright,
            cmdName: "mergeright"
          },
          {
            label: lang.mergedown,
            cmdName: "mergedown"
          },
          "-",
          {
            label: lang.splittorows,
            cmdName: "splittorows"
          },
          {
            label: lang.splittocols,
            cmdName: "splittocols"
          },
          {
            label: lang.splittocells,
            cmdName: "splittocells"
          },
          "-",
          {
            label: lang.averageDiseRow,
            cmdName: "averagedistributerow"
          },
          {
            label: lang.averageDisCol,
            cmdName: "averagedistributecol"
          },
          "-",
          {
            label: lang.edittd,
            cmdName: "edittd",
            exec: function() {
              if (UE.ui["edittd"]) {
                new UE.ui["edittd"](this);
              }
              this.getDialog("edittd").open();
            }
          },
          {
            label: lang.edittable,
            cmdName: "edittable",
            exec: function() {
              if (UE.ui["edittable"]) {
                new UE.ui["edittable"](this);
              }
              this.getDialog("edittable").open();
            }
          },
          {
            label: lang.setbordervisible,
            cmdName: "setbordervisible"
          }
        ]
      },
      {
        group: lang.tablesort,
        icon: "tablesort",
        subMenu: [
          {
            label: lang.enablesort,
            cmdName: "enablesort"
          },
          {
            label: lang.disablesort,
            cmdName: "disablesort"
          },
          "-",
          {
            label: lang.reversecurrent,
            cmdName: "sorttable",
            value: "reversecurrent"
          },
          {
            label: lang.orderbyasc,
            cmdName: "sorttable",
            value: "orderbyasc"
          },
          {
            label: lang.reversebyasc,
            cmdName: "sorttable",
            value: "reversebyasc"
          },
          {
            label: lang.orderbynum,
            cmdName: "sorttable",
            value: "orderbynum"
          },
          {
            label: lang.reversebynum,
            cmdName: "sorttable",
            value: "reversebynum"
          }
        ]
      },
      {
        group: lang.borderbk,
        icon: "borderBack",
        subMenu: [
          {
            label: lang.setcolor,
            cmdName: "interlacetable",
            exec: function() {
              this.execCommand("interlacetable");
            }
          },
          {
            label: lang.unsetcolor,
            cmdName: "uninterlacetable",
            exec: function() {
              this.execCommand("uninterlacetable");
            }
          },
          {
            label: lang.setbackground,
            cmdName: "settablebackground",
            exec: function() {
              this.execCommand("settablebackground", {
                repeat: true,
                colorList: ["#bbb", "#ccc"]
              });
            }
          },
          {
            label: lang.unsetbackground,
            cmdName: "cleartablebackground",
            exec: function() {
              this.execCommand("cleartablebackground");
            }
          },
          {
            label: lang.redandblue,
            cmdName: "settablebackground",
            exec: function() {
              this.execCommand("settablebackground", {
                repeat: true,
                colorList: ["red", "blue"]
              });
            }
          },
          {
            label: lang.threecolorgradient,
            cmdName: "settablebackground",
            exec: function() {
              this.execCommand("settablebackground", {
                repeat: true,
                colorList: ["#aaa", "#bbb", "#ccc"]
              });
            }
          }
        ]
      },
      {
        group: lang.aligntd,
        icon: "aligntd",
        subMenu: [
          {
            cmdName: "cellalignment",
            value: { align: "left", vAlign: "top" }
          },
          {
            cmdName: "cellalignment",
            value: { align: "center", vAlign: "top" }
          },
          {
            cmdName: "cellalignment",
            value: { align: "right", vAlign: "top" }
          },
          {
            cmdName: "cellalignment",
            value: { align: "left", vAlign: "middle" }
          },
          {
            cmdName: "cellalignment",
            value: { align: "center", vAlign: "middle" }
          },
          {
            cmdName: "cellalignment",
            value: { align: "right", vAlign: "middle" }
          },
          {
            cmdName: "cellalignment",
            value: { align: "left", vAlign: "bottom" }
          },
          {
            cmdName: "cellalignment",
            value: { align: "center", vAlign: "bottom" }
          },
          {
            cmdName: "cellalignment",
            value: { align: "right", vAlign: "bottom" }
          }
        ]
      },
      {
        group: lang.aligntable,
        icon: "aligntable",
        subMenu: [
          {
            cmdName: "tablealignment",
            className: "left",
            label: lang.tableleft,
            value: "left"
          },
          {
            cmdName: "tablealignment",
            className: "center",
            label: lang.tablecenter,
            value: "center"
          },
          {
            cmdName: "tablealignment",
            className: "right",
            label: lang.tableright,
            value: "right"
          }
        ]
      },
      "-",
      {
        label: lang.insertparagraphbefore,
        cmdName: "insertparagraph",
        value: true
      },
      {
        label: lang.insertparagraphafter,
        cmdName: "insertparagraph"
      },
      {
        label: lang["copy"],
        cmdName: "copy"
      },
      {
        label: lang["paste"],
        cmdName: "paste"
      }
    ];
  if (!items.length) {
    return;
  }
  var uiUtils = UE.ui.uiUtils;

  me.addListener("contextmenu", function(type, evt) {
    var offset = uiUtils.getViewportOffsetByEvent(evt);
    me.fireEvent("beforeselectionchange");
    if (menu) {
      menu.destroy();
    }
    for (var i = 0, ti, contextItems = []; (ti = items[i]); i++) {
      var last;
      (function(item) {
        if (item == "-") {
          if ((last = contextItems[contextItems.length - 1]) && last !== "-") {
            contextItems.push("-");
          }
        } else if (item.hasOwnProperty("group")) {
          for (var j = 0, cj, subMenu = []; (cj = item.subMenu[j]); j++) {
            (function(subItem) {
              if (subItem == "-") {
                if ((last = subMenu[subMenu.length - 1]) && last !== "-") {
                  subMenu.push("-");
                } else {
                  subMenu.splice(subMenu.length - 1);
                }
              } else {
                if (
                  (me.commands[subItem.cmdName] ||
                    UE.commands[subItem.cmdName] ||
                    subItem.query) &&
                  (subItem.query
                    ? subItem.query()
                    : me.queryCommandState(subItem.cmdName)) > -1
                ) {
                  subMenu.push({
                    label:
                      subItem.label ||
                        me.getLang(
                          "contextMenu." +
                            subItem.cmdName +
                            (subItem.value || "")
                        ) ||
                        "",
                    className:
                      "edui-for-" +
                        subItem.cmdName +
                        (subItem.className
                          ? " edui-for-" +
                              subItem.cmdName +
                              "-" +
                              subItem.className
                          : ""),
                    onclick: subItem.exec
                      ? function() {
                          subItem.exec.call(me);
                        }
                      : function() {
                          me.execCommand(subItem.cmdName, subItem.value);
                        }
                  });
                }
              }
            })(cj);
          }
          if (subMenu.length) {
            function getLabel() {
              switch (item.icon) {
                case "table":
                  return me.getLang("contextMenu.table");
                case "justifyjustify":
                  return me.getLang("contextMenu.paragraph");
                case "aligntd":
                  return me.getLang("contextMenu.aligntd");
                case "aligntable":
                  return me.getLang("contextMenu.aligntable");
                case "tablesort":
                  return lang.tablesort;
                case "borderBack":
                  return lang.borderbk;
                default:
                  return "";
              }
            }
            contextItems.push({
              //todo 修正成自动获取方式
              label: getLabel(),
              className: "edui-for-" + item.icon,
              subMenu: {
                items: subMenu,
                editor: me
              }
            });
          }
        } else {
          //有可能commmand没有加载右键不能出来，或者没有command也想能展示出来添加query方法
          if (
            (me.commands[item.cmdName] ||
              UE.commands[item.cmdName] ||
              item.query) &&
            (item.query
              ? item.query.call(me)
              : me.queryCommandState(item.cmdName)) > -1
          ) {
            contextItems.push({
              label: item.label || me.getLang("contextMenu." + item.cmdName),
              className:
                "edui-for-" +
                  (item.icon ? item.icon : item.cmdName + (item.value || "")),
              onclick: item.exec
                ? function() {
                    item.exec.call(me);
                  }
                : function() {
                    me.execCommand(item.cmdName, item.value);
                  }
            });
          }
        }
      })(ti);
    }
    if (contextItems[contextItems.length - 1] == "-") {
      contextItems.pop();
    }

    menu = new UE.ui.Menu({
      items: contextItems,
      className: "edui-contextmenu",
      editor: me
    });
    menu.render();
    menu.showAt(offset);

    me.fireEvent("aftershowcontextmenu", menu);

    domUtils.preventDefault(evt);
    if (browser.ie) {
      var ieRange;
      try {
        ieRange = me.selection.getNative().createRange();
      } catch (e) {
        return;
      }
      if (ieRange.item) {
        var range = new dom.Range(me.document);
        range.selectNode(ieRange.item(0)).select(true, true);
      }
    }
  });

  // 添加复制的flash按钮
  me.addListener("aftershowcontextmenu", function(type, menu) {
    if (me.zeroclipboard) {
      var items = menu.items;
      for (var key in items) {
        if (items[key].className == "edui-for-copy") {
          me.zeroclipboard.clip(items[key].getDom());
        }
      }
    }
  });
};
