{"version":3,"sources":["tabs.js","dialog.js","editors.js","notification.js","tree.js","wide.js","session.js","menu.js","windows.js","hotkeys.js","bottomGroup.js"],"names":["Tabs","obj","_$tabsPanel","$","id","_$tabs","_stack","this","STACKSIZE","_init","_it","each","data","length","splice","push","extend","prototype","_that","on","event","hasClass","setCurrent","clickAfter","parent","isRemove","removeBefore","del","stopPropagation","_hasId","find","add","getCurrentId","$tabsPanel","append","title","content","after","prevId","$tabs","stack","children","remove","i","removeAfter","path","removeClass","hide","addClass","show","setAfter","tId","tree","getTIdByPath","node","fileTree","getNodeByTId","selectNode","wide","curNode","ii","editors","curEditor","editor","cursor","getCursor","setCursor","focus","refreshOutline","text","line","ch","fn","dialog","version","author","Dialog","_defaults","styleClass","background","panel","main","footer","headerMiddle","headerBg","closeIcon","closeIconHover","dpuuid","Date","getTime","PROP_NAME","_attach","target","settings","uuid","inst","_newInst","replace","_getInst","err","_destroyDialog","removeData","prependTo","unwrap","removeAttr","_getDefaults","windowH","window","height","windowW","width","dialogH","parseInt","dialogW","okText","cancelText","footerHTML","headerHTML","hideFooter","hiddenOk","dialogHTML","bgHTML","modal","document","documentElement","scrollHeight","wrap","cloneObj","clone","get","bind","_close","$buttons","undefined","ok","_bindMove","keyup","keyCode","resize","afterInit","className","mousedown","_document","getElementById","x","clientX","style","left","y","clientY","top","ondragstart","onselectstart","onselect","setCapture","captureEvents","Event","MOUSEMOVE","MOUSEUP","onmousemove","positionX","positionY","onmouseup","releaseCapture","css","close","_closeDialog","_openDialog","msg","$dialog","position","afterOpen","_updateDialog","html","defaults","key","theme","styleName","options","otherArgs","Array","slice","call","arguments","shift","apply","concat","jQuery","autocompleteMutex","tabs","getEditorByPath","click","closeOther","currentIndex","firstIndex","_removeAllMarker","removeIndex","_initClose","ZeroClipboard","button","screenX","attr","init","config","label","tip","fileName","file","confirm_save","fmt","doc","isClean","nextId","menu","disabled","cancelSelectedNode","_initCodeMirrorHotKeys","openStartPage","dateFormat","time","date","dateObj","M+","getMonth","d+","getDate","h+","getHours","m+","getMinutes","s+","getSeconds","q+","Math","floor","S","getMilliseconds","k","test","RegExp","$1","getFullYear","substr","start_page","load","wideSessionId","ajax","url","type","dataType","jsonp","success","textStatus","articles","listHTML","community","article","articlePermalink","articleTitle","articleCreateTime","ret","getCurrentPath","currentPath","CodeMirror","registerHelper","word","cur","curLine","getLine","start","end","charAt","request","newWideRequest","code","getValue","cursorLine","cursorCh","autocompleteHints","state","completionActive","async","JSON","stringify","autocompleteArray","displayText","name","class","substring","console","warn","markClean","setTimeout","list","from","Pos","to","commands","autocompleteAfterDot","cm","mode","getMode","Pass","token","getTokenAt","showHint","hint","go","completeSingle","autocompleteAnyWord","auto","gotoLine","doNothing","exprInfo","result","cursorCoords","copyLinesDown","selectoion","listSelections","anchor","head","max","replaceToLine","replaceRange","offset","setSelection","copyLinesUp","moveLinesUp","moveLinesDown","lastLine","jumpToDecl","openFile","findUsages","appendSearch","selectIdentifier","findWordAt","extendSelection","searcHTML","toLowerCase","contents","matches","split","startIndex","endIndex","j","keyWord","search_no_match","$search","find_usages","search_text","bottomGroup","searchTab","$it","half","getScrollInfo","clientHeight","defaultTextHeight","scrollTo","windows","flowBottom","newEditor","iconSkin","undisabled","textArea","value","fromTextArea","lineNumbers","autofocus","autoCloseBrackets","matchBrackets","highlightSelectionMatches","showToken","rulers","color","column","lineStyle","styleActiveLine","editorTheme","tabSize","editorTabSize","indentUnit","indentWithTabs","foldGutter","cursorHeight","readOnly","isGOAPI","profile","extraKeys","Ctrl-\\",".","Ctrl-/","Ctrl-I","Ctrl-L","Ctrl-E","Ctrl-D","Ctrl-B","Ctrl-S","saveFile","Shift-Ctrl-S","saveAllFiles","Shift-Alt-F","Alt-F7","Shift-Alt-Enter","isMaxEditor","restoreEditor","maxEditor","Shift-Ctrl-Up","Shift-Ctrl-Down","Shift-Alt-Up","Shift-Alt-Down","Shift-Alt-J","emmetCodeMirror","$span","evt","altKey","ctrlKey","shiftKey","which","autocomplete","random","setSize","setOption","keymap","notification","_initWS","notificationWS","ReconnectingWebSocket","channel","onopen","onmessage","e","parse","$notification","notificationHTML","cmd","severity","message","onclose","onerror","log","getCurrentNodeLastNode","returnNode","open","getNextShowNode","level","getParentNode","getNextNode","isBottomNode","isLastNode","nodes","transformToArray","getNodes","getOpenPaths","paths","getAllParents","parents","parentTId","isParents","parentPath","parentNode","isDir","indexOf","newFile","it","newDir","removeIt","removable","rename","export","isSucc","crossCompile","platform","refresh","reAsyncChildNodes","$dirRMenu","$fileRMenu","setting","view","showTitle","selectedMulti","enable","autoParam","callback","onDblClick","treeId","treeNode","onRightClick","creatable","display","onClick","clickFlag","zTree","session","restore","_initSearch","_initRename","tempCursor","findModeByFileName","mime","error","$okBtn","closest","prop","trim","val","search","cancel","dir","extension","select","oldPath","newPath","lastIndexOf","curProcessId","outlineHTML","decls","maxj","Ch","Line","Name","dblclick","_initDialog","confirm","delete","create_file","create","fileType","create_dir","goto_file","$list","hotkeys","bindList","$selected","goFileHTML","icoSkin","getClassBySuffix","goto_line","outputWS","goLintFound","nextCmd","executable","fillOutput","output","pid","build_n_run","lints","files","lint","lineNo","signal","_initFooter","unbind","subMenu","onbeforeunload","oncontextmenu","_save","getOption","gofmt","beforeSend","resetOutput","stop","run","scrollInfo","setValue","formatted","html_beautify","js_beautify","css_beautify","suffix","ready","getLayoutState","paneState","isClosed","size","setInterval","filse","currentFile","layout","side","outerLayout","west","sideRight","innerLayout","east","bottom","south","latestSessionContent","nodesToOpen","jj","isOpen","l","expandNode","kk","m","mm","n","nn","c","sessionWS","addNodes","isParent","removeNode","_initPreference","_initAbout","_initShare","hover","pic","urls","email","twitterShare","encodeURIComponent","twitter","facebook","googleplus","weibo","qqz","about","wideVersion","uptodate","new_version_available","colon","wideDownload","mouseover","openPreference","closeAllFiles","exit","location","href","openAbout","goinstall","govet","build","isChange","emptys","emptysTip","tabIndex","no_empty","preference","$dialogPreference","$fontFamily","$fontSize","$goFmt","$GoBuildArgsForLinux","$GoBuildArgsForWindows","$GoBuildArgsForDarwin","$workspace","$password","$email","$locale","$theme","$editorFontFamily","$editorFontSize","$editorLineHeight","$editorTheme","$editorTabSize","$keymap","fontFamily","fontSize","goFmt","GoBuildArgsForLinux","GoBuildArgsForWindows","GoBuildArgsForDarwin","workspace","password","locale","editorFontFamily","editorFontSize","editorLineHeight","reload","jqXHR","north__paneSelector","center__paneSelector","south__paneSelector","north__size","south__size","spacing_open","north__spacing_open","south__spacing_open","fxSpeed_open","fxSpeed_close","fxSettings_close","easing","fxSettings_open","paneSelector","togglerLength_open","togglerLength_closed","togglerAlign_closed","slideTrigger_open","spacing_closed","minSize","togglerClass","togglerTip_open","min","togglerTip_closed","restore_side","resizerTip","initClosed","center","restore_outline","restore_bottom","ondrag_end","pane","refreshEditor","onresize_end","onclose_end","onopen_end","onshow_end","addCloseBtn","maxSide","maxSideRight","maxBottom","toggleEditor","restoreBottom","restoreSide","restoreSideRight","sizePane","max_editor","editorDatas","slideOpen","defaultKeyMap","goEditor","fun","goFileTree","goOutline","goOutput","goSearch","goNotification","clearWindow","changeEditor","closeCurEditor","goFile","buildRun","$source","enterFun","keydown","index","count","scrollTop","offsetTop","_bindOutput","hotKeys","clear","preventDefault","_bindFileTree","isFirstNode","getPreNode","preNode","nextShowNode","_bindDocument","activeElement","nextPath","currentId","nextTId","_initTabs","_initFrame","$path","mouseup","offsetY","$output","Autolinker","link"],"mappings":"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","file":"wide.min.js","sourcesContent":["/*\n * Copyright (c) 2014-present, b3log.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * @file tabs.js\n *\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\n * @version 1.0.0.1, Dec 8, 2015\n */\nvar Tabs = function (obj) {\n    obj._$tabsPanel = $(obj.id + \" > .tabs-panel\");\n    obj._$tabs = $(obj.id + \" > .tabs\");\n    obj._stack = [];\n\n    this.obj = obj;\n    this.obj.STACKSIZE = 64;\n\n    this._init(obj);\n\n    // DOM 元素存在时,应顺序入栈\n    var _it = this;\n    $(obj.id + \" > .tabs > div\").each(function () {\n        var id = $(this).data(\"index\");\n        if (obj._stack.length === _it.obj.STACKSIZE) {\n            obj._stack.splice(0, 1);\n        }\n        if (obj._stack[obj._stack.length - 1] !== id) {\n            _it.obj._stack.push(id);\n        }\n    });\n\n};\n\n$.extend(Tabs.prototype, {\n    _init: function (obj) {\n        var _that = this;\n\n        obj._$tabs.on(\"click\", \"div\", function (event) {\n            if ($(this).hasClass('current')) {\n                return false;\n            }\n\n            var id = $(this).data(\"index\");\n            _that.setCurrent(id);\n            if (typeof (obj.clickAfter) === \"function\") {\n                obj.clickAfter(id);\n            }\n        });\n\n        obj._$tabs.on(\"click\", \".ico-close\", function (event) {\n            var id = $(this).parent().data(\"index\"),\n                    isRemove = true;\n\n            if (typeof obj.removeBefore === 'function') {\n                isRemove = obj.removeBefore(id);\n            }\n\n            if (isRemove) {\n                _that.del(id);\n            }\n            event.stopPropagation();\n        });\n    },\n    _hasId: function (id) {\n        var $tabs = this.obj._$tabs;\n        if ($tabs.find('div[data-index=\"' + id + '\"]').length === 0) {\n            return false;\n        }\n        return true;\n    },\n    add: function (data) {\n        // 添加当前 tab\n        if (this.getCurrentId() === data.id) {\n            return false;\n        }\n\n        // 当前 tab 已经存在\n        if (this._hasId(data.id)) {\n            this.setCurrent(data.id);\n            return false;\n        }\n\n        var $tabsPanel = this.obj._$tabsPanel,\n                $tabs = this.obj._$tabs;\n\n        $tabs.append('<div data-index=\"' + data.id + '\">'\n                + data.title + ' <span class=\"ico-close font-ico\"></span></div>');\n        $tabsPanel.append('<div data-index=\"' + data.id + '\">' + data.content\n                + '</div>');\n\n        this.setCurrent(data.id);\n\n        if (typeof data.after === 'function') {\n            data.after();\n        }\n    },\n    del: function (id) {\n        var $tabsPanel = this.obj._$tabsPanel,\n                $tabs = this.obj._$tabs,\n                stack = this.obj._stack,\n                prevId = null;\n\n        $tabs.children(\"div[data-index='\" + id + \"']\").remove();\n        $tabsPanel.children(\"div[data-index='\" + id + \"']\").remove();\n\n        // 移除堆栈中该 id\n        for (var i = 0; i < stack.length; i++) {\n            if (id === stack[i]) {\n                stack.splice(i, 1);\n                i--;\n            }\n        }\n\n        prevId = stack[stack.length - 1];\n\n        if (typeof this.obj.removeAfter === 'function') {\n            this.obj.removeAfter(id, prevId);\n        }\n\n        this.setCurrent(prevId);\n    },\n    getCurrentId: function () {\n        var $tabs = this.obj._$tabs;\n        return $tabs.children(\".current\").data(\"index\");\n    },\n    setCurrent: function (path) {\n        if (!path) {\n            return false;\n        }\n\n        var $tabsPanel = this.obj._$tabsPanel,\n                $tabs = this.obj._$tabs;\n\n        var $currentTab = $tabs.children(\".current\");\n        if ($currentTab.data(\"index\") === path) {\n            return false;\n        }\n\n        // tab 顺序入栈,如栈满则清除\n        var stack = this.obj._stack;\n        if (stack.length === this.obj.STACKSIZE) {\n            stack.splice(0, 1);\n        }\n        if (stack[stack.length - 1] !== path) {\n            this.obj._stack.push(path);\n        }\n\n        $tabs.children(\"div\").removeClass(\"current\");\n        $tabsPanel.children(\"div\").hide();\n\n        $tabs.children('div[data-index=\"' + path + '\"]').addClass(\"current\");\n        $tabsPanel.children('div[data-index=\"' + path + '\"]').show();\n\n        if (typeof this.obj.setAfter === 'function') {\n            this.obj.setAfter();\n        }\n\n        var id = this.getCurrentId();\n        if (\"startPage\" === id) {\n            return;\n        }\n\n        // set tree node selected\n        var tId = tree.getTIdByPath(id);\n        var node = tree.fileTree.getNodeByTId(tId);\n        tree.fileTree.selectNode(node);\n        wide.curNode = node;\n\n        for (var i = 0, ii = editors.data.length; i < ii; i++) {\n            if (editors.data[i].id === id) {\n                wide.curEditor = editors.data[i].editor;\n                break;\n            }\n        }\n\n        if (wide.curEditor) {\n            var cursor = wide.curEditor.getCursor();\n            wide.curEditor.setCursor(cursor);\n            wide.curEditor.focus();\n            wide.refreshOutline();\n\n            $(\".footer .cursor\").text('|   ' + (cursor.line + 1) + ':' + (cursor.ch + 1) + '   |');\n        }\n    }\n});","/*\n * Copyright (c) 2014-present, b3log.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * @file dialog.js\n *\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\n * @version 1.0.0.1, Dec 8, 2015\n */\n(function ($) {\n    $.fn.extend({\n        dialog: {\n            version: \"0.0.1.7\",\n            author: \"v@b3log.org\"\n        }\n    });\n\n    var dpuuid = new Date().getTime();\n    var PROP_NAME = 'dialog';\n\n    var Dialog = function () {\n        this._defaults = {\n            \"styleClass\": {\n                \"background\": \"dialog-background\",\n                \"panel\": \"dialog-panel\",\n                \"main\": \"dialog-main\",\n                \"footer\": \"dialog-footer\",\n                \"headerMiddle\": \"dialog-header-middle\",\n                \"headerBg\": \"dialog-header-bg\",\n                \"closeIcon\": \"dialog-close-icon\",\n                \"closeIconHover\": \"dialog-close-icon-hover\",\n                \"title\": \"dialog-title\"\n            }\n        };\n    };\n\n    $.extend(Dialog.prototype, {\n        _attach: function (target, settings) {\n            if (!target.id) {\n                this.uuid++;\n                target.id = 'dp' + this.uuid;\n            }\n            var inst = this._newInst($(target));\n\n            inst.settings = $.extend({}, settings || {});\n            $.data(target, PROP_NAME, inst);\n            this._init(target);\n        },\n        /* Create a new instance object. */\n        _newInst: function (target) {\n            // escape jQuery meta chars\n            var id = target[0].id.replace(/([^A-Za-z0-9_])/g, '\\\\\\\\$1');\n            return {\n                id: id\n            };\n        },\n        _getInst: function (target) {\n            try {\n                return $.data(target, PROP_NAME);\n            } catch (err) {\n                throw 'Missing instance data for this dialog';\n            }\n        },\n        _destroyDialog: function (target) {\n            var inst = $.dialog._getInst(target);\n            var id = inst.id;\n            $.removeData(target, PROP_NAME);\n\n            $(target).prependTo(\"#\" + id + \"Wrap\").unwrap();\n            $(target).removeAttr(\"style\");\n\n            var styleClass = this._getDefaults($.dialog._defaults, inst.settings, \"styleClass\");\n            $(\".\" + styleClass.background).remove();\n            $(\"#\" + id + \"Dialog\").remove();\n        },\n        _init: function (target) {\n            var inst = this._getInst(target);\n            var id = inst.id,\n                    settings = inst.settings;\n            var windowH = $(window).height(),\n                    windowW = $(window).width();\n            var styleClass = this._getDefaults($.dialog._defaults, settings, \"styleClass\"),\n                    dialogH = settings.height ? settings.height : parseInt(windowH * 0.6),\n                    dialogW = settings.width ? settings.width : parseInt(windowW * 0.6);\n\n            // get settings or default value.\n            settings.title = settings.title ? settings.title : \"\";\n            settings.okText = settings.okText ? settings.okText : \"Ok\";\n            settings.cancelText = settings.cancelText ? settings.cancelText : \"Cancel\";\n\n            // build HTML.\n            var footerHTML = \"\",\n                    headerHTML = \"<div class='\"\n                    + styleClass.headerBg + \"'><div class='\"\n                    + styleClass.title + \"'>\"\n                    + settings.title + \"</div><a href='javascript:void(0);' class='ico-close font-ico \"\n                    + styleClass.closeIcon + \"'></a></div>\";\n\n            // Sets footerHTML.\n            if (!settings.hideFooter) {\n                if (!settings.hiddenOk) {\n                    footerHTML = \"<button>\" + settings.okText +\n                            \"</button>\";\n                }\n                footerHTML += \"<button>\"\n                        + settings.cancelText + \"</button>\";\n            }\n\n            var dialogHTML = \"<div id='\" + id + \"Dialog' class='\" + styleClass.panel\n                    + \"' style='width: \" + dialogW + \"px;' onselectstart='return false;'>\" + headerHTML\n                    + \"<div class='\" + styleClass.main + \"'><div style='overflow: auto; height: \"\n                    + dialogH + \"px;'></div><div class='\" + styleClass.footer + \"'>\"\n                    + footerHTML + \"</div></div>\";\n\n            var bgHTML = \"\";\n            if (settings.modal && $(\".\" + styleClass.background).length === 0) {\n                var bgHeight = windowH < document.documentElement.scrollHeight\n                        ? document.documentElement.scrollHeight : windowH;\n                bgHTML = \"<div style='height:\" + bgHeight\n                        + \"px;' class='\" + styleClass.background + \"'></div>\";\n            }\n\n            // Package dialog.\n            $(\"#\" + id).wrap(\"<div id='\" + id + \"Wrap'></div>\");\n            var cloneObj = $(target).clone(true);\n            $(target).remove();\n            $('body').append(bgHTML + dialogHTML);\n            $($(\"#\" + id + \"Dialog .\" + styleClass.main + \" div\").get(0)).append(cloneObj);\n            $(cloneObj).show();\n\n            // Bind event.\n            $(\"#\" + id + \"Dialog .\" + styleClass.closeIcon).bind(\"click\", function () {\n                $.dialog._close(id, settings);\n            });\n\n            var $buttons = $(\"#\" + id + \"Dialog .\" + styleClass.footer + \" button\");\n            $($buttons.get(1)).bind(\"click\", function () {\n                $.dialog._close(id, settings);\n            });\n\n            $($buttons.get(0)).bind(\"click\", function () {\n                if (settings.ok === undefined || settings.ok()) {\n                    $.dialog._close(id, settings);\n                }\n            });\n\n            this._bindMove(id, styleClass.headerBg, dialogH, dialogW);\n\n            // esc exit\n            $(window).keyup(function (event) {\n                if (event.keyCode === 27) {\n                    $.dialog._close(id, settings);\n                }\n            });\n\n            $(window).resize(function () {\n                var height = $(\"body\").height() > $(window).height() ? $(\"body\").height() : $(window).height();\n                $(\".dialog-background\").height(height);\n            });\n\n            if (typeof settings.afterInit === \"function\") {\n                settings.afterInit();\n            }\n        },\n        _bindMove: function (id, className) {\n            $(\"#\" + id + \"Dialog .\" + className).mousedown(function (event) {\n                var _document = document;\n                if (!event) {\n                    event = window.event;\n                }\n                var dialog = document.getElementById(id + \"Dialog\");\n                var x = event.clientX - parseInt(dialog.style.left),\n                        y = event.clientY - parseInt(dialog.style.top);\n                _document.ondragstart = \"return false;\";\n                _document.onselectstart = \"return false;\";\n                _document.onselect = \"document.selection.empty();\";\n\n                if (this.setCapture) {\n                    this.setCapture();\n                } else if (window.captureEvents) {\n                    window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);\n                }\n\n                _document.onmousemove = function (event) {\n                    if (!event) {\n                        event = window.event;\n                    }\n                    var positionX = event.clientX - x,\n                            positionY = event.clientY - y;\n                    if (positionX < 0) {\n                        positionX = 0;\n                    }\n                    if (positionX > $(window).width() - $(dialog).width()) {\n                        positionX = $(window).width() - $(dialog).width();\n                    }\n                    if (positionY > $(window).height() - $(dialog).height()) {\n                        positionY = $(window).height() - $(dialog).height();\n                    }\n                    if (positionY < 0) {\n                        positionY = 0;\n                    }\n                    dialog.style.left = positionX + \"px\";\n                    dialog.style.top = positionY + \"px\";\n                };\n\n                _document.onmouseup = function () {\n                    if (this.releaseCapture) {\n                        this.releaseCapture();\n                    } else if (window.captureEvents) {\n                        window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);\n                    }\n                    _document.onmousemove = null;\n                    _document.onmouseup = null;\n                    _document.ondragstart = null;\n                    _document.onselectstart = null;\n                    _document.onselect = null;\n                };\n            });\n        },\n        _close: function (id, settings) {\n            if ($(\"#\" + id + \"Dialog\").css(\"display\") === \"none\") {\n                return;\n            }\n            if (settings.close === undefined || settings.close()) {\n                $(\"#\" + id + \"Dialog\").hide();\n                if (settings.modal) {\n                    var styleClass = this._getDefaults($.dialog._defaults, settings, \"styleClass\");\n                    $(\".\" + styleClass.background).hide();\n                }\n            }\n        },\n        _closeDialog: function (target) {\n            var inst = this._getInst(target);\n            var id = inst.id,\n                    settings = inst.settings;\n            $.dialog._close(id, settings);\n        },\n        _openDialog: function (target, msg) {\n            var inst = this._getInst(target);\n            var id = inst.id,\n                    settings = inst.settings,\n                    top = \"\", left = \"\",\n                    $dialog = $(\"#\" + id + \"Dialog\"),\n                    windowH = $(window).height(),\n                    windowW = $(window).width(),\n                    dialogH = settings.height ? settings.height : parseInt(windowH * 0.6),\n                    dialogW = settings.width ? settings.width : parseInt(windowW * 0.6);\n\n            // Sets position.\n            if (settings.position) {\n                top = settings.position.top;\n                left = settings.position.left;\n            } else {\n                // 20(footer) + 23(header)\n                top = parseInt((windowH - dialogH - 43) / 2);\n                if (top < 0) {\n                    top = 0;\n                }\n                left = parseInt((windowW - dialogW) / 2);\n            }\n            $dialog.css({\n                \"top\": top + \"px\",\n                \"left\": left + \"px\"\n            }).show();\n\n            if (settings.modal) {\n                var styleClass = this._getDefaults($.dialog._defaults, settings, \"styleClass\");\n                $(\".\" + styleClass.background).show();\n            }\n\n            if (typeof settings.afterOpen === \"function\") {\n                settings.afterOpen(msg);\n            }\n\n            $(\"#\" + id + \"Dialog .dialog-footer button:eq(0)\").focus();\n        },\n        _updateDialog: function (target, data) {\n            var inst = this._getInst(target);\n            var id = inst.id,\n                    settings = inst.settings;\n            var styleClass = this._getDefaults($.dialog._defaults, settings, \"styleClass\");\n            $.extend(settings, data);\n            var $dialog = $(\"#\" + id + \"Dialog\");\n            if (data.position) {\n                $dialog.css({\n                    \"top\": data.position.top,\n                    \"left\": data.position.left\n                });\n            }\n\n            if (data.width) {\n                $dialog.width(data.width + 26);\n                $dialog.find(\".\" + styleClass.main + \" div\")[0].style.width = data.width + \"px\";\n                $dialog.find(\".\" + styleClass.headerBg).width(data.width + 18);\n            }\n\n            if (data.height) {\n                $dialog.find(\".\" + styleClass.main + \" div\")[0].style.height = data.height + \"px\";\n            }\n\n            if (data.title) {\n                $dialog.find(\".\" + styleClass.title).html(data.title);\n            }\n\n            if (data.modal !== undefined) {\n                if (data.modal) {\n                    $(\".\" + styleClass.background).show();\n                } else {\n                    $(\".\" + styleClass.background).hide();\n                }\n            }\n\n            if (data.hideFooter !== undefined) {\n                if (data.hideFooter) {\n                    $dialog.find(\".\" + styleClass.footer).hide();\n                } else {\n                    $dialog.find(\".\" + styleClass.footer).show();\n                }\n            }\n\n        },\n        _getDefaults: function (defaults, settings, key) {\n            if (key === \"styleClass\") {\n                if (settings.theme === \"default\" || settings.theme === undefined) {\n                    return defaults.styleClass;\n                }\n                settings.styleClass = {};\n                for (var styleName in defaults[key]) {\n                    settings.styleClass[styleName] = settings.theme + \"-\" + defaults.styleClass[styleName];\n                }\n            } else if (key === \"height\" || key === \"width\") {\n                if (settings[key] === null || settings[key] === undefined) {\n                    return \"auto\";\n                } else {\n                    return settings[key] + \"px\";\n                }\n            } else {\n                if (settings[key] === null || settings[key] === undefined) {\n                    return defaults[key];\n                }\n            }\n            return settings[key];\n        }\n    });\n\n    $.fn.dialog = function (options) {\n        var otherArgs = Array.prototype.slice.call(arguments);\n\n        if (typeof options === 'string') {\n            otherArgs.shift();\n            return $.dialog['_' + options + 'Dialog'].apply($.dialog, [this[0]].concat(otherArgs));\n        }\n        return this.each(function () {\n            $.dialog._attach(this, options);\n        });\n    };\n\n    $.dialog = new Dialog();\n\n    // Add another global to avoid noConflict issues with inline event handlers\n    window['DP_jQuery_' + dpuuid] = $;\n})(jQuery);","/*\n * Copyright (c) 2014-present, b3log.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * @file editor.js\n *\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\n * @version 1.1.1.0, Jan 12, 2016\n */\nvar editors = {\n    autocompleteMutex: false,\n    data: [],\n    tabs: {},\n    getEditorByPath: function (path) {\n        for (var i = 0, ii = editors.data.length; i < ii; i++) {\n            if (editors.data[i].editor.options.path === path) {\n                return editors.data[i].editor;\n            }\n        }\n    },\n    close: function () {\n        $('.edit-panel .tabs > div[data-index=\"' + $('.edit-panel .frame').data('index') + ']').find('.ico-close').click();\n    },\n    closeOther: function () {\n        var currentIndex = $(\".edit-panel .frame\").data(\"index\");\n\n        // 设置全部关闭标识\n        var removeData = [];\n        $(\".edit-panel .tabs > div\").each(function (i) {\n            if (currentIndex !== $(this).data(\"index\")) {\n                removeData.push($(this).data(\"index\"));\n            }\n        });\n        if (removeData.length === 0) {\n            return false;\n        }\n        var firstIndex = removeData.splice(0, 1);\n        $(\"#dialogCloseEditor\").data(\"removeData\", removeData);\n        // 开始关闭\n        $('.edit-panel .tabs > div[data-index=\"' + firstIndex + '\"]').find(\".ico-close\").click();\n    },\n    _removeAllMarker: function () {\n        var removeData = $(\"#dialogCloseEditor\").data(\"removeData\");\n        if (removeData && removeData.length > 0) {\n            var removeIndex = removeData.splice(0, 1);\n            $(\"#dialogCloseEditor\").data(\"removeData\", removeData);\n            $('.edit-panel .tabs > div[data-index=\"' + removeIndex + '\"] .ico-close').click();\n        }\n        if (wide.curEditor) {\n            wide.curEditor.focus();\n        }\n    },\n    _initClose: function () {\n        new ZeroClipboard($(\"#copyFilePath\"));\n\n        // 关闭、关闭其他、关闭所有\n        $(\".edit-panel\").on(\"mouseup\", '.tabs > div', function (event) {\n            event.stopPropagation();\n\n            if (event.button === 0) { // 左键\n                $(\".edit-panel .frame\").hide();\n                return false;\n            }\n\n            // event.button === 2 右键\n            var left = event.screenX;\n            if ($(\".side\").css(\"left\") === \"auto\" || $(\".side\").css(\"left\") === \"0px\") {\n                left = event.screenX - $(\".side\").width();\n            }\n            $(\".edit-panel .frame\").show().css({\n                \"left\": left + \"px\",\n                \"top\": \"21px\"\n            }).data('index', $(this).data(\"index\"));\n\n            $(\"#copyFilePath\").attr('data-clipboard-text', $(this).find(\"span:eq(0)\").attr(\"title\"));\n            return false;\n        });\n    },\n    init: function () {\n        $(\"#dialogCloseEditor\").dialog({\n            \"modal\": true,\n            \"height\": 90,\n            \"width\": 260,\n            \"title\": config.label.tip,\n            \"hideFooter\": true,\n            \"afterOpen\": function (fileName) {\n                $(\"#dialogCloseEditor > div:eq(0)\").html(config.label.file\n                        + ' <b>' + fileName + '</b>. ' + config.label.confirm_save + '?');\n                $(\"#dialogCloseEditor button:eq(0)\").focus();\n            },\n            \"afterInit\": function () {\n                $(\"#dialogCloseEditor button.save\").click(function () {\n                    var i = $(\"#dialogCloseEditor\").data(\"index\");\n                    wide.fmt(editors.data[i].id, editors.data[i].editor);\n                    editors.tabs.del(editors.data[i].id);\n                    $(\"#dialogCloseEditor\").dialog(\"close\");\n                    editors._removeAllMarker();\n                });\n\n                $(\"#dialogCloseEditor button.discard\").click(function () {\n                    var i = $(\"#dialogCloseEditor\").data(\"index\");\n                    editors.tabs.del(editors.data[i].id);\n                    $(\"#dialogCloseEditor\").dialog(\"close\");\n                    editors._removeAllMarker();\n                });\n\n                $(\"#dialogCloseEditor button.cancel\").click(function (event) {\n                    $(\"#dialogCloseEditor\").dialog(\"close\");\n                    editors._removeAllMarker();\n                });\n            }\n        });\n\n        editors.tabs = new Tabs({\n            id: \".edit-panel\",\n            setAfter: function () {\n                if (wide.curEditor) {\n                    wide.curEditor.focus();\n                }\n            },\n            clickAfter: function (id) {\n                if (id === 'startPage') {\n                    wide.curEditor = undefined;\n                    $(\".footer .cursor\").text('');\n                    wide.refreshOutline();\n                    \n                    return false;\n                }\n            },\n            removeBefore: function (id) {\n                if (id === 'startPage') { // 当前关闭的 tab 是起始页\n                    editors._removeAllMarker();\n                    return true;\n                }\n\n                for (var i = 0, ii = editors.data.length; i < ii; i++) {\n                    if (editors.data[i].id === id) {\n                        if (editors.data[i].editor.doc.isClean()) {\n                            editors._removeAllMarker();\n                            return true;\n                        } else {\n                            $(\"#dialogCloseEditor\").dialog(\"open\", $('.edit-panel .tabs > div[data-index=\"'\n                                    + editors.data[i].id + '\"] > span:eq(0)').text());\n                            $(\"#dialogCloseEditor\").data(\"index\", i);\n                            return false;\n                        }\n\n                        break;\n                    }\n                }\n            },\n            removeAfter: function (id, nextId) {\n                if ($(\".edit-panel .tabs > div\").length === 0) {\n                    // 全部 tab 都关闭时才 disables 菜单中“全部关闭”的按钮\n                    menu.disabled(['close-all']);\n                }\n\n                // 移除编辑器\n                for (var i = 0, ii = editors.data.length; i < ii; i++) {\n                    if (editors.data[i].id === id) {\n                        editors.data.splice(i, 1);\n                        break;\n                    }\n                }\n\n                if (editors.data.length === 0) { // 起始页可能存在,所以用编辑器数据判断\n                    menu.disabled(['save-all', 'build', 'run', 'go-test', 'go-vet', 'go-mod', 'go-install',\n                        'find', 'find-next', 'find-previous', 'replace', 'replace-all',\n                        'format', 'autocomplete', 'jump-to-decl', 'expr-info', 'find-usages', 'toggle-comment',\n                        'edit']);\n\n                    // remove selected tree node\n                    tree.fileTree.cancelSelectedNode();\n                    wide.curNode = undefined;\n                    wide.curEditor = undefined;\n                    wide.refreshOutline();\n                    $(\".footer .cursor\").text('');\n                    return false;\n                }\n\n                if (!nextId) {\n                    // 编辑器区域不存在打开的 Tab\n                    // remove selected tree node\n                    tree.fileTree.cancelSelectedNode();\n                    wide.curNode = undefined;\n                    wide.curEditor = undefined;\n                    wide.refreshOutline();\n                    $(\".footer .cursor\").text('');\n                    return false;\n                }\n\n                if (nextId === editors.tabs.getCurrentId()) {\n                    // 关闭的不是当前编辑器\n                    return false;\n                }\n            }\n        });\n\n        this._initCodeMirrorHotKeys();\n        this.openStartPage();\n        this._initClose();\n    },\n    openStartPage: function () {\n        wide.curEditor = undefined;\n        wide.refreshOutline();\n        $(\".footer .cursor\").text('');\n\n        var dateFormat = function (time, fmt) {\n            var date = new Date(time);\n            var dateObj = {\n                \"M+\": date.getMonth() + 1, //月份 \n                \"d+\": date.getDate(), //日 \n                \"h+\": date.getHours(), //小时 \n                \"m+\": date.getMinutes(), //分 \n                \"s+\": date.getSeconds(), //秒 \n                \"q+\": Math.floor((date.getMonth() + 3) / 3), //季度 \n                \"S\": date.getMilliseconds() //毫秒 \n            };\n            if (/(y+)/.test(fmt))\n                fmt = fmt.replace(RegExp.$1, (date.getFullYear() + \"\").substr(4 - RegExp.$1.length));\n            for (var k in dateObj)\n                if (new RegExp(\"(\" + k + \")\").test(fmt)) {\n                    fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1)\n                            ? (dateObj[k]) : ((\"00\" + dateObj[k]).substr((\"\" + dateObj[k]).length)));\n                }\n            return fmt;\n        };\n\n        editors.tabs.add({\n            id: \"startPage\",\n            title: '<span title=\"' + config.label.start_page\n                    + '\"><span class=\"ico-start font-ico\"></span> ' + config.label.start_page + '</span>',\n            content: '<div id=\"startPage\"></div>',\n            after: function () {\n                $(\"#startPage\").load('/start?sid=' + config.wideSessionId);\n                $.ajax({\n                    url: \"https://hacpai.com/apis/articles?tags=wide,golang&p=1&size=20\",\n                    type: \"GET\",\n                    dataType: \"jsonp\",\n                    jsonp: \"callback\",\n                    success: function (data, textStatus) {\n                        var articles = data.articles;\n                        if (0 === articles.length) {\n                            return;\n                        }\n\n                        // 按 size = 20 取,但只保留最多 9 篇\n                        var length = articles.length;\n                        if (length > 9) {\n                            length = 9;\n                        }\n\n                        var listHTML = \"<ul><li class='title'>\" + config.label.community +\n                            \"<a href='https://hacpai.com/article/1437497122181' target='_blank' class='fn-right'>边看边练</li>\";\n                        for (var i = 0; i < length; i++) {\n                            var article = articles[i];\n                            listHTML += \"<li>\"\n                                    + \"<a target='_blank' href='\"\n                                    + article.articlePermalink + \"'>\"\n                                    + article.articleTitle + \"</a>&nbsp; <span class='date'>\"\n                                    + dateFormat(article.articleCreateTime, 'yyyy-MM-dd');\n                            +\"</span></li>\";\n                        }\n\n                        $(\"#startPage .news\").html(listHTML + \"</ul>\");\n                    }\n                });\n            }\n        });\n    },\n    getCurrentId: function () {\n        var ret = editors.tabs.getCurrentId();\n        if (ret === 'startPage') {\n            ret = null;\n        }\n        \n        return ret;\n    },\n    getCurrentPath: function () {\n        var currentPath = $(\".edit-panel .tabs .current span:eq(0)\").attr(\"title\");\n        if (currentPath === config.label.start_page) {\n            currentPath = null;\n        }\n        return currentPath;\n    },\n    _initCodeMirrorHotKeys: function () {\n        CodeMirror.registerHelper(\"hint\", \"go\", function (editor) {\n            editor = wide.curEditor; // 使用当前编辑器覆盖实参,因为异步调用的原因,实参不一定正确\n            var word = /[\\w$]+/;\n\n            var cur = editor.getCursor(), curLine = editor.getLine(cur.line);\n\n            var start = cur.ch, end = start;\n            while (end < curLine.length && word.test(curLine.charAt(end))) {\n                ++end;\n            }\n            while (start && word.test(curLine.charAt(start - 1))) {\n                --start;\n            }\n\n            var request = newWideRequest();\n            request.path = $(\".edit-panel .tabs .current > span:eq(0)\").attr(\"title\");\n            request.code = editor.getValue();\n            request.cursorLine = cur.line;\n            request.cursorCh = cur.ch;\n\n            var autocompleteHints = [];\n\n            if (editors.autocompleteMutex && editor.state.completionActive) {\n                return;\n            }\n\n            editors.autocompleteMutex = true;\n\n            $.ajax({\n                async: false, // 同步执行\n                type: 'POST',\n                url: '/autocomplete',\n                data: JSON.stringify(request),\n                dataType: \"json\",\n                success: function (data) {\n                    var autocompleteArray = data[1];\n\n                    if (autocompleteArray) {\n                        for (var i = 0; i < autocompleteArray.length; i++) {\n                            var displayText = '',\n                                    text = autocompleteArray[i].name;\n\n                            switch (autocompleteArray[i].class) {\n                                case \"type\":\n                                    displayText = '<span class=\"fn-clear\"><span class=\"ico-type ico\"></span>'// + autocompleteArray[i].class \n                                            + '<b>' + autocompleteArray[i].name + '</b>    '\n                                            + autocompleteArray[i].type + '</span>';\n                                    break;\n                                case \"const\":\n                                    displayText = '<span class=\"fn-clear\"><span class=\"ico-const ico\"></span>'// + autocompleteArray[i].class \n                                            + '<b>' + autocompleteArray[i].name + '</b>    '\n                                            + autocompleteArray[i].type + '</span>';\n                                    break;\n                                case \"var\":\n                                    displayText = '<span class=\"fn-clear\"><span class=\"ico-var ico\"></span>'// + autocompleteArray[i].class \n                                            + '<b>' + autocompleteArray[i].name + '</b>    '\n                                            + autocompleteArray[i].type + '</span>';\n                                    break;\n                                case \"package\":\n                                    displayText = '<span class=\"fn-clear\"><span class=\"ico-package ico\"></span>'// + autocompleteArray[i].class \n                                            + '<b>' + autocompleteArray[i].name + '</b>    '\n                                            + autocompleteArray[i].type + '</span>';\n                                    break;\n                                case \"func\":\n                                    displayText = '<span><span class=\"ico-func ico\"></span>'// + autocompleteArray[i].class \n                                            + '<b>' + autocompleteArray[i].name + '</b>'\n                                            + autocompleteArray[i].type.substring(4) + '</span>';\n                                    text += '()';\n                                    break;\n                                default:\n                                    console.warn(\"Can't handle autocomplete [\" + autocompleteArray[i].class + \"]\");\n                                    break;\n                            }\n\n                            autocompleteHints[i] = {\n                                displayText: displayText,\n                                text: text\n                            };\n                        }\n                    }\n\n                    editor.doc.markClean();\n                    $(\".edit-panel .tabs .current > span:eq(0)\").removeClass(\"changed\");\n                }\n            });\n\n            setTimeout(function () {\n                editors.autocompleteMutex = false;\n            }, 20);\n\n            return {list: autocompleteHints, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)};\n        });\n\n        CodeMirror.commands.autocompleteAfterDot = function (cm) {\n            var mode = cm.getMode();\n            if (mode && \"go\" !== mode.name) {\n                return CodeMirror.Pass;\n            }\n\n            var token = cm.getTokenAt(cm.getCursor());\n\n            if (\"comment\" === token.type || \"string\" === token.type) {\n                return CodeMirror.Pass;\n            }\n\n            setTimeout(function () {\n                if (!cm.state.completionActive) {\n                    cm.showHint({hint: CodeMirror.hint.go, completeSingle: false});\n                }\n            }, 50);\n\n            return CodeMirror.Pass;\n        };\n\n        CodeMirror.commands.autocompleteAnyWord = function (cm) {\n            cm.showHint({hint: CodeMirror.hint.auto});\n        };\n\n        CodeMirror.commands.gotoLine = function (cm) {\n            $(\"#dialogGoLinePrompt\").dialog(\"open\");\n        };\n\n        // 用于覆盖 cm 默认绑定的某些快捷键功能.\n        CodeMirror.commands.doNothing = function (cm) {\n        };\n\n        CodeMirror.commands.exprInfo = function (cm) {\n            var cur = wide.curEditor.getCursor();\n\n            var request = newWideRequest();\n            request.path = $(\".edit-panel .tabs .current > span:eq(0)\").attr(\"title\");\n            request.code = wide.curEditor.getValue();\n            request.cursorLine = cur.line;\n            request.cursorCh = cur.ch;\n\n            $.ajax({\n                type: 'POST',\n                url: '/exprinfo',\n                data: JSON.stringify(request),\n                dataType: \"json\",\n                success: function (result) {\n                    if (0 != result.code) {\n                        return;\n                    }\n                    \n                    var position = wide.curEditor.cursorCoords();\n                    $(\"body\").append('<div style=\"top:'\n                            + (position.top + 15) + 'px;left:' + position.left\n                            + 'px\" class=\"edit-exprinfo\">' + result.data + '</div>');\n                }\n            });\n        };\n\n        CodeMirror.commands.copyLinesDown = function (cm) {\n            var content = '',\n                    selectoion = cm.listSelections()[0];\n\n            var from = selectoion.anchor,\n                    to = selectoion.head;\n            if (from.line > to.line) {\n                from = selectoion.head;\n                to = selectoion.anchor;\n            }\n\n            for (var i = from.line, max = to.line; i <= max; i++) {\n                if (to.ch !== 0 || i !== max) { // 下一行选中为0时,不应添加内容\n                    content += '\\n' + cm.getLine(i);\n                }\n            }\n            // 下一行选中为0时,应添加到上一行末\n            var replaceToLine = to.line;\n            if (to.ch === 0) {\n                replaceToLine = to.line - 1;\n            }\n            cm.replaceRange(content, CodeMirror.Pos(replaceToLine));\n\n            var offset = replaceToLine - from.line + 1;\n            cm.setSelection(CodeMirror.Pos(from.line + offset, from.ch),\n                    CodeMirror.Pos(to.line + offset, to.ch));\n        };\n\n        CodeMirror.commands.copyLinesUp = function (cm) {\n            var content = '',\n                    selectoion = cm.listSelections()[0];\n\n            var from = selectoion.anchor,\n                    to = selectoion.head;\n            if (from.line > to.line) {\n                from = selectoion.head;\n                to = selectoion.anchor;\n            }\n\n            for (var i = from.line, max = to.line; i <= max; i++) {\n                if (to.ch !== 0 || i !== max) { // 下一行选中为0时,不应添加内容\n                    content += '\\n' + cm.getLine(i);\n                }\n            }\n\n            // 下一行选中为0时,应添加到上一行末\n            var replaceToLine = to.line;\n            if (to.ch === 0) {\n                replaceToLine = to.line - 1;\n            }\n            cm.replaceRange(content, CodeMirror.Pos(replaceToLine));\n\n            cm.setSelection(CodeMirror.Pos(from.line, from.ch),\n                    CodeMirror.Pos(to.line, to.ch));\n        };\n\n        CodeMirror.commands.moveLinesUp = function (cm) {\n            var selectoion = cm.listSelections()[0];\n\n            var from = selectoion.anchor,\n                    to = selectoion.head;\n            if (from.line > to.line) {\n                from = selectoion.head;\n                to = selectoion.anchor;\n            }\n\n            if (from.line === 0) {\n                return false;\n            }\n            // 下一行选中为0时,应添加到上一行末\n            var replaceToLine = to.line;\n            if (to.ch === 0) {\n                replaceToLine = to.line - 1;\n            }\n            cm.replaceRange('\\n' + cm.getLine(from.line - 1), CodeMirror.Pos(replaceToLine));\n            if (from.line === 1) {\n                // 移除第一行的换行\n                cm.replaceRange('', CodeMirror.Pos(0, 0),\n                        CodeMirror.Pos(1, 0));\n            } else {\n                cm.replaceRange('', CodeMirror.Pos(from.line - 2, cm.getLine(from.line - 2).length),\n                        CodeMirror.Pos(from.line - 1, cm.getLine(from.line - 1).length));\n            }\n\n            cm.setSelection(CodeMirror.Pos(from.line - 1, from.ch),\n                    CodeMirror.Pos(to.line - 1, to.ch));\n        };\n\n        CodeMirror.commands.moveLinesDown = function (cm) {\n            var selectoion = cm.listSelections()[0];\n\n            var from = selectoion.anchor,\n                    to = selectoion.head;\n            if (from.line > to.line) {\n                from = selectoion.head;\n                to = selectoion.anchor;\n            }\n\n            if (to.line === cm.lastLine()) {\n                return false;\n            }\n\n            // 下一行选中为0时,应添加到上一行末\n            var replaceToLine = to.line;\n            if (to.ch === 0) {\n                replaceToLine = to.line - 1;\n            }\n            // 把选中的下一行添加到选中区域的上一行\n            if (from.line === 0) {\n                cm.replaceRange(cm.getLine(replaceToLine + 1) + '\\n', CodeMirror.Pos(0, 0));\n            } else {\n                cm.replaceRange('\\n' + cm.getLine(replaceToLine + 1), CodeMirror.Pos(from.line - 1));\n            }\n            // 删除选中的下一行\n            cm.replaceRange('', CodeMirror.Pos(replaceToLine + 1, cm.getLine(replaceToLine + 1).length),\n                    CodeMirror.Pos(replaceToLine + 2, cm.getLine(replaceToLine + 2).length));\n\n            cm.setSelection(CodeMirror.Pos(from.line + 1, from.ch),\n                    CodeMirror.Pos(to.line + 1, to.ch));\n        };\n\n        CodeMirror.commands.jumpToDecl = function (cm) {\n            var cur = wide.curEditor.getCursor();\n\n            var request = newWideRequest();\n            request.path = $(\".edit-panel .tabs .current > span:eq(0)\").attr(\"title\");\n            request.code = wide.curEditor.getValue();\n            request.cursorLine = cur.line;\n            request.cursorCh = cur.ch;\n\n            $.ajax({\n                type: 'POST',\n                url: '/find/decl',\n                data: JSON.stringify(request),\n                dataType: \"json\",\n                success: function (result) {\n                    if (0 != result.code) {\n                        return;\n                    }\n                    \n                    var data = result.data;\n\n                    var tId = tree.getTIdByPath(data.path);\n                    wide.curNode = tree.fileTree.getNodeByTId(tId);\n                    tree.fileTree.selectNode(wide.curNode);\n\n                    tree.openFile(wide.curNode, CodeMirror.Pos(data.cursorLine - 1, data.cursorCh - 1));\n                }\n            });\n        };\n\n        CodeMirror.commands.findUsages = function (cm) {\n            var cur = wide.curEditor.getCursor();\n\n            var request = newWideRequest();\n            request.path = $(\".edit-panel .tabs .current > span:eq(0)\").attr(\"title\");\n            request.code = wide.curEditor.getValue();\n            request.cursorLine = cur.line;\n            request.cursorCh = cur.ch;\n\n            $.ajax({\n                type: 'POST',\n                url: '/find/usages',\n                data: JSON.stringify(request),\n                dataType: \"json\",\n                success: function (result) {\n                    if (0 != result.code) {\n                        return;\n                    }\n\n                    editors.appendSearch(result.data, 'usages', '');\n                }\n            });\n        };\n\n        CodeMirror.commands.selectIdentifier = function (cm) {\n            var cur = cm.getCursor();\n            var word = cm.findWordAt(cur);\n            cm.extendSelection(word.anchor, word.head);\n        };\n    },\n    appendSearch: function (data, type, key) {\n        var searcHTML = '<ul class=\"list\">',\n                key = key.toLowerCase();\n\n        for (var i = 0, ii = data.length; i < ii; i++) {\n            var contents = '',\n                    lowerCaseContents = data[i].contents[0].toLowerCase(),\n                    matches = lowerCaseContents.split(key),\n                    startIndex = 0,\n                    endIndex = 0;\n            for (var j = 0, max = matches.length; j < max; j++) {\n                startIndex = endIndex + matches[j].length;\n                endIndex = startIndex + key.length;\n                var keyWord = data[i].contents[0].substring(startIndex, endIndex);\n                if (keyWord !== '') {\n                    keyWord = '<b>' + keyWord + '</b>';\n                }\n                contents += data[i].contents[0].substring(startIndex - matches[j].length, startIndex) + keyWord;\n            }\n\n            searcHTML += '<li title=\"' + data[i].path + '\">'\n                    + contents + \"&nbsp;&nbsp;&nbsp;&nbsp;<span class='ft-small'>\" + data[i].path\n                    + '<i class=\"position\" data-line=\"'\n                    + data[i].line + '\" data-ch=\"' + data[i].ch + '\"> (' + data[i].line + ':'\n                    + data[i].ch + ')</i></span></li>';\n        }\n\n        if (data.length === 0) {\n            searcHTML += '<li>' + config.label.search_no_match + '</li>';\n        }\n        searcHTML += '</ul>';\n\n        var $search = $('.bottom-window-group .search'),\n                title = config.label.find_usages;\n        if (type === \"founds\") {\n            title = config.label.search_text;\n        }\n        if ($search.find(\"ul\").length === 0) {\n            bottomGroup.searchTab = new Tabs({\n                id: \".bottom-window-group .search\",\n                removeAfter: function (id, prevId) {\n                    if ($search.find(\"ul\").length === 1) {\n                        $search.find(\".tabs\").hide();\n                    }\n                }\n            });\n\n            $search.on(\"click\", \"li\", function () {\n                $search.find(\"li\").removeClass(\"selected\");\n                $(this).addClass(\"selected\");\n            });\n\n            $search.on(\"dblclick\", \"li\", function () {\n                var $it = $(this),\n                        tId = tree.getTIdByPath($it.attr(\"title\"));\n                tree.openFile(tree.fileTree.getNodeByTId(tId));\n                tree.fileTree.selectNode(wide.curNode);\n\n                var line = $it.find(\".position\").data(\"line\") - 1;\n                var cursor = CodeMirror.Pos(line, $it.find(\".position\").data(\"ch\") - 1);\n\n\n                var editor = wide.curEditor;\n                editor.setCursor(cursor);\n\n                var half = Math.floor(editor.getScrollInfo().clientHeight / editor.defaultTextHeight() / 2);\n                var cursorCoords = editor.cursorCoords({line: cursor.line - half, ch: 0}, \"local\");\n                editor.scrollTo(0, cursorCoords.top);\n\n                wide.curEditor.focus();\n            });\n\n            $search.find(\".tabs-panel > div\").append(searcHTML);\n\n            $search.find(\".tabs .first\").text(title);\n        } else {\n            $search.find(\".tabs\").show();\n            bottomGroup.searchTab.add({\n                \"id\": \"search\" + (new Date()).getTime(),\n                \"title\": title,\n                \"content\": searcHTML\n            });\n        }\n\n        // focus\n        bottomGroup.tabs.setCurrent(\"search\");\n        windows.flowBottom();\n        $(\".bottom-window-group .search\").focus();\n    },\n    // 新建一个编辑器 Tab,如果已经存在 Tab 则切换到该 Tab.\n    newEditor: function (data, cursor) {\n        var id = wide.curNode.id;\n\n        editors.tabs.add({\n            id: id,\n            title: '<span title=\"' + wide.curNode.path + '\"><span class=\"'\n                    + wide.curNode.iconSkin + 'ico\"></span>' + wide.curNode.name + '</span>',\n            content: '<textarea id=\"editor' + id + '\"></textarea>'\n        });\n\n        menu.undisabled(['save-all', 'close-all', 'build', 'run', 'go-test', 'go-vet', 'go-mod', 'go-install',\n            'find', 'find-next', 'find-previous', 'replace', 'replace-all',\n            'format', 'autocomplete', 'jump-to-decl', 'expr-info', 'find-usages', 'toggle-comment',\n            'edit']);\n\n        var textArea = document.getElementById(\"editor\" + id);\n        textArea.value = data.content;\n\n        var editor = CodeMirror.fromTextArea(textArea, {\n            lineNumbers: true,\n            autofocus: true,\n            autoCloseBrackets: true,\n            matchBrackets: true,\n            highlightSelectionMatches: {showToken: /\\w/},\n            rulers: [{color: \"#ccc\", column: 120, lineStyle: \"dashed\"}],\n            styleActiveLine: true,\n            theme: config.editorTheme,\n            tabSize: config.editorTabSize,\n            indentUnit: 4,\n            indentWithTabs: true,\n            foldGutter: true,\n            cursorHeight: 1,\n            path: data.path,\n            readOnly: wide.curNode.isGOAPI,\n            profile: 'xhtml', // define Emmet output profile\n            extraKeys: {\n                \"Ctrl-\\\\\": \"autocompleteAnyWord\",\n                \".\": \"autocompleteAfterDot\",\n                \"Ctrl-/\": 'toggleComment',\n                \"Ctrl-I\": \"exprInfo\",\n                \"Ctrl-L\": \"gotoLine\",\n                \"Ctrl-E\": \"deleteLine\",\n                \"Ctrl-D\": \"doNothing\", // 取消默认的 deleteLine\n                \"Ctrl-B\": \"jumpToDecl\",\n                \"Ctrl-S\": function () {\n                    wide.saveFile();\n                },\n                \"Shift-Ctrl-S\": function () {\n                    menu.saveAllFiles();\n                },\n                \"Shift-Alt-F\": function () {\n                    var currentPath = editors.getCurrentPath();\n                    if (!currentPath) {\n                        return false;\n                    }\n                    wide.fmt(currentPath, wide.curEditor);\n                },\n                \"Alt-F7\": \"findUsages\",\n                \"Shift-Alt-Enter\": function () {\n                    if (windows.isMaxEditor) {\n                        windows.restoreEditor();\n                    } else {\n                        windows.maxEditor();\n                    }\n                },\n                \"Shift-Ctrl-Up\": \"copyLinesUp\",\n                \"Shift-Ctrl-Down\": \"copyLinesDown\",\n                \"Shift-Alt-Up\": \"moveLinesUp\",\n                \"Shift-Alt-Down\": \"moveLinesDown\",\n                \"Shift-Alt-J\": \"selectIdentifier\"\n            }\n        });\n\n        if (\"text/html\" === data.mode) {\n            emmetCodeMirror(editor);\n        }\n\n        editor.on('cursorActivity', function (cm) {\n            $(\".edit-exprinfo\").remove();\n            var cursor = cm.getCursor();\n\n            $(\".footer .cursor\").text('|   ' + (cursor.line + 1) + ':' + (cursor.ch + 1) + '   |');\n        });\n\n        editor.on('blur', function (cm) {\n            $(\".edit-exprinfo\").remove();\n        });\n\n        editor.on('changes', function (cm) {\n            if (cm.doc.isClean()) { // no modification\n                $(\".edit-panel .tabs > div\").each(function () {\n                    var $span = $(this).find(\"span:eq(0)\");\n                    if ($span.attr(\"title\") === cm.options.path) {\n                        $span.removeClass(\"changed\");\n                    }\n                });\n\n                return;\n            }\n\n            // changed\n\n            $(\".edit-panel .tabs > div\").each(function () {\n                var $span = $(this).find(\"span:eq(0)\");\n                if ($span.attr(\"title\") === cm.options.path) {\n                    $span.addClass(\"changed\");\n                }\n            });\n        });\n\n        editor.on('keydown', function (cm, evt) {\n            if (evt.altKey || evt.ctrlKey || evt.shiftKey) {\n                return;\n            }\n\n            var k = evt.which;\n\n            if (k < 48) {\n                return;\n            }\n\n            // hit [0-9]\n\n            if (k > 57 && k < 65) {\n                return;\n            }\n\n            // hit [a-z]\n\n            if (k > 90) {\n                return;\n            }\n\n            if (config.autocomplete) {\n                if (0.5 <= Math.random()) {\n                    CodeMirror.commands.autocompleteAfterDot(cm);\n                }\n            }\n        });\n\n        editor.setSize('100%', $(\".edit-panel\").height() - $(\".edit-panel .tabs\").height());\n        editor.setOption(\"mode\", data.mode);\n        editor.setOption(\"gutters\", [\"CodeMirror-lint-markers\", \"CodeMirror-foldgutter\"]);\n\n        if (\"wide\" !== config.keymap) {\n            editor.setOption(\"keyMap\", config.keymap);\n        }\n\n        if (\"text/x-go\" === data.mode || \"application/json\" === data.mode) {\n            editor.setOption(\"lint\", true);\n        }\n\n        if (\"application/xml\" === data.mode || \"text/html\" === data.mode) {\n            editor.setOption(\"autoCloseTags\", true);\n        }\n\n        wide.curEditor = editor;\n        editors.data.push({\n            \"editor\": editor,\n            \"id\": id\n        });\n\n        $(\".footer .cursor\").text('|   ' + (cursor.line + 1) + ':' + (cursor.ch + 1) + '   |');\n\n        var half = Math.floor(wide.curEditor.getScrollInfo().clientHeight / wide.curEditor.defaultTextHeight() / 2);\n        var cursorCoords = wide.curEditor.cursorCoords({line: cursor.line - half, ch: 0}, \"local\");\n        wide.curEditor.scrollTo(0, cursorCoords.top);\n\n        editor.setCursor(cursor);\n        editor.focus();\n    }\n};","/*\n * Copyright (c) 2014-present, b3log.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * @file notification.js\n *\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\n * @version 1.0.0.2, Jun 23, 2019\n */\nvar notification = {\n    init: function () {\n        $(\".notification-count\").click(function () {\n            bottomGroup.tabs.setCurrent(\"notification\");\n            $(\".bottom-window-group .notification\").focus();\n            $(this).hide();\n        });\n\n        this._initWS();\n    },\n    _initWS: function () {\n        var notificationWS = new ReconnectingWebSocket(config.channel + '/notification/ws?sid=' + config.wideSessionId);\n\n        notificationWS.onopen = function () {\n            // console.log('[notification onopen] connected');\n        };\n\n        notificationWS.onmessage = function (e) {\n            var data = JSON.parse(e.data),\n                    $notification = $('.bottom-window-group .notification > table'),\n                    notificationHTML = '';\n            \n            if (data.cmd && \"init-notification\" === data.cmd) {\n                // console.log('[notification onmessage]' + e.data);\n                \n                return;\n            }\n\n            notificationHTML += '<tr><td class=\"severity\">' + data.severity\n                    + '</td><td class=\"message\">' + data.message\n                    + '</td><td class=\"type\">' + data.type + '</td></tr>';\n            $notification.append(notificationHTML);\n\n            $(\".notification-count\").show();\n        };\n\n        notificationWS.onclose = function (e) {\n            // console.log('[notification onclose] disconnected (' + e.code + ')');\n        };\n\n        notificationWS.onerror = function (e) {\n            console.log('[notification onerror]', e);\n        };\n    }\n};","/*\n * Copyright (c) 2014-present, b3log.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * @file tree.js\n *\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\n * @version 1.0.1.1, Dec 15, 2015\n */\nvar tree = {\n    fileTree: undefined,\n    // 递归获取当前节点展开中的最后一个节点\n    getCurrentNodeLastNode: function (node) {\n        var returnNode = node.children[node.children.length - 1];\n        if (returnNode.open) {\n            return tree.getCurrentNodeLastNode(returnNode);\n        } else {\n            return returnNode;\n        }\n    },\n    // 按照树展现获取下一个节点\n    getNextShowNode: function (node) {\n        if (node.level !== 0) {\n            if (node.getParentNode().getNextNode()) {\n                return node.getParentNode().getNextNode();\n            } else {\n                return tree.getNextShowNode(node.getParentNode());\n            }\n        } else {\n            return node.getNextNode();\n        }\n    },\n    isBottomNode: function (node) {\n        if (node.open) {\n            return false;\n        }\n\n        if (node.getParentNode()) {\n            if (node.getParentNode().isLastNode) {\n                return tree.isBottomNode(node.getParentNode());\n            } else {\n                return false;\n            }\n        } else {\n            if (node.isLastNode) {\n                return true;\n            } else {\n                return false;\n            }\n        }\n    },\n    getTIdByPath: function (path) {\n        var nodes = tree.fileTree.transformToArray(tree.fileTree.getNodes());\n        for (var i = 0, ii = nodes.length; i < ii; i++) {\n            if (nodes[i].path === path) {\n                return nodes[i].tId;\n            }\n        }\n\n        return undefined;\n    },\n    getOpenPaths: function () {\n        var nodes = tree.fileTree.transformToArray(tree.fileTree.getNodes()),\n                paths = [];\n        for (var i = 0, ii = nodes.length; i < ii; i++) {\n            if (nodes[i].open) {\n                paths.push(nodes[i].path);\n            }\n        }\n\n        return paths;\n    },\n    getAllParents: function (node, parents) {\n        if (!parents) {\n            parents = [];\n        }\n\n        if (!node || !node.parentTId) {\n            return parents;\n        } else {\n            parents.push(node.getParentNode());\n            return tree.getAllParents(node.getParentNode(), parents);\n        }\n    },\n    isParents: function (tId, parentPath) {\n        var node = tree.fileTree.getNodeByTId(tId);\n        if (!node || !node.parentTId) {\n            return false;\n        } else {\n            var parentNode = tree.fileTree.getNodeByTId(node.parentTId);\n            if (node.path === parentPath) {\n                return true;\n            } else {\n                return tree.isParents(parentNode.tId, parentPath);\n            }\n        }\n    },\n    isDir: function () {\n        if (wide.curNode.iconSkin.indexOf(\"ico-ztree-dir\") === 0) {\n            return true;\n        }\n\n        return false;\n    },\n    newFile: function (it) {\n        if ($(it).hasClass(\"disabled\")) {\n            return false;\n        }\n\n        $(\"#dialogNewFilePrompt\").dialog(\"open\");\n    },\n    newDir: function (it) {\n        if ($(it).hasClass(\"disabled\")) {\n            return false;\n        }\n\n        $(\"#dialogNewDirPrompt\").dialog(\"open\");\n    },\n    removeIt: function (it) {\n        if (it) {\n            if ($(it).hasClass(\"disabled\")) {\n                return false;\n            }\n        } else {\n            if (!wide.curNode.removable) {\n                return false;\n            }\n        }\n\n        $(\"#dialogRemoveConfirm\").dialog(\"open\");\n    },\n    rename: function (it) {\n        if (it) {\n            if ($(it).hasClass(\"disabled\")) {\n                return false;\n            }\n        }\n\n        $(\"#dialogRenamePrompt\").dialog(\"open\");\n    },\n    export: function () {\n        var request = newWideRequest(),\n                isSucc = false;\n        request.path = wide.curNode.path;\n\n        $.ajax({\n            async: false,\n            type: 'POST',\n            url: '/file/zip/new',\n            data: JSON.stringify(request),\n            dataType: \"json\",\n            success: function (result) {\n                if (0 != result.code) {\n                    $(\"#dialogAlert\").dialog(\"open\", result.msg);\n\n                    return false;\n                }\n\n                isSucc = true;\n            }\n        });\n\n        if (isSucc) {\n            window.open('/file/zip?path=' + wide.curNode.path + \".zip\");\n        }\n    },\n    crossCompile: function (platform) {\n        var request = newWideRequest();\n        request.path = wide.curNode.path;\n        request.platform = platform;\n\n        $.ajax({\n            async: false,\n            type: 'POST',\n            url: '/cross',\n            data: JSON.stringify(request),\n            dataType: \"json\",\n            success: function (result) {\n                if (0 != result.code) {\n                    $(\"#dialogAlert\").dialog(\"open\", result.msg);\n\n                    return false;\n                }\n            }\n        });\n    },\n    refresh: function (it) {\n        if (it) {\n            if ($(it).hasClass(\"disabled\")) {\n                return false;\n            }\n        }\n\n        tree.fileTree.reAsyncChildNodes(wide.curNode, \"refresh\", true);\n    },\n    init: function () {\n        $(\"#file\").click(function () {\n            $(this).focus();\n        });\n\n        var request = newWideRequest();\n\n        $.ajax({\n            type: 'POST',\n            url: '/files',\n            data: JSON.stringify(request),\n            dataType: \"json\",\n            success: function (result) {\n                if (0 == result.code) {\n                    var $dirRMenu = $(\"#dirRMenu\");\n                    var $fileRMenu = $(\"#fileRMenu\");\n                    var setting = {\n                        data: {\n                            key: {\n                                title: \"path\"\n                            }\n                        },\n                        view: {\n                            showTitle: true,\n                            selectedMulti: false\n                        },\n                        async: {\n                            enable: true,\n                            url: \"/file/refresh\",\n                            autoParam: [\"path\"]\n                        },\n                        callback: {\n                            onDblClick: function (event, treeId, treeNode) {\n                                if (treeNode) {\n                                    tree.openFile(treeNode);\n                                }\n                            },\n                            onRightClick: function (event, treeId, treeNode) {\n                                if (treeNode && !treeNode.isGOAPI) {\n                                    menu.undisabled(['import', 'export', 'git-clone']);\n\n                                    wide.curNode = treeNode;\n                                    tree.fileTree.selectNode(treeNode);\n\n                                    if (!tree.isDir()) { // if right click on a file\n                                        if (wide.curNode.removable) {\n                                            $fileRMenu.find(\".remove\").removeClass(\"disabled\");\n                                        } else {\n                                            $fileRMenu.find(\".remove\").addClass(\"disabled\");\n                                        }\n\n                                        if (-1 === wide.curNode.path.indexOf(\"zip\", wide.curNode.path.length - \"zip\".length)) { // !path.endsWith(\"zip\")\n                                            $fileRMenu.find(\".decompress\").hide();\n                                        } else {\n                                            $fileRMenu.find(\".decompress\").show();\n                                        }\n\n                                        if (-1 === wide.curNode.path.indexOf(\"go\", wide.curNode.path.length - \"go\".length)) { // !path.endsWith(\"go\")\n                                            $fileRMenu.find(\".linux64\").hide();\n                                        } else {\n                                            $fileRMenu.find(\".linux64\").show();\n                                        }\n\n                                        var top = event.clientY - 10;\n                                        if ($fileRMenu.height() + top > $('.content').height()) {\n                                            top = top - $fileRMenu.height() - 25;\n                                        }\n                                        $fileRMenu.css({\n                                            \"top\": top + \"px\",\n                                            \"left\": event.clientX + \"px\",\n                                            \"display\": \"block\"\n                                        }).show();\n\n                                        $dirRMenu.hide();\n\n                                        menu.disabled(['import', 'git-clone']);\n                                    } else { // 右击了目录\n                                        if (wide.curNode.removable) {\n                                            $dirRMenu.find(\".remove\").removeClass(\"disabled\");\n                                        } else {\n                                            $dirRMenu.find(\".remove\").addClass(\"disabled\");\n                                        }\n\n                                        if (wide.curNode.creatable) {\n                                            $dirRMenu.find(\".create\").removeClass(\"disabled\");\n                                        } else {\n                                            $dirRMenu.find(\".create\").addClass(\"disabled\");\n                                        }\n\n                                        var top = event.clientY - 10;\n                                        if ($dirRMenu.height() + top > $('.content').height()) {\n                                            top = top - $dirRMenu.height() - 25;\n                                        }\n\n                                        $dirRMenu.css({\n                                            \"top\": top + \"px\",\n                                            \"left\": event.clientX + \"px\",\n                                            \"display\": \"block\"\n                                        }).show();\n\n                                        $fileRMenu.hide();\n                                    }\n                                    $(\"#files\").focus();\n                                }\n                            },\n                            onClick: function (event, treeId, treeNode, clickFlag) {\n                                if (treeNode) {\n                                    wide.curNode = treeNode;\n                                    tree.fileTree.selectNode(treeNode);\n\n                                    menu.undisabled(['import', 'export', 'git-clone']);\n                                    if (!tree.isDir()) {\n                                        menu.disabled(['import', 'git-clone']);\n                                    }\n\n                                    $(\"#files\").focus();\n                                }\n                            }\n                        }\n                    };\n                    tree.fileTree = $.fn.zTree.init($(\"#files\"), setting, result.data.children);\n\n                    session.restore();\n                }\n            }\n        });\n\n        this._initSearch();\n        this._initRename();\n    },\n    openFile: function (treeNode, cursor) {\n        wide.curNode = treeNode;\n        var tempCursor = cursor;\n\n        for (var i = 0, ii = editors.data.length; i < ii; i++) {\n            // 该节点文件已经打开\n            if (editors.data[i].id === treeNode.path) {\n                editors.tabs.setCurrent(treeNode.path);\n                wide.curEditor = editors.data[i].editor;\n\n                if (!tempCursor) {\n                    tempCursor = wide.curEditor.getCursor();\n                }\n                $(\".footer .cursor\").text('|   ' + (tempCursor.line + 1) + ':' + (tempCursor.ch + 1) + '   |');\n\n                wide.curEditor.setCursor(tempCursor);\n                var half = Math.floor(wide.curEditor.getScrollInfo().clientHeight / wide.curEditor.defaultTextHeight() / 2);\n                var cursorCoords = wide.curEditor.cursorCoords({line: tempCursor.line - half, ch: 0}, \"local\");\n                wide.curEditor.scrollTo(0, cursorCoords.top);\n                wide.curEditor.focus();\n\n                wide.refreshOutline();\n                return false;\n            }\n        }\n\n        if (!tree.isDir()) {\n            var request = newWideRequest();\n            request.path = treeNode.path;\n\n            $.ajax({\n                async: false,\n                type: 'POST',\n                url: '/file',\n                data: JSON.stringify(request),\n                dataType: \"json\",\n                success: function (result) {\n                    if (0 != result.code) {\n                        $(\"#dialogAlert\").dialog(\"open\", result.msg);\n\n                        return false;\n                    }\n\n                    var data = result.data;\n\n                    if (!data.mode) {\n                        var mode = CodeMirror.findModeByFileName(treeNode.path);\n                        if (mode) {\n                            data.mode = mode.mime;\n                        } else {\n                            data.mode = 'text/plain';\n                        }\n                    }\n\n                    if (!data.mode) {\n                        console.error(\"Can't find mode by file name [\" + treeNode.path + \"]\");\n                    }\n\n                    if (\"img\" === data.mode) { // 是图片文件的话新建 tab 打开\n                        // 最好是开 tab,但这个最终取决于浏览器设置\n                        var w = window.open(data.path);\n                        return false;\n                    }\n\n                    if (!tempCursor) {\n                        tempCursor = CodeMirror.Pos(0, 0);\n                    }\n\n                    editors.newEditor(data, tempCursor);\n\n                    wide.refreshOutline();\n                }\n            });\n        }\n    },\n    _initSearch: function () {\n        $(\"#dialogSearchForm > input:eq(0)\").keyup(function (event) {\n            var $okBtn = $(this).closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\");\n            if (event.which === 13 && !$okBtn.prop(\"disabled\")) {\n                $okBtn.click();\n            }\n\n            if ($.trim($(this).val()) === \"\") {\n                $okBtn.prop(\"disabled\", true);\n            } else {\n                $okBtn.prop(\"disabled\", false);\n            }\n        });\n\n        $(\"#dialogSearchForm > input:eq(1)\").keyup(function (event) {\n            var $okBtn = $(this).closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\");\n            if (event.which === 13 && !$okBtn.prop(\"disabled\")) {\n                $okBtn.click();\n            }\n        });\n\n        $(\"#dialogSearchForm\").dialog({\n            \"modal\": true,\n            \"height\": 80,\n            \"width\": 260,\n            \"title\": config.label.search,\n            \"okText\": config.label.search,\n            \"cancelText\": config.label.cancel,\n            \"afterOpen\": function () {\n                $(\"#dialogSearchForm > input:eq(0)\").val('').focus();\n                $(\"#dialogSearchForm > input:eq(1)\").val('');\n                $(\"#dialogSearchForm\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\").prop(\"disabled\", true);\n            },\n            \"ok\": function () {\n                var request = newWideRequest();\n\n                if (!wide.curNode) {\n                    request.dir = \"\";\n                } else {\n                    request.dir = wide.curNode.path;\n                }\n\n                request.text = $(\"#dialogSearchForm > input:eq(0)\").val();\n                request.extension = $(\"#dialogSearchForm > input:eq(1)\").val();\n\n                $.ajax({\n                    type: 'POST',\n                    url: '/file/search/text',\n                    data: JSON.stringify(request),\n                    dataType: \"json\",\n                    success: function (result) {\n                        if (0 != result.code) {\n                            return;\n                        }\n\n                        $(\"#dialogSearchForm\").dialog(\"close\");\n                        editors.appendSearch(result.data, 'founds', request.text);\n                    }\n                });\n            }\n        });\n    },\n    _initRename: function () {\n        $(\"#dialogRenamePrompt\").dialog({\n            \"modal\": true,\n            \"height\": 52,\n            \"width\": 260,\n            \"title\": config.label.rename,\n            \"okText\": config.label.rename,\n            \"cancelText\": config.label.cancel,\n            \"afterOpen\": function () {\n                $(\"#dialogRenamePrompt\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\").prop(\"disabled\", true);\n                $(\"#dialogRenamePrompt > input\").val(wide.curNode.name).select().focus();\n            },\n            \"ok\": function () {\n                var name = $(\"#dialogRenamePrompt > input\").val(),\n                        request = newWideRequest();\n\n                request.oldPath = wide.curNode.path;\n                request.newPath = wide.curNode.path.substring(0, wide.curNode.path.lastIndexOf(\"/\") + 1) + name;\n\n                $.ajax({\n                    type: 'POST',\n                    url: '/file/rename',\n                    data: JSON.stringify(request),\n                    dataType: \"json\",\n                    success: function (result) {\n                        if (0 != result.code) {\n                            $(\"#dialogRenamePrompt\").dialog(\"close\");\n                            bottomGroup.tabs.setCurrent(\"notification\");\n                            windows.flowBottom();\n                            $(\".bottom-window-group .notification\").focus();\n                            return false;\n                        }\n\n                        $(\"#dialogRenamePrompt\").dialog(\"close\");\n                    }\n                });\n            }\n        });\n    }\n};","/*\n * Copyright (c) 2014-present, b3log.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * @file wide.js\n *\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\n * @version 1.0.0.2, Jun 23, 2019\n */\nvar wide = {\n    curNode: undefined,\n    curEditor: undefined,\n    curProcessId: undefined, // curent running process id (pid)\n    refreshOutline: function () {\n        if (!wide.curEditor ||\n                (wide.curEditor && wide.curEditor.doc.getMode().name !== \"go\")) {\n            $(\"#outline\").html('');\n            return false;\n        }\n\n        var request = newWideRequest();\n        request.code = wide.curEditor.getValue();\n\n        $.ajax({\n            type: 'POST',\n            async: false,\n            url: '/outline',\n            data: JSON.stringify(request),\n            dataType: \"json\",\n            success: function (result) {\n                if (0 != result.code) {\n                    return;\n                }\n\n                var data = result.data;\n\n                var outlineHTML = '<ul class=\"list\">',\n                        decls = ['constDecls', 'varDecls', 'funcDecls',\n                            'structDecls', 'interfaceDecls', 'typeDecls'];\n\n                for (var i = 0, max = decls.length; i < max; i++) {\n                    var key = decls[i];\n                    for (var j = 0, maxj = data[key].length; j < maxj; j++) {\n                        var obj = data[key][j];\n                        outlineHTML += '<li data-ch=\"' + obj.Ch + '\" data-line=\"'\n                                + obj.Line + '\"><span class=\"ico ico-'\n                                + key.replace('Decls', '') + '\"></span> ' + obj.Name + '</li>';\n                    }\n                }\n                $(\"#outline\").html(outlineHTML + '</ul>');\n\n                $(\"#outline li\").dblclick(function () {\n                    var $it = $(this),\n                            cursor = CodeMirror.Pos($it.data('line'), $it.data(\"ch\"));\n\n                    var editor = wide.curEditor;\n                    editor.setCursor(cursor);\n\n                    var half = Math.floor(editor.getScrollInfo().clientHeight / editor.defaultTextHeight() / 2);\n                    var cursorCoords = editor.cursorCoords({line: cursor.line - half, ch: 0}, \"local\");\n                    editor.scrollTo(0, cursorCoords.top);\n\n                    editor.focus();\n                });\n            }\n        });\n    },\n    _initDialog: function () {\n        $(\".dialog-prompt > input\").keyup(function (event) {\n            var $okBtn = $(this).closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\");\n            if (event.which === 13 && !$okBtn.prop(\"disabled\")) {\n                $okBtn.click();\n            }\n\n            if ($.trim($(this).val()) === \"\") {\n                $okBtn.prop(\"disabled\", true);\n            } else {\n                $okBtn.prop(\"disabled\", false);\n            }\n        });\n\n        $(\"#dialogAlert\").dialog({\n            \"modal\": true,\n            \"height\": 40,\n            \"width\": 350,\n            \"title\": config.label.tip,\n            \"hiddenOk\": true,\n            \"cancelText\": config.label.confirm,\n            \"afterOpen\": function (msg) {\n                $(\"#dialogAlert\").html(msg);\n            }\n        });\n\n        $(\"#dialogRemoveConfirm\").dialog({\n            \"modal\": true,\n            \"height\": 36,\n            \"width\": 260,\n            \"title\": config.label.delete,\n            \"okText\": config.label.delete,\n            \"cancelText\": config.label.cancel,\n            \"afterOpen\": function () {\n                $(\"#dialogRemoveConfirm > b\").html('\"' + wide.curNode.name + '\"');\n            },\n            \"ok\": function () {\n                var request = newWideRequest();\n                request.path = wide.curNode.path;\n\n                $.ajax({\n                    type: 'POST',\n                    url: '/file/remove',\n                    data: JSON.stringify(request),\n                    dataType: \"json\",\n                    success: function (result) {\n                        if (0 != result.code) {\n                            $(\"#dialogRemoveConfirm\").dialog(\"close\");\n                            bottomGroup.tabs.setCurrent(\"notification\");\n                            windows.flowBottom();\n                            $(\".bottom-window-group .notification\").focus();\n                            return false;\n                        }\n\n                        $(\"#dialogRemoveConfirm\").dialog(\"close\");\n                    }\n                });\n            }\n        });\n\n        $(\"#dialogNewFilePrompt\").dialog({\n            \"modal\": true,\n            \"height\": 52,\n            \"width\": 260,\n            \"title\": config.label.create_file,\n            \"okText\": config.label.create,\n            \"cancelText\": config.label.cancel,\n            \"afterOpen\": function () {\n                $(\"#dialogNewFilePrompt > input\").val('').focus();\n                $(\"#dialogNewFilePrompt\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\").prop(\"disabled\", true);\n            },\n            \"ok\": function () {\n                var request = newWideRequest(),\n                        name = $(\"#dialogNewFilePrompt > input\").val();\n\n                request.path = wide.curNode.path + \"/\" + name;\n                request.fileType = \"f\";\n\n                $.ajax({\n                    type: 'POST',\n                    url: '/file/new',\n                    data: JSON.stringify(request),\n                    dataType: \"json\",\n                    success: function (result) {\n                        if (0 != result.code) {\n                            $(\"#dialogNewFilePrompt\").dialog(\"close\");\n                            bottomGroup.tabs.setCurrent(\"notification\");\n                            windows.flowBottom();\n                            $(\".bottom-window-group .notification\").focus();\n                            return false;\n                        }\n\n                        $(\"#dialogNewFilePrompt\").dialog(\"close\");\n\n                        setTimeout(function () { // Delay, waiting the file change notified and then open it\n                            var tId = tree.getTIdByPath(request.path);\n                            tree.openFile(tree.fileTree.getNodeByTId(tId));\n                            tree.fileTree.selectNode(wide.curNode);\n                        }, 100);\n                    }\n                });\n            }\n        });\n\n        $(\"#dialogNewDirPrompt\").dialog({\n            \"modal\": true,\n            \"height\": 52,\n            \"width\": 260,\n            \"title\": config.label.create_dir,\n            \"okText\": config.label.create,\n            \"cancelText\": config.label.cancel,\n            \"afterOpen\": function () {\n                $(\"#dialogNewDirPrompt > input\").val('').focus();\n                $(\"#dialogNewDirPrompt\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\").prop(\"disabled\", true);\n            },\n            \"ok\": function () {\n                var name = $(\"#dialogNewDirPrompt > input\").val(),\n                        request = newWideRequest();\n\n                request.path = wide.curNode.path + \"/\" + name;\n                request.fileType = \"d\";\n\n                $.ajax({\n                    type: 'POST',\n                    url: '/file/new',\n                    data: JSON.stringify(request),\n                    dataType: \"json\",\n                    success: function (result) {\n                        if (0 != result.code) {\n                            $(\"#dialogNewDirPrompt\").dialog(\"close\");\n                            bottomGroup.tabs.setCurrent(\"notification\");\n                            windows.flowBottom();\n                            $(\".bottom-window-group .notification\").focus();\n                            return false;\n                        }\n\n                        $(\"#dialogNewDirPrompt\").dialog(\"close\");\n                    }\n                });\n            }\n        });\n\n        $(\"#dialogGoFilePrompt\").dialog({\n            \"modal\": true,\n            \"height\": 320,\n            \"width\": 660,\n            \"title\": config.label.goto_file,\n            \"okText\": config.label.go,\n            \"cancelText\": config.label.cancel,\n            \"afterInit\": function () {\n                $(\"#dialogGoFilePrompt\").on(\"dblclick\", \"li\", function () {\n                    var tId = tree.getTIdByPath($(this).find(\".ft-small\").text());\n                    tree.openFile(tree.fileTree.getNodeByTId(tId));\n                    tree.fileTree.selectNode(wide.curNode);\n                    $(\"#dialogGoFilePrompt\").dialog(\"close\");\n                    wide.curEditor.focus();\n                });\n\n                $(\"#dialogGoFilePrompt\").on(\"click\", \"li\", function () {\n                    var $list = $(\"#dialogGoFilePrompt > .list\");\n                    $list.find(\"li\").removeClass(\"selected\");\n                    $list.data(\"index\", $(this).data(\"index\"));\n                    $(this).addClass(\"selected\");\n                });\n\n                hotkeys.bindList($(\"#dialogGoFilePrompt > input\"), $(\"#dialogGoFilePrompt > .list\"), function ($selected) {\n                    var tId = tree.getTIdByPath($selected.find(\".ft-small\").text());\n                    tree.openFile(tree.fileTree.getNodeByTId(tId));\n                    tree.fileTree.selectNode(wide.curNode);\n                    $(\"#dialogGoFilePrompt\").dialog(\"close\");\n                    wide.curEditor.focus();\n                });\n\n                $(\"#dialogGoFilePrompt > input\").bind(\"input\", function () {\n                    var name = $(\"#dialogGoFilePrompt > input\").val();\n\n                    var request = newWideRequest();\n                    request.path = '';\n                    request.name = '*' + name + '*';\n                    if (wide.curNode) {\n                        request.path = wide.curNode.path;\n                    }\n\n                    $.ajax({\n                        type: 'POST',\n                        url: '/file/find/name',\n                        data: JSON.stringify(request),\n                        dataType: \"json\",\n                        success: function (result) {\n                            if (0 != result.code) {\n                                return;\n                            }\n\n                            var data = result.data;\n\n                            var goFileHTML = '';\n                            for (var i = 0, max = data.length; i < max; i++) {\n                                var path = data[i].path,\n                                        name = path.substr(path.lastIndexOf(\"/\") + 1),\n                                        icoSkin = wide.getClassBySuffix(name.split(\".\")[1]);\n                                if (i === 0) {\n                                    goFileHTML += '<li data-index=\"' + i + '\" class=\"selected\" title=\"'\n                                            + path + '\"><span class=\"'\n                                            + icoSkin + 'ico\"></span>'\n                                            + name + '&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"ft-small\">'\n                                            + path + '</span></li>';\n                                } else {\n                                    goFileHTML += '<li data-index=\"' + i + '\" title=\"'\n                                            + path + '\"><span class=\"' + icoSkin + 'ico\"></span>'\n                                            + name + '&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"ft-small\">'\n                                            + path + '</span></li>';\n                                }\n                            }\n\n                            $(\"#dialogGoFilePrompt > ul\").html(goFileHTML);\n                        }\n                    });\n                });\n            },\n            \"afterOpen\": function () {\n                $(\"#dialogGoFilePrompt > input\").val('').focus();\n                $(\"#dialogGoFilePrompt\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\").prop(\"disabled\", true);\n                $(\"#dialogGoFilePrompt .list\").html('').data(\"index\", 0);\n            },\n            \"ok\": function () {\n                var tId = tree.getTIdByPath($(\"#dialogGoFilePrompt .selected .ft-small\").text());\n                tree.openFile(tree.fileTree.getNodeByTId(tId));\n                tree.fileTree.selectNode(wide.curNode);\n                $(\"#dialogGoFilePrompt\").dialog(\"close\");\n                wide.curEditor.focus();\n            }\n        });\n\n        $(\"#dialogGoLinePrompt\").dialog({\n            \"modal\": true,\n            \"height\": 52,\n            \"width\": 260,\n            \"title\": config.label.goto_line,\n            \"okText\": config.label.go,\n            \"cancelText\": config.label.cancel,\n            \"afterOpen\": function () {\n                $(\"#dialogGoLinePrompt > input\").val('').focus();\n                $(\"#dialogGoLinePrompt\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\").prop(\"disabled\", true);\n            },\n            \"ok\": function () {\n                var line = parseInt($(\"#dialogGoLinePrompt > input\").val()) - 1;\n                $(\"#dialogGoLinePrompt\").dialog(\"close\");\n\n                var editor = wide.curEditor;\n                var cursor = editor.getCursor();\n\n                editor.setCursor(CodeMirror.Pos(line, cursor.ch));\n\n                var half = Math.floor(editor.getScrollInfo().clientHeight / editor.defaultTextHeight() / 2);\n                var cursorCoords = editor.cursorCoords({line: line - half, ch: cursor.ch}, \"local\");\n                editor.scrollTo(0, cursorCoords.top);\n\n                editor.focus();\n            }\n        });\n    },\n    _initWS: function () {\n        var outputWS = new ReconnectingWebSocket(config.channel + '/output/ws?sid=' + config.wideSessionId);\n        outputWS.onopen = function () {\n            // console.log('[output onopen] connected');\n        };\n\n        outputWS.onmessage = function (e) {\n            // console.log('[output onmessage]' + e.data);\n            var data = JSON.parse(e.data);\n\n            if (goLintFound) {\n                goLintFound = [];\n            }\n\n            if ('run' === data.nextCmd) {\n                var request = newWideRequest();\n                request.executable = data.executable;\n\n                $.ajax({\n                    type: 'POST',\n                    url: '/run',\n                    data: JSON.stringify(request),\n                    dataType: \"json\"\n                });\n            }\n\n            switch (data.cmd) {\n                case 'run':\n                    var content = $('.bottom-window-group .output > div').html();\n                    if (!wide.curProcessId || '' === content) {\n                        bottomGroup.fillOutput(content + '<pre>' + data.output + '</pre>');\n                    } else {\n                        bottomGroup.fillOutput(content.replace(/<\\/pre>$/g, data.output + '</pre>'));\n                    }\n\n                    wide.curProcessId = data.pid;\n\n                    break;\n                case 'run-done':\n                    bottomGroup.fillOutput($('.bottom-window-group .output > div').html().replace(/<\\/pre>$/g, data.output + '</pre>'));\n\n                    wide.curProcessId = undefined;\n                    $(\"#buildRun\").removeClass(\"ico-stop\")\n                            .addClass(\"ico-buildrun\").attr(\"title\", config.label.build_n_run);\n\n                    break;\n                case 'start-build':\n                case 'start-test':\n                case 'start-vet':\n                case 'start-install':\n                    bottomGroup.fillOutput(data.output);\n\n                    break;\n                case 'go test':\n                case 'go vet':\n                case 'go install':\n                    bottomGroup.fillOutput($('.bottom-window-group .output > div').html() + data.output);\n\n                    break;\n                case 'git clone':\n                    bottomGroup.fillOutput($('.bottom-window-group .output > div').html() + data.output);\n                    tree.fileTree.reAsyncChildNodes(wide.curNode, \"refresh\", false);\n\n                    break;\n                case 'build':\n                case 'cross-build':\n                    bottomGroup.fillOutput($('.bottom-window-group .output > div').html() + data.output);\n\n                    if (data.lints) { // has build error\n                        var files = {};\n\n                        for (var i = 0; i < data.lints.length; i++) {\n                            var lint = data.lints[i];\n\n                            goLintFound.push({from: CodeMirror.Pos(lint.lineNo, 0),\n                                to: CodeMirror.Pos(lint.lineNo, 0),\n                                message: lint.msg, severity: lint.severity});\n\n                            files[lint.file] = lint.file;\n                        }\n\n                        $(\"#buildRun\").removeClass(\"ico-stop\")\n                                .addClass(\"ico-buildrun\").attr(\"title\", config.label.build_n_run);\n\n                        // trigger gutter lint\n                        for (var path in files) {\n                            var editor = editors.getEditorByPath(path);\n                            CodeMirror.signal(editor, \"change\", editor);\n                        }\n                    } else {\n                        if ('cross-build' === data.cmd) {\n                            var request = newWideRequest(),\n                                    path = null;\n                            request.path = data.executable;\n                            request.name = data.name;\n\n                            $.ajax({\n                                async: false,\n                                type: 'POST',\n                                url: '/file/zip/new',\n                                data: JSON.stringify(request),\n                                dataType: \"json\",\n                                success: function (result) {\n                                    if (0 != result.code) {\n                                        $(\"#dialogAlert\").dialog(\"open\", result.msg);\n\n                                        return false;\n                                    }\n\n                                    path = result.data;\n                                }\n                            });\n\n                            if (path) {\n                                window.open('/file/zip?path=' + path + \".zip\");\n                            }\n                        }\n                    }\n\n                    break;\n            }\n        };\n        outputWS.onclose = function (e) {\n            // console.log('[output onclose] disconnected (' + e.code + ')');\n        };\n        outputWS.onerror = function (e) {\n            console.log('[output onerror]',e);\n        };\n    },\n    _initFooter: function () {\n        $(\".footer .cursor\").dblclick(function () {\n            $(\"#dialogGoLinePrompt\").dialog(\"open\");\n        });\n    },\n    init: function () {\n        this._initFooter();\n\n        this._initWS();\n\n        // 点击隐藏弹出层\n        $(\"body\").bind(\"mouseup\", function (event) {\n            // MAC 右键文件树失效\n            if (event.which === 3) {\n                return false;\n            }\n\n            $(\".frame\").hide();\n\n            if (!($(event.target).closest(\".frame\").length === 1 || event.target.className === \"frame\")) {\n                $(\".menu > ul > li\").unbind().removeClass(\"selected\");\n                menu.subMenu();\n            }\n        });\n\n        // 刷新提示\n        window.onbeforeunload = function () {\n            if (editors.data.length > 0) {\n                return config.label.confirm_save;\n            }\n        };\n\n        // 禁止鼠标右键菜单\n        document.oncontextmenu = function () {\n            return false;\n        };\n\n        this._initDialog();\n    },\n    _save: function (path, editor) {\n        if (!path) {\n            return false;\n        }\n\n        var request = newWideRequest();\n        request.file = path;\n        request.code = editor.getValue();\n\n        $.ajax({\n            type: 'POST',\n            url: '/file/save',\n            data: JSON.stringify(request),\n            dataType: \"json\",\n            success: function (result) {\n                // reset the save state\n                editor.doc.markClean();\n                $(\".edit-panel .tabs > div\").each(function () {\n                    var $span = $(this).find(\"span:eq(0)\");\n                    if ($span.attr(\"title\") === path) {\n                        $span.removeClass(\"changed\");\n                    }\n                });\n            }\n        });\n    },\n    saveFile: function () {\n        var path = editors.getCurrentPath();\n        if (!path) {\n            return false;\n        }\n\n        var editor = wide.curEditor;\n        if (editor.doc.isClean()) { // no modification\n            return false;\n        }\n\n        if (\"text/x-go\" === editor.getOption(\"mode\")) {\n            wide.gofmt(path, wide.curEditor); // go fmt will save\n\n            // build the file at once\n            var request = newWideRequest();\n            request.file = path;\n            request.code = editor.getValue();\n            request.nextCmd = \"\"; // build only, no following operation\n            $.ajax({\n                type: 'POST',\n                url: '/build',\n                data: JSON.stringify(request),\n                dataType: \"json\",\n                beforeSend: function () {\n                    bottomGroup.resetOutput();\n                },\n                success: function (result) {\n                }\n            });\n\n            // refresh outline\n            wide.refreshOutline();\n\n            return;\n        }\n\n        wide._save(path, wide.curEditor);\n    },\n    stop: function () {\n        if ($(\"#buildRun\").hasClass(\"ico-buildrun\")) {\n            menu.run();\n            return false;\n        }\n\n        if (!wide.curProcessId) {\n            return false;\n        }\n\n        var request = newWideRequest();\n        request.pid = wide.curProcessId;\n\n        $.ajax({\n            type: 'POST',\n            url: '/stop',\n            data: JSON.stringify(request),\n            dataType: \"json\",\n            success: function (result) {\n                $(\"#buildRun\").removeClass(\"ico-stop\")\n                        .addClass(\"ico-buildrun\").attr(\"title\", config.label.build_n_run);\n            }\n        });\n    },\n    gofmt: function (path, editor) {\n        var cursor = editor.getCursor();\n        var scrollInfo = editor.getScrollInfo();\n\n        var request = newWideRequest();\n        request.file = path;\n        request.code = editor.getValue();\n        request.cursorLine = cursor.line;\n        request.cursorCh = cursor.ch;\n\n        $.ajax({\n            async: false, // sync\n            type: 'POST',\n            url: '/go/fmt',\n            data: JSON.stringify(request),\n            dataType: \"json\",\n            success: function (result) {\n                if (0 == result.code) {\n                    editor.setValue(result.data.code);\n                    editor.setCursor(cursor);\n                    editor.scrollTo(null, scrollInfo.top);\n\n                    wide._save(path, editor);\n                }\n            }\n        });\n    },\n    fmt: function (path, editor) {\n        var mode = editor.getOption(\"mode\");\n\n        var cursor = editor.getCursor();\n        var scrollInfo = editor.getScrollInfo();\n\n        var request = newWideRequest();\n        request.file = path;\n        request.code = editor.getValue();\n        request.cursorLine = cursor.line;\n        request.cursorCh = cursor.ch;\n\n        var formatted = null;\n\n        switch (mode) {\n            case \"text/x-go\":\n                $.ajax({\n                    async: false, // sync\n                    type: 'POST',\n                    url: '/go/fmt',\n                    data: JSON.stringify(request),\n                    dataType: \"json\",\n                    success: function (result) {\n                        if (0 == result.code) {\n                            formatted = result.data.code;\n                        }\n                    }\n                });\n\n                break;\n            case \"text/html\":\n                formatted = html_beautify(editor.getValue());\n                break;\n            case \"text/javascript\":\n            case \"application/json\":\n                formatted = js_beautify(editor.getValue());\n                break;\n            case \"text/css\":\n                formatted = css_beautify(editor.getValue());\n                break;\n            default :\n                break;\n        }\n\n        if (formatted) {\n            editor.setValue(formatted);\n            editor.setCursor(cursor);\n            editor.scrollTo(null, scrollInfo.top);\n\n            wide._save(path, editor);\n        }\n    },\n    getClassBySuffix: function (suffix) {\n        var iconSkin = \"ico-ztree-other \";\n        switch (suffix) {\n            case \"html\":\n            case \"htm\":\n                iconSkin = \"ico-ztree-html \";\n                break;\n            case \"go\":\n                iconSkin = \"ico-ztree-go \";\n                break;\n            case \"css\":\n                iconSkin = \"ico-ztree-css \";\n                break;\n            case \"txt\":\n                iconSkin = \"ico-ztree-text \";\n                break;\n            case \"sql\":\n                iconSkin = \"ico-ztree-sql \";\n                break;\n            case \"properties\":\n                iconSkin = \"ico-ztree-pro \";\n                break;\n            case \"md\":\n                iconSkin = \"ico-ztree-md \";\n                break;\n            case \"js\", \"json\":\n                iconSkin = \"ico-ztree-js \";\n                break;\n            case \"xml\":\n                iconSkin = \"ico-ztree-xml \";\n                break;\n            case \"jpg\":\n            case \"jpeg\":\n            case \"bmp\":\n            case \"gif\":\n            case \"png\":\n            case \"svg\":\n            case \"ico\":\n                iconSkin = \"ico-ztree-img \";\n                break;\n        }\n\n        return iconSkin;\n    }\n};\n\n$(document).ready(function () {\n    wide.init();\n    tree.init();\n    menu.init();\n    hotkeys.init();\n    session.init();\n    notification.init();\n    editors.init();\n    windows.init();\n    bottomGroup.init();\n});\n","/*\n * Copyright (c) 2014-present, b3log.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * @file session.js\n *\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\n * @version 1.1.0.2, Jun 23, 2019\n */\nvar session = {\n    init: function () {\n        this._initWS();\n\n        var getLayoutState = function (paneState) {\n            var state = 'normal';\n            if (paneState.isClosed) {\n                state = 'min';\n            } else if (paneState.size >= $('body').width()) {\n                state = 'max';\n            }\n\n            return state;\n        };\n\n        // save session content every 30 seconds\n        setInterval(function () {\n            var request = newWideRequest(),\n                    filse = [],\n                    fileTree = [],\n                    currentId = editors.getCurrentId(),\n                    currentFile = currentId ? editors.getCurrentPath() : \"\";\n\n            editors.tabs.obj._$tabs.find(\"div\").each(function () {\n                var $it = $(this);\n                if ($it.find(\"span:eq(0)\").attr(\"title\") !== config.label.start_page) {\n                    filse.push($it.find(\"span:eq(0)\").attr(\"title\"));\n                }\n            });\n\n            fileTree = tree.getOpenPaths();\n\n            request.currentFile = currentFile; // current editor file\n            request.fileTree = fileTree; // file tree expansion state\n            request.files = filse; // editor tabs\n\n\n            request.layout = {\n                \"side\": {\n                    \"size\": windows.outerLayout.west.state.size,\n                    \"state\": getLayoutState(windows.outerLayout.west.state)\n                },\n                \"sideRight\": {\n                    \"size\": windows.innerLayout.east.state.size,\n                    \"state\": getLayoutState(windows.innerLayout.east.state)\n                },\n                \"bottom\": {\n                    \"size\": windows.innerLayout.south.state.size,\n                    \"state\": getLayoutState(windows.innerLayout.south.state)\n                }\n            };\n\n            $.ajax({\n                type: 'POST',\n                url: '/session/save',\n                data: JSON.stringify(request),\n                dataType: \"json\",\n                success: function (result) {\n                }\n            });\n        }, 30000);\n    },\n    restore: function () {\n        if (!config.latestSessionContent) {\n            return;\n        }\n\n        var fileTree = config.latestSessionContent.fileTree,\n                files = config.latestSessionContent.files,\n                currentFile = config.latestSessionContent.currentFile,\n                id = \"\",\n                nodesToOpen = [];\n\n        var nodes = tree.fileTree.transformToArray(tree.fileTree.getNodes());\n\n        for (var i = 0, ii = nodes.length; i < ii; i++) {\n            // expand tree\n            for (var j = 0, jj = fileTree.length; j < jj; j++) {\n                if (nodes[i].path === fileTree[j]) {\n                    // expand this node only if its parents are open\n                    var parents = tree.getAllParents(tree.fileTree.getNodeByTId(nodes[i].tId)),\n                            isOpen = true;\n                    for (var l = 0, max = parents.length; l < max; l++) {\n                        if (parents[l].open === false) {\n                            isOpen = false;\n                        }\n                    }\n                    if (isOpen) {\n                        tree.fileTree.expandNode(nodes[i], true, false, true);\n                    } else {\n                        // flag it is open\n                        nodes[i].open = true;\n                    }\n                    break;\n                }\n            }\n\n            // open editors\n            for (var k = 0, kk = files.length; k < kk; k++) {\n                if (nodes[i].path === files[k]) {\n                    nodesToOpen.push(nodes[i]);\n                    break;\n                }\n            }\n\n            if (nodes[i].path === currentFile) {\n                id = nodes[i].path;\n\n                // FIXME: 上面的展开是异步进行的,所以执行到这里的时候可能还没有展开完,导致定位不了可视区域\n                tree.fileTree.selectNode(nodes[i]);\n                wide.curNode = nodes[i];\n            }\n        }\n\n        // handle the open sequence of editors\n        for (var m = 0, mm = files.length; m < mm; m++) {\n            for (var n = 0, nn = nodesToOpen.length; n < nn; n++) {\n                if (nodesToOpen[n].path === files[m]) {\n                    tree.openFile(nodesToOpen[n]);\n                    break;\n                }\n            }\n        }\n\n        // set the current editor\n        editors.tabs.setCurrent(id);\n        for (var c = 0, max = editors.data.length; c < max; c++) {\n            if (id === editors.data[c].id) {\n                wide.curEditor = editors.data[c].editor;\n                break;\n            }\n        }        \n    },\n    _initWS: function () {\n        // Used for session retention, server will release all resources of the session if this channel closed\n        var sessionWS = new ReconnectingWebSocket(config.channel + '/session/ws?sid=' + config.wideSessionId);\n\n        sessionWS.onopen = function () {\n            var dateFormat = function (time, fmt) {\n                var date = new Date(time);\n                var dateObj = {\n                    \"M+\": date.getMonth() + 1,\n                    \"d+\": date.getDate(),\n                    \"h+\": date.getHours(),\n                    \"m+\": date.getMinutes(),\n                    \"s+\": date.getSeconds(),\n                    \"q+\": Math.floor((date.getMonth() + 3) / 3),\n                    \"S\": date.getMilliseconds()\n                };\n                if (/(y+)/.test(fmt))\n                    fmt = fmt.replace(RegExp.$1, (date.getFullYear() + \"\").substr(4 - RegExp.$1.length));\n                for (var k in dateObj)\n                    if (new RegExp(\"(\" + k + \")\").test(fmt)) {\n                        fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1)\n                                ? (dateObj[k]) : ((\"00\" + dateObj[k]).substr((\"\" + dateObj[k]).length)));\n                    }\n                return fmt;\n            };\n\n            var data = {type: \"Network\", severity: \"INFO\",\n                message: \"Connected to server [sid=\" + config.wideSessionId + \"], \" + dateFormat(new Date().getTime(), 'yyyy-MM-dd hh:mm:ss')},\n            $notification = $('.bottom-window-group .notification > table'),\n                    notificationHTML = '';\n\n            notificationHTML += '<tr><td class=\"severity\">' + data.severity\n                    + '</td><td class=\"message\">' + data.message\n                    + '</td><td class=\"type\">' + data.type + '</td></tr>';\n            $notification.append(notificationHTML);\n        };\n\n        sessionWS.onmessage = function (e) {\n            var data = JSON.parse(e.data);\n            switch (data.cmd) {\n                case 'create-file':\n                    var node = tree.fileTree.getNodeByTId(tree.getTIdByPath(data.dir)),\n                            name = data.path.replace(data.dir + '/', ''),\n                            mode = CodeMirror.findModeByFileName(name),\n                            iconSkin = wide.getClassBySuffix(name.split(\".\")[1]);\n\n                    if (data.type && data.type === 'f') {\n                        tree.fileTree.addNodes(node, [{\n                                \"id\": data.path,\n                                \"name\": name,\n                                \"iconSkin\": iconSkin,\n                                \"path\": data.path,\n                                \"mode\": mode,\n                                \"removable\": true,\n                                \"creatable\": true\n                            }]);\n\n                    } else {\n                        tree.fileTree.addNodes(node, [{\n                                \"id\": data.path,\n                                \"name\": name,\n                                \"iconSkin\": \"ico-ztree-dir \",\n                                \"path\": data.path,\n                                \"removable\": true,\n                                \"creatable\": true,\n                                \"isParent\": true\n                            }]);\n                    }\n                    break;\n                case 'remove-file':\n                case 'rename-file':\n                    var node = tree.fileTree.getNodeByTId(tree.getTIdByPath(data.path));\n                    tree.fileTree.removeNode(node);\n\n                    var nodes = tree.fileTree.transformToArray(node);\n                    for (var i = 0, ii = nodes.length; i < ii; i++) {\n                        editors.tabs.del(nodes[i].path);\n                    }\n\n                    break;\n            }\n        };\n        sessionWS.onclose = function (e) {\n            // console.log('[session onclose] disconnected (' + e.code + ')');\n\n            var data = {type: \"Network\", severity: \"ERROR\",\n                message: \"Disconnected from server, trying to reconnect it [sid=\" + config.wideSessionId + \"]\"},\n            $notification = $('.bottom-window-group .notification > table'),\n                    notificationHTML = '';\n\n            notificationHTML += '<tr><td class=\"severity\">' + data.severity\n                    + '</td><td class=\"message\">' + data.message\n                    + '</td><td class=\"type\">' + data.type + '</td></tr>';\n            $notification.append(notificationHTML);\n\n            $(\".notification-count\").show();\n        };\n        sessionWS.onerror = function (e) {\n            console.log('[session onerror]', e);\n        };\n    }\n};","/*\n * Copyright (c) 2014-present, b3log.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * @file menu.js\n *\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\n * @version 1.0.1.3, Oct 5, 2018\n */\nvar menu = {\n    init: function () {\n        this.subMenu();\n        this._initPreference();\n        this._initAbout();\n        this._initShare();\n\n        // 点击子菜单后消失\n        $(\".menu .frame li\").click(function () {\n            $(\".menu > ul > li\").unbind().removeClass(\"selected\");\n            menu.subMenu();\n        });\n    },\n    _initShare: function () {\n        $(\".menu .ico-share\").hover(function () {\n            $(\".menu .share-panel\").show();\n        });\n\n        $(\".share-panel .font-ico\").click(function () {\n            var key = $(this).attr('class').split('-')[2];\n            var url = \"https://wide.b3log.org\", pic = 'https://wide.b3log.org/static/images/wide-logo.png';\n            var urls = {};\n            urls.email = \"mailto:?subject=\" + $('title').text()\n                    + \"&body=\" + $('meta[name=description]').attr('content') + ' ' + url;\n\n            var twitterShare = encodeURIComponent($('meta[name=description]').attr('content') + \" \" + url + \" #golang\");\n            urls.twitter = \"https://twitter.com/intent/tweet?status=\" + twitterShare;\n\n            urls.facebook = \"https://www.facebook.com/sharer/sharer.php?u=\" + url;\n            urls.googleplus = \"https://plus.google.com/share?url=\" + url;\n\n            var title = encodeURIComponent($('title').text() + '. \\n' + $('meta[name=description]').attr('content')\n                    + \" #golang#\");\n            urls.weibo = \"http://v.t.sina.com.cn/share/share.php?title=\" + title + \"&url=\" + url + \"&pic=\" + pic;\n            urls.qqz = \"https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=\" + url + \"&sharesource=qzone&title=\" + title+ \"&pics=\" + pic;\n\n            window.open(urls[key], \"_blank\", \"top=100,left=200,width=648,height=618\");\n        });\n    },\n    _initAbout: function () {\n        $(\"#dialogAbout\").load('/about', function () {\n            $(\"#dialogAbout\").dialog({\n                \"modal\": true,\n                \"title\": config.label.about,\n                \"hideFooter\": true,\n                \"afterOpen\": function () {\n                    $.ajax({\n                        url: \"https://rhythm.b3log.org/version/wide/latest\",\n                        type: \"GET\",\n                        dataType: \"jsonp\",\n                        jsonp: \"callback\",\n                        success: function (data, textStatus) {\n                            if ($(\"#dialogAbout .version\").text() === data.wideVersion) {\n                                $(\".upgrade\").text(config.label.uptodate);\n                            } else {\n                                $(\".upgrade\").html(config.label.new_version_available + config.label.colon\n                                        + \"<a href='\" + data.wideDownload\n                                        + \"' target='_blank'>\" + data.wideVersion + \"</a>\");\n                            }\n                        }\n                    });\n                }\n            });\n        });\n    },\n    disabled: function (list) {\n        for (var i = 0, max = list.length; i < max; i++) {\n            $(\".menu li.\" + list[i]).addClass(\"disabled\");\n        }\n    },\n    undisabled: function (list) {\n        for (var i = 0, max = list.length; i < max; i++) {\n            $(\".menu li.\" + list[i]).removeClass(\"disabled\");\n        }\n    },\n    // 焦点不在菜单上时需点击展开子菜单,否则为鼠标移动展开\n    subMenu: function () {\n        $(\".menu > ul > li\").click(function (event) {\n            if ($(event.target).closest(\".frame\").length === 1) {\n                return;\n            }\n            var $it = $(this);\n            $it.find('.frame').show();\n            $(\".menu > ul > li\").removeClass(\"selected\");\n            $(this).addClass(\"selected\");\n\n            $(\".menu > ul > li\").unbind();\n\n            $(\".menu > ul > li\").mouseover(function () {\n                if ($(event.target).closest(\".frame\").length === 1) {\n                    return;\n                }\n                $(\".menu .frame\").hide();\n                $(this).find('.frame').show();\n                $(\".menu > ul > li\").removeClass(\"selected\");\n                $(this).addClass(\"selected\");\n            });\n        });\n    },\n    openPreference: function () {\n        $(\"#dialogPreference\").dialog(\"open\");\n    },\n    saveAllFiles: function () {\n        if ($(\".menu li.save-all\").hasClass(\"disabled\")) {\n            return false;\n        }\n        for (var i = 0, ii = editors.data.length; i < ii; i++) {\n            var path = editors.data[i].id;\n            var editor = editors.data[i].editor;\n\n            if (\"text/x-go\" === editor.getOption(\"mode\")) {\n                wide.fmt(path, editor);\n            } else {\n                wide._save(path, editor);\n            }\n        }\n    },\n    closeAllFiles: function () {\n        if ($(\".menu li.close-all\").hasClass(\"disabled\")) {\n            return false;\n        }\n\n        // 设置全部关闭标识\n        var removeData = [];\n        $(\".edit-panel .tabs > div\").each(function (i) {\n            if (i !== 0) {\n                removeData.push($(this).data(\"index\"));\n            }\n        });\n        $(\"#dialogCloseEditor\").data(\"removeData\", removeData);\n        // 开始关闭\n        $(\".edit-panel .tabs .ico-close:eq(0)\").click();\n    },\n    exit: function () {\n        var request = newWideRequest();\n\n        $.ajax({\n            type: 'POST',\n            url: '/logout',\n            data: JSON.stringify(request),\n            dataType: \"json\",\n            success: function (result) {\n                if (0 == result.code) {\n                    window.location.href = \"/login\";\n                }\n            }\n        });\n    },\n    openAbout: function () {\n        $(\"#dialogAbout\").dialog(\"open\");\n    },\n    goinstall: function () {\n        menu.saveAllFiles();\n\n        var currentPath = editors.getCurrentPath();\n        if (!currentPath) {\n            return false;\n        }\n\n        if ($(\".menu li.go-install\").hasClass(\"disabled\")) {\n            return false;\n        }\n\n        var request = newWideRequest();\n        request.file = currentPath;\n\n        $.ajax({\n            type: 'POST',\n            url: '/go/install',\n            data: JSON.stringify(request),\n            dataType: \"json\",\n            beforeSend: function () {\n                bottomGroup.resetOutput();\n            },\n            success: function (result) {\n            }\n        });\n    },\n    // go test.\n    test: function () {\n        menu.saveAllFiles();\n\n        var currentPath = editors.getCurrentPath();\n        if (!currentPath) {\n            return false;\n        }\n\n        if ($(\".menu li.go-test\").hasClass(\"disabled\")) {\n            return false;\n        }\n\n        var request = newWideRequest();\n        request.file = currentPath;\n\n        $.ajax({\n            type: 'POST',\n            url: '/go/test',\n            data: JSON.stringify(request),\n            dataType: \"json\",\n            beforeSend: function () {\n                bottomGroup.resetOutput();\n            },\n            success: function (result) {\n            }\n        });\n    },\n    // go vet.\n    govet: function () {\n        menu.saveAllFiles();\n\n        var currentPath = editors.getCurrentPath();\n        if (!currentPath) {\n            return false;\n        }\n\n        if ($(\".menu li.go-vet\").hasClass(\"disabled\")) {\n            return false;\n        }\n\n        var request = newWideRequest();\n        request.file = currentPath;\n\n        $.ajax({\n            type: 'POST',\n            url: '/go/vet',\n            data: JSON.stringify(request),\n            dataType: \"json\",\n            beforeSend: function () {\n                bottomGroup.resetOutput();\n            },\n            success: function (result) {\n            }\n        });\n    },\n    // Build & Run.\n    run: function () {\n        menu.saveAllFiles();\n\n        if ($(\"#buildRun\").hasClass(\"ico-stop\")) {\n            wide.stop();\n            return false;\n        }\n\n        var currentPath = editors.getCurrentPath();\n        if (!currentPath) {\n            return false;\n        }\n\n        if ($(\".menu li.run\").hasClass(\"disabled\")) {\n            return false;\n        }\n\n        var request = newWideRequest();\n        request.file = currentPath;\n        request.code = wide.curEditor.getValue();\n        request.nextCmd = \"run\";\n\n        $.ajax({\n            type: 'POST',\n            url: '/build',\n            data: JSON.stringify(request),\n            dataType: \"json\",\n            beforeSend: function () {\n                bottomGroup.resetOutput();\n\n                $(\"#buildRun\").addClass(\"ico-stop\")\n                        .removeClass(\"ico-buildrun\").attr(\"title\", config.label.stop);\n            },\n            success: function (result) {\n            }\n        });\n    },\n    // Build.\n    build: function () {\n        menu.saveAllFiles();\n\n        var currentPath = editors.getCurrentPath();\n        if (!currentPath) {\n            return false;\n        }\n\n        if ($(\".menu li.build\").hasClass(\"disabled\")) {\n            return false;\n        }\n\n        var request = newWideRequest();\n        request.file = currentPath;\n        request.code = wide.curEditor.getValue();\n        request.nextCmd = \"\"; // build only, no following operation\n\n        $.ajax({\n            type: 'POST',\n            url: '/build',\n            data: JSON.stringify(request),\n            dataType: \"json\",\n            beforeSend: function () {\n                bottomGroup.resetOutput();\n            },\n            success: function (result) {\n            }\n        });\n    },\n    _initPreference: function () {\n        $(\"#dialogPreference\").load('/preference', function () {\n            $(\"#dialogPreference input\").keyup(function () {\n                var isChange = false,\n                        emptys = [],\n                        emptysTip = '';\n                $(\"#dialogPreference input\").each(function () {\n                    var $it = $(this);\n                    // data-value 如为数字,则不会和 value 一样转换为 String,再次不使用全等\n                    if ($it.val() != $it.data(\"value\")) {\n                        isChange = true;\n                    }\n\n                    if ($.trim($it.val()) === '') {\n                        emptys.push($it);\n                    }\n                });\n\n                var $okBtn = $(\"#dialogPreference\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\");\n                if (isChange) {\n                    $okBtn.prop(\"disabled\", false);\n                } else {\n                    $okBtn.prop(\"disabled\", true);\n                }\n\n                if (emptys.length === 0) {\n                    $(\"#dialogPreference\").find(\".tip\").html(\"\");\n                    $okBtn.prop(\"disabled\", false);\n                } else {\n                    for (var i = 0, max = emptys.length; i < max; i++) {\n                        var tabIndex = emptys[i].closest('div').data(\"index\"),\n                                text = $.trim(emptys[i].parent().text());\n                        emptysTip += '[' + $('#dialogPreference .tabs > div[data-index=\"' + tabIndex + '\"]').text()\n                                + '] -> [' + text.substr(0, text.length - 1)\n                                + ']: ' + config.label.no_empty + \"<br/>\";\n                    }\n                    $(\"#dialogPreference\").find(\".tip\").html(emptysTip);\n                    $okBtn.prop(\"disabled\", true);\n                }\n            });\n\n            $(\"#dialogPreference select\").on(\"change\", function () {\n                var isChange = false;\n                $(\"#dialogPreference select\").each(function () {\n                    if ($(this).val() !== $(this).data(\"value\")) {\n                        isChange = true;\n                    }\n                });\n\n                var $okBtn = $(\"#dialogPreference\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\");\n                if (isChange) {\n                    $okBtn.prop(\"disabled\", false);\n                } else {\n                    $okBtn.prop(\"disabled\", true);\n                }\n            });\n\n            $(\"#dialogPreference\").dialog({\n                \"modal\": true,\n                \"height\": 280,\n                \"width\": 800,\n                \"title\": config.label.preference,\n                \"okText\": config.label.apply,\n                \"cancelText\": config.label.cancel,\n                \"afterOpen\": function () {\n                    var $okBtn = $(\"#dialogPreference\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\");\n                    $okBtn.prop(\"disabled\", true);\n                },\n                \"ok\": function () {\n                    var request = newWideRequest(),\n                            $dialogPreference = $(\"#dialogPreference\"),\n                            $fontFamily = $dialogPreference.find(\"input[name=fontFamily]\"),\n                            $fontSize = $dialogPreference.find(\"input[name=fontSize]\"),\n                            $goFmt = $dialogPreference.find(\"select[name=goFmt]\"),\n                            $GoBuildArgsForLinux = $dialogPreference.find(\"input[name=GoBuildArgsForLinux]\"),\n                            $GoBuildArgsForWindows = $dialogPreference.find(\"input[name=GoBuildArgsForWindows]\"),\n                            $GoBuildArgsForDarwin = $dialogPreference.find(\"input[name=GoBuildArgsForDarwin]\"),\n                            $workspace = $dialogPreference.find(\"input[name=workspace]\"),\n                            $password = $dialogPreference.find(\"input[name=password]\"),\n                            $email = $dialogPreference.find(\"input[name=email]\"),\n                            $locale = $dialogPreference.find(\"select[name=locale]\"),\n                            $theme = $dialogPreference.find(\"select[name=theme]\"),\n                            $editorFontFamily = $dialogPreference.find(\"input[name=editorFontFamily]\"),\n                            $editorFontSize = $dialogPreference.find(\"input[name=editorFontSize]\"),\n                            $editorLineHeight = $dialogPreference.find(\"input[name=editorLineHeight]\"),\n                            $editorTheme = $dialogPreference.find(\"select[name=editorTheme]\"),\n                            $editorTabSize = $dialogPreference.find(\"input[name=editorTabSize]\"),\n                            $keymap = $dialogPreference.find(\"select[name=keymap]\");\n\n                    $.extend(request, {\n                        \"fontFamily\": $fontFamily.val(),\n                        \"fontSize\": $fontSize.val(),\n                        \"goFmt\": $goFmt.val(),\n                        \"GoBuildArgsForLinux\": $GoBuildArgsForLinux.val(),\n                        \"GoBuildArgsForWindows\": $GoBuildArgsForWindows.val(),\n                        \"GoBuildArgsForDarwin\": $GoBuildArgsForDarwin.val(),\n                        \"workspace\": $workspace.val(),\n                        \"password\": $password.val(),\n                        \"locale\": $locale.val(),\n                        \"theme\": $theme.val(),\n                        \"editorFontFamily\": $editorFontFamily.val(),\n                        \"editorFontSize\": $editorFontSize.val(),\n                        \"editorLineHeight\": $editorLineHeight.val(),\n                        \"editorTheme\": $editorTheme.val(),\n                        \"editorTabSize\": $editorTabSize.val(),\n                        \"keymap\": $keymap.val()\n                    });\n\n                    if (config.keymap !== $keymap.val()) {\n                        window.location.reload();\n                    }\n\n                    $.ajax({\n                        type: 'POST',\n                        url: '/preference',\n                        data: JSON.stringify(request),\n                        success: function (result, textStatus, jqXHR) {\n                            if (0 != result.code) {\n                                return false;\n                            }\n\n                            $fontFamily.data(\"value\", $fontFamily.val());\n                            $fontSize.data(\"value\", $fontSize.val());\n                            $goFmt.data(\"value\", $goFmt.val());\n                            $GoBuildArgsForLinux.data(\"value\", $GoBuildArgsForLinux.val());\n                            $GoBuildArgsForWindows.data(\"value\", $GoBuildArgsForWindows.val());\n                            $GoBuildArgsForDarwin.data(\"value\", $GoBuildArgsForDarwin.val());\n                            $workspace.data(\"value\", $workspace.val());\n                            $password.data(\"value\", $password.val());\n                            $email.data(\"value\", $email.val());\n                            $locale.data(\"value\", $locale.val());\n                            $theme.data(\"value\", $theme.val());\n                            $editorFontFamily.data(\"value\", $editorFontFamily.val());\n                            $editorFontSize.data(\"value\", $editorFontSize.val());\n                            $editorLineHeight.data(\"value\", $editorLineHeight.val());\n                            $editorTheme.data(\"value\", $editorTheme.val());\n                            $editorTabSize.data(\"value\", $editorTabSize.val());\n                            $keymap.data(\"value\", $keymap.val());\n\n                            // update the config\n                            config.keymap = $keymap.val();\n\n                            var $okBtn = $(\"#dialogPreference\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\");\n                            $okBtn.prop(\"disabled\", true);\n\n                            $(\"#themesLink\").attr(\"href\", '/static/css/themes/' + $theme.val() + '.css');\n\n                            config.editorTheme = $editorTheme.val();\n                            for (var i = 0, ii = editors.data.length; i < ii; i++) {\n                                editors.data[i].editor.setOption(\"theme\", $editorTheme.val());\n                            }\n                        }\n                    });\n                }\n            });\n\n            new Tabs({\n                id: \".preference\"\n            });\n        });\n    }\n};\n","/*\n * Copyright (c) 2014-present, b3log.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * @file windows.js\n *\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\n * @version 1.1.2.2, Feb 16, 2016\n */\nvar windows = {\n    isMaxEditor: false,\n    outerLayout: {},\n    innerLayout: {},\n    init: function () {\n        if (!config.latestSessionContent) {\n            config.latestSessionContent = {\n                \"fileTree\": [],\n                \"files\": [],\n                \"currentFile\": \"\",\n            };\n        }\n        \n        if (!config.latestSessionContent.layout) {\n            config.latestSessionContent.layout = {\n                \"side\": {\n                    \"size\": 200,\n                    \"state\": 'normal'\n                },\n                \"sideRight\": {\n                    \"size\": 200,\n                    \"state\": 'normal'\n                },\n                \"bottom\": {\n                    \"size\": 100,\n                    \"state\": 'normal'\n                }\n            };\n        }\n\n        var layout = config.latestSessionContent.layout;\n\n        this.outerLayout = $('body').layout({\n            north__paneSelector: \".menu\",\n            center__paneSelector: \".content\",\n            south__paneSelector: \".footer\",\n            north__size: 22,\n            south__size: 19,\n            spacing_open: 2,\n            north__spacing_open: 0,\n            south__spacing_open: 0,\n            defaults: {\n                fxSpeed_open: 300,\n                fxSpeed_close: 100,\n                fxSettings_close: {\n                    easing: \"easeOutQuint\"\n                },\n                fxSettings_open: {\n                    easing: \"easeInQuint\"\n                }\n            },\n            west: {\n                size: layout.side.size,\n                paneSelector: \".side\",\n                togglerLength_open: 0,\n                togglerLength_closed: 15,\n                togglerAlign_closed: \"top\",\n                slideTrigger_open: \"mouseover\",\n                spacing_closed: 15,\n                minSize: 100,\n                togglerClass: \"ico-restore\",\n                togglerTip_open: config.label.min,\n                togglerTip_closed: config.label.restore_side,\n                resizerTip: config.label.resize,\n                initClosed: (layout.side.state === 'min')\n            }\n        });\n\n        this.innerLayout = $('div.content').layout({\n            spacing_open: 2,\n            defaults: {\n                fxSpeed_open: 300,\n                fxSpeed_close: 100,\n                fxSettings_close: {\n                    easing: \"easeOutQuint\"\n                },\n                fxSettings_open: {\n                    easing: \"easeInQuint\"\n                }\n            },\n            center: {\n                paneSelector: \".edit-panel\"\n            },\n            east: {\n                size: layout.sideRight.size,\n                paneSelector: \".side-right\",\n                togglerLength_open: 0,\n                togglerLength_closed: 15,\n                togglerAlign_closed: \"top\",\n                slideTrigger_open: \"mouseover\",\n                spacing_closed: 15,\n                minSize: 100,\n                togglerClass: \"ico-restore\",\n                togglerTip_open: config.label.min,\n                togglerTip_closed: config.label.restore_outline,\n                resizerTip: config.label.resize,\n                initClosed: (layout.sideRight.state === 'min')\n            },\n            south: {\n                size: layout.bottom.size,\n                paneSelector: \".bottom-window-group\",\n                togglerLength_open: 0,\n                togglerLength_closed: 15,\n                togglerAlign_closed: \"top\",\n                slideTrigger_open: \"mouseover\",\n                spacing_closed: 16,\n                minSize: 100,\n                togglerClass: \"ico-restore\",\n                togglerTip_open: config.label.min,\n                togglerTip_closed: config.label.restore_bottom,\n                resizerTip: config.label.resize,\n                initClosed: (layout.bottom.state === 'min'),\n                ondrag_end: function (type, pane) {\n                    windows.refreshEditor(pane, 'drag');\n                },\n                onresize_end: function (type, pane) {\n                    windows.refreshEditor(pane, 'resize');\n                },\n                onclose_end: function (type, pane) {\n                    windows.refreshEditor(pane, 'close');\n                },\n                onopen_end: function (type, pane) {\n                    windows.refreshEditor(pane, 'open');\n                },\n                onshow_end: function (type, pane) {\n                    windows.refreshEditor(pane, 'show');\n                }\n            }\n        });\n\n        this.outerLayout.addCloseBtn(\".side .ico-min\", \"west\");\n        this.innerLayout.addCloseBtn(\".side-right .ico-min\", \"east\");\n        this.innerLayout.addCloseBtn(\".bottom-window-group .ico-min\", \"south\");\n\n        if (layout.side.state === 'max') {\n            windows.maxSide();\n        }\n        if (layout.sideRight.state === 'max') {\n            windows.maxSideRight();\n        }\n        if (layout.bottom.state === 'max') {\n            windows.maxBottom();\n        }\n\n        $(\".toolbars .ico-max\").click(function () {\n            windows.toggleEditor();\n        });\n\n        $(\".edit-panel .tabs\").on(\"dblclick\", function () {\n            windows.toggleEditor();\n        });\n\n        $(\".bottom-window-group .tabs\").dblclick(function () {\n            var $it = $(\".bottom-window-group\");\n            if ($it.hasClass(\"bottom-window-group-max\")) {\n                windows.restoreBottom();\n            } else {\n                windows.maxBottom($it);\n            }\n        });\n\n        $(\".side .tabs\").dblclick(function () {\n            var $it = $(\".side\");\n            if ($it.hasClass(\"side-max\")) {\n                windows.restoreSide();\n            } else {\n                windows.restoreSide($it);\n            }\n        });\n\n        $(\".side-right .tabs\").dblclick(function () {\n            var $it = $(\".side-right\");\n            if ($it.hasClass(\"side-right-max\")) {\n                windows.restoreSideRight();\n            } else {\n                windows.maxSideRight($it);\n            }\n        });\n\n        $('.bottom-window-group .search').height($('.bottom-window-group .tabs-panel').height());\n        $(window).resize(function () {\n            windows.refreshEditor($('.bottom-window-group'));\n        });\n\n    },\n    maxEditor: function () {\n        var $it = $(\".toolbars .font-ico\");\n        windows.outerLayout.close('west');\n        windows.innerLayout.close('south');\n        windows.innerLayout.close('east');\n        $it.removeClass('ico-max').addClass('ico-restore').attr('title', config.label.min);\n        windows.isMaxEditor = true;\n    },\n    maxBottom: function ($it) {\n        $it.data('height', $it.height()).addClass(\"bottom-window-group-max\").find('.ico-min').hide();\n        windows.outerLayout.hide('west');\n        windows.innerLayout.hide('east');\n        windows.innerLayout.sizePane('south', $('.content').height());\n    },\n    maxSide: function ($it) {\n        $it.data('width', $it.width()).addClass(\"side-max\").find('.ico-min').hide();\n        $('.content').hide();\n        windows.outerLayout.sizePane('west', $('body').width());\n    },\n    maxSideRight: function ($it) {\n        $it.addClass(\"side-right-max\").data('width', $it.width()).find('.ico-min').hide();\n        windows.outerLayout.hide('west');\n        windows.innerLayout.hide('south');\n        windows.innerLayout.sizePane('east', $('body').width());\n    },\n    toggleEditor: function () {\n        var $it = $(\".toolbars .font-ico\");\n        if ($it.hasClass('ico-restore')) {\n            windows.restoreEditor();\n        } else {\n            windows.maxEditor();\n        }\n    },\n    restoreBottom: function () {\n        var $it = $(\".bottom-window-group\");\n        $it.removeClass(\"bottom-window-group-max\").find('.ico-min').show();\n        windows.outerLayout.show('west');\n        windows.innerLayout.show('east');\n        windows.innerLayout.sizePane('south', $it.data('height'));\n    },\n    restoreSide: function () {\n        var $it = $(\".side\");\n        $it.removeClass(\"side-max\").find('.ico-min').show();\n        $('.content').show();\n        windows.outerLayout.sizePane('west', $it.data('width'));\n    },\n    restoreSideRight: function () {\n        var $it = $(\".side-right\");\n        $it.removeClass(\"side-right-max\").find('.ico-min').show();\n        windows.outerLayout.show('west');\n        windows.innerLayout.show('south');\n        windows.innerLayout.sizePane('east', $it.data('width'));\n    },\n    restoreEditor: function () {\n        windows.outerLayout.open('west');\n        windows.innerLayout.open('south');\n        windows.innerLayout.open('east');\n        windows.isMaxEditor = false;\n        $(\".toolbars .font-ico\").addClass('ico-max').removeClass('ico-restore').attr('title', config.label.max_editor);\n    },\n    refreshEditor: function (pane, type) {\n        var editorDatas = editors.data,\n                height = $('.content').height() - pane.height() - 24;\n        switch (type) {\n            case 'close':\n                height = $('.content').height() - 40;\n                break;\n            default:\n                break;\n        }\n        for (var i = 0, ii = editorDatas.length; i < ii; i++) {\n            editorDatas[i].editor.setSize(\"100%\", height);\n        }\n\n        $('.bottom-window-group .search').height($('.bottom-window-group .tabs-panel').height());\n    },\n    flowBottom: function () {\n        if (windows.innerLayout.south.state.isClosed) {\n            windows.innerLayout.slideOpen('south');\n        }\n    }\n};","/*\n * Copyright (c) 2014-present, b3log.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * @file hotkeys.js\n *\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\n * @version 1.0.0.2, Dec 15, 2015\n */\nvar hotkeys = {\n    defaultKeyMap: {\n        // Ctrl-0\n        goEditor: {\n            ctrlKey: true,\n            altKey: false,\n            shiftKey: false,\n            which: 48,\n            fun: function () {\n                if (wide.curEditor) {\n                    wide.curEditor.focus();\n                }\n            }\n        },\n        // Ctrl-1\n        goFileTree: {\n            ctrlKey: true,\n            altKey: false,\n            shiftKey: false,\n            which: 49,\n            fun: function () {\n                // 有些元素需设置 tabindex 为 -1 时才可以 focus\n                if (windows.outerLayout.west.state.isClosed) {\n                    windows.outerLayout.slideOpen('west');\n                }\n                $(\"#files\").focus();\n            }\n        },\n        // Ctrl-2\n        goOutline: {\n            ctrlKey: true,\n            altKey: false,\n            shiftKey: false,\n            which: 50,\n            fun: function () {\n                if (windows.innerLayout.east.state.isClosed) {\n                    windows.innerLayout.slideOpen('east');\n                }\n\n                $(\"#outline\").focus();\n            }\n        },\n        // Ctrl-4\n        goOutput: {\n            ctrlKey: true,\n            altKey: false,\n            shiftKey: false,\n            which: 52,\n            fun: function () {\n                bottomGroup.tabs.setCurrent(\"output\");\n                windows.flowBottom();\n                $(\".bottom-window-group .output\").focus();\n            }\n        },\n        // Ctrl-5\n        goSearch: {\n            ctrlKey: true,\n            altKey: false,\n            shiftKey: false,\n            which: 53,\n            fun: function () {\n                bottomGroup.tabs.setCurrent(\"search\");\n                windows.flowBottom();\n                $(\".bottom-window-group .search\").focus();\n            }\n        },\n        // Ctrl-6\n        goNotification: {\n            ctrlKey: true,\n            altKey: false,\n            shiftKey: false,\n            which: 54,\n            fun: function () {\n                bottomGroup.tabs.setCurrent(\"notification\");\n                windows.flowBottom();\n                $(\".bottom-window-group .notification\").focus();\n            }\n        },\n        // Alt-C\n        clearWindow: {\n            ctrlKey: false,\n            altKey: true,\n            shiftKey: false,\n            which: 67\n        },\n        // Ctrl-D 窗口组切换   \n        changeEditor: {\n            ctrlKey: true,\n            altKey: false,\n            shiftKey: false,\n            which: 68\n        },\n        // Ctrl-F search  \n        search: {\n            ctrlKey: true,\n            altKey: false,\n            shiftKey: false,\n            which: 70\n        },\n        // Ctrl-Q close current editor   \n        closeCurEditor: {\n            ctrlKey: true,\n            altKey: false,\n            shiftKey: false,\n            which: 81\n        },\n        // Ctrl-R\n        rename: {\n            ctrlKey: true,\n            altKey: false,\n            shiftKey: false,\n            which: 82\n        },\n        // Shift-Alt-O 跳转到文件\n        goFile: {\n            ctrlKey: false,\n            altKey: true,\n            shiftKey: true,\n            which: 79\n        },\n        // F5 Build\n        build: {\n            ctrlKey: false,\n            altKey: false,\n            shiftKey: false,\n            which: 116\n        },\n        // F6 Build & Run\n        buildRun: {\n            ctrlKey: false,\n            altKey: false,\n            shiftKey: false,\n            which: 117\n        }\n    },\n    bindList: function ($source, $list, enterFun) {\n        $list.data(\"index\", 0);\n        $source.keydown(function (event) {\n            var index = $list.data(\"index\"),\n                    count = $list.find(\"li\").length;\n\n            if (count === 0) {\n                return true;\n            }\n\n            if (event.which === 38) {   // up\n                index--;\n                if (index < 0) {\n                    index = count - 1;\n                }\n            }\n\n            if (event.which === 40) {   // down\n                index++;\n                if (index > count - 1) {\n                    index = 0;\n                }\n            }\n\n            var $selected = $list.find(\"li:eq(\" + index + \")\");\n\n            if (event.which === 13) {   // enter\n                enterFun($selected);\n            }\n\n            $list.find(\"li\").removeClass(\"selected\");\n            $list.data(\"index\", index);\n            $selected.addClass(\"selected\");\n\n            if (index === 0) {\n                $list.scrollTop(0);\n            } else {\n                if ($selected[0].offsetTop + $list.scrollTop() > $list.height()) {\n                    if (event.which === 40) {\n                        $list.scrollTop($list.scrollTop() + $selected.height());\n                    } else {\n                        $list.scrollTop($selected[0].offsetTop);\n                    }\n                } else {\n                    $list.scrollTop(0);\n                }\n            }\n\n            // 阻止上下键改变光标位置\n            if (event.which === 38 || event.which === 40 || event.which === 13) {\n                return false;\n            }\n        });\n    },\n    _bindOutput: function () {\n        $(\".bottom-window-group .output\").keydown(function (event) {\n            var hotKeys = hotkeys.defaultKeyMap;\n            if (event.altKey === hotKeys.clearWindow.altKey\n                    && event.which === hotKeys.clearWindow.which) {  // Alt-C clear output\n                bottomGroup.clear('output');\n\n                event.preventDefault();\n\n                return;\n            }\n        });\n    },\n    _bindFileTree: function () {\n        $(\"#files\").keydown(function (event) {\n            event.preventDefault();\n\n            var hotKeys = hotkeys.defaultKeyMap;\n            if (event.ctrlKey === hotKeys.search.ctrlKey\n                    && event.which === hotKeys.search.which) {  // Ctrl-F 搜索\n                $(\"#dialogSearchForm\").dialog(\"open\");\n                return;\n            }\n\n            if (event.ctrlKey === hotKeys.rename.ctrlKey\n                    && event.which === hotKeys.rename.which) {  // Ctrl-R 重命名\n                if (wide.curNode.removable) {\n                    $(\"#dialogRenamePrompt\").dialog(\"open\");\n                }\n                return;\n            }\n\n            switch (event.which) {\n                case 46: // delete\n                    tree.removeIt();\n                    break;\n                case 13: // enter\n                    if (!wide.curNode) {\n                        return false;\n                    }\n\n                    if (tree.isDir()) {\n                        if (wide.curNode.open) {\n                            return false;\n                        }\n\n                        tree.fileTree.expandNode(wide.curNode, true, false, true);\n                        $(\"#files\").focus();\n\n                        break;\n                    }\n\n                    tree.openFile(wide.curNode);\n\n                    break;\n                case 38: // up\n                    var node = {};\n\n                    if (!wide.curNode) { // select the first one if no node been selected\n                        node = tree.fileTree.getNodeByTId(\"files_1\");\n                    } else {\n                        if (wide.curNode && wide.curNode.isFirstNode && wide.curNode.level === 0) {\n                            return false;\n                        }\n\n                        node = wide.curNode.getPreNode();\n                        if (wide.curNode.isFirstNode && wide.curNode.getParentNode()) {\n                            node = wide.curNode.getParentNode();\n                        }\n\n                        var preNode = wide.curNode.getPreNode();\n                        if (preNode && tree.isDir() && preNode.open) {\n                            node = tree.getCurrentNodeLastNode(preNode);\n                        }\n                    }\n\n                    wide.curNode = node;\n                    tree.fileTree.selectNode(node);\n                    $(\"#files\").focus();\n                    break;\n                case 40: // down\n                    var node = {};\n\n                    if (!wide.curNode) { // select the first one if no node been selected                        \n                        node = tree.fileTree.getNodeByTId(\"files_1\");\n                    } else {\n                        if (wide.curNode && tree.isBottomNode(wide.curNode)) {\n                            return false;\n                        }\n\n                        node = wide.curNode.getNextNode();\n                        if (tree.isDir() && wide.curNode.open) {\n                            node = wide.curNode.children[0];\n                        }\n\n                        var nextShowNode = tree.getNextShowNode(wide.curNode);\n                        if (wide.curNode.isLastNode && wide.curNode.level !== 0 && !wide.curNode.open && nextShowNode) {\n                            node = nextShowNode;\n                        }\n                    }\n\n                    if (node) {\n                        wide.curNode = node;\n                        tree.fileTree.selectNode(node);\n                    }\n\n                    $(\"#files\").focus();\n                    break;\n                case 37: // left\n                    if (!wide.curNode) {\n                        wide.curNode = tree.fileTree.getNodeByTId(\"files_1\");\n                        tree.fileTree.selectNode(wide.curNode);\n                        $(\"#files\").focus();\n                        return false;\n                    }\n\n                    if (!tree.isDir() || !wide.curNode.open) {\n                        return false;\n                    }\n\n                    tree.fileTree.expandNode(wide.curNode, false, false, true);\n                    $(\"#files\").focus();\n                    break;\n                case 39: // right\n                    if (!wide.curNode) {\n                        wide.curNode = tree.fileTree.getNodeByTId(\"files_1\");\n                        tree.fileTree.selectNode(wide.curNode);\n                        $(\"#files\").focus();\n                        return false;\n                    }\n\n                    if (!tree.isDir() || wide.curNode.open) {\n                        return false;\n                    }\n\n                    tree.fileTree.expandNode(wide.curNode, true, false, true);\n                    $(\"#files\").focus();\n\n                    break;\n                case 116: // F5\n                    if (!wide.curNode || !tree.isDir()) {\n                        return false;\n                    }\n\n                    tree.refresh(wide.curNode);\n\n                    break;\n            }\n        });\n    },\n    _bindDocument: function () {\n        var hotKeys = this.defaultKeyMap;\n        $(document).keydown(function (event) {\n            if (event.ctrlKey === hotKeys.goEditor.ctrlKey\n                    && event.which === hotKeys.goEditor.which) {  // Ctrl-0 焦点切换到当前编辑器\n                hotKeys.goEditor.fun();\n                event.preventDefault();\n\n                return;\n            }\n\n            if (event.ctrlKey === hotKeys.goFileTree.ctrlKey\n                    && event.which === hotKeys.goFileTree.which) { // Ctrl-1 焦点切换到文件树\n                hotKeys.goFileTree.fun();\n                event.preventDefault();\n\n                return;\n            }\n\n            if (event.ctrlKey === hotKeys.goOutline.ctrlKey\n                    && event.which === hotKeys.goOutline.which) { // Ctrl-2 焦点切换到大纲\n                hotKeys.goOutline.fun();\n                event.preventDefault();\n\n                return;\n            }\n\n            if (event.ctrlKey === hotKeys.goOutput.ctrlKey\n                    && event.which === hotKeys.goOutput.which) { // Ctrl-4 焦点切换到输出窗口   \n                hotKeys.goOutput.fun();\n                event.preventDefault();\n\n                return;\n            }\n\n            if (event.ctrlKey === hotKeys.goSearch.ctrlKey\n                    && event.which === hotKeys.goSearch.which) { // Ctrl-5 焦点切换到搜索窗口  \n                hotKeys.goSearch.fun();\n                event.preventDefault();\n\n                return;\n            }\n\n            if (event.ctrlKey === hotKeys.goNotification.ctrlKey\n                    && event.which === hotKeys.goNotification.which) { // Ctrl-6 焦点切换到通知窗口  \n                hotKeys.goNotification.fun();\n                event.preventDefault();\n\n                return;\n            }\n\n            if (event.ctrlKey === hotKeys.closeCurEditor.ctrlKey\n                    && event.which === hotKeys.closeCurEditor.which) {  // Ctrl-Q 关闭当前编辑器   \n                $(\".edit-panel .tabs > div.current\").find(\".ico-close\").click();\n                event.preventDefault();\n\n                return;\n            }\n\n            if (event.ctrlKey === hotKeys.changeEditor.ctrlKey\n                    && event.which === hotKeys.changeEditor.which) { // Ctrl-D 窗口组切换\n                if (document.activeElement.className === \"notification\"\n                        || document.activeElement.className === \"output\"\n                        || document.activeElement.className === \"search\") {\n                    // 焦点在底部窗口组时,对底部进行切换\n                    var tabs = [\"output\", \"search\", \"notification\"],\n                            nextPath = \"\";\n                    for (var i = 0, ii = tabs.length; i < ii; i++) {\n                        if (bottomGroup.tabs.getCurrentId() === tabs[i]) {\n                            if (i < ii - 1) {\n                                nextPath = tabs[i + 1];\n                            } else {\n                                nextPath = tabs[0];\n                            }\n                            break;\n                        }\n                    }\n                    bottomGroup.tabs.setCurrent(nextPath);\n                    $(\".bottom-window-group .\" + nextPath).focus();\n\n                    event.preventDefault();\n\n                    return false;\n                }\n\n                if (editors.data.length > 1) {\n                    var nextPath = \"\";\n                    for (var i = 0, ii = editors.data.length; i < ii; i++) {\n                        var currentId = editors.getCurrentId();\n                        if (currentId) {\n                            if (currentId === editors.data[i].id) {\n                                if (i < ii - 1) {\n                                    nextPath = editors.data[i + 1].id;\n                                    wide.curEditor = editors.data[i + 1].editor;\n                                } else {\n                                    nextPath = editors.data[0].id;\n                                    wide.curEditor = editors.data[0].editor;\n                                }\n                                break;\n                            }\n                        }\n                    }\n\n                    editors.tabs.setCurrent(nextPath);\n                    var nextTId = tree.getTIdByPath(nextPath);\n                    wide.curNode = tree.fileTree.getNodeByTId(nextTId);\n\n                    tree.fileTree.selectNode(wide.curNode);\n                    wide.refreshOutline();\n                    var cursor = wide.curEditor.getCursor();\n                    $(\".footer .cursor\").text('|   ' + (cursor.line + 1) + ':' + (cursor.ch + 1) + '   |');\n                    wide.curEditor.focus();\n                }\n\n                event.preventDefault();\n\n                return false;\n            }\n\n            if (event.which === hotKeys.build.which) { // F5 Build\n                menu.build();\n                event.preventDefault();\n\n                return;\n            }\n\n            if (event.which === hotKeys.buildRun.which) { // F6 Build & Run\n                menu.run();\n                event.preventDefault();\n\n                return;\n            }\n\n            if (event.ctrlKey === hotKeys.goFile.ctrlKey\n                    && event.altKey === hotKeys.goFile.altKey\n                    && event.shiftKey === hotKeys.goFile.shiftKey\n                    && event.which === hotKeys.goFile.which) { // Shift-Alt-O 跳转到文件\n                $(\"#dialogGoFilePrompt\").dialog(\"open\");\n            }\n        });\n    },\n    init: function () {\n        this._bindFileTree();\n        this._bindOutput();\n        this._bindDocument();\n    }\n};","/*\n * Copyright (c) 2014-present, b3log.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * @file bottomGroup.js\n *\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\n * @version 1.1.1.1, Mar 15, 2017\n */\nvar bottomGroup = {\n    tabs: undefined,\n    searchTab: undefined,\n    init: function () {\n        this._initTabs();\n        this._initFrame();\n\n        $('.bottom-window-group .output').click(function () {\n            $(this).focus();\n        });\n\n        $('.bottom-window-group .output').on('click', '.path', function (event) {\n            var $path = $(this),\n                    tId = tree.getTIdByPath($path.data(\"path\"));\n            tree.openFile(tree.fileTree.getNodeByTId(tId),\n                    CodeMirror.Pos($path.data(\"line\") - 1, $path.data(\"column\") - 1));\n            event.preventDefault();\n            return false;\n        });\n    },\n    _initFrame: function () {\n        $(\".bottom-window-group .output\").parent().mouseup(function (event) {\n            event.stopPropagation();\n\n            if (event.button === 0) { // 左键\n                $(\".bottom-window-group .frame\").hide();\n                return;\n            }\n\n            // event.button === 2 右键\n            var left = event.screenX,\n                    $it = $(this);\n            if ($(\".side\").css(\"left\") === \"auto\" || $(\".side\").css(\"left\") === \"0px\") {\n                left = event.screenX - $(\".side\").width();\n            }\n            $(\".bottom-window-group .frame\").show().css({\n                \"left\": left + \"px\",\n                \"top\": (event.offsetY + event.target.offsetTop - $it.scrollTop() - 10) + \"px\"\n            });\n            return;\n        });\n    },\n    clear: function (id) {\n        $('.bottom-window-group .' + id + ' > div').text('');\n    },\n    resetOutput: function () {\n        this.clear('output');\n        bottomGroup.tabs.setCurrent(\"output\");\n        windows.flowBottom();\n    },\n    _initTabs: function () {\n        this.tabs = new Tabs({\n            id: \".bottom-window-group\",\n            clickAfter: function (id) {\n                this._$tabsPanel.find(\".\" + id).focus();\n            }\n        });\n    },\n    fillOutput: function (data) {\n        var $output = $('.bottom-window-group .output');\n\n        data = data.replace(/\\r/g, '');\n        data = data.replace(/\\n/g, '<br/>');\n\n        if (-1 !== data.indexOf(\"<br/>\")) {\n            data = Autolinker.link(data);\n        }\n\n        $output.find(\"div\").html(data);\n        $output.parent().scrollTop($output[0].scrollHeight);\n    }\n};\n"]}