wide/static/js/wide.min.js.map

1 line
245 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"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","$tabs","find","add","getCurrentId","$tabsPanel","append","title","content","after","stack","prevId","children","remove","i","removeAfter","path","$currentTab","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","dpuuid","Date","getTime","PROP_NAME","Dialog","_defaults","styleClass","background","panel","main","footer","headerMiddle","headerBg","closeIcon","closeIconHover","_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","bgHeight","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","test","RegExp","$1","getFullYear","substr","k","start_page","load","context","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","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","succ","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","lowerCaseContents","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","log","onmessage","e","parse","$notification","notificationHTML","cmd","severity","message","onclose","onerror","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","decompress","dir","reAsyncChildNodes","refresh","gitClone","import","fileupload","formData","done","fail","$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","extension","select","oldPath","newPath","lastIndexOf","curProcessId","outlineHTML","decls","maxj","Ch","Line","Name","dblclick","_initDialog","confirm","create_file","create","fileType","create_dir","goto_file","$list","hotkeys","bindList","$selected","goFileHTML","icoSkin","getClassBySuffix","goto_line","git_clone","repository","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","currentId","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","tencent","about","wideVersion","uptodate","new_version_available","colon","wideDownload","mouseover","openPreference","closeAllFiles","exit","location","href","openAbout","goget","goinstall","govet","build","isChange","emptys","emptysTip","tabIndex","no_empty","preference","$dialogPreference","$fontFamily","$fontSize","$goFmt","$workspace","$password","$email","$locale","$theme","$editorFontFamily","$editorFontSize","$editorLineHeight","$editorTheme","$editorTabSize","$keymap","fontFamily","fontSize","goFmt","workspace","password","locale","editorFontFamily","editorFontSize","editorLineHeight","reload","jqXHR","staticServer","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","nextTId","_initTabs","_initFrame","$path","mouseup","offsetY","$output","Autolinker","link"],"mappings":"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","file":"wide.min.js","sourcesContent":["/*\n * Copyright (c) 2014-2016, b3log.org & hacpai.com\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 * http://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-2016, b3log.org & hacpai.com\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 * http://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: \"lly219@gmail.com\"\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-2016, b3log.org & hacpai.com\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 * http://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-get', '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(config.context + '/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 + \"</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: config.context + '/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: config.context + '/exprinfo',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\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: config.context + '/find/decl',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\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: config.context + '/find/usages',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\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-get', '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-2016, b3log.org & hacpai.com\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 * http://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.1, Dec 8, 2015\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]');\n };\n }\n};","/*\n * Copyright (c) 2014-2016, b3log.org & hacpai.com\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 * http://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: config.context + '/file/zip/new',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\n $(\"#dialogAlert\").dialog(\"open\", result.msg);\n\n return false;\n }\n\n isSucc = true;\n }\n });\n\n if (isSucc) {\n window.open(config.context + '/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: config.context + '/cross',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\n $(\"#dialogAlert\").dialog(\"open\", result.msg);\n\n return false;\n }\n }\n });\n },\n decompress: function () {\n var request = newWideRequest();\n request.path = wide.curNode.path;\n\n $.ajax({\n async: false,\n type: 'POST',\n url: config.context + '/file/decompress',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\n $(\"#dialogAlert\").dialog(\"open\", result.msg);\n\n return false;\n }\n\n var dir = wide.curNode.getParentNode();\n tree.fileTree.reAsyncChildNodes(dir, \"refresh\");\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 gitClone: function (it) {\n if (it) {\n if ($(it).hasClass(\"disabled\")) {\n return false;\n }\n }\n\n $(\"#dialogGitClonePrompt\").dialog('open');\n },\n import: function () {\n var request = newWideRequest();\n request.path = wide.curNode.path;\n\n $('#importFileupload').fileupload({\n url: \"/file/upload?path=\" + request.path,\n dataType: 'json',\n formData: request,\n done: function (e, result) {\n tree.fileTree.reAsyncChildNodes(wide.curNode, \"refresh\");\n },\n fail: function () {\n console.log(arguments);\n }\n });\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: config.context + '/files',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (result.succ) {\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: config.context + \"/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: config.context + '/file',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\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(config.context + 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: config.context + '/file/search/text',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\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: config.context + '/file/rename',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\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-2016, b3log.org & hacpai.com\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 * http://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.1, Dec 8, 2015\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: config.context + '/outline',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\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: config.context + '/file/remove',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\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: config.context + '/file/new',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\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: config.context + '/file/new',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\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: config.context + '/file/find/name',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\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 $(\"#dialogGitClonePrompt\").dialog({\n \"modal\": true,\n \"height\": 52,\n \"width\": 360,\n \"title\": config.label.git_clone,\n \"okText\": config.label.confirm,\n \"cancelText\": config.label.cancel,\n \"afterOpen\": function () {\n $(\"#dialogGitClonePrompt > input\").val('').focus();\n $(\"#dialogGitClonePrompt\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\").prop(\"disabled\", true);\n },\n \"ok\": function () {\n $(\"#dialogGitClonePrompt\").dialog(\"close\");\n\n var request = newWideRequest();\n request.path = wide.curNode.path;\n request.repository = $(\"#dialogGitClonePrompt > input\").val();\n\n $.ajax({\n type: 'POST',\n url: config.context + '/git/clone',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n }\n });\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: config.context + '/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 case 'start-get':\n case 'start-git_clone':\n bottomGroup.fillOutput(data.output);\n\n break;\n case 'go test':\n case 'go vet':\n case 'go install':\n case 'go get':\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: config.context + '/file/zip/new',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (!result.succ) {\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(config.context + '/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]');\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: config.context + '/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: config.context + '/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: config.context + '/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: config.context + '/go/fmt',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (result.succ) {\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: config.context + '/go/fmt',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (result.succ) {\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-2016, b3log.org & hacpai.com\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 * http://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.1, Dec 8, 2015\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: config.context + '/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 console.log('[session onopen] connected');\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 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]');\n };\n }\n};","/*\n * Copyright (c) 2014-2016, b3log.org & hacpai.com\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 * http://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.0.1, Dec 8, 2015\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.tencent = \"http://share.v.t.qq.com/index.php?c=share&a=index&title=\" + title +\n \"&url=\" + url + \"&pic=\" + pic;\n\n window.open(urls[key], \"_blank\", \"top=100,left=200,width=648,height=618\");\n });\n },\n _initAbout: function () {\n $(\"#dialogAbout\").load(config.context + '/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: config.context + '/logout',\n data: JSON.stringify(request),\n dataType: \"json\",\n success: function (result) {\n if (result.succ) {\n window.location.href = config.context + \"/login\";\n }\n }\n });\n },\n openAbout: function () {\n $(\"#dialogAbout\").dialog(\"open\");\n },\n goget: function () {\n menu.saveAllFiles();\n\n var currentPath = editors.getCurrentPath();\n if (!currentPath) {\n return false;\n }\n\n if ($(\".menu li.go-get\").hasClass(\"disabled\")) {\n return false;\n }\n\n var request = newWideRequest();\n request.file = currentPath;\n\n $.ajax({\n type: 'POST',\n url: config.context + '/go/get',\n data: JSON.stringify(request),\n dataType: \"json\",\n beforeSend: function () {\n bottomGroup.resetOutput();\n },\n success: function (result) {\n }\n });\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: config.context + '/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: config.context + '/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: config.context + '/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: config.context + '/build',\n data: JSON.stringify(request),\n dataType: \"json\",\n beforeSend: function () {\n bottomGroup.resetOutput();\n },\n success: function (result) {\n $(\"#buildRun\").addClass(\"ico-stop\")\n .removeClass(\"ico-buildrun\").attr(\"title\", config.label.stop);\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: config.context + '/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(config.context + '/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 $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 \"workspace\": $workspace.val(),\n \"password\": $password.val(),\n \"email\": $email.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: config.context + '/preference',\n data: JSON.stringify(request),\n success: function (result, textStatus, jqXHR) {\n if (!result.succ) {\n return false;\n }\n\n $fontFamily.data(\"value\", $fontFamily.val());\n $fontSize.data(\"value\", $fontSize.val());\n $goFmt.data(\"value\", $goFmt.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\", config.staticServer + '/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 * Copyright (c) 2014-2016, b3log.org & hacpai.com\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 * http://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-2016, b3log.org & hacpai.com\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 * http://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-2016, b3log.org & hacpai.com\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 * http://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.0.1, Dec 8, 2015\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(/\\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"],"sourceRoot":"/source/"}