| attachDocumentEditor = function (editorElement, commitDialogElement) | 
 | { | 
 | 	var edit = require("./prosemirror/dist/edit") | 
 | 	require("./prosemirror/dist/inputrules/autoinput") | 
 | 	require("./prosemirror/dist/menu/menubar") | 
 | 	require("./prosemirror/dist/markdown") | 
 | 	var _menu = require("./prosemirror/dist/menu/menu") | 
 | 	 | 
 | 	 | 
 | 	var content = document.querySelector('#editor'); | 
 | 	content.style.display = "none"; | 
 | 	 | 
 | 	var gitblitCommands = new _menu.MenuCommandGroup("gitblitCommands"); | 
 | 	var viewCommands = new _menu.MenuCommandGroup("viewCommands"); | 
 | 	var textCommands = new _menu.MenuCommandGroup("textCommands"); | 
 | 	var insertCommands = new _menu.MenuCommandGroup("insertCommands"); | 
 | 	 | 
 | 	var menuItems = [gitblitCommands, viewCommands, textCommands, _menu.inlineGroup, _menu.blockGroup, _menu.historyGroup, insertCommands]; | 
 | 	 | 
 | 	const updateCmd = Object.create(null); | 
 | 	 | 
 | 	updateCmd["GitblitCommit"] = { | 
 | 		label: "GitblitCommit", | 
 | 		run: function() { | 
 | 			commitDialogElement.modal({show:true}); | 
 | 			editorElement.value = pm.getContent('markdown'); | 
 | 		}, | 
 | 		menu: { | 
 | 			group: "gitblitCommands", rank: 10, | 
 | 			display: { | 
 | 				render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-save"); } | 
 | 			} | 
 | 		  } | 
 | 	}; | 
 | 	 | 
 | 	updateCmd["FullScreen"] = { | 
 | 	label: "Toggle Fullscreen", | 
 | 	derive: "toggle", | 
 | 	run: function(pm) { | 
 | 		//Maintain the scroll context | 
 | 		var initialScroll = window.scrollY; | 
 | 		var navs = [document.querySelector("div.repositorynavbar"), document.querySelector("div.navbar"), document.querySelector("div.docnav")]; | 
 | 		var offset = navs.reduce(function(p, c) { return p + c.offsetHeight; }, 0); | 
 | 		navs.forEach(function(e) { e.classList.toggle("forceHide"); }); | 
 | 		 | 
 | 		if (!toggleFullScreen(document.documentElement)) { | 
 | 			offset = 60; | 
 | 		} else { | 
 | 			offset -= 60; | 
 | 		} | 
 | 		 | 
 | 		pm.signal("commandsChanged"); | 
 | 		 | 
 | 		//Browsers don't seem to accept a scrollTo straight after a full screen | 
 | 		setTimeout(function(){window.scrollTo(0, Math.max(0,initialScroll - offset));}, 100); | 
 | 		 | 
 | 	}, | 
 | 	 menu: { | 
 | 		group: "viewCommands", rank: 11, | 
 | 		display: { | 
 | 			render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-arrows-alt"); } | 
 | 		} | 
 | 	  }, | 
 | 	  active: function active(pm) { return getFullScreenElement() ? true : false; } | 
 | 	}; | 
 | 	 | 
 | 	updateCmd["heading1"] = { | 
 | 		derive: "toggle", | 
 | 		run: function(pm) { | 
 | 			var selection = pm.selection; | 
 | 			var from = selection.from; | 
 | 			var to = selection.to; | 
 | 			var attr = {name:"make", level:"1"}; | 
 | 			 | 
 | 			var node = pm.doc.resolve(from).parent; | 
 | 			if (node && node.hasMarkup(pm.schema.nodes.heading, attr)) { | 
 | 				return pm.tr.setBlockType(from, to, pm.schema.defaultTextblockType(), {}).apply(pm.apply.scroll); | 
 | 			} else { | 
 | 				return pm.tr.setBlockType(from, to, pm.schema.nodes.heading, attr).apply(pm.apply.scroll); | 
 | 			} | 
 | 			 | 
 | 		}, | 
 | 		active: function active(pm) { | 
 | 			var node = pm.doc.resolve(pm.selection.from).parent; | 
 | 			if (node && node.hasMarkup(pm.schema.nodes.heading, {name:"make", level:"1"})) { | 
 | 				return true; | 
 | 			} | 
 | 			return false; | 
 | 		}, | 
 | 		menu: { | 
 | 			group: "textCommands", rank: 1, | 
 | 			display: { | 
 | 			  render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-header fa-header-x fa-header-1"); } | 
 | 			}, | 
 | 		  }, | 
 | 		  select: function(){return true;} | 
 | 	}; | 
 | 	 | 
 | 	updateCmd["heading2"] = { | 
 | 		derive: "toggle", | 
 | 		run: function(pm) { | 
 | 			var selection = pm.selection; | 
 | 			var from = selection.from; | 
 | 			var to = selection.to; | 
 | 			var attr = {name:"make", level:"2"}; | 
 | 			 | 
 | 			var node = pm.doc.resolve(from).parent; | 
 | 			if (node && node.hasMarkup(pm.schema.nodes.heading, attr)) { | 
 | 				return pm.tr.setBlockType(from, to, pm.schema.defaultTextblockType(), {}).apply(pm.apply.scroll); | 
 | 			} else { | 
 | 				return pm.tr.setBlockType(from, to, pm.schema.nodes.heading, attr).apply(pm.apply.scroll); | 
 | 			} | 
 | 			 | 
 | 		}, | 
 | 		active: function active(pm) { | 
 | 			var node = pm.doc.resolve(pm.selection.from).parent; | 
 | 			if (node && node.hasMarkup(pm.schema.nodes.heading, {name:"make", level:"2"})) { | 
 | 				return true; | 
 | 			} | 
 | 			return false; | 
 | 		}, | 
 | 		menu: { | 
 | 			group: "textCommands", rank: 2, | 
 | 			display: { | 
 | 			  render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-header fa-header-x fa-header-2"); } | 
 | 			}, | 
 | 		  }, | 
 | 		  select: function(){return true;} | 
 | 	}; | 
 | 	 | 
 | 	updateCmd["heading3"] = { | 
 | 		derive: "toggle", | 
 | 		run: function(pm) { | 
 | 			var selection = pm.selection; | 
 | 			var from = selection.from; | 
 | 			var to = selection.to; | 
 | 			var attr = {name:"make", level:"3"}; | 
 | 			 | 
 | 			var node = pm.doc.resolve(from).parent; | 
 | 			if (node && node.hasMarkup(pm.schema.nodes.heading, attr)) { | 
 | 				return pm.tr.setBlockType(from, to, pm.schema.defaultTextblockType(), {}).apply(pm.apply.scroll); | 
 | 			} else { | 
 | 				return pm.tr.setBlockType(from, to, pm.schema.nodes.heading, attr).apply(pm.apply.scroll); | 
 | 			} | 
 | 			 | 
 | 		}, | 
 | 		active: function active(pm) { | 
 | 			var node = pm.doc.resolve(pm.selection.from).parent; | 
 | 			if (node && node.hasMarkup(pm.schema.nodes.heading, {name:"make", level:"3"})) { | 
 | 				return true; | 
 | 			} | 
 | 			return false; | 
 | 		}, | 
 | 		menu: { | 
 | 			group: "textCommands", rank: 3, | 
 | 			display: { | 
 | 			  render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-header fa-header-x fa-header-3"); } | 
 | 			}, | 
 | 		  }, | 
 | 		  select: function(){return true;} | 
 | 	}; | 
 | 		 | 
 | 	updateCmd["strong:toggle"] = { | 
 | 	menu: { | 
 | 		group: "textCommands", rank: 4, | 
 | 		display: { | 
 | 			render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-bold"); } | 
 | 		} | 
 | 	  }, | 
 | 	  select: function(){return true;} | 
 | 	}; | 
 | 	 | 
 | 	updateCmd["em:toggle"] = { | 
 | 	menu: { | 
 | 		group: "textCommands", rank: 5, | 
 | 		display: { | 
 | 			render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-italic"); } | 
 | 		} | 
 | 	  }, | 
 | 	  select: function(){return true;} | 
 | 	}; | 
 | 	 | 
 | 	updateCmd["code:toggle"] = { | 
 | 	menu: { | 
 | 		group: "textCommands", rank: 6, | 
 | 		display: { | 
 | 			render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-code"); } | 
 | 		} | 
 | 	  }, | 
 | 	  select: function(){return true;} | 
 | 	}; | 
 | 	 | 
 | 	updateCmd["image:insert"] = { | 
 | 	menu: { | 
 | 		group: "insertCommands", rank: 1, | 
 | 		display: { | 
 | 			render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-picture-o"); } | 
 | 		} | 
 | 	  } | 
 | 	}; | 
 | 	 | 
 | 	updateCmd["selectParentNode"] = { | 
 | 	menu: { | 
 | 		group: "insertCommands", rank: 10, | 
 | 		display: { | 
 | 			render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-arrow-circle-o-left"); } | 
 | 		} | 
 | 	  } | 
 | 	}; | 
 | 	 | 
 | 	var pm = window.pm = new edit.ProseMirror({ | 
 | 	  place: document.querySelector('#visualEditor'), | 
 | 	  autoInput: true, | 
 | 	  doc: content.value, | 
 | 	  menuBar: { float:true, content: menuItems}, | 
 | 	  commands: edit.CommandSet.default.update(updateCmd), | 
 | 	  docFormat: "markdown" | 
 | 	}); | 
 | 	 | 
 |  | 
 | 	var scrollStart = document.querySelector(".ProseMirror").offsetTop; | 
 | 	 | 
 | 	 | 
 | 	var ticking = false; | 
 | 	window.addEventListener("scroll", function() { | 
 | 		var scrollPosition = window.scrollY; | 
 | 		if (!ticking) { | 
 | 			window.requestAnimationFrame(function() { | 
 | 				if (!getFullScreenElement() && (scrollPosition > scrollStart)) { | 
 | 					document.querySelector(".ProseMirror-menubar").classList.add("scrolling"); | 
 | 				} else { | 
 | 					document.querySelector(".ProseMirror-menubar").classList.remove("scrolling"); | 
 | 				} | 
 | 				ticking = false; | 
 | 			}); | 
 | 		} | 
 | 		ticking = true; | 
 | 	}); | 
 | } | 
 |  | 
 | function renderFontAwesomeIcon(cmd, pm, classNames) { | 
 | 	var node = document.createElement("div"); | 
 | 	node.className = "ProseMirror-icon"; | 
 | 	var icon = document.createElement("i"); | 
 | 	icon.setAttribute("class", "fa fa-fw " + classNames); | 
 | 	 | 
 | 	var active = cmd.active(pm); | 
 | 	 | 
 | 	if (active || cmd.spec.invert) node.classList.add("ProseMirror-menu-active"); | 
 | 	node.appendChild(icon); | 
 | 	return node; | 
 | } | 
 |  | 
 |  | 
 |  | 
 | function getFullScreenElement() { | 
 | 	return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement; | 
 | } | 
 |  | 
 | function toggleFullScreen(e) { | 
 |   if (getFullScreenElement()) { | 
 |     if      (document.exitFullscreen)       { document.exitFullscreen(); } | 
 | 	else if (document.msExitFullscreen)     { document.msExitFullscreen(); } | 
 | 	else if (document.mozCancelFullScreen)  { document.mozCancelFullScreen(); } | 
 | 	else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } | 
 | 	return true; | 
 |   } else { | 
 | 	if      (e.requestFullscreen)       { e.requestFullscreen(); } | 
 | 	else if (e.msRequestFullscreen)     { e.msRequestFullscreen(); } | 
 | 	else if (e.mozRequestFullScreen)    { e.mozRequestFullScreen(); } | 
 | 	else if (e.webkitRequestFullscreen) { e.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); } | 
 |   } | 
 |   return false; | 
 | } | 
 |  | 
 | commitChanges = function() { | 
 | 	document.querySelector('form#documentEditor').submit(); | 
 | } | 
 | 	 |