// Edit extension, https://github.com/datenstrom/yellow-extensions/tree/master/source/edit var yellow = { onLoad: function(e) { yellow.edit.load(e); }, onKeydown: function(e) { yellow.edit.keydown(e); }, onDrag: function(e) { yellow.edit.drag(e); }, onDrop: function(e) { yellow.edit.drop(e); }, onClick: function(e) { yellow.edit.click(e); }, onClickAction: function(e) { yellow.edit.clickAction(e); }, onPageShow: function(e) { yellow.edit.pageShow(e); }, onUpdatePane: function() { yellow.edit.updatePane(yellow.edit.paneId, yellow.edit.paneAction, yellow.edit.paneStatus); }, onResizePane: function() { yellow.edit.resizePane(yellow.edit.paneId, yellow.edit.paneAction, yellow.edit.paneStatus); }, action: function(action, status, arguments) { yellow.edit.processAction(action, status, arguments); } }; yellow.edit = { paneId: 0, // visible pane ID paneAction: 0, // current pane action paneStatus: 0, // current pane status popupId: 0, // visible popup ID intervalId: 0, // timer interval ID // Handle initialisation load: function(e) { var body = document.getElementsByTagName("body")[0]; if (body && body.firstChild && !document.getElementById("yellow-bar")) { this.createBar("yellow-bar"); this.processAction(yellow.page.action, yellow.page.status); clearInterval(this.intervalId); } if (e.type=="DOMContentLoaded") { var page = document.getElementsByClassName("page")[0]; if (page) this.bindActions(page); } }, // Handle keyboard keydown: function(e) { if (this.paneId=="yellow-pane-create" || this.paneId=="yellow-pane-edit" || this.paneId=="yellow-pane-delete") this.processShortcut(e); if (this.paneId && e.keyCode==27) this.hidePane(this.paneId); }, // Handle drag drag: function(e) { e.stopPropagation(); e.preventDefault(); }, // Handle drop drop: function(e) { e.stopPropagation(); e.preventDefault(); var elementText = document.getElementById(this.paneId+"-text"); var files = e.dataTransfer ? e.dataTransfer.files : e.target.files; for (var i=0; i"+ this.getRawDataPaneAction("edit")+ ""+ "
"+ this.getRawDataPaneAction("create")+ this.getRawDataPaneAction("delete")+ this.getRawDataPaneAction("menu", yellow.user.name, true)+ "
"+ "
"; } else { elementDiv.innerHTML = " "; } elementBar.appendChild(elementDiv); yellow.toolbox.insertBefore(elementBar, document.getElementsByTagName("body")[0].firstChild); this.bindActions(elementBar); }, // Update bar updateBar: function(paneId, name) { if (paneId) { var element = document.getElementById(paneId+"-bar"); if (element) { if (name.indexOf("selected")!=-1) element.setAttribute("aria-expanded", "true"); yellow.toolbox.addClass(element, name); } } else { var elements = document.getElementsByClassName(name); for (var i=0, l=elements.length; i"+ ""+ "

"+this.getText("LoginTitle")+"

"+ "
"+ ""+ "


"+ "


"+ "

"+ "

"+this.getText("LoginForgot")+"
"+this.getText("LoginSignup")+"

"+ "
"+ ""; break; case "yellow-pane-signup": elementDiv.innerHTML = "
"+ ""+ "

"+this.getText("SignupTitle")+"

"+ "

"+this.getText("SignupStatus", "", paneStatus)+"

"+ "
"+ ""+ "


"+ "


"+ "


"+ "

"+ "

"+ "
"+ "
"; break; case "yellow-pane-forgot": elementDiv.innerHTML = "
"+ ""+ "

"+this.getText("ForgotTitle")+"

"+ "

"+this.getText("ForgotStatus", "", paneStatus)+"

"+ "
"+ ""+ "


"+ "

"+ "
"+ "
"; break; case "yellow-pane-recover": elementDiv.innerHTML = "
"+ ""+ "

"+this.getText("RecoverTitle")+"

"+ "

"+this.getText("RecoverStatus", "", paneStatus)+"

"+ "
"+ "


"+ "

"+ "
"+ "
"; break; case "yellow-pane-quit": elementDiv.innerHTML = "
"+ ""+ "

"+this.getText("QuitTitle")+"

"+ "

"+this.getText("QuitStatus", "", paneStatus)+"

"+ "
"+ ""+ ""+ "


"+ "

"+ "
"+ "
"; break; case "yellow-pane-account": elementDiv.innerHTML = "
"+ ""+ "

"+this.getText("AccountTitle")+"

"+ "

"+this.getText("AccountStatus", "", paneStatus)+"

"+ "
"+ "

"+this.getRawDataSettingsActions(paneAction)+"

"+ "
 
"+ "
"+ ""+ ""+ "


"+ "


"+ "


"+ "

"+this.getRawDataLanguages(paneId)+"

"+ "

"+this.getText("AccountInformation")+" "+this.getText("AccountMore")+"

"+ "

"+ "
"+ "
"+ "
"+ "
"; break; case "yellow-pane-configure": elementDiv.innerHTML = "
"+ ""+ "

"+this.getText("ConfigureTitle")+"

"+ "

"+this.getText("ConfigureStatus", "", paneStatus)+"

"+ "
"+ "

"+this.getRawDataSettingsActions(paneAction)+"

"+ "
 
"+ "
"+ ""+ ""+ "


"+ "


"+ "


"+ "

"+this.getText("ConfigureInformation")+"

"+ "

"+ "
"+ "
"+ "
"+ "
"; break; case "yellow-pane-update": elementDiv.innerHTML = "
"+ ""+ "

"+yellow.toolbox.encodeHtml(yellow.system.coreProductRelease)+"

"+ "

"+this.getText("UpdateStatus", "", paneStatus)+"

"+ "
"+yellow.page.rawDataOutput+"
"+ ""+ "
"; break; case "yellow-pane-create": elementDiv.innerHTML = "
"+ "
"+ "

"+this.getText("Create")+"

"+ "
    "+this.getRawDataButtons(paneId)+"
"+ ""+ "
    "+ "
    "+ ""+ "
    "+ "
    "; break; case "yellow-pane-edit": elementDiv.innerHTML = "
    "+ "
    "+ "

    "+this.getText("Edit")+"

    "+ "
      "+this.getRawDataButtons(paneId)+"
    "+ ""+ "
      "+ "
      "+ ""+ "
      "+ "
      "; break; case "yellow-pane-delete": elementDiv.innerHTML = "
      "+ "
      "+ "

      "+this.getText("Delete")+"

      "+ "
        "+this.getRawDataButtons(paneId)+"
      "+ ""+ "
        "+ "
        "+ ""+ "
        "+ "
        "; break; case "yellow-pane-menu": elementDiv.innerHTML = ""; break; case "yellow-pane-information": elementDiv.innerHTML = "
        "+ ""+ "

        "+this.getText(paneAction+"Title")+"

        "+ "

        "+this.getText(paneAction+"Status", "", paneStatus)+"

        "+ ""+ "
        "; break; default: elementDiv.innerHTML = ""+ "
        Pane '"+paneId+"' was not found. Oh no...
        "; } elementPane.appendChild(elementDiv); yellow.toolbox.insertAfter(elementPane, document.getElementsByTagName("body")[0].firstChild); this.bindActions(elementPane); }, // Update pane updatePane: function(paneId, paneAction, paneStatus, paneInit) { switch (paneId) { case "yellow-pane-login": if (paneInit && yellow.system.editLoginRestriction) { yellow.toolbox.setVisible(document.getElementById("yellow-pane-login-signup"), false); } break; case "yellow-pane-quit": if (paneStatus=="none") { document.getElementById("yellow-pane-quit-status").innerHTML = this.getText("QuitStatusNone"); document.getElementById("yellow-pane-quit-name").value = ""; } break; case "yellow-pane-account": if (paneInit && yellow.system.editSettingsActions=="none") { document.getElementById("yellow-pane-account-title").innerHTML = this.getText("MenuSettings"); } if (paneStatus=="none") { document.getElementById("yellow-pane-account-status").innerHTML = this.getText("AccountStatusNone"); document.getElementById("yellow-pane-account-name").value = yellow.user.name; document.getElementById("yellow-pane-account-email").value = yellow.user.email; document.getElementById("yellow-pane-account-password").value = ""; if (document.getElementById("yellow-pane-account-"+yellow.user.language)) { document.getElementById("yellow-pane-account-"+yellow.user.language).checked = true; } } break; case "yellow-pane-configure": if (paneStatus=="none") { document.getElementById("yellow-pane-configure-status").innerHTML = this.getText("ConfigureStatusNone"); document.getElementById("yellow-pane-configure-sitename").value = yellow.system.sitename; document.getElementById("yellow-pane-configure-author").value = yellow.system.author; document.getElementById("yellow-pane-configure-email").value = yellow.system.email; } break; case "yellow-pane-update": if (paneStatus=="none") { document.getElementById("yellow-pane-update-status").innerHTML = this.getText("UpdateStatusCheck"); document.getElementById("yellow-pane-update-output").innerHTML = ""; setTimeout("yellow.action('submit', '', 'action:update/option:check/');", 500); } if (paneStatus=="updates") { document.getElementById(paneId+"-submit").innerHTML = this.getText("UpdateButton"); document.getElementById(paneId+"-submit").setAttribute("data-action", "submit"); document.getElementById(paneId+"-submit").setAttribute("data-arguments", "action:update"); } break; case "yellow-pane-create": case "yellow-pane-edit": case "yellow-pane-delete": document.getElementById(paneId+"-text").focus(); if (paneInit) { yellow.toolbox.setVisible(document.getElementById(paneId+"-text"), true); yellow.toolbox.setVisible(document.getElementById(paneId+"-preview"), false); document.getElementById(paneId+"-toolbar-title").innerHTML = yellow.toolbox.encodeHtml(yellow.page.title); document.getElementById(paneId+"-text").value = paneId=="yellow-pane-create" ? yellow.page.rawDataNew : yellow.page.rawDataEdit; var matches = document.getElementById(paneId+"-text").value.match(/^(\xEF\xBB\xBF)?\-\-\-[\r\n]+/); var position = document.getElementById(paneId+"-text").value.indexOf("\n", matches ? matches[0].length : 0); document.getElementById(paneId+"-text").setSelectionRange(position, position); if (yellow.system.editToolbarButtons!="none") { yellow.toolbox.setVisible(document.getElementById(paneId+"-toolbar-title"), false); this.updateToolbar(0, "yellow-toolbar-checked"); } if (!this.isUserAccess(paneAction, yellow.page.location) || (yellow.page.rawDataReadonly && paneId!="yellow-pane-create")) { document.getElementById(paneId+"-text").readOnly = true; var elements = document.getElementsByClassName("yellow-toolbar-btn-icon"); for (var i=0, l=elements.length; ibuttonsWidthMax) yellow.toolbox.setVisible(element, false); } yellow.toolbox.setOuterWidth(document.getElementById(paneId+"-toolbar-title"), buttonsWidthMax); var height1 = yellow.toolbox.getHeight(document.getElementById(paneId)); var height2 = yellow.toolbox.getOuterHeight(document.getElementById(paneId+"-toolbar")); yellow.toolbox.setOuterHeight(document.getElementById(paneId+"-text"), height1 - height2); yellow.toolbox.setOuterHeight(document.getElementById(paneId+"-preview"), height1 - height2); var elementLink = document.getElementById(paneId+"-bar"); var position = yellow.toolbox.getOuterLeft(elementLink) + yellow.toolbox.getOuterWidth(elementLink)/2; position -= yellow.toolbox.getOuterLeft(document.getElementById(paneId)) + 1; yellow.toolbox.setOuterLeft(document.getElementById(paneId+"-arrow"), position); break; case "yellow-pane-menu": yellow.toolbox.setOuterLeft(document.getElementById("yellow-pane-menu"), paneLeft + paneWidth - yellow.toolbox.getOuterWidth(document.getElementById("yellow-pane-menu"))); yellow.toolbox.setOuterTop(document.getElementById("yellow-pane-menu"), paneTop); var elementLink = document.getElementById("yellow-pane-menu-bar"); var position = yellow.toolbox.getOuterLeft(elementLink) + yellow.toolbox.getOuterWidth(elementLink)/2; position -= yellow.toolbox.getOuterLeft(document.getElementById("yellow-pane-menu")); yellow.toolbox.setOuterLeft(document.getElementById("yellow-pane-menu-arrow"), position); break; default: yellow.toolbox.setOuterLeft(document.getElementById(paneId), paneLeft); yellow.toolbox.setOuterTop(document.getElementById(paneId), paneTop); yellow.toolbox.setOuterWidth(document.getElementById(paneId), paneWidth); break; } }, // Show or hide pane showPane: function(paneId, paneAction, paneStatus, paneModal) { if (this.paneId!=paneId || this.paneAction!=paneAction) { this.hidePane(this.paneId); var paneInit = !document.getElementById(paneId); if (!document.getElementById(paneId)) this.createPane(paneId, paneAction, paneStatus); var element = document.getElementById(paneId); if (!yellow.toolbox.isVisible(element)) { if (yellow.system.debug) console.log("yellow.edit.showPane id:"+paneId); yellow.toolbox.setVisible(element, true); if (paneModal) { yellow.toolbox.addClass(document.body, "yellow-body-modal-open"); yellow.toolbox.addValue("meta[name=viewport]", "content", ", maximum-scale=1, user-scalable=0"); } this.paneId = paneId; this.paneAction = paneAction; this.paneStatus = paneStatus; this.updatePane(paneId, paneAction, paneStatus, paneInit); this.resizePane(paneId, paneAction, paneStatus); this.updateBar(paneId, "yellow-bar-selected"); } } else { this.hidePane(this.paneId, true); } }, // Hide pane hidePane: function(paneId, fadeout) { var element = document.getElementById(paneId); if (yellow.toolbox.isVisible(element)) { if (yellow.system.debug) console.log("yellow.edit.hidePane id:"+paneId); yellow.toolbox.removeClass(document.body, "yellow-body-modal-open"); yellow.toolbox.removeValue("meta[name=viewport]", "content", ", maximum-scale=1, user-scalable=0"); yellow.toolbox.setVisible(element, false, fadeout); this.paneId = 0; this.paneAction = 0; this.paneStatus = 0; this.updateBar(0, "yellow-bar-selected"); } this.hidePopup(this.popupId); }, // Process action processAction: function(action, status, arguments) { action = action ? action : "none"; status = status ? status : "none"; arguments = arguments ? arguments : "none"; if (action!="none") { if (yellow.system.debug) console.log("yellow.edit.processAction action:"+action+" status:"+status); var paneId = (status!="next" && status!="done") ? "yellow-pane-"+action : "yellow-pane-information"; switch(action) { case "login": this.showPane(paneId, action, status); break; case "signup": this.showPane(paneId, action, status); break; case "confirm": this.showPane(paneId, action, status); break; case "approve": this.showPane(paneId, action, status); break; case "forgot": this.showPane(paneId, action, status); break; case "recover": this.showPane(paneId, action, status); break; case "reactivate": this.showPane(paneId, action, status); break; case "verify": this.showPane(paneId, action, status); break; case "change": this.showPane(paneId, action, status); break; case "quit": this.showPane(paneId, action, status); break; case "remove": this.showPane(paneId, action, status); break; case "account": this.showPane(paneId, action, status); break; case "configure": this.showPane(paneId, action, status); break; case "update": this.showPane(paneId, action, status); break; case "create": this.showPane(paneId, action, status, true); break; case "edit": this.showPane(paneId, action, status, true); break; case "delete": this.showPane(paneId, action, status, true); break; case "menu": this.showPane(paneId, action, status); break; case "toolbar": this.processToolbar(status, arguments); break; case "settings": this.processSettings(arguments); break; case "submit": this.processSubmit(arguments); break; case "restore": this.processSubmit("action:"+action); break; case "help": this.processHelp(); break; case "close": this.processClose(); break; } } }, // Process toolbar processToolbar: function(status, arguments) { if (yellow.system.debug) console.log("yellow.edit.processToolbar status:"+status); var elementText = document.getElementById(this.paneId+"-text"); var elementPreview = document.getElementById(this.paneId+"-preview"); if (!yellow.toolbox.isVisible(elementPreview) && !elementText.readOnly) { switch (status) { case "h1": yellow.editor.setMarkdown(elementText, "# ", "insert-multiline-block", true); break; case "h2": yellow.editor.setMarkdown(elementText, "## ", "insert-multiline-block", true); break; case "h3": yellow.editor.setMarkdown(elementText, "### ", "insert-multiline-block", true); break; case "paragraph": yellow.editor.setMarkdown(elementText, "", "remove-multiline-block"); yellow.editor.setMarkdown(elementText, "", "remove-fenced-block"); break; case "notice": yellow.editor.setMarkdown(elementText, "! ", "insert-multiline-block", true); break; case "quote": yellow.editor.setMarkdown(elementText, "> ", "insert-multiline-block", true); break; case "pre": yellow.editor.setMarkdown(elementText, "```\n", "insert-fenced-block", true); break; case "bold": yellow.editor.setMarkdown(elementText, "**", "insert-inline", true); break; case "italic": yellow.editor.setMarkdown(elementText, "*", "insert-inline", true); break; case "strikethrough": yellow.editor.setMarkdown(elementText, "~~", "insert-inline", true); break; case "code": yellow.editor.setMarkdown(elementText, "`", "insert-autodetect", true); break; case "ul": yellow.editor.setMarkdown(elementText, "* ", "insert-multiline-block", true); break; case "ol": yellow.editor.setMarkdown(elementText, "1. ", "insert-multiline-block", true); break; case "tl": yellow.editor.setMarkdown(elementText, "- [ ] ", "insert-multiline-block", true); break; case "link": yellow.editor.setMarkdown(elementText, "[link](url)", "insert", false, yellow.editor.getMarkdownLink); break; case "text": yellow.editor.setMarkdown(elementText, arguments, "insert"); break; case "status": yellow.editor.setMetaData(elementText, "status", true); break; case "file": this.showFileDialog(); break; case "undo": yellow.editor.undo(); break; case "redo": yellow.editor.redo(); break; } if (this.isExpandable(status)) { this.showPopup("yellow-popup-"+status, status); } else { this.hidePopup(this.popupId); } } if (!elementText.readOnly) { if (status=="preview") this.showPreview(elementText, elementPreview); if (status=="save" && this.paneAction!="delete") this.processSubmit("action:"+this.paneAction); if (status=="help") window.open(this.getText("YellowHelpUrl"), "_blank"); } }, // Update toolbar updateToolbar: function(status, name) { if (status) { var element = document.getElementById(this.paneId+"-toolbar-"+status); if (element) { if (name.indexOf("selected")!=-1) element.setAttribute("aria-expanded", "true"); yellow.toolbox.addClass(element, name); } } else { var elements = document.getElementsByClassName(name); for (var i=0, l=elements.length; i"+ "
      • "+this.getText("ToolbarH1")+"
      • "+ "
      • "+this.getText("ToolbarH2")+"
      • "+ "
      • "+this.getText("ToolbarH3")+"
      • "+ "
      • "+this.getText("ToolbarParagraph")+"
      • "+ "
      • "+this.getText("ToolbarPre")+"
      • "+ "
      • "+this.getText("ToolbarNotice")+"
      • "+ "
      • "+this.getText("ToolbarQuote")+"
      • "+ ""; break; case "yellow-popup-heading": elementDiv.innerHTML = ""; break; case "yellow-popup-list": elementDiv.innerHTML = ""; break; case "yellow-popup-emojiawesome": var rawDataEmojis = ""; if (yellow.system.emojiawesomeToolbarButtons && yellow.system.emojiawesomeToolbarButtons!="none") { var tokens = yellow.system.emojiawesomeToolbarButtons.split(" "); for (var i=0; i"; } } elementDiv.innerHTML = "
          "+rawDataEmojis+"
        "; break; case "yellow-popup-fontawesome": var rawDataIcons = ""; if (yellow.system.fontawesomeToolbarButtons && yellow.system.fontawesomeToolbarButtons!="none") { var tokens = yellow.system.fontawesomeToolbarButtons.split(" "); for (var i=0; i"; } } elementDiv.innerHTML = "
          "+rawDataIcons+"
        "; break; } elementPopup.appendChild(elementDiv); yellow.toolbox.insertAfter(elementPopup, document.getElementsByTagName("body")[0].firstChild); this.bindActions(elementPopup); }, // Show or hide popup showPopup: function(popupId, status) { if (this.popupId!=popupId) { this.hidePopup(this.popupId); if (!document.getElementById(popupId)) this.createPopup(popupId); var element = document.getElementById(popupId); if (yellow.system.debug) console.log("yellow.edit.showPopup id:"+popupId); yellow.toolbox.setVisible(element, true); this.popupId = popupId; this.updateToolbar(status, "yellow-toolbar-selected"); var elementParent = document.getElementById(this.paneId+"-toolbar-"+status); var popupLeft = yellow.toolbox.getOuterLeft(elementParent); var popupTop = yellow.toolbox.getOuterTop(elementParent) + yellow.toolbox.getOuterHeight(elementParent) - 1; yellow.toolbox.setOuterLeft(document.getElementById(popupId), popupLeft); yellow.toolbox.setOuterTop(document.getElementById(popupId), popupTop); } else { this.hidePopup(this.popupId, true); } }, // Hide popup hidePopup: function(popupId, fadeout) { var element = document.getElementById(popupId); if (yellow.toolbox.isVisible(element)) { if (yellow.system.debug) console.log("yellow.edit.hidePopup id:"+popupId); yellow.toolbox.setVisible(element, false, fadeout); this.popupId = 0; this.updateToolbar(0, "yellow-toolbar-selected"); } }, // Show or hide preview showPreview: function(elementText, elementPreview) { if (!yellow.toolbox.isVisible(elementPreview)) { var thisObject = this; var formData = new FormData(); formData.append("action", "preview"); formData.append("csrftoken", this.getCookie("csrftoken")); formData.append("rawdataedit", elementText.value); formData.append("rawdataendofline", yellow.page.rawDataEndOfLine); var request = new XMLHttpRequest(); request.open("POST", window.location.pathname, true); request.onload = function() { if (this.status==200) thisObject.showPreviewDone.call(thisObject, elementText, elementPreview, this.responseText); }; request.send(formData); } else { this.showPreviewDone(elementText, elementPreview, ""); } }, // Preview done showPreviewDone: function(elementText, elementPreview, responseText) { var showPreview = responseText.length!=0; yellow.toolbox.setVisible(elementText, !showPreview); yellow.toolbox.setVisible(elementPreview, showPreview); if (showPreview) { this.updateToolbar("preview", "yellow-toolbar-checked"); elementPreview.innerHTML = responseText; dispatchEvent(new Event("DOMContentLoaded")); } else { this.updateToolbar(0, "yellow-toolbar-checked"); elementText.focus(); } }, // Show file dialog and trigger upload showFileDialog: function() { var element = document.createElement("input"); element.setAttribute("id", "yellow-file-dialog"); element.setAttribute("type", "file"); element.setAttribute("accept", yellow.system.editUploadExtensions); element.setAttribute("multiple", "multiple"); yellow.toolbox.addEvent(element, "change", yellow.onDrop); element.click(); }, // Upload file uploadFile: function(elementText, file) { if (this.isUserAccess("upload", yellow.page.location)) { var extension = (file.name.lastIndexOf(".")!=-1 ? file.name.substring(file.name.lastIndexOf("."), file.name.length) : "").toLowerCase(); var extensions = yellow.system.editUploadExtensions.split(/\s*,\s*/); if (file.size<=yellow.system.coreFileSizeMax && extensions.indexOf(extension)!=-1) { var text = "["+this.getText("UploadProgress")+"]\u200b"; yellow.editor.setMarkdown(elementText, text, "insert"); var thisObject = this; var formData = new FormData(); formData.append("action", "upload"); formData.append("csrftoken", this.getCookie("csrftoken")); formData.append("file", file); var request = new XMLHttpRequest(); request.open("POST", window.location.pathname, true); request.onload = function() { if (this.status==200) { thisObject.uploadFileDone.call(thisObject, elementText, this.responseText); } else { thisObject.uploadFileError.call(thisObject, elementText, this.responseText); } }; request.send(formData); } else { var textError = extensions.indexOf(extension)!=-1 ? "file too big!" : "file format not supported!"; var textNew = "[Can't upload file '"+file.name+"', "+textError+"]"; yellow.editor.setMarkdown(elementText, textNew, "insert"); } } else { var textNew = "[Can't upload file '"+file.name+"', access is restricted!]"; yellow.editor.setMarkdown(elementText, textNew, "insert"); } }, // Upload done uploadFileDone: function(elementText, responseText) { var result = JSON.parse(responseText); if (result) { var textOld = "["+this.getText("UploadProgress")+"]\u200b"; var textNew; if (result.location.substring(0, yellow.system.coreImageLocation.length)==yellow.system.coreImageLocation) { textNew = "[image "+result.location.substring(yellow.system.coreImageLocation.length)+"]"; } else { textNew = "[link]("+result.location+")"; } yellow.editor.replace(elementText, textOld, textNew); } }, // Upload error uploadFileError: function(elementText, responseText) { var result = JSON.parse(responseText); if (result) { var textOld = "["+this.getText("UploadProgress")+"]\u200b"; var textNew = "["+result.error+"]"; yellow.editor.replace(elementText, textOld, textNew); } }, // Bind actions to links bindActions: function(element) { var elements = element.getElementsByTagName("a"); for (var i=0, l=elements.length; i"+yellow.toolbox.encodeHtml(text)+""; } return rawDataAction; }, // Return raw data for settings actions getRawDataSettingsActions: function(paneAction) { var rawDataActions = ""; if (yellow.system.editSettingsActions && yellow.system.editSettingsActions!="none") { var tokens = yellow.system.editSettingsActions.split(/\s*,\s*/); for (var i=0; i"+this.getText(token+"Title")+"
        "; } } return rawDataActions; }, // Return raw data for languages getRawDataLanguages: function(paneId) { var rawDataLanguages = ""; if (yellow.system.coreLanguages && Object.keys(yellow.system.coreLanguages).length>1) { for (var language in yellow.system.coreLanguages) { var checked = language==this.getRequest("language") ? " checked=\"checked\"" : ""; rawDataLanguages += "
        "; } } return rawDataLanguages; }, // Return raw data for buttons getRawDataButtons: function(paneId) { var rawDataButtons = ""; if (yellow.system.editToolbarButtons && yellow.system.editToolbarButtons!="none") { var tokens = yellow.system.editToolbarButtons.split(/\s*,\s*/); for (var i=0; i"; } else { rawDataButtons += "
      • "; } } } return rawDataButtons; }, // Return request data getRequest: function(key, prefix) { if (!prefix) prefix = "request"; key = prefix + yellow.toolbox.toUpperFirst(key); return (key in yellow.page) ? yellow.page[key] : ""; }, // Return shortcut setting getShortcut: function(key) { var shortcut = ""; var tokens = yellow.system.editKeyboardShortcuts.split(/\s*,\s*/); for (var i=0; i0) top--; if (bottom==top && bottom\s]+)?(\s+\[.\]|\s*\d+\.)?[ \t]+/); if (matches) { textSelectionNew += lines[i].substring(matches[0].length); } else { textSelectionNew += lines[i]; } } textSelection = textSelectionNew; if (information.type.indexOf("remove")==-1) { textSelectionNew = ""; var linePrefix = information.prefix; lines = yellow.toolbox.getTextLines(textSelection.length!=0 ? textSelection : "\n"); for (var i=0; i=48 && e.keyCode<=90) { shortcut += (e.ctrlKey ? "ctrl+" : "")+(e.metaKey ? "meta+" : "")+(e.altKey ? "alt+" : "")+(e.shiftKey ? "shift+" : ""); shortcut += String.fromCharCode(e.keyCode).toLowerCase(); } return shortcut; }, // Return element width in pixel getWidth: function(element) { return element.offsetWidth - this.getBoxSize(element).width; }, // Return element height in pixel getHeight: function(element) { return element.offsetHeight - this.getBoxSize(element).height; }, // Set element width in pixel, including padding and border setOuterWidth: function(element, width) { element.style.width = Math.max(0, width - this.getBoxSize(element).width) + "px"; }, // Set element height in pixel, including padding and border setOuterHeight: function(element, height) { element.style.height = Math.max(0, height - this.getBoxSize(element).height) + "px"; }, // Return element width in pixel, including padding and border getOuterWidth: function(element, includeMargin) { var width = element.offsetWidth; if (includeMargin) width += this.getMarginSize(element).width; return width; }, // Return element height in pixel, including padding and border getOuterHeight: function(element, includeMargin) { var height = element.offsetHeight; if (includeMargin) height += this.getMarginSize(element).height; return height; }, // Set element left position in pixel setOuterLeft: function(element, left) { element.style.left = Math.max(0, left) + "px"; }, // Set element top position in pixel setOuterTop: function(element, top) { element.style.top = Math.max(0, top) + "px"; }, // Return element left position in pixel getOuterLeft: function(element) { return element.getBoundingClientRect().left + window.pageXOffset; }, // Return element top position in pixel getOuterTop: function(element) { return element.getBoundingClientRect().top + window.pageYOffset; }, // Return window width in pixel getWindowWidth: function() { return window.innerWidth; }, // Return window height in pixel getWindowHeight: function() { return window.innerHeight; }, // Return element CSS property getStyle: function(element, property) { return window.getComputedStyle(element).getPropertyValue(property); }, // Return element CSS padding and border getBoxSize: function(element) { var paddingLeft = parseFloat(this.getStyle(element, "padding-left")) || 0; var paddingRight = parseFloat(this.getStyle(element, "padding-right")) || 0; var borderLeft = parseFloat(this.getStyle(element, "border-left-width")) || 0; var borderRight = parseFloat(this.getStyle(element, "border-right-width")) || 0; var width = paddingLeft + paddingRight + borderLeft + borderRight; var paddingTop = parseFloat(this.getStyle(element, "padding-top")) || 0; var paddingBottom = parseFloat(this.getStyle(element, "padding-bottom")) || 0; var borderTop = parseFloat(this.getStyle(element, "border-top-width")) || 0; var borderBottom = parseFloat(this.getStyle(element, "border-bottom-width")) || 0; var height = paddingTop + paddingBottom + borderTop + borderBottom; return { "width":width, "height":height }; }, // Return element CSS margin getMarginSize: function(element) { var marginLeft = parseFloat(this.getStyle(element, "margin-left")) || 0; var marginRight = parseFloat(this.getStyle(element, "margin-right")) || 0; var width = marginLeft + marginRight; var marginTop = parseFloat(this.getStyle(element, "margin-top")) || 0; var marginBottom = parseFloat(this.getStyle(element, "margin-bottom")) || 0; var height = marginTop + marginBottom; return { "width":width, "height":height }; }, // Set element visibility setVisible: function(element, show, fadeout) { if (fadeout && !show) { var opacity = 1; function renderFrame() { opacity -= .1; if (opacity<=0) { element.style.opacity = "initial"; element.style.display = "none"; } else { element.style.opacity = opacity; requestAnimationFrame(renderFrame); } } renderFrame(); } else { element.style.display = show ? "block" : "none"; } }, // Check if element exists and is visible isVisible: function(element) { return element && element.style.display!="none"; }, // Convert first letter to lowercase toLowerFirst: function(string) { return string.charAt(0).toLowerCase()+string.slice(1); }, // Convert first letter to uppercase toUpperFirst: function(string) { return string.charAt(0).toUpperCase()+string.slice(1); }, // Return lines from text string, including newline getTextLines: function(string) { var lines = string.split("\n"); for (var i=0; i/g, ">") .replace(/"/g, """); }, // Submit form with post method submitForm: function(arguments) { var elementForm = document.createElement("form"); elementForm.setAttribute("method", "post"); for (var key in arguments) { if (!arguments.hasOwnProperty(key)) continue; var elementInput = document.createElement("input"); elementInput.setAttribute("type", "hidden"); elementInput.setAttribute("name", key); elementInput.setAttribute("value", arguments[key]); elementForm.appendChild(elementInput); } document.body.appendChild(elementForm); elementForm.submit(); } }; yellow.edit.intervalId = setInterval("yellow.onLoad(new Event('DOMContentLoading'))", 1); window.addEventListener("DOMContentLoaded", yellow.onLoad, false);