// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE
/**
 * 定义“全屏模式”扩展方法
 * 用于 CodeMirror 编辑器 提供全屏切换功能，通过全屏时占据整个视口，退出时恢复原始尺寸和页面滚动位置
 */
(function(mod) {
  // 模块化封装（兼容 CommonJS/AMD/浏览器全局环境）
  if (typeof exports == "object" && typeof module == "object") // CommonJS
    mod(require("../../lib/codemirror"));
  else if (typeof define == "function" && define.amd) // AMD
    define(["../../lib/codemirror"], mod);
  else // Plain browser env
    mod(CodeMirror);
})(function(CodeMirror) {
  "use strict";
  /**
   * 定义“fullScreen”配置项（控制全屏状态）
   * @param {CodeMirror} cm - 编辑器实例
   * @param {boolean} val - 新状态（true=全屏，false=普通）
   * @param {boolean} old - 旧状态（用于判断是否需要执行切换逻辑）
   */
  CodeMirror.defineOption("fullScreen", false, function(cm, val, old) {
    if (old == CodeMirror.Init) old = false;
    if (!old == !val) return;
    if (val) setFullscreen(cm);
    else setNormal(cm);
  });
  /**
   * 进入全屏模式
   * @param {CodeMirror} cm - 编辑器实例
   */
  function setFullscreen(cm) {
    var wrap = cm.getWrapperElement();
    cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset,
                                  width: wrap.style.width, height: wrap.style.height};
    // 清除编辑器原始宽高（让全屏时自动占满可用空间）
    wrap.style.width = "";
    wrap.style.height = "auto";
    wrap.className += " CodeMirror-fullscreen";
    document.documentElement.style.overflow = "hidden";
    cm.refresh();
  }
  /**
   * 退出全屏模式（恢复普通模式）
   * @param {CodeMirror} cm - 编辑器实例
   */
  function setNormal(cm) {
    var wrap = cm.getWrapperElement();
    wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, "");
    document.documentElement.style.overflow = "";
    var info = cm.state.fullScreenRestore;
    wrap.style.width = info.width; wrap.style.height = info.height;
    window.scrollTo(info.scrollLeft, info.scrollTop);
    cm.refresh();
  }
});
