//变量声明
var mouseFrom = {},
  mouseTo = {},
  drawType = 'right', //画板绘制类型
  canvasObjectIndex = 0;
var drawWidth = 2; //笔触宽度
var modifySize = 20, modifySmallSize = 10; //大/小 | 对/错画笔直径大小
var color = "#E34F51"; //画笔颜色
var drawingObject = null; //当前绘制对象
var moveCount = 1; //绘制移动计数器
var doDrawing = false; // 绘制状态
var rightColor = "#008B00", wrongColor = "#E34F51";
// var modifyImg = null;//当前批改的图片
var appErrCount = 0;//全局错误个数
var errTextBoxArray = new Array();
var canvasArr = [];  //所有(fabric产生)的canvas对象


//切换画板
function switchCanvas(url, index) {
  var canvasId = "c" + index;
  jQuery("#canvasDiv").find("div").addClass("fn-hide");
  jQuery("#canvasDiv").find("div").eq(index).removeClass("fn-hide");
  if (canvasArr[index]) {
    //canvas已经存在
    window.canvas = canvasArr[index];
    return false;
  }
  var canvas = new fabric.Canvas(canvasId, {
    isDrawingMode: false,
    skipTargetFind: true,
    selectable: false,
    selection: false
  });
  fabric.Image.fromURL(url, function (img) {
    canvas.add(img);
  }, { crossOrigin: 'anonymous' });
  canvasArr[index] = canvas;
  canvas.freeDrawingBrush.color = color; //设置自由绘颜色
  canvas.freeDrawingBrush.width = drawWidth;
  window.canvas = canvas;

  //绑定画板事件
  canvas.on("mouse:down", function (options) {
    var xy = transformMouse(options.e.offsetX, options.e.offsetY);
    mouseFrom.x = xy.x;
    mouseFrom.y = xy.y;
    doDrawing = true;
  });
  canvas.on("mouse:up", function (options) {
    var xy = transformMouse(options.e.offsetX, options.e.offsetY);
    mouseTo.x = xy.x;
    mouseTo.y = xy.y;
    drawing();
    drawingObject = null;
    moveCount = 1;
    doDrawing = false;
    if (drawType.indexOf("wrong") != -1) {
      //有错题
      jQuery("#errModal").removeClass("fn-hide");
      jQuery("#errModal").find("div[name=etag]").removeClass("active");
      ++appErrCount;
      var addLeft = 10, addTop = 25;
      if (drawType == "wrong") {
        addLeft = 25;
        addTop = 30;
      }
      var textbox = new fabric.Textbox(appErrCount.toString(), {
        left: mouseFrom.x + addLeft,
        top: mouseFrom.y - addTop,
        fontSize: 18,
        borderColor: "#2c2c2c",
        fill: color,
        hasControls: false,
        eindex: (appErrCount - 1),
        type: "textbox"
      });
      canvas.add(textbox);
      errTextBoxArray[appErrCount] = textbox;
    }
  });
  canvas.on("mouse:move", function (options) {
    if (moveCount % 2 && !doDrawing) {
      //减少绘制频率
      return;
    }
    moveCount++;
    var xy = transformMouse(options.e.offsetX, options.e.offsetY);
    mouseTo.x = xy.x;
    mouseTo.y = xy.y;
    drawing();
  });
  canvas.on("selection:created", function (e) {
    if (e.target._objects) {
      //多选删除
      var etCount = e.target._objects.length;
      for (var etindex = 0; etindex < etCount; etindex++) {
        if (e.target._objects[etindex].type == "image" || e.target._objects[etindex].type == "textbox") {
          continue;
        }
        var eindex = e.target._objects[etindex].eindex;
        canvas.remove(errTextBoxArray[(1 + eindex)]); //移除对应右上角的数字
        delete errTextBoxArray[(1 + eindex)];

        canvas.remove(e.target._objects[etindex]);

        //移除作业批注
        var errMsgChildren = jQuery("#errMsg").children();
        errMsgChildren.eq(errMsgChildren.length - 1 - eindex).addClass("fn-hide");
      }
    } else {
      //单选删除
      if (e.target.type != "image" && e.target.type != "textbox") {
        var eindex = e.target.eindex;
        canvas.remove(errTextBoxArray[(1 + eindex)]); //移除对应右上角的数字
        delete errTextBoxArray[(1 + eindex)];
        canvas.remove(e.target);

        //移除作业批注
        var errMsgChildren = jQuery("#errMsg").children();
        errMsgChildren.eq(errMsgChildren.length - 1 - eindex).addClass("fn-hide");

      }
    }
    canvas.discardActiveObject(); //清楚选中框
  });


}

window.zoom = window.zoom ? window.zoom : 1;
// window.drawType = drawType;

//坐标转换
function transformMouse(mouseX, mouseY) {
  return { x: mouseX / window.zoom, y: mouseY / window.zoom };
}

//绘画方法
function drawing() {
  if (drawingObject) {
    canvas.remove(drawingObject);
  }
  var canvasObject = null;
  switch (drawType) {
    case 'right': //整题正确
      var path =
        "M " +
        (mouseFrom.x - modifySize) +
        " " +
        (mouseFrom.y - modifySize) +
        " L " +
        mouseFrom.x +
        " " +
        mouseFrom.y +
        " L " +
        (mouseFrom.x + modifySize * 2) +
        " " +
        (mouseFrom.y - modifySize * 2);
      canvasObject = new fabric.Path(path, {
        stroke: rightColor,
        strokeWidth: drawWidth,
        fill: "rgba(255, 255, 255, 0)"
      });
      break;
    case 'wrong': //整题错误
      var path =
        "M " +
        (mouseFrom.x - modifySize) +
        " " +
        (mouseFrom.y - modifySize) +
        " L " +
        (mouseFrom.x + modifySize) +
        " " +
        (mouseFrom.y + modifySize) +
        "M " +
        (mouseFrom.x + modifySize) +
        " " +
        (mouseFrom.y - modifySize) +
        " L " +
        (mouseFrom.x - modifySize) +
        " " +
        (mouseFrom.y + modifySize);
      canvasObject = new fabric.Path(path, {
        stroke: wrongColor,
        strokeWidth: drawWidth,
        eindex: appErrCount,
        fill: "rgba(255, 255, 255, 0)"
      });

      // canvas.add();
      break;
    case 'smallright': //题目内单个正确
      var path =
        "M " +
        (mouseFrom.x - modifySmallSize) +
        " " +
        (mouseFrom.y - modifySmallSize) +
        " L " +
        mouseFrom.x +
        " " +
        mouseFrom.y +
        " L " +
        (mouseFrom.x + modifySmallSize * 2) +
        " " +
        (mouseFrom.y - modifySmallSize * 2);
      canvasObject = new fabric.Path(path, {
        stroke: rightColor,
        strokeWidth: drawWidth,
        fill: "rgba(255, 255, 255, 0)"
      });
      break;
    case 'smallwrong': //题目内单个错误
      var path =
        "M " +
        (mouseFrom.x - modifySmallSize) +
        " " +
        (mouseFrom.y - modifySmallSize) +
        " L " +
        (mouseFrom.x + modifySmallSize) +
        " " +
        (mouseFrom.y + modifySmallSize) +
        "M " +
        (mouseFrom.x + modifySmallSize) +
        " " +
        (mouseFrom.y - modifySmallSize) +
        " L " +
        (mouseFrom.x - modifySmallSize) +
        " " +
        (mouseFrom.y + modifySmallSize);
      canvasObject = new fabric.Path(path, {
        stroke: wrongColor,
        strokeWidth: drawWidth,
        eindex: appErrCount,
        fill: "rgba(255, 255, 255, 0)"
      });
      break;
    case "rectangle": //圈题
      canvasObject = new fabric.Rect({
        top: mouseFrom.y,
        left: mouseFrom.x,
        width: (mouseTo.x - mouseFrom.x),
        height: (mouseTo.y - mouseFrom.y),
        stroke: color,
        strokeWidth: drawWidth,
        fill: "rgba(255, 255, 255, 0)"
      });
      break;
    case "remove":
      break;
    case "help":

      break;
    default:

      break;
  }
  if (canvasObject) {
    // canvasObject.index = getCanvasObjectIndex();
    canvasObject.type = drawType;
    canvas.add(canvasObject); //.setActiveObject(canvasObject)
    drawingObject = canvasObject;
  }
}

//获取画板对象的下标
function getCanvasObjectIndex() {
  return canvasObjectIndex++;
}