-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathsimplehtmleditor.min.js
More file actions
11 lines (11 loc) · 91.2 KB
/
simplehtmleditor.min.js
File metadata and controls
11 lines (11 loc) · 91.2 KB
1
2
3
4
5
6
7
8
9
10
11
/*!
* Simple HTML Editor v2.0.1
* A lightweight, customizable WYSIWYG HTML editor for modern web applications
*
* @author FranBarInstance
* @license MIT
* @version 2.0.1
* @link https://github.com/FranBarInstance/simple-html-editor
* @copyright (c) 2022-2025
*/
if(window.ncsedtRestorable=function(){var e=this;this.elementsWithTag=document.querySelectorAll("ncsedt-restorable"),this.elementsWithAttribute=document.querySelectorAll('[data-ncsedt-restorable="true"]'),this.savedHTML=[],this.savedAttributes=[],this.undoHistoryHTML=[],this.undoHistoryAttributes=[],this.htmlElementCount=0,this.attributeElementCount=0,this.elementsWithTag.forEach((function(t){e.savedHTML[e.htmlElementCount++]=t.innerHTML})),this.elementsWithAttribute.forEach((function(t){e.savedAttributes[e.attributeElementCount++]=t.cloneNode().attributes}))},ncsedtRestorable.prototype.restore=function(){var e=this,t=0;t=0,this.elementsWithTag.forEach((function(n){e.undoHistoryHTML[t++]=n.innerHTML})),t=0,this.elementsWithAttribute.forEach((function(n){e.undoHistoryAttributes[t++]=n.cloneNode().attributes}));for(let e=0;e<this.elementsWithTag.length;e++)this.elementsWithTag[e].innerHTML=this.savedHTML[e];for(let t=0;t<this.elementsWithAttribute.length;t++)Array.prototype.slice.call(this.elementsWithAttribute[t].attributes).forEach((function(n){e.elementsWithAttribute[t].removeAttribute(n.name)}));for(let t=0;t<this.elementsWithAttribute.length;t++)Array.prototype.slice.call(this.savedAttributes[t]).forEach((function(n){e.elementsWithAttribute[t].setAttribute(n.name,n.value)}));document.dispatchEvent(new Event("editorchanges"))},ncsedtRestorable.prototype.undoRestore=function(){var e=this;for(let e=0;e<this.elementsWithTag.length;e++)this.elementsWithTag[e].innerHTML=this.undoHistoryHTML[e];for(let t=0;t<this.elementsWithAttribute.length;t++)Array.prototype.slice.call(this.undoHistoryAttributes[t]).forEach((function(n){e.elementsWithAttribute[t].setAttribute(n.name,n.value)}));document.dispatchEvent(new Event("editorchanges"))},!("ncsedtRestorableObj"in window))var ncsedtRestorableObj=new ncsedtRestorable;window.ncSimpleHtmlEditor=function(e={}){var t=this;this.restorable=window.ncsedtRestorableObj||new ncsedtRestorable,this.state={isEditing:!1,clipboard:null,history:{undo:[],redo:[],force:[]},selection:null},this.validateOptions(e);const n={editableContentSelector:"body",usesLinearUndoHistory:!0,mutationGroupingWindowMs:200,aiModelParams:{temperature:.5,top_p:.9},aiBackends:{ollama:{enabled:!0,url:"http://localhost:11434/api/generate",model:"qwen2.5-coder:7b"},openrouter:{enabled:!1,url:"https://openrouter.ai/api/v1/chat/completions",model:"qwen/qwen-2.5-coder-32b-instruct:free"},anthropic:{enabled:!1,url:"https://api.anthropic.com/v1/messages",model:"claude-3-opus-20240229"},azure:{enabled:!1,url:"",model:""},gemini:{enabled:!1,url:"https://generativelanguage.googleapis.com/v1beta/models/",model:"gemini-pro"},openai:{enabled:!1,url:"https://api.openai.com/v1/chat/completions",model:"gpt-4-turbo"}},additionalPrompts:{"only replacement":"Iinstructions:\nProvide only what is requested, including all code or text in input that does not change, without additional comments, without Markdown. The div id ncsedt-implement code must never be modified."},customPrompts:{translate:"Translate to English",traduce:"Traduce a Español"},toolbarCols:null,saveTimeout:500,maxImageSizeBytes:12e5,toolbar:["edit","undo","redo","up","down","previous","next","cut","copy","paste","head","code","agent","link","image","save","github"],buttons:{edit:{name:"edit",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAABP0lEQVRo3u3YMU4CQRTG8T+7nkM3HkUTK26BHa2Vt9BGGlAEgl5Dz2E2XoFGGqLNTljJDDNLwXtD3pdMQTIkv+/tsNkFLBaLxQIV8AmsgAeglAZ1yTnwBfy21jtwJg07FJ9NiX34LEoMI3i3Fij+TdwnlniUhrpUwNUBJVbScIevgR/gpmOJDy14B+pSogYuJPGhu80a6O/svdvZ8w1casSnlBDHV/w/NqHlO07D5vtiCU1+AgyADfErIZYK/+THQNHsucV/Ja6l8fsm7/A94MmzR/zMnyT++ZTwo1zxRfM5G/yS7eNvAbwY3vBpePfqlx3+rYUvc8dPDW/4OL79X41aPPgfiedsb5UlMPPsqRF+GXGJTf4VpZMPFWhPfo7iyYcKOLz6yYcKhJZKfGoBtfiUAqrxsQLq8RaLxXKc/AH+RGvPIDl6DwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOS0xNlQxNDo1ODoyMyswMDowMGRD6r4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDktMTZUMTQ6NTk6MzIrMDA6MDCQATIWAAAAAElFTkSuQmCC",icon2:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAACI0lEQVRo3u3YsWoUURTG8Z9ICIiNsDEiioioKGEbK0uxUWwkjU9kbRUbn8BitQkE0byBTUSx0FgkisaAaCGITSx2Bzezd3buzM7OzJL9YNhqzvy/c+45995lrrnmmmsuOljHL6xhoWmgIlrCFg6GnnUsNg1WFn5mTCzhTQZ8aRMdbKJbg4E7+Jtj4AA9kT3R8b+c+zWZWI00sRYT7FXqpWmY6AZixpj4GRN8BXtTNNEdxAvFzDPxMvYjV/El9fIP3KgIflzMe/gTgN/GcpGPXcHnCk2k4YuY2B/wFNZl7FZgIgs+xsRv3CyZNHAJO8r3RB78uJiruDsJfKIL+muwaCWy4Hu4b3StV9FnY018ishaDHyyIT0QV4nKdB4fIz/4Igf+OJ7WbQDO4J380p90eFMchj+GJwH479OGT7SMtxEmFvE8AP+4SfhEoUqEyr/g8CHskQaWTZZOGz0Kj5skD7Ug82ndFpfRE0YvLY1lPtG4TSpUiVN4rSWZj9lhQxmu87JUGH5DP7OtWiax8MmovIav4hu7VfAGvxtaNCqLwj+T3RONVaIK+MZMTAL/Hrc03BMx8L0M+OQOG0pCbT1RJvMfcDYVp7HplIbLy/w2zmXEaqQSacAEPpT5HVzMiVd7JfKmSvLs6v8BEKNaTcTAfxtAFVFtJvLg93C9ZOxaTOSdNlcmjN/qs9ORMhEasZtNQxXVcCW29C8/M6eufuZnEv7o6h+WFd8aD3ft0gAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOS0xNlQxNDo1OTozMiswMDowMOFciqoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDktMTZUMTQ6NTk6MzIrMDA6MDCQATIWAAAAAElFTkSuQmCC",title:"Edit",disabled:function(){return t.isEditButtonDisabled()},action:function(){t.editToggle()}},code:{name:"code",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAACIElEQVRo3u2ZsUscQRjFf8ZCMFVSmFIskiqkUxEkXbAJFmJO0MQmraSxDYLYJVVII5axCakEm5C/IBwh2ClBxPaKWNhEjMlZXA7mHrPZmZ3ZGYR9cMXevO99783s7c7tQoMGDRrkxHCiPgvAHjADjAO/gE7u8D54A3SNz9tYwrcSBZiS43aivlEwDJwzuALjuU354JGYj3ruh55Cyw6cSTluV9CoBS3gtwNvh8EVeC3jV8CLXOa7DtwDCfBExrupQ5jmywKMCvcvcMcSIFkINV8W4LFwjywcc7zWEMv/GpgNy34D68LftXB0Qq6o4Ydtm3mXRp+kZs3CWQQuqXElqpoHOJW6yQJebSFCzI9J3QUw8h9+9BAh5gHmpfarQ020EKHmAbak/p1jXXCIGOYBvojGc4/ayiFimR8CzkTnvqeGUwjXzdyQZ/MHDN5xz4BjT42ivqXbl6JVWPFovCr1nz2NLxZ4cD4NnwUKvJfaTQ/zob2jCLWl7mlq8yGCI/RuWmbNvRzmqwpPC/fEoUfLs0e0ELbr8ivhfcxtvo+lgkaKXeGsl+jatuhLsc33Ybu8KX7I+GyJZsjlOkoIE3fp/W00Z/O2Y4Ak5m0hTMwxOKPfHbSSmzdDXMp3GxJg20Eni/k+WnK8LwFeVtDIio4EeJjbkA8mxPw5Cd4/xHy8ro/QvwF/bnKAJO8AYi5xh95N7Ce9Dd0H4DBFiAYNGjTIh2vrWlwSpGLTnQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOS0xNlQxNTowMjowNCswMDowMFgiNkMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDktMTZUMTU6MDI6MDQrMDA6MDApf47/AAAAAElFTkSuQmCC",title:"Code",disabled:function(){return t.isCodeButtonDisabled()},action:function(){t.editCode()}},undo:{name:"undo",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAABhklEQVRo3u3WMWsUURDA8Z9i5CQaG5toIURMIRLUJo3Gyi5fxVYbwWATIYVo48ewsLJUsFFMYZVCiyTNhQhBwXDEnGfxVjiWvTWn7xED84dpdpeZ+e/Mg0cQBEEQBEEQ/E88PuwG/pXBUZI4MeL5ffSwNEauCdzELdzAZUzjNH7gC7axibd4g1Xs55YaDMVBBK7iedXgYMzYwZNKtohAm8QVvMTPv2i8Hv0q12wJgfqZmJBWbC9D4/XYq2p1cgv8nsRFaW9zN16PDzh/kGaPjRAYxXdMtrzfxWu8wntsoVvlPCcd6nncxh2cacm1iUV8zDWBtuji3h8aqjOFu/jUkvcr5koK9LGMU+MWGaIjrWdvRI11aXLZBb5Jq5CLa9LaNNV6h5MlJrCUUQAuSDvfVOtBCYES145pbDTU2cWlEgIlJnFd85l4UUqgxCQeNdToY6aUQO5JdPC5ocbK8EfHM/+1hxklenhae9aVrhut5LgK5JI4izU8w4L8PzwIgiAIgiAIgiPML+zxM5YSM3skAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIyLTA5LTE2VDE1OjAxOjUyKzAwOjAwmCW2HgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMi0wOS0xNlQxNDo1OTo1NiswMDowME3jdLwAAAAASUVORK5CYII=",title:"Undo",disabled:function(){return t.isUndoButtonDisabled()},action:function(){t.undo()}},redo:{name:"redo",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAABiklEQVRo3u3WT0tUURjH8U+hhoSuijQqd4oECS1aBJK73ktvoCCs2am7auHLCIJatSraRFjbsDYFUVAgRqFWji7uLPQ4c+femWO6eL5wFvfP8/D9nXMv5xAEQRAEQRAEQTUaRy3Qr/xOenMgQ+MBXMUNXMdFnMUZDOIXvuID3uIlXuFfTfn7uWdkEg+x1pqZOuM7lnG5ovze2r6ZwjM0exBPRxNPMF1Rvq8Ag7iNzQzi6fiLRZzqIt9zgPNYOQTxdKxgokT+QIATFeRn8BQXSt75ied4gdf4hh+t/mM4h2u4qfjZh0t6/cbpkudVnPfJr5fMxipuYaRGz1HcaYXsZZUqM47PHZpsYB5DdRomDGMJ24cRYAhvOjT4hCt9iKfMKT7BrAHudih+11qZnDRqyFcKMKHYPdPCL8p/5P8hXynAY+2/+ZljIN81wCXFGSUtundM5LsGWGhT8NH+HfIo5Q8EOJlc/1GcHPfyAFsZ5bOfKtuFmsUjvFdsPLnkcxw3giAIgiAIgiAIwC7w7i5ZynjYFQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOS0xNlQxNTowMjowNCswMDowMFgiNkMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDktMTZUMTU6MDI6MDQrMDA6MDApf47/AAAAAElFTkSuQmCC",title:"Redo",disabled:function(){return t.isRedoButtonDisabled()},action:function(){t.redo()}},up:{name:"up",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAAAsUlEQVRo3u3VTQqCUBhG4dMP0aBZbaLVNWzaRlqJm2gpzmoSNXGQYJJe7bsXzgOCA9H3CCJIkqRei+gBKS7AFVhGDxk7/tUcxUV8ji8uomt8MRF947OP+GV8thFDxmcXMWZ8NhEp4yeJWCWMPwFn4PHl2NL+C9fAveO6I7AHqr+88gFq2m/6MMdDsviIDCiZAdEMiGZANAOiGRDNgGjFB6xnvPcN2DXnG+AZHStJkqb2BvfBZVUwT6fHAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIyLTA5LTI3VDExOjAxOjU1KzAwOjAwYMkoEwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMi0wOS0yN1QwMTowMTo1NSswMDowMBGUkK8AAAAASUVORK5CYII=",title:"Select up",disabled:function(){return t.isUpButtonDisabled()},action:function(){t.up()}},down:{name:"down",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAAArUlEQVRo3u2XvQrCMBgAT9FJEAqu4vO4+BgOvrSv4NjJOgm10Gp/vwTv4JuSkLtsAREREelkBxTAKlqkLw+gqs1hjkvW0ZUGRAsYEC1gQLSAAdECBkQLGBAtYEC0wN8HbEacPQLbjvXm45yAfcveCrgvHX8GSj5/XUPmCdyWlp8qIlR+bEQS8kMjkpLvG5Gk/K8RSct/i8hCvi0iK/lmRJbyby7ANVpCRERE5uIFO9pmz/tN+9wAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjItMDktMjdUMDE6MDE6MzcrMDA6MDAxOTC9AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIyLTA5LTE2VDE1OjAxOjE1KzAwOjAwqJU+1gAAAABJRU5ErkJggg==",title:"Selenct down",disabled:function(){return t.isDownButtonDisabled()},action:function(){t.down()}},previous:{name:"previous",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABGklEQVRoQ+1XOQ7CMBBMREFBwQPgWdRU/IqGf1DxmVDRUFBQAOsikmUFa61ZgkaaSC6i7I7nSGyn78ivnpx/JwH/TlAJKAHQAb1CoIFwuxKALQQBlABoINyuBAoL93Z/tnGFrXUCRCaQyJ9sbG0MzvnhsigBI/mEt2ETkJNPjlIJKMlTCZgiTyPgG3kKAQdjeawsHzt7dgOXl7f1XzwYratQzXnPfN6alxUuPMUtAuYin3g/bSyZBTyM/CpaQMKbK4W7zbX+hQCPCIqNjHoZHZOl3shqIiheofz7oj7MTSVBl0ApgvKHJhdB+0vp2XfCa1rOQuGTRwBKQISLCIYSQNyL6FUCES4iGEoAcS+iVwlEuIhgKAHEvYjeD0hbKjFLoDaVAAAAAElFTkSuQmCC",title:"Select previous sibling",disabled:function(){return t.isPreviousButtonDisabled()},action:function(){t.previous()}},next:{name:"next",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABHklEQVRoQ+2WQQrCUAxE25WXEEHwEh7MnaAuXOmdPIggiAfRZK82k/yQX5hCV02m82bk13GY+TXO3P9AgOoG2QAbCCbAn1AwwPA6GwhHGBRgA8EAw+tswBHhQXZOjr2vKxUNvMXJTu5rC4gqAPXeBKISoAlENUAYogeAEEQvAG4IBGArb1k0ODlufzT28uyMvAMBeInwEhF3zkKnEwLwFEMrpyl0zQyBADzExRp14pzXL/XRsosA3EVwYxENzugXWhswXQiASdAwpH8lfl2QeRXpCQA23xOAy3wvAG7zPQCEzFcDhM1XAjQxXwVwQc75qWO54hid8gQ9JwAUV8IwG0gIFZJkA1BcCcNsICFUSJINQHElDLOBhFAhydk38AELbCYxoaSv8QAAAABJRU5ErkJggg==",title:"Select next sibling",disabled:function(){return t.isNextButtonDisabled()},action:function(){t.next()}},cut:{name:"cut",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAAB9klEQVRo3u2YTU7CQBiGHzHqCgzXELmAceERSIhncUndGRFTAtHD+BNdeAAFI3HJDQSXGFxMScgU2pnOtDOLvskkJP2m87ztVzp9oVSpUmlqAn1gDPxGYwyEwLFruCQdAHfAH7DcMhbAENh3DbsJ/jkBXB5Plk0ECWsp6V4DfjUGBcArGWgSb5sp0Aaq0WgBE+Lt1MgZPlA5SShN+gLqG+rqkbH12lvX8ACf0sRWQu25VDtyDQ8wkyZXE2prUu3MNbyugUOp9sc1POi1UFuq/XAND/GHeML2h/hbqr12DQ9ie7CQTjhFPLC1aLQ3wC+Bnmv4lYYpi2QFKAQexLbg0bKJwuDXTQyIt1NWE4FGrVU1EG/YETBH/FW+A11Ez5uayBVeRRcpJq4S6jumi+9aMPAG7ABnW46fRsdfpPpX4NLWVbQh3TvhpQIJ+gRxB3Lr90rOhiqIdlmpk4cJWwpQ/4v1rp104L0zkQW+UBNyLjRDvNRuUHuRpRkM8gJXyYVUwQo3oZsLebeZy5ILebOdzpoLefNBE0on1MmFuopr5GrCJBfy4qPeJBfyIlYxyYW8CLZMciEvosVQmqyTC3kR7mbNhRbAkYEBqyay5EJ9Q3hVE0rSzYUegD1LBtJMKEslF1ogrrxNeOuSc6F59LuHec+XKlXKUP835G8IanS10wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOS0yN1QwNDo0MDowNCswMDowMFFlZxoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDktMjdUMDQ6NDA6MDQrMDA6MDAgON+mAAAAAElFTkSuQmCC",title:"Cut",disabled:function(){return t.isCutButtonDisabled()},action:function(){t.cut()}},copy:{name:"copy",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAAA7klEQVRo3u2ZSw6CMBRFj4apcQMyZu0aEscO3JGagAvAATqQQOTTvlfiPQmTQuk9bdKXtCDSJAdKoAaayE+U8HeD4NEESsPwiwU2PW01sIsxMxMyLOrcjPgmGbbeASTgHcBLwKJO1MAZKKaG+7XNWdeJx3vMYALWdaIBTkNh52yj1nXiM+Y+lIBVnRg1zt/uQskgAW8k4I0EvJGANxLwRgLeSMAbCXizeoGspy3ps9Auq18BCXgjAW8k4E02o8+T78PdKFelHaqhF3NW4GoQuMsl5M8K2ksHq7uBG3AIPSM57aVDFTF4BRxjhBcheQHmPezLx9HoXgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOS0yN1QwNDozOTozNCswMDowMArEXrAAAAAElFTkSuQmCC",title:"Copy",disabled:function(){return t.isCopyButtonDisabled()},action:function(){t.copy()}},paste:{name:"paste",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAABG0lEQVRo3u2ZzWrCUBBGj9WtUNc1a99KfT1F6KYoXbgVq6+iQiK4TRcmoGKS3h/7WToHZhHIzP0OCVlkID4dYAxsgVNRG2AEtB9wXlR6wBeQV9QaeFWHrKLdEL6sFfCiDnuP8Q/ClzX8rVAJMAMyh3BlfQBvQB+Ye/RnwDswCAm/9zi4rP7NLN85h6LfmVnAoTEFcmDqI+Dz2lzWvJBIgEXgrLQqZKtGIG+4NycuTfPvZn3Kz5kLJqDGBNR0AnpbAb3R+PNPwATUmIAaE1BjAmpMQI0JqDEBNSagxgTUmIAaE1BjAmrq/swdge7Fdex9gAuVC466J7AUBr7l06dpwHnBFrIailE7rvdtTiScF2ypIHgKTELCG8Z/4BuHD+VLGLARSgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOS0yN1QwNDozOTo1MCswMDowMDjkcyQAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDktMjdUMDQ6Mzk6NTArMDA6MDCQATIWAAAAAElFTkSuQmCC",title:"Paste",disabled:function(){return t.isPasteButtonDisabled()},action:function(){t.paste()}},link:{name:"link",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAADHElEQVRo3u2ZzUsUYRzHP7uBSh0qLTtUKKuBQdGpOkSkFBQEnZLqYJEQBL0IEkT0B1QQhYc6mG1u18B7eRGtSxHUUahs7WZrmEX4Eurh2YHxO2+77szOCvuFYXlmvvP7fZ6Z53n2eZ6Bqqqqal0rEVPeOuAo0AQ0ADngO/AWmI/7ofgpBWSAv8Cyy/EHSAPNcYO6qRdY8ADXYx64HjewpSTwrEBwPfqCgm8oA3wa6Ha59g0YAoaBL0A9sFk8hzH940PEnJ7wgzifag7oxDmAJIEuYEb8c5jOXhHwk0BrwL37XSrxvFLgUwXG6JJ7Z4GacsFnSoS34mQlRsd6gbf0QuK4DQQkQ6zAAHBRzv0A2jEjTrGaknJDlBW4DVwOER5gu5R/hcTq0D7gP4U1mx3AAYIfXAKYoEx9YEgSTQEtLr5TwL+85zX+o8oFnKNQbRTw9cCiJDvt4R0WX7+HrxWYFm86CniA85Loo4/3Kc4R6ph4GjDTap3YNUdVgbuS7J6PdwswLv5R8WzKA9s9N8OCTQJtcu6xJOsJiHEIWLL5l4Cd4hkluJmtgioUPg2ck/O/pbw1IM57YMxWTgAnxPM5/5sBroZRAQv+EqbT2pWVcnsB8UakrDPN6Tx8N+YNlSz7YkST78LZJA4GxOthdbN7JNfbCHGG0CvJ5oCN4hkTzzimw3rpgfjvhAWrSuFcw04C28TXgXN4fOIT95N4z0ZVAZ1Z5vBejOia942H74z4FvB/W2tWHc6tj04ffw1merCMmS6cdPG0AD8l5qso4MEMbfZEXwneBEtiJmqNLtdSmOZnj7kI7I2qAlck2UAJsdzgl4FbYYB6DVf6h5QrAX4E2C3n08DDKCugi4fGoEBFwL/EvOFIdZzVrztLcX8uXs0mU2ScNasWs9FqT95VIvxgueAtpQVgBrPp5Kc9lQIPZhGhc/MZzM6DwiQwy0BdScUGb+mGC5DVJwaB+5j9mwkPX6zwlvo84IKO/kqAt3QNMxMt9ONEaMvAMNWE2SWe9QCP5fPQWj7y1QBH8qCNmH2gLPCOCv9AV1VVVVWgVgAPDHRgefYM4AAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOS0xNlQxNDo1OTozMiswMDowMOFciqoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDktMTZUMTQ6NTk6MzIrMDA6MDCQATIWAAAAAElFTkSuQmCC",title:"Link",disabled:function(){return t.isLinkButtonDisabled()},action:function(){t.editLink()}},image:{name:"image",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAABzUlEQVRo3u2ZyUrDUBSGvzosxLEqqAj6AKJvIK58AKdncOXeCUdc+BKiILoQhYLgwpUg4hOIIu4UdyotKDi0LpJLQ8hNk7S9p4X7wYHCPWn+L0N7cwMWWRqr/P0bwARwJS2aNHzBrTXpMHHZdIN/u1UAVqRDJQk/BUx7JFalw8UNr5ihDs6ELrxiFvhxe5alw/rZKhE+SGJJOnTc8Io5j8RiuTtPlRgfBNaBcaBPs32X+/kXyEXcbwfF/6B3TU8OyODc+NkkcsPAM8Xfcql69BykWJzUQHhVe7qQYZdQFmhPYl4FPoB03I38R8EkvVH332A4WMWxAtJYAWmsgDRWQBorII0VkKbSAmmgW1pKkWQ6fQZcUv6SZeTpdCUFFjy9OyV6Sz2LGxcYA748vXmcJZQg+oFroKdWBNqA+4D+HDDi620Bbt3xc/T3oFGBQ/QP4w9Ap9uXAo5847oVOmMC8yHhVWXc8NsBY3/ApJTAKPAZQUBdLnnN2CswYFqgFbiLGD5K3QDNJgX2Kxhe1a5JgWpj14XqhroXaAoZy+Ks4ytM3wdedO8QQs/AhWBgP6dJNhoCXpB/N/BEcTqSSOIYZ33edPA34ABn9mqpWf4B0/l4sgdYXjsAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjItMDktMTZUMTU6MDE6MTUrMDA6MDDZyIZqAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIyLTA5LTE2VDE1OjAxOjE1KzAwOjAwqJU+1gAAAABJRU5ErkJggg==",title:"Image",disabled:function(){return t.isImageButtonDisabled()},action:function(){t.editImage()}},head:{name:"head",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAADI0lEQVRo3u2ZT09TQRTFf4KtCRBNwJIodK0LdwgWd+BnMBDdgaisCYluXAqu1QBxSeKfGFeKSz6AAZMaNzRxYQWbKC6gKGWhdTGvyePOtH3TzrQYe5JZzOvMmXPfu3PvnSm00ML/jWOOeNqBIWAEGADOA2eAruD3PeArsAGsA6vAO+BPs19AEpgHNoGiZfsCzAH9zRCeAJaAgxqEy3YALACnGyX+GvDDgXDZtoFxn8JjwJMKAnaAp8ANYDD4SrGgJYJnU8AzYLcCz2Iwxyk6gLdlFtwAJoIxNnyTQKYM54olX9U3bxL/C5gBjtfJPQvsG/jf4OhLmNwmA1xw9YaAFCrMynUW6iW+biB9j/Jp1+gH0ob1xmolTKBHm4wn8WEjcmLN70BPLWRL6D7v0m3KIQUUxNqPbUmS6ElqpgHiS7gn1i5gmbHn0UNlPdHGFl3orjQXdXI7em0z0UDxJUwLDVmgLcrEYTFxB4dJxQKdQF5oGZKDTBaNiP4KagM3Gj+DtcMYjWLAgOivNkF8ubWlNqMB50Q/Lfpx4AEqc26hNnzc0xi5ttRmhExesk6XEaoYPPMxphc9qVWFjP/yrZhqlpynMSfQ88EhRApLAkXDs9+exlSFyYA90T8p+suGOcuexpwS/XwUoz5SOfbGUb66ReUN6mJMSmj5EMWAV2LSVJRJnnBLaHkpB5hcaE30R2kerlTRZoT8bLscnVJiMMrENtSlU3jiZBMMmBIaPmMRNefE5AwerjoqIA58Ehru2xD0oye02QYacAc9gfXZkiwIkn3U/vCNy+hHyoe1EHWjag+Z6pMexZ9FP0xtU8e96Th6vZLGz41yEpWo5HpX6yVeNJDmcOtOw+hn4CLwyAV5DHUykuQF1O1BZx3cceAuus8Xgdc4vEjoKGNE6WtMWxrSCdxED5Vh8c6TZww9MoVbHniOql8uoQ4j8aD1Bs9uAy/QM6x0G69XOGPo0clF+4aDDRsVPajrPpPv2rYCKs53N0p8GH2osiNbg/AsqjywzrBhuPqbtQ24iCq9B1C3B30c/pt1E1VTraGuS9Y5An+zttDCv46/K53XmFVUFdIAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjItMDktMjRUMDc6MTM6NTQrMDA6MDAX56YDAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIyLTA5LTI0VDA3OjEzOjU0KzAwOjAwZroevwAAAABJRU5ErkJggg==",title:"Edit head",disabled:function(){return t.isHeadButtonDisabled()},action:function(){t.editHead()}},save:{name:"save",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAABvklEQVRo3u2Zu0oDQRSGv0jUWKigTZAIYiH2Bn0FOx/AQiSVVV4hpYiVta3YeEGsLSwEo40+gRcQO4MXtIzF7uKyzGSzs3NmDcwPU+25/N/mZGaXBS8vL6//rEXgFPgAusKrZdv8LPDmwLgYxJFj89YhXIyNKESyqJSWUI/q9qAAiEHoAGyNiTiEawDrEEUA9IIYGACAlX7jSykAqlhbf+hSyvVuP/FDlswUJg9QtMoGOWmz61QD/wt4gKIlAVABmkAb+ArXNbAFjGSo85rXiMlRXgPu0Z++hxn6jwIN4DlD/1wAlRTzB8C4gY9p4NwFQLOH+V3ybb9GuVkB2ujvfCFnR1aAT0XOIzBh2L/qGuBbkbNu2LtO8E5gmm8EcJuIf8Jsm64DnbDGD7DsCmAzEW/yGhg3H60rVwBl4CYWv6qJm8lg/gGYcwUAMMXfblRTXG+FJuvS5k0BIJj7DWBYYT6qFYcQMZ8HQKedRL0OwaOCiHkJgBKwr6ib3LnmbZgHeE9plrbWFDXLwJkm3tqdj3SSE2BPU3cMuJQ2D7BAvg8cLwSPxCpNAneS5uMQx5iPU6NH7SpwIWney8vLS16/eT7oBHxeUFYAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjItMDktMTdUMTY6Mjk6NTQrMDA6MDCj7IdOAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIyLTA5LTE3VDE2OjI5OjU0KzAwOjAw0rE/8gAAAABJRU5ErkJggg==",icon2:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAABvklEQVRo3u2Zu0oDQRSGv0jUWKigTZAIYiH2Bn0FOx/AQiSVVV4hpYiVta3YeEGsLSwEo40+gRcQO4MXtIzF7uKyzGSzs3NmDcwPU+25/N/mZGaXBS8vL6//rEXgFPgAusKrZdv8LPDmwLgYxJFj89YhXIyNKESyqJSWUI/q9qAAiEHoAGyNiTiEawDrEEUA9IIYGACAlX7jSykAqlhbf+hSyvVuP/FDlswUJg9QtMoGOWmz61QD/wt4gKIlAVABmkAb+ArXNbAFjGSo85rXiMlRXgPu0Z++hxn6jwIN4DlD/1wAlRTzB8C4gY9p4NwFQLOH+V3ybb9GuVkB2ujvfCFnR1aAT0XOIzBh2L/qGuBbkbNu2LtO8E5gmm8EcJuIf8Jsm64DnbDGD7DsCmAzEW/yGhg3H60rVwBl4CYWv6qJm8lg/gGYcwUAMMXfblRTXG+FJuvS5k0BIJj7DWBYYT6qFYcQMZ8HQKedRL0OwaOCiHkJgBKwr6ib3LnmbZgHeE9plrbWFDXLwJkm3tqdj3SSE2BPU3cMuJQ2D7BAvg8cLwSPxCpNAneS5uMQx5iPU6NH7SpwIWney8vLS16/eT7oBHxeUFYAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjItMDktMTdUMTY6Mjk6NTQrMDA6MDCj7IdOAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIyLTA5LTE3VDE2OjI5OjU0KzAwOjAw0rE/8gAAAABJRU5ErkJggg==",title:"Save",disabled:function(){return t.isSaveButtonDisabled()},action:function(){t.save()}},agent:{name:"agent",icon:"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEyIDJDNi40NzcgMiAyIDYuNDc3IDIgMTJzNC40NzcgMTAgMTAgMTAgMTAtNC40NzcgMTAtMTBTMTcuNTIzIDIgMTIgMnptMCAyYzQuNDE4IDAgOCAzLjU4MiA4IDhzLTMuNTgyIDgtOCA4LTgtMy41ODItOC04IDMuNTgyLTggOC04eiIvPjxwYXRoIGZpbGw9IiMwMDAiIGQ9Ik0xMiA2Yy0zLjMxNCAwLTYgMi42ODYtNiA2czIuNjg2IDYgNiA2IDYtMi42ODYgNi02LTIuNjg2LTYtNi02em0wIDJjMi4yMDkgMCA0IDEuNzkxIDQgNHMtMS43OTEgNC00IDQtNC0xLjc5MS00LTQgMS43OTEtNCA0LTR6Ii8+PC9zdmc+",title:"AI Agent",disabled:function(){return t.isAgentButtonDisabled()},action:function(){t.editAgent()}},github:{name:"github",icon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAADIklEQVRo3u2Y20tUQRzHPyrdzFKoxUv5WlGhkCX10JUgejQquzxE/0IQRBYVBAoSJSZmvfYqFpQEQXSBoCihx+olSreLRmDXLWt7mFl2nT0zZ845c45B+4UB2d+c7+/7nRln5jdQQgn/N8oc8VQArcBWoAVYAdQDVTL+BUgDz4GnwB3gMfBnpgegEegCRoFswPYG6ASWzoTwFDAAZEIIV1sG6AcWJyX+APDRgXC1TQD74hQ+C7gSg3C1XZK5nKISGE5AfK7dlDmdjXyS4nPtNjDbhYEklo2u9UcVf1BDfAHYBfQB7yMIfAdclFw9mj7tYcWn0O82Kwv6zQM6gM8yNoU4sB4ilt6w/PuFjGVl3w75bQ6rNLnGgUVhDAxoCL9p+jcAG8mfvl6okn0aNPHvmpx9QcU3oj+kJsKMhiV0M/6DgCd2F/p1+5vpU+8KlZJbl7fTlqgC/7tNUwwGmnxyvgbKbYg2+BANxCA+h8s+uVttSI4bCCYJuSNYIkV+N/Nqx9QPvKZkrSHBEOIfLS6MA9cN8RYbA8sMBPdiFJ/DXUNsuY2BegPBWAIGRg2xIm1eBkwH0UxjgY2BKQNBElVTyhAr0uZlwHTS1iVgwLSEi7R5GRg3EGxKwMBmQ+yDjYFXBoJtOKyUPDAf2GKIF2nzMvDAQFAFHInRwFHMA3TfhqQZ83E+CayOQXwz4gEs8h2sHPHoZCJKy4SusAZRnTm5zAGcUD7+BLxUfssAZ4HaCMKXAN3ALx/xWcQdzRq1TC9oeuXv6xDlomrkFuKitRNYaOCtAdqAk4j3URvhWUSlZjofPNGrkFxF1AqN6Av5Z8BcA+ccYMRStPqIEBjViLVeSHRGxnaQL9AL22EL3vaA4sd8ZtWIPQrZV/Kn8XbgEfATccDcwG6aGwIa2B1WfA7nFMLzEfkqAojvjioexNY1VEA6BRyKyGkjfpAA26YfKoFrSoJhYD+wHlEptTk0MEgMLx9lwGmfxC4M9OBw5L2wl+LdyYWBNGLTSAQ1iOc+9fUujIEM4oG3OinxhagDTiFG70mA70aAt4glmUSRVEIJJfyr+AubsTWHiHv2sgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOS0yOVQxNjozMzoyNCswMDowMAydbHEAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDktMjlUMTY6MzM6MjQrMDA6MDB9wNTNAAAAAElFTkSuQmCC",title:"Github",disabled:function(){return!1},action:function(){var e=document.createElement("a"),t=document.querySelector("#ncsedt-implement");e.setAttribute("href","https://github.com/FranBarInstance/simple-html-editor"),e.setAttribute("target","_blank"),t.appendChild(e),e.click()}}},draggerIcon:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAAA+klEQVRo3u3ZUQ7CIBAE0NGDGOL9r+SHJ6k/bWJIkV3KDrvCJHx3XgwsrcDKiuukfYXMA8ALwBvAc3SZ1vLbvkIh8vKhEKXyIRC18q4R0vIuEdryrhCt5bshboa4jfGsuyGAkukAidDJ7BnHhpUm37DSmJxO36eNNaD7EZsflQxAN8TZOc8CXEaUhhQT0Iz4NWHZADXi6vXAaokQXssXEeEn8Vm8/grd9oE0wzZxDcEGdJ8FTIDJNGYBzO5DDIDpjdQaYPqynwgAzTPWS/3wTA/QTOy/+zrnonwrwlV5LcJleSnCdfkaIkT5EiJU+RwRsvyRhMB/dK9MkQ9aiYmYo9JGZAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOS0xNlQxMjoyOTo1MSswMDowMJ8FU+4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDktMTZUMTQ6Mjk6NTErMDA6MDDuWOtSAAAAAElFTkSuQmCC"};this.options=this.deepMerge(n,e),this.options.mutationGroupingWindowMs=this.options.mutationGroupingWindowMs/1e4,this.sessionConfig={aiBackends:JSON.parse(JSON.stringify(this.options.aiBackends))},this.editingEnabled=null,this.clipboard=null,this.editable=document.querySelector(this.options.editableContentSelector),this.editableInBody(),this.wrapEditable(),this.implement=document.querySelector("#ncsedt-implement"),this.implementToLastBody(),this.focusedElement=this.editable,this.previousFocusedElement=this.focusedElement,this.observer=this.setObserver(),this.historyUndo=[],this.historyRedo=[],this.historyForce=[],this.setEventEditorChanges()},ncSimpleHtmlEditor.prototype.deepMerge=function(e,t){for(key of Object.keys(t))e.hasOwnProperty(key)&&"object"==typeof t[key]?this.deepMerge(e[key],t[key]):e[key]=t[key];return e},ncSimpleHtmlEditor.prototype.isEditingEnabled=function(){return this.editingEnabled},ncSimpleHtmlEditor.prototype.getCurrentFocusedElement=function(){return this.focusedElement},ncSimpleHtmlEditor.prototype.getPreviousFocusedElement=function(){return this.previousFocusedElement},ncSimpleHtmlEditor.prototype.getEditable=function(e,t){return this.editable},ncSimpleHtmlEditor.prototype.getClipboard=function(e,t){return this.clipboard},ncSimpleHtmlEditor.prototype.editableInBody=function(){this.editable.contains(document.body)&&this.editable!=document.body&&(this.options.editableContentSelectorContentSelector="body",this.editable=document.querySelector(this.options.editableContentSelector))},ncSimpleHtmlEditor.prototype.wrapEditable=function(){this.editable=((e,t=document.createElement("ncsedt-editable"))=>([...e.childNodes].forEach((e=>t.appendChild(e))),e.appendChild(t),t))(this.editable),this.editable.id="ncsedt-editable",this.editable.setAttribute("contentEditable","true")},ncSimpleHtmlEditor.prototype.implementToLastBody=function(){var e=document.createDocumentFragment();e.appendChild(this.implement),document.body.appendChild(e),this.implement.insertAdjacentHTML("beforeend",'<div id="ncsedt-container"></div>'),this.implement.insertAdjacentHTML("beforebegin","\x3c!-- ncsedt-implement:begin --\x3e"),this.implement.insertAdjacentHTML("afterend","\x3c!-- ncsedt-implement:end --\x3e"),this.container=document.getElementById("ncsedt-container"),this.container.insertAdjacentHTML("beforebegin","\x3c!-- ncsedt-container:begin --\x3e"),this.container.insertAdjacentHTML("afterend","\x3c!-- ncsedt-container:end --\x3e")},ncSimpleHtmlEditor.prototype.start=function(){this.editOff(),this.tollbar=this.renderTollbar(),this.dialogCode=this.renderDialogCode(),this.dialogImage=this.renderDialogImage(),this.dialogLink=this.renderDialogLink(),this.dialogHead=this.renderDialogHead(),this.dialogAgent=this.renderDialogAgent(),this.dialogConfig=this.renderConfigDialog(),this.movable("#ncsedt-toolbar","#ncsedt-toolbar-dragger"),this.movable("#ncsedt-dialog-code","#ncsedt-dialog-code .dragger"),this.movable("#ncsedt-dialog-image","#ncsedt-dialog-image .dragger"),this.movable("#ncsedt-dialog-link","#ncsedt-dialog-link .dragger"),this.movable("#ncsedt-dialog-head","#ncsedt-dialog-head .dragger"),this.movable("#ncsedt-dialog-agent","#ncsedt-dialog-agent .dragger"),this.movable("#ncsedt-dialog-config","#ncsedt-dialog-config .dragger"),this.setEvents(),this.setEventsToolbar(),this.setEventsDialogCode(),this.setEventsDialogImage(),this.setEventsDialogLink(),this.setEventsDialogHead(),this.setEventsDialogAgent(),this.setupConfigDialogEvents(),document.dispatchEvent(new Event("editorstart"))},ncSimpleHtmlEditor.prototype.editOn=function(){var e=document.querySelectorAll(".ncsedt-toolbar-btn-edit img");for(element of(this.editable.setAttribute("contentEditable","true"),e))element.src=this.options.buttons.edit.icon2;this.editingEnabled=!0,this.setFocus(this.focusedElement),this.observe(),document.dispatchEvent(new Event("editorchanges"))},ncSimpleHtmlEditor.prototype.editOff=function(){this.observer.disconnect();var e=document.querySelectorAll("*[contentEditable]"),t=document.querySelectorAll(".ncsedt-toolbar-btn-edit img");for(element of e)element.setAttribute("contentEditable","false");for(element of t)element.src=this.options.buttons.edit.icon;for(focused of document.querySelectorAll(".focused"))focused.classList.remove("focused");this.editingEnabled=!1,document.dispatchEvent(new Event("editorchanges"))},ncSimpleHtmlEditor.prototype.setFocus=function(e){if(this.editingEnabled&&e&&e.isContentEditable){for(oldfocused of document.querySelectorAll(".focused"))oldfocused.classList.remove("focused");this.previousFocusedElement=this.focusedElement,this.focusedElement=e,this.focusedElement.focus(),this.focusedElement.classList.add("focused"),document.dispatchEvent(new Event("focusedchange"))}},ncSimpleHtmlEditor.prototype.save=function(){var e=this,t=this.getDocumentHTML(),n=document.createElement("a"),i=document.querySelectorAll(".ncsedt-toolbar-btn-save img");for(button of(this.saving=!0,this.editOff(),i))button.src=this.options.buttons.save.icon2,button.parentNode.disabled=!0;n.setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(t)),n.setAttribute("download","index.html"),this.container.appendChild(n),n.click(),setTimeout((function(){for(button of(e.saving=!1,i))button.src=e.options.buttons.save.icon,button.parentNode.disabled=!1}),this.options.saveTimeout),this.container.removeChild(n),this.editOn()},ncSimpleHtmlEditor.prototype.getDocumentHTML=function(e=null){var t="";return window.scrollTo({top:0,left:0,behavior:"instant"}),this.restorable.restore(),this.removable(),t=e?document.querySelector(e).innerHTML:(new XMLSerializer).serializeToString(document),this.undoRemovable(),this.restorable.undoRestore(),this.ncsedtRemover(t)},ncSimpleHtmlEditor.prototype.ncsedtRemover=function(e){return e=(e=(e=(e=(e=e.replace(/<ncsedt-removable>\s*<\/ncsedt-removable>/gis,"")).replace(/<!--\s*ncsedt-implement:before\s*-->.*<\/ncsedt-editable>/gis,"</ncsedt-editable>")).replace(/<!--\s*ncsedt-implement:begin\s*-->.*<!--\s*ncsedt-implement:end\s*-->/gis,"")).replace(/<!--\s*ncsedt-container:begin\s*-->.*<!--\s*ncsedt-container:end\s*-->/gis,"")).replace(/<\/?ncsedt-editable[^>]*>/gis,"")},ncSimpleHtmlEditor.prototype.removable=function(){var e=this,t=0;this.removableHtml=[],document.querySelectorAll("ncsedt-removable").forEach((function(n){e.removableHtml[t++]=n.innerHTML,n.innerHTML=""}))},ncSimpleHtmlEditor.prototype.undoRemovable=function(){var e=this,t=0;document.querySelectorAll("ncsedt-removable").forEach((function(n){n.innerHTML=e.removableHtml[t++]}))},ncSimpleHtmlEditor.prototype.editToggle=function(){this.editingEnabled?this.editOff():this.editOn()},ncSimpleHtmlEditor.prototype.undo=function(){this.undoredo(!0)},ncSimpleHtmlEditor.prototype.redo=function(){this.undoredo(!1)},ncSimpleHtmlEditor.prototype.up=function(){this.focusedElement.parentElement&&(this.setFocus(this.focusedElement.parentElement),this.focusedElement.scrollIntoView({block:"center"}))},ncSimpleHtmlEditor.prototype.down=function(){this.focusedElement.firstElementChild&&(this.setFocus(this.focusedElement.firstElementChild),this.focusedElement.scrollIntoView({block:"center"}))},ncSimpleHtmlEditor.prototype.previous=function(){this.focusedElement.previousElementSibling?(this.setFocus(this.focusedElement.previousElementSibling),this.focusedElement.scrollIntoView({block:"center"})):this.focusedElement.parentElement.previousElementSibling?(this.setFocus(this.focusedElement.parentElement.previousElementSibling),this.focusedElement.scrollIntoView({block:"center"})):this.focusedElement.parentElement.parentElement&&this.focusedElement.parentElement.parentElement.previousElementSibling&&(this.setFocus(this.focusedElement.parentElement.parentElement.previousElementSibling),this.focusedElement.scrollIntoView({block:"center"}))},ncSimpleHtmlEditor.prototype.next=function(){this.focusedElement.nextElementSibling?(this.setFocus(this.focusedElement.nextElementSibling),this.focusedElement.scrollIntoView({block:"center"})):this.focusedElement.parentElement.nextElementSibling?(this.setFocus(this.focusedElement.parentElement.nextElementSibling),this.focusedElement.scrollIntoView({block:"center"})):this.focusedElement.parentElement.parentElement&&this.focusedElement.parentElement.parentElement.nextElementSibling&&(this.setFocus(this.focusedElement.parentElement.parentElement.nextElementSibling),this.focusedElement.scrollIntoView({block:"center"}))},ncSimpleHtmlEditor.prototype.copy=function(){this.focusedElement!=this.editable&&(this.clipboard=this.focusedElement.outerHTML,document.dispatchEvent(new Event("editorchanges")))},ncSimpleHtmlEditor.prototype.cut=function(){this.focusedElement!=this.editable&&(this.clipboard=this.focusedElement.outerHTML,this.focusedElement.parentElement.removeChild(this.focusedElement),this.setFocus(this.focusedElement.parentElement))},ncSimpleHtmlEditor.prototype.paste=function(){this.clipboard&&this.focusedElement!=this.editable&&this.focusedElement.insertAdjacentHTML("afterend",this.clipboard)},ncSimpleHtmlEditor.prototype.isAgentButtonDisabled=function(){return!this.editingEnabled},ncSimpleHtmlEditor.prototype.isEditButtonDisabled=function(){return!1},ncSimpleHtmlEditor.prototype.isSaveButtonDisabled=function(){return!this.editingEnabled||this.saving},ncSimpleHtmlEditor.prototype.isUndoButtonDisabled=function(){return!this.isEditingEnabled()||!this.hasUndoHistory()},ncSimpleHtmlEditor.prototype.hasUndoHistory=function(){return this.historyUndo.length>0},ncSimpleHtmlEditor.prototype.isRedoButtonDisabled=function(){return!this.isEditingEnabled()||!this.hasRedoHistory()},ncSimpleHtmlEditor.prototype.hasRedoHistory=function(){return this.historyRedo.length>0},ncSimpleHtmlEditor.prototype.isUpButtonDisabled=function(){return!this.editingEnabled||!this.canMoveUp()},ncSimpleHtmlEditor.prototype.canMoveUp=function(){return this.focusedElement.parentElement&&this.focusedElement.parentElement.isContentEditable},ncSimpleHtmlEditor.prototype.isDownButtonDisabled=function(){return!this.editingEnabled||!this.canMoveDown()},ncSimpleHtmlEditor.prototype.canMoveDown=function(){return this.focusedElement.firstElementChild},ncSimpleHtmlEditor.prototype.isPreviousButtonDisabled=function(){return!this.editingEnabled||!this.canMovePrevious()},ncSimpleHtmlEditor.prototype.canMovePrevious=function(){return this.focusedElement.previousElementSibling||this.focusedElement.parentElement&&this.focusedElement.parentElement.previousElementSibling||this.focusedElement.parentElement&&this.focusedElement.parentElement.parentElement&&this.focusedElement.parentElement.parentElement.previousElementSibling},ncSimpleHtmlEditor.prototype.isNextButtonDisabled=function(){return!this.editingEnabled||!this.canMoveNext()},ncSimpleHtmlEditor.prototype.canMoveNext=function(){return this.focusedElement.nextElementSibling||this.focusedElement.parentElement&&this.focusedElement.parentElement.nextElementSibling||this.focusedElement.parentElement&&this.focusedElement.parentElement.parentElement&&this.focusedElement.parentElement.parentElement.nextElementSibling},ncSimpleHtmlEditor.prototype.isCutButtonDisabled=function(){return!this.editingEnabled||this.focusedElement==this.editable},ncSimpleHtmlEditor.prototype.isCopyButtonDisabled=function(){return!this.editingEnabled||this.focusedElement==this.editable},ncSimpleHtmlEditor.prototype.isPasteButtonDisabled=function(){return!this.editingEnabled||!this.clipboard||this.focusedElement==this.editable},ncSimpleHtmlEditor.prototype.isLinkButtonDisabled=function(){return!this.editingEnabled},ncSimpleHtmlEditor.prototype.isImageButtonDisabled=function(){return!this.editingEnabled},ncSimpleHtmlEditor.prototype.isHeadButtonDisabled=function(){return!this.editingEnabled},ncSimpleHtmlEditor.prototype.isCodeButtonDisabled=function(){return!this.editingEnabled},ncSimpleHtmlEditor.prototype.validateOptions=function(e){if(e.editableContentSelector&&"string"!=typeof e.editableContentSelector)throw new Error('Option "editable" must be a string selector');if(e.maxImageSizeBytes&&"number"!=typeof e.maxImageSizeBytes)throw new Error('Option "maxImageUpload" must be a number');if(e.toolbar&&!Array.isArray(e.toolbar))throw new Error('Option "toolbar" must be an array');if(e.mutationGroupingWindowMs&&(e.mutationGroupingWindowMs=Math.max(100,e.mutationGroupingWindowMs)),e.maxImageSizeBytes&&(e.maxImageSizeBytes=Math.min(e.maxImageSizeBytes,5e6)),e.aiBackends){const t=["ollama","openrouter","anthropic","azure","gemini","openai"];for(const n of t)e.aiBackends[n]&&("boolean"!=typeof e.aiBackends[n].enabled&&(e.aiBackends[n].enabled=!1),"azure"===n?e.aiBackends[n].url&&e.aiBackends[n].model||(e.aiBackends[n].enabled=!1):"ollama"!==n&&(e.aiBackends[n].apiKey||(e.aiBackends[n].enabled=!1)))}},ncSimpleHtmlEditor.prototype.setObserver=function(){return new MutationObserver((function(e){_this.editingEnabled&&!_this.ignoreMutations&&(e.forEach((function(e){switch(e.time=Date.now()/1e4,e.type){case"characterData":e.newValue=e.target.nodeValue,_this.historyUndo.push(e),_this.resetLinearHistory(),document.dispatchEvent(new Event("contentchanges"));break;case"attributes":var t=e.attributeName,n=e.target.getAttribute(e.attributeName);(_this.focusedElement.contains(e.target)||document.head.contains(e.target))&&_this.historyForceCheck(t,n)&&(e.newValue=n,_this.historyUndo.push(e),_this.historyForceRemove(t,n),_this.resetLinearHistory(),document.dispatchEvent(new Event("contentchanges")));break;case"childList":_this.historyUndo.push(e),_this.resetLinearHistory(),document.dispatchEvent(new Event("contentchanges"));break}})),document.dispatchEvent(new Event("editorchanges")))}))},ncSimpleHtmlEditor.prototype.observe=function(){this.observer.observe(this.editable,{attributes:!0,characterData:!0,childList:!0,subtree:!0,attributeOldValue:!0,characterDataOldValue:!0}),this.options.toolbar.includes("head")&&this.observer.observe(document.head,{attributes:!0,characterData:!0,childList:!0,subtree:!0,attributeOldValue:!0,characterDataOldValue:!0})},ncSimpleHtmlEditor.prototype.resetLinearHistory=function(){this.historyRedo.length&&this.options.usesLinearUndoHistory&&(this.historyRedo=[])},ncSimpleHtmlEditor.prototype.historyForcePush=function(e,t){var n=e+":"+t.toString();this.historyForce.push(n)},ncSimpleHtmlEditor.prototype.historyForceCheck=function(e,t){var n=e+":"+(t||"").toString();return this.historyForce.includes(n)},ncSimpleHtmlEditor.prototype.historyForceRemove=function(e,t){var n=e+":"+t.toString();this.historyForce.includes(n)&&this.historyForce.splice(this.historyForce.indexOf(n),1)},ncSimpleHtmlEditor.prototype.undoredo=function(e){this.observer.disconnect();for(var t=null;;){if(e){if(!this.historyUndo.length)break;var n=this.historyUndo.pop();if(this.historyRedo.push(n),t&&n.time+_this.options.mutationGroupingWindowMs<t){this.historyUndo.push(n),this.historyRedo.pop();break}}else{if(!this.historyRedo.length)break;if(n=this.historyRedo.pop(),this.historyUndo.push(n),t&&n.time-_this.options.mutationGroupingWindowMs>t){this.historyRedo.push(n),this.historyUndo.pop();break}}switch(n.type){case"characterData":(n.target.parentElement.parentElement.parentElement||n.target.parentElement.parentElement||n.target.parentElement).scrollIntoView({block:"center"}),this.setFocus(n.target.parentElement),n.target.textContent=e?n.oldValue:n.newValue;break;case"attributes":n.target.scrollIntoView({block:"center"}),this.setFocus(n.target);var i=e?n.oldValue:n.newValue;null===i?n.target.removeAttribute(n.attributeName):n.target.setAttribute(n.attributeName,i);break;case"childList":n.target.scrollIntoView({block:"center"}),this.setFocus(n.target);var o=e?n.removedNodes:n.addedNodes,s=e?n.addedNodes:n.removedNodes;Array.from(o).forEach(n.nextSibling?e=>{n.nextSibling.parentNode.insertBefore(e,n.nextSibling)}:e=>{n.target.appendChild(e)}),Array.from(s).forEach((function(e){e.parentNode.removeChild(e)}));break}t=n.time}this.observe(),document.dispatchEvent(new Event("editorchanges")),document.dispatchEvent(new Event("contentchanges"))},ncSimpleHtmlEditor.prototype.setEventEditorChanges=function(){var e=this;document.addEventListener("editorchanges",(function(){e.setDisabledBtns()}))},ncSimpleHtmlEditor.prototype.setEvents=function(){var e=this;this.editable.addEventListener("click",(function(t){e.focusedElement!=t.target&&e.setFocus(t.target)}),!0),this.editable.addEventListener("input",(function(t){"insertParagraph"==t.inputType&&setTimeout((function(){e.setFocus(document.getSelection().anchorNode)}),50)}),!0),this.editable.addEventListener("dblclick",(function(){"A"==e.focusedElement.tagName||"A"==e.focusedElement.parentElement.tagName?e.command(e.options.buttons.link):"IMG"==e.focusedElement.tagName||"IMG"==e.focusedElement.parentElement.tagName?e.command(e.options.buttons.image):e.command(e.options.buttons.code)}),!0),document.addEventListener("contentchanges",(function(){window.onbeforeunload=function(e){return e.returnValue="",""}}))},ncSimpleHtmlEditor.prototype.setEventsToolbar=function(){for(var e of(_this=this,this.options.toolbar)){var t=this.options.buttons[e],n=document.querySelectorAll(".ncsedt-toolbar-btn-"+t.name);for(btn of n)btn.addEventListener("click",i(t))}function i(e){return function(t){_this.command(e)}}},ncSimpleHtmlEditor.prototype.command=function(e){e.action()},ncSimpleHtmlEditor.prototype.setDisabledBtns=function(){for(var e of this.options.toolbar){var t=this.options.buttons[e],n=document.querySelectorAll(".ncsedt-toolbar-btn-"+t.name);for(button of n)button.disabled=t.disabled()}},ncSimpleHtmlEditor.prototype.movable=function(e,t){new ncSimpleMoveable(e,t)},ncSimpleHtmlEditor.prototype.renderTollbar=function(){var e=document.createElement("toolbar");for(var t of(e.id="ncsedt-toolbar",e.classList.add("ncsedt-toolbar"),e.innerHTML='<button class="ncsedt-toolbar-dragger ncsedt-toolbar-btn" id="ncsedt-toolbar-dragger"> <img class="ncsedt-toolbar-icon-dragger ncsedt-toolbar-icon" src="'+this.options.draggerIcon+'" title="Move"></button>',this.options.toolbar)){var n=this.options.buttons[t],i=document.createElement("button");i.classList.add("ncsedt-toolbar-btn"),i.classList.add("ncsedt-toolbar-btn-"+n.name),i.disabled=n.disabled(),i.innerHTML='<img class="ncsedt-toolbar-icon" src="'+n.icon+'" title="'+n.title+'">',e.append(i)}if(this.container.append(e),this.options.toolbarCols){var o=window.getComputedStyle(e),s=parseInt(o.getPropertyValue("padding")),l=parseInt(o.getPropertyValue("border"));e.style.width=42*this.options.toolbarCols+2*s+2*l+"px"}return e},ncSimpleHtmlEditor.prototype.renderConfigDialog=function(){const e=`\n <dialog id="ncsedt-dialog-config" class="ncsedt-dialog" style="width: 500px;">\n <div class="ncsedt-btns">\n <div class="ncsedt-btns-left">\n <button type="button" class="sbutton dragger">\n <img src="${this.options.draggerIcon}" title="Move">\n <span>Configure AI Backend</span>\n </button>\n </div>\n <div class="ncsedt-btns-right">\n <button type="button" class="sbutton cancel"> <b>⨯</b> </button>\n </div>\n </div>\n <div class="body">\n <div class="backend-selector">\n <label style="width: 20%;text-align: right;">Backend:</label>\n <select id="ncsedt-config-backend" class="sbutton">\n <option value="ollama">Ollama</option>\n <option value="openrouter">OpenRouter</option>\n <option value="anthropic">Anthropic</option>\n <option value="azure">Azure</option>\n <option value="gemini">Gemini</option>\n <option value="openai">OpenAI</option>\n </select>\n </div>\n\n <div id="ncsedt-config-fields">\n \x3c!-- Los campos se generarán dinámicamente --\x3e\n </div>\n </div>\n <div class="ncsedt-btns">\n <div class="ncsedt-btns-right">\n <button type="button" class="sbutton confirm">✓ Save</button>\n </div>\n </div>\n </dialog>\n `;return this.container.insertAdjacentHTML("beforeend",e),document.getElementById("ncsedt-dialog-config")},ncSimpleHtmlEditor.prototype.setupConfigDialogEvents=function(){const e=this,t=document.getElementById("ncsedt-dialog-config");document.getElementById("ncsedt-config-backend").addEventListener("change",(function(){e.updateConfigFields(this.value)})),document.querySelector("#ncsedt-dialog-config .cancel").addEventListener("click",(function(){t.close()})),document.querySelector("#ncsedt-dialog-config .confirm").addEventListener("click",(function(){e.saveBackendConfig(),t.close()}))},ncSimpleHtmlEditor.prototype.updateConfigFields=function(e){const t=document.getElementById("ncsedt-config-fields"),n=this.sessionConfig.aiBackends[e];let i=`\n <div class="separator"></div>\n <div class="config-field">\n <label for="ncsedt-config-enabled" style="width: 20%;text-align: right;">Enabled:</label>\n <input id="ncsedt-config-enabled" type="checkbox" ${n.enabled?"checked":""}>\n </div>\n <div class="separator"></div>\n <div class="config-field">\n <label for="ncsedt-config-url" style="width: 20%;text-align: right;">API URL:</label>\n <input id="ncsedt-config-url" type="text" value="${n.url||""}" class="sbutton" style="width: 75%">\n </div>\n <div class="separator"></div>\n <div class="config-field">\n <label for="ncsedt-config-model" style="width: 20%;text-align: right;">Model:</label>\n <input id="ncsedt-config-model" type="text" value="${n.model||""}" class="sbutton" style="width: 75%">\n </div>\n <div class="separator"></div>`;"ollama"!==e&&(i+=`\n <div class="config-field">\n <label for="ncsedt-config-apikey" style="width: 20%;text-align: right;">API Key:</label>\n <input id="ncsedt-config-apikey" type="password" value="${n.apiKey||""}" class="sbutton" style="width: 75%">\n </div>\n <div class="separator"></div>`),t.innerHTML=i},ncSimpleHtmlEditor.prototype.saveBackendConfig=function(){const e=document.getElementById("ncsedt-config-backend").value,t=this.sessionConfig.aiBackends[e];if(t.enabled=document.getElementById("ncsedt-config-enabled").checked,t.url=document.getElementById("ncsedt-config-url").value,t.model=document.getElementById("ncsedt-config-model").value,"ollama"!==e){const e=document.getElementById("ncsedt-config-apikey").value;e&&(t.apiKey=e)}this.updateBackendSelector()},ncSimpleHtmlEditor.prototype.updateBackendSelector=function(){const e=document.getElementById("ncsedt-dialog-agent-backend");e&&Array.from(e.options).forEach((e=>{const t=e.value;this.sessionConfig.aiBackends[t]&&(e.disabled=!this.sessionConfig.aiBackends[t].enabled,e.style.opacity=this.sessionConfig.aiBackends[t].enabled?"1":"0.5")}))},ncSimpleHtmlEditor.prototype.renderDialogAgent=function(){var e='<dialog id="ncsedt-dialog-agent" class="ncsedt-dialog" style="width: 600px;"> <div class="ncsedt-btns"> <div class="ncsedt-btns-left"> <button type="button" class="sbutton dragger"><img class="" src="'+this.options.draggerIcon+'" title="Move"> <span>AI Agent</span></button> </div> <div class="ncsedt-btns-right"> <button type="button" class="sbutton cancel"> <b>⨯</b> </button> </div> </div> <div class="body"> <div class="code-section"> <label>Current Code:</label> <textarea class="code sbutton" placeholder="Current HTML code"></textarea> </div> <div class="separator"></div> <div class="prompt-section"> <label>AI Prompt:</label> <textarea id="ncsedt-dialog-agent-prompt" class="prompt sbutton" placeholder="Enter your instructions for the AI..."></textarea> <div class="ai-config"> <div class="backend-selector"> <button id="ncsedt-dialog-agent-config" type="button" class="sbutton config-models">⚙</button> <select id="ncsedt-dialog-agent-backend" class="sbutton" style="padding: 8px"> <option value="ollama">Ollama</option> <option value="openrouter">OpenRouter</option> <option value="anthropic">Anthropic</option> <option value="azure">Azure</option> <option value="gemini">Gemini</option> <option value="openai">OpenAI</option> </select> <select id="ncsedt-dialog-agent-additional-prompt" class="sbutton" style="padding: 8px"> <option value="none">None</option>';for(const[t,n]of Object.entries(this.options.additionalPrompts))e+=`<option value="${t}"${"only replacement"===t?' selected="selected"':""}>${t}</option>`;e+=' </select> <select id="ncsedt-dialog-agent-custom-prompt" class="sbutton" style="padding: 8px"> <option value="none">Custom prompt</option>';for(const[t,n]of Object.entries(this.options.customPrompts))e+=`<option value="${t}">${t}</option>`;return e+=' </select> <button type="button" class="sbutton execute-ai" style="float: right;">Go!</button> </div> </div> </div> <div class="separator"></div> <div class="response-section"> <label>AI Response:</label> <textarea id="ncsedt-dialog-agent-response" class="response sbutton" placeholder="AI response will appear here..." readonly></textarea> <div class="ai-actions"> <button type="button" class="sbutton copy-response">Copy</button> <button type="button" class="sbutton apply-response">Apply Changes</button> <button type="button" class="sbutton apply-and-close">Apply and Close</button> </div> </div> </div> <div class="ncsedt-btns"> <div class="ncsedt-btns-left"> <button type="button" class="sbutton parent" title="Find parent">⇑</button> <button type="button" class="sbutton child" title="Find child">⇓</button> <button type="button" class="sbutton go-code" title="Edit code"><img class="" src="'+this.options.buttons.code.icon+'" ></button> </div> <div class="ncsedt-btns-right"> <button type="button" class="sbutton ko">⨯ Ko</button> <button type="button" class="sbutton confirm">✓ Ok</button> </div> </div></dialog>',this.container.insertAdjacentHTML("beforeend",e),document.getElementById("ncsedt-dialog-agent")},ncSimpleHtmlEditor.prototype.setEventsDialogAgent=function(){var e=this,t=document.getElementById("ncsedt-dialog-agent-backend");["ollama","openrouter","anthropic","azure","gemini","openai"].forEach((n=>{var i=t.querySelector(`option[value="${n}"]`);e.options.aiBackends[n].enabled&&("ollama"===n||e.options.aiBackends[n].apiKey)&&("azure"!==n||e.options.aiBackends.azure.url&&e.options.aiBackends.azure.model)||(i.disabled=!0,i.style.opacity="0.5")})),document.getElementById("ncsedt-dialog-agent-custom-prompt").addEventListener("change",(function(){const t=this.value,n=document.getElementById("ncsedt-dialog-agent-prompt");"none"!==t&&e.options.customPrompts[t]&&(n.value=e.options.customPrompts[t])})),document.querySelector("#ncsedt-dialog-agent .config-models").addEventListener("click",(function(){const t=document.getElementById("ncsedt-dialog-agent-backend").value,n=document.getElementById("ncsedt-dialog-config");document.getElementById("ncsedt-config-backend").value=t,e.updateConfigFields(t),n.open||n.showModal()})),document.querySelector("#ncsedt-dialog-agent .cancel").addEventListener("click",(function(){e.dialogAgent.close()})),document.querySelector("#ncsedt-dialog-agent .ko").addEventListener("click",(function(){e.dialogAgent.close()})),document.querySelector("#ncsedt-dialog-agent .confirm").addEventListener("click",(function(){e.editAgentConfirm()})),document.querySelector("#ncsedt-dialog-agent .parent").addEventListener("click",(function(){e.editAgentParent()})),document.querySelector("#ncsedt-dialog-agent .child").addEventListener("click",(function(){e.editAgentChild()})),document.querySelector("#ncsedt-dialog-agent .execute-ai").addEventListener("click",(function(){e.executeAIPrompt()})),document.querySelector("#ncsedt-dialog-agent .go-code").addEventListener("click",(function(){e.dialogAgent.open&&e.dialogAgent.close(),e.command(e.options.buttons.code)})),document.querySelector("#ncsedt-dialog-agent .apply-response").addEventListener("click",(function(){var e=document.getElementById("ncsedt-dialog-agent-response").value;document.querySelector("#ncsedt-dialog-agent .code").value=e})),document.querySelector("#ncsedt-dialog-agent .apply-and-close").addEventListener("click",(function(){var t=document.getElementById("ncsedt-dialog-agent-response").value;document.querySelector("#ncsedt-dialog-agent .code").value=t,e.editAgentConfirm()})),document.querySelector("#ncsedt-dialog-agent .copy-response").addEventListener("click",(function(){var e=document.getElementById("ncsedt-dialog-agent-response");e.select(),e.setSelectionRange(0,99999);try{navigator.clipboard.writeText(e.value)}catch(e){}}))},ncSimpleHtmlEditor.prototype.editAgent=function(){this.editingEnabled&&(this.currentSelection=window.getSelection(),this.currentRange=this.currentSelection.getRangeAt(0),this.dialogAgent.querySelector("textarea.code").value=this.focusedElement.innerHTML,this.dialogAgent.open||this.dialogAgent.showModal())},ncSimpleHtmlEditor.prototype.editAgentConfirm=function(){this.dialogAgent.open&&this.dialogAgent.close(),this.editingEnabled&&this.focusedElement.isContentEditable&&this.focusedElement.innerHTML!=this.dialogAgent.querySelector("textarea.code").value&&(this.focusedElement.innerHTML=this.dialogAgent.querySelector("textarea.code").value)},ncSimpleHtmlEditor.prototype.editAgentParent=function(){this.editingEnabled&&this.focusedElement.parentElement&&this.focusedElement.parentElement.isContentEditable&&(this.setFocus(this.focusedElement.parentElement),this.editAgent())},ncSimpleHtmlEditor.prototype.editAgentChild=function(){this.editingEnabled&&this.focusedElement.firstElementChild&&this.focusedElement.firstElementChild.isContentEditable&&(this.setFocus(this.focusedElement.firstElementChild),this.editAgent())},ncSimpleHtmlEditor.prototype.executeAIPrompt=function(){var e=document.getElementById("ncsedt-dialog-agent-prompt").value,t=document.getElementById("ncsedt-dialog-agent-backend"),n=t.options[t.selectedIndex].value,i=document.getElementById("ncsedt-dialog-agent-additional-prompt"),o=i.options[i.selectedIndex].value,s=document.querySelector("#ncsedt-dialog-agent .code").value,l=document.getElementById("ncsedt-dialog-agent-response");if(!e.trim())return void alert("Please enter a prompt for the AI");let a=`User instructions:\n${e}\n\nINPUT:\n${s}`;"none"!==o&&this.options.additionalPrompts[o]&&(a=this.options.additionalPrompts[o]+"\n\n"+a);var d=document.querySelector("#ncsedt-dialog-agent .execute-ai"),c=d.textContent;if(d.disabled=!0,d.textContent="...",l.value="Processing your request...","only replacement"===o){const e=t=>{if(t.detail.backend===n){let e=t.detail.response;e=e.replace(/<think\b[^>]*>[\s\S]*?<\/think\b[^>]*>\s*/gi,""),e=e.replace(/```[a-zA-Z]*\s*/g,""),e=e.replace(/```/g,""),l.value=e}document.removeEventListener("aiSuccess",e)};document.addEventListener("aiSuccess",e)}try{switch(n){case"ollama":this.callOllamaAPI(a,l,d,c);break;case"openrouter":this.callOpenRouterAPI(a,l,d,c);break;case"anthropic":this.callAnthropicAPI(a,l,d,c);break;case"azure":this.callAzureAPI(a,l,d,c);break;case"gemini":this.callGeminiAPI(a,l,d,c);break;case"openai":this.callOpenAIAPI(a,l,d,c);break;default:l.value="Selected backend not implemented",d.disabled=!1,d.textContent=c}}catch(e){l.value="Error calling AI service: "+e.message,d.disabled=!1,d.textContent=c}},ncSimpleHtmlEditor.prototype.callOllamaAPI=function(e,t,n,i){const o="ollama",s=this.sessionConfig.aiBackends.ollama;if(!s.enabled)return t.value="Ollama backend is disabled",n.disabled=!1,void(n.textContent=i);fetch(s.url,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:s.model,prompt:e,stream:!1,options:{temperature:this.options.aiModelParams.temperature,top_p:this.options.aiModelParams.top_p}})}).then((e=>{if(!e.ok)throw new Error(`Ollama API error: ${e.status}`);return e.json()})).then((e=>{t.value=e.response,n.disabled=!1,n.textContent=i;const s=new CustomEvent("aiSuccess",{detail:{backend:o,response:e.response}});document.dispatchEvent(s)})).catch((e=>{t.value="Error calling Ollama API. Make sure Ollama is running locally.\nError: "+e.message,n.disabled=!1,n.textContent=i}))},ncSimpleHtmlEditor.prototype.callOpenRouterAPI=function(e,t,n,i){const o="openrouter",s=this.sessionConfig.aiBackends[o];return s.enabled?s.apiKey?void fetch(s.url,{method:"POST",headers:{Authorization:`Bearer ${s.apiKey}`,"Content-Type":"application/json","HTTP-Referer":"https://github.com/FranBarInstance/simple-html-editor","X-Title":"Simple HTML Editor"},body:JSON.stringify({model:s.model,messages:[{role:"user",content:e}],temperature:this.options.aiModelParams.temperature,top_p:this.options.aiModelParams.top_p,max_tokens:2e3})}).then((e=>e.ok?e.json():e.json().then((t=>{throw new Error(t.error?.message||`OpenRouter API error: ${e.status}`)})))).then((e=>{if(!(e.choices&&e.choices[0]&&e.choices[0].message))throw new Error("Unexpected response format from OpenRouter");{t.value=e.choices[0].message.content;const n=new CustomEvent("aiSuccess",{detail:{backend:o,response:e.choices[0].message.content}});document.dispatchEvent(n)}n.disabled=!1,n.textContent=i})).catch((e=>{t.value="Error calling OpenRouter API:\n"+e.message,n.disabled=!1,n.textContent=i})):(t.value="OpenRouter API key not configured. Please configure it first.",n.disabled=!1,void(n.textContent=i)):(t.value="OpenRouter backend is disabled",n.disabled=!1,void(n.textContent=i))},ncSimpleHtmlEditor.prototype.callAnthropicAPI=function(e,t,n,i){const o="anthropic",s=this.sessionConfig.aiBackends[o];return s.enabled?s.apiKey?void fetch(s.url,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":s.apiKey,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:s.model,messages:[{role:"user",content:e}],temperature:this.options.aiModelParams.temperature,top_p:this.options.aiModelParams.top_p,max_tokens:2e3})}).then((e=>e.ok?e.json():e.json().then((t=>{throw new Error(t.error?.message||`Anthropic API error: ${e.status}`)})))).then((e=>{if(!(e.content&&e.content[0]&&e.content[0].text))throw new Error("Unexpected response format from Anthropic");{t.value=e.content[0].text;const n=new CustomEvent("aiSuccess",{detail:{backend:o,response:e.content[0].text}});document.dispatchEvent(n)}n.disabled=!1,n.textContent=i})).catch((e=>{t.value="Error calling Anthropic API:\n"+e.message,n.disabled=!1,n.textContent=i})):(t.value="Anthropic API key not configured. Please configure it first.",n.disabled=!1,void(n.textContent=i)):(t.value="Anthropic backend is disabled",n.disabled=!1,void(n.textContent=i))},ncSimpleHtmlEditor.prototype.callAzureAPI=function(e,t,n,i){const o="azure",s=this.sessionConfig.aiBackends.azure;return s.enabled?s.apiKey&&s.url&&s.model?void fetch(s.url,{method:"POST",headers:{"Content-Type":"application/json","api-key":s.apiKey},body:JSON.stringify({messages:[{role:"user",content:e}],temperature:this.options.aiModelParams.temperature,top_p:this.options.aiModelParams.top_p,max_tokens:2e3})}).then((e=>e.ok?e.json():e.json().then((t=>{throw new Error(t.error?.message||`Azure API error: ${e.status}`)})))).then((e=>{if(!(e.choices&&e.choices[0]&&e.choices[0].message))throw new Error("Unexpected response format from Azure");{t.value=e.choices[0].message.content;const n=new CustomEvent("aiSuccess",{detail:{backend:o,response:e.choices[0].message.content}});document.dispatchEvent(n)}n.disabled=!1,n.textContent=i})).catch((e=>{t.value="Error calling Azure API:\n"+e.message,n.disabled=!1,n.textContent=i})):(t.value="Azure configuration incomplete. Please set URL, model and API key.",n.disabled=!1,void(n.textContent=i)):(t.value="Azure backend is disabled",n.disabled=!1,void(n.textContent=i))},ncSimpleHtmlEditor.prototype.callGeminiAPI=function(e,t,n,i){const o="gemini",s=this.sessionConfig.aiBackends.gemini;if(!s.enabled)return t.value="Gemini backend is disabled",n.disabled=!1,void(n.textContent=i);if(!s.apiKey)return t.value="Gemini API key not configured. Please configure it first.",n.disabled=!1,void(n.textContent=i);const l=`${s.url}${s.model}:generateContent?key=${s.apiKey}`;fetch(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({contents:[{parts:[{text:e}]}],generationConfig:{temperature:this.options.aiModelParams.temperature,top_p:this.options.aiModelParams.top_p}})}).then((e=>e.ok?e.json():e.json().then((t=>{throw new Error(t.error?.message||`Gemini API error: ${e.status}`)})))).then((e=>{if(!(e.candidates&&e.candidates[0]&&e.candidates[0].content&&e.candidates[0].content.parts[0]))throw new Error("Unexpected response format from Gemini");{t.value=e.candidates[0].content.parts[0].text;const n=new CustomEvent("aiSuccess",{detail:{backend:o,response:e.candidates[0].content.parts[0].text}});document.dispatchEvent(n)}n.disabled=!1,n.textContent=i})).catch((e=>{t.value="Error calling Gemini API:\n"+e.message,n.disabled=!1,n.textContent=i}))},ncSimpleHtmlEditor.prototype.callOpenAIAPI=function(e,t,n,i){const o="openai",s=this.sessionConfig.aiBackends.openai;return s.enabled?s.apiKey?void fetch(s.url,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s.apiKey}`},body:JSON.stringify({model:s.model,messages:[{role:"user",content:e}],temperature:.7,max_tokens:2e3})}).then((e=>e.ok?e.json():e.json().then((t=>{throw new Error(t.error?.message||`OpenAI API error: ${e.status}`)})))).then((e=>{if(!(e.choices&&e.choices[0]&&e.choices[0].message))throw new Error("Unexpected response format from OpenAI");{t.value=e.choices[0].message.content;const n=new CustomEvent("aiSuccess",{detail:{backend:o,response:e.choices[0].message.content}});document.dispatchEvent(n)}n.disabled=!1,n.textContent=i})).catch((e=>{t.value="Error calling OpenAI API:\n"+e.message,n.disabled=!1,n.textContent=i})):(t.value="OpenAI API key not configured. Please configure it first.",n.disabled=!1,void(n.textContent=i)):(t.value="OpenAI backend is disabled",n.disabled=!1,void(n.textContent=i))},ncSimpleHtmlEditor.prototype.renderDialogCode=function(){var e='<dialog id="ncsedt-dialog-code" class="ncsedt-dialog"> <div class="ncsedt-btns"> <div class="ncsedt-btns-left"> <button type="button" class="sbutton dragger"><img class="" src="'+this.options.draggerIcon+'" title="Move"> <span>Edit source code</span></button> </div> <div class="ncsedt-btns-right"> <button type="button" class="sbutton cancel"> <b>⨯</b> </button> </div> </div> <div class="body"> <textarea class="code sbutton" placeholder=" ( empty ) "></textarea> </div> <div class="ncsedt-btns"> <div class="ncsedt-btns-left"> <button type="button" class="sbutton parent" title="Find parent">⇑</button> <button type="button" class="sbutton child" title="Find child">⇓</button> <button type="button" class="sbutton agent"><img class="" src="'+this.options.buttons.agent.icon+'" title="AI Agent"></button> <button type="button" class="sbutton link"><img class="" src="'+this.options.buttons.link.icon+'" title="Edit link"></button> <button type="button" class="sbutton image"><img class="" src="'+this.options.buttons.image.icon+'" title="Edit image"></button> </div> <div class="ncsedt-btns-right"> <button type="button" class="sbutton ko">⨯ Ko</button> <button type="button" class="sbutton confirm">✓ Ok</button> </div> </div></dialog>';return this.container.insertAdjacentHTML("beforeend",e),document.getElementById("ncsedt-dialog-code")},ncSimpleHtmlEditor.prototype.setEventsDialogCode=function(){var e=this;document.querySelector("#ncsedt-dialog-code .cancel").addEventListener("click",(function(){e.dialogCode.close()})),document.querySelector("#ncsedt-dialog-code .ko").addEventListener("click",(function(){e.dialogCode.close()})),document.querySelector("#ncsedt-dialog-code .parent").addEventListener("click",(function(){e.editCodeParent()})),document.querySelector("#ncsedt-dialog-code .child").addEventListener("click",(function(){e.editCodeChild()})),document.querySelector("#ncsedt-dialog-code .confirm").addEventListener("click",(function(){e.editCodeConfirm()})),document.querySelector("#ncsedt-dialog-code .agent").addEventListener("click",(function(){e.dialogCode.open&&e.dialogCode.close(),e.command(e.options.buttons.agent)})),document.querySelector("#ncsedt-dialog-code .link").addEventListener("click",(function(){e.dialogCode.open&&e.dialogCode.close(),e.command(e.options.buttons.link)})),document.querySelector("#ncsedt-dialog-code .image").addEventListener("click",(function(){e.dialogCode.open&&e.dialogCode.close(),e.setFocus(e.focusedElement.querySelector("img")),e.command(e.options.buttons.image)}))},ncSimpleHtmlEditor.prototype.editCode=function(){this.editingEnabled&&(this.focusedElement.querySelector("img")||this.focusedElement.parentElement.querySelector("img")?this.dialogCode.querySelector("#ncsedt-dialog-code .image").style.visibility="visible":this.dialogCode.querySelector("#ncsedt-dialog-code .image").style.visibility="hidden",window.getSelection().toString()||this.focusedElement.querySelector("a")||this.focusedElement.parentElement.querySelector("a")?this.dialogCode.querySelector("#ncsedt-dialog-code .link").style.visibility="visible":this.dialogCode.querySelector("#ncsedt-dialog-code .link").style.visibility="hidden",this.dialogCode.querySelector("textarea.code").value=this.focusedElement.outerHTML,this.dialogCode.open||this.dialogCode.showModal())},ncSimpleHtmlEditor.prototype.editCodeConfirm=function(){this.editingEnabled&&(this.dialogCode.open&&this.dialogCode.close(),this.focusedElement.isContentEditable&&this.focusedElement.innerHTML!=this.dialogCode.querySelector("textarea.code").value&&(this.focusedElement.innerHTML=this.dialogCode.querySelector("textarea.code").value))},ncSimpleHtmlEditor.prototype.editCodeParent=function(){this.editingEnabled&&this.focusedElement.parentElement&&this.focusedElement.parentElement.isContentEditable&&(this.setFocus(this.focusedElement.parentElement),this.editCode())},ncSimpleHtmlEditor.prototype.editCodePrev=function(){this.editingEnabled&&this.focusedElementPrev&&this.focusedElementPrev.isContentEditable&&(this.setFocus(this.focusedElementPrev),this.editCode())},ncSimpleHtmlEditor.prototype.editCodeChild=function(){this.editingEnabled&&this.focusedElement.firstElementChild&&this.focusedElement.firstElementChild.isContentEditable&&(this.setFocus(this.focusedElement.firstElementChild),this.editCode())},ncSimpleHtmlEditor.prototype.renderDialogImage=function(){var e='<dialog id="ncsedt-dialog-image" class="ncsedt-dialog"> <div class="ncsedt-btns"> <div class="ncsedt-btns-left"> <button type="button" class="sbutton dragger"><img class="" src="'+this.options.draggerIcon+'" title="Move"> <span id="ncsedt-dialog-image-title">Edit image</span></button> </div> <div class="ncsedt-btns-right"> <button type="button" class="sbutton cancel"> <b>⨯</b> </button> </div> </div> <div class="body"> <div class="preview"> <img class="image" src="'+this.options.buttons.image.icon+'"> <button id="ncsedt-dialog-image-upload" type="button" class="upload sbutton">⤒ Upload</button> <input id="ncsedt-dialog-image-file" class="file" accept="image/*" type="file" /> </div> <label for="ncsedt-dialog-image-src">Image URL:</label> <input id="ncsedt-dialog-image-src" class="src sbutton" type="text"> <div class="separator"></div> <label for="ncsedt-dialog-image-alt">Alt. text:</label> <input id="ncsedt-dialog-image-alt" class="alt sbutton" type="text"> <div class="separator"></div> <input size="3" id="ncsedt-dialog-image-width" class="width sbutton" type="text" placeholder="auto"> <button type="button" class="sbutton style-width" value="100%">⟷</button> <button type="button" class="sbutton style-width" value="50%">50%</button> <button type="button" class="sbutton style-width" value="25%">25%</button> <button type="button" class="sbutton style-width" value="">↺</button> <div class="separator"></div> <input size="3" id="ncsedt-dialog-image-height" class="height sbutton style-height" type="text" placeholder="auto"> <button type="button" class="sbutton style-height" value="100%">↕</button> <button type="button" class="sbutton style-height" value="">↺</button> <div class="separator"></div> <input size="3" id="ncsedt-dialog-image-float" class="float sbutton style-float" type="text" placeholder="no"> <button type="button" class="sbutton style-float" value="left">↫</button> <button type="button" class="sbutton style-float" value="right">↬</button> <button type="button" class="sbutton style-float" value="">↺</button> <div class="separator"></div> <input size="3" id="ncsedt-dialog-image-padding" class="padding sbutton style-padding" type="text" placeholder="no"> <button type="button" class="sbutton style-padding" value="10px">⊡</button> <button type="button" class="sbutton style-padding" value="">↺</button> <div class="image-remove"> <div class="separator"></div> <label for="ncsedt-dialog-image-remove">Remove image:</label> <input id="ncsedt-dialog-image-remove" class="remove" type="checkbox"> </div> </div> <div class="ncsedt-btns"> <div class="ncsedt-btns-left"> <button type="button" class="sbutton parent" title="Find parent">⇑</button> <button type="button" class="sbutton child" title="Find child">⇓</button> <button type="button" class="sbutton code"><img class="" src="'+this.options.buttons.code.icon+'" ></button> <button type="button" class="sbutton link"><img class="" src="'+this.options.buttons.link.icon+'" title="Edit link"></button> </div> <div class="ncsedt-btns-right"> <button type="button" class="sbutton ko">⨯ Ko</button> <button type="button" class="sbutton confirm">✓ Ok</button> </div> </div></dialog>';return this.container.insertAdjacentHTML("beforeend",e),document.getElementById("ncsedt-dialog-image")},ncSimpleHtmlEditor.prototype.setEventsDialogImage=function(){var e=this;document.querySelector("#ncsedt-dialog-image .cancel").addEventListener("click",(function(){e.dialogImage.close()})),document.querySelector("#ncsedt-dialog-image .ko").addEventListener("click",(function(){e.dialogImage.close()})),document.querySelector("#ncsedt-dialog-image .confirm").addEventListener("click",(function(){e.editImageConfirm()})),document.querySelector("#ncsedt-dialog-image .parent").addEventListener("click",(function(){e.editImageParent()})),document.querySelector("#ncsedt-dialog-image .child").addEventListener("click",(function(){e.editImageChild()})),document.querySelector("#ncsedt-dialog-image .code").addEventListener("click",(function(){e.dialogImage.open&&e.dialogImage.close(),e.command(e.options.buttons.code)})),document.querySelector("#ncsedt-dialog-image .link").addEventListener("click",(function(){e.dialogImage.open&&e.dialogImage.close(),e.command(e.options.buttons.link)})),document.querySelector("#ncsedt-dialog-image .upload").addEventListener("click",(function(){document.querySelector("#ncsedt-dialog-image-file").dispatchEvent(new MouseEvent("click"))})),document.querySelector("#ncsedt-dialog-image-file").addEventListener("change",(function(t){if(this.files[0].size>e.options.maxImageSizeBytes){var n=(e.options.maxImageSizeBytes/1024/1024).toFixed(1);return alert("File is too big! "+n+"MB. max. (Use .webp format)"),this.value="",!1}var i=new window.FileReader;i.readAsDataURL(this.files[0]),i.onloadend=function(){e.dialogImage.querySelector("#ncsedt-dialog-image .image").src=i.result,e.dialogImage.querySelector("#ncsedt-dialog-image .src").value="data:image/..."}})),document.querySelectorAll("#ncsedt-dialog-image button.style-width").forEach((function(t){t.addEventListener("click",(function(t){e.dialogImage.querySelector("#ncsedt-dialog-image-width").value=t.target.value}))})),document.querySelectorAll("#ncsedt-dialog-image button.style-height").forEach((function(t){t.addEventListener("click",(function(t){e.dialogImage.querySelector("#ncsedt-dialog-image-height").value=t.target.value}))})),document.querySelectorAll("#ncsedt-dialog-image button.style-float").forEach((function(t){t.addEventListener("click",(function(t){e.dialogImage.querySelector("#ncsedt-dialog-image-float").value=t.target.value,t.target.value?e.dialogImage.querySelector("#ncsedt-dialog-image-padding").value="10px":e.dialogImage.querySelector("#ncsedt-dialog-image-padding").value=""}))})),document.querySelectorAll("#ncsedt-dialog-image button.style-padding").forEach((function(t){t.addEventListener("click",(function(t){e.dialogImage.querySelector("#ncsedt-dialog-image-padding").value=t.target.value}))}))},ncSimpleHtmlEditor.prototype.editImage=function(){this.editingEnabled&&("IMG"==this.focusedElement.parentElement.tagName&&this.editImageParent(),this.focusedElement.firstElementChild&&this.focusedElement.lastElementChild&&"IMG"==this.focusedElement.firstElementChild.tagName&&"IMG"==this.focusedElement.lastElementChild.tagName&&this.editImageChild(),this.currentSelection=window.getSelection(),this.currentRange=this.currentSelection.getRangeAt(0),this.dialogImage.querySelector("#ncsedt-dialog-image-remove").checked=!1,"IMG"==this.focusedElement.tagName?(window.getComputedStyle(this.focusedElement),this.dialogImage.querySelector("#ncsedt-dialog-image-title").innerHTML="Image (Edit)",this.dialogImage.querySelector(".preview img").src=this.focusedElement.src,this.focusedElement.getAttribute("src").startsWith("data:image/")?this.dialogImage.querySelector("#ncsedt-dialog-image-src").value="data:image/...":this.dialogImage.querySelector("#ncsedt-dialog-image-src").value=this.focusedElement.getAttribute("src"),this.dialogImage.querySelector("#ncsedt-dialog-image-alt").value=this.focusedElement.getAttribute("alt"),this.dialogImage.querySelector("#ncsedt-dialog-image-width").value=this.focusedElement.style.width,this.dialogImage.querySelector("#ncsedt-dialog-image-height").value=this.focusedElement.style.height,this.dialogImage.querySelector("#ncsedt-dialog-image-float").value=this.focusedElement.style.float,this.dialogImage.querySelector("#ncsedt-dialog-image-padding").value=this.focusedElement.style.padding,this.dialogImage.querySelector("#ncsedt-dialog-image .image-remove").style.visibility="visible"):(this.dialogImage.querySelector("#ncsedt-dialog-image-title").innerHTML="Image (CREATE)",this.dialogImage.querySelector(".preview img").src=this.options.buttons.image.icon,this.dialogImage.querySelector("#ncsedt-dialog-image-src").value="",this.dialogImage.querySelector("#ncsedt-dialog-image-alt").value="",this.dialogImage.querySelector("#ncsedt-dialog-image-width").value="",this.dialogImage.querySelector("#ncsedt-dialog-image-height").value="",this.dialogImage.querySelector("#ncsedt-dialog-image-float").value="",this.dialogImage.querySelector("#ncsedt-dialog-image-padding").value="",this.dialogImage.querySelector("#ncsedt-dialog-image .image-remove").style.visibility="hidden"),this.dialogImage.open||this.dialogImage.showModal())},ncSimpleHtmlEditor.prototype.editImageConfirm=function(){this.dialogImage.open&&this.dialogImage.close(),this.editingEnabled&&this.focusedElement.isContentEditable&&("IMG"==this.focusedElement.tagName?this.dialogImage.querySelector("#ncsedt-dialog-image-remove").checked?this.focusedElement.outerHTML=this.focusedElement.innerHTML:this.editImageConfirmExisting():this.editImageConfirmNew())},ncSimpleHtmlEditor.prototype.editImageConfirmExisting=function(){var e=this.dialogImage.querySelector("#ncsedt-dialog-image-src").value,t=this.dialogImage.querySelector("#ncsedt-dialog-image-alt").value,n=this.dialogImage.querySelector("#ncsedt-dialog-image-width").value,i=this.dialogImage.querySelector("#ncsedt-dialog-image-height").value,o=this.dialogImage.querySelector("#ncsedt-dialog-image-float").value,s=this.dialogImage.querySelector("#ncsedt-dialog-image-padding").value,l=this.focusedElement.getAttribute("src"),a=this.focusedElement.getAttribute("alt"),d=this.focusedElement.style.width,c=this.focusedElement.style.height,r=this.focusedElement.style.float,A=this.focusedElement.style.padding;n&&!isNaN(n)&&(n+="%"),i&&!isNaN(i)&&(i+="%"),s&&!isNaN(s)&&(s+="px"),l!=e&&("data:image/..."==e&&(e=this.dialogImage.querySelector("#ncsedt-dialog-image .image").src),this.historyForcePush("src",e),this.focusedElement.setAttribute("src",e)),a!=t&&(this.historyForcePush("alt",t),this.focusedElement.setAttribute("alt",t)),d!=n&&(this.focusedElement.style.width=n,this.historyForcePush("style",this.focusedElement.style.cssText)),c!=i&&(this.focusedElement.style.height=i,this.historyForcePush("style",this.focusedElement.style.cssText)),r!=o&&(this.focusedElement.style.float=o,this.historyForcePush("style",this.focusedElement.style.cssText)),A!=s&&(this.focusedElement.style.padding=s,this.historyForcePush("style",this.focusedElement.style.cssText))},ncSimpleHtmlEditor.prototype.editImageConfirmNew=function(){var e=this.dialogImage.querySelector("#ncsedt-dialog-image-src").value,t=this.dialogImage.querySelector("#ncsedt-dialog-image-alt").value,n=this.dialogImage.querySelector("#ncsedt-dialog-image-width").value,i=this.dialogImage.querySelector("#ncsedt-dialog-image-height").value,o=this.dialogImage.querySelector("#ncsedt-dialog-image-float").value,s=this.dialogImage.querySelector("#ncsedt-dialog-image-padding").value;if(isNaN(n)||(n+="%"),isNaN(i)||(i+="%"),e){"data:image/..."==e&&(e=this.dialogImage.querySelector("#ncsedt-dialog-image .image").src);var l=document.createElement("img");l.setAttribute("src",e),l.setAttribute("alt",t),l.style.width=n,l.style.height=i,l.style.float=o,l.style.padding=s,this.currentRange.surroundContents(l)}},ncSimpleHtmlEditor.prototype.editImageParent=function(){this.editingEnabled&&(this.focusedElement.parentElement&&this.focusedElement.parentElement.isContentEditable?(this.setFocus(this.focusedElement.parentElement),this.editImage()):this.focusedElement.parentElement.parentElement&&this.focusedElement.parentElement.parentElement.querySelector("img")&&this.focusedElement.parentElement.parentElement.isContentEditable?(this.setFocus(this.focusedElement.parentElement.parentElement.querySelector("img")),this.editImage()):this.focusedElement.previousElementSibling&&"IMG"==this.focusedElement.previousElementSibling.tagName&&this.focusedElement.previousElementSibling.isContentEditable&&(this.setFocus(this.focusedElement.previousElementSibling),this.editImage()))},ncSimpleHtmlEditor.prototype.editImageChild=function(){this.editingEnabled&&(this.focusedElement.querySelector("img")?(this.setFocus(this.focusedElement.querySelector("img")),this.editImage()):this.focusedElement.nextElementSibling&&"IMG"==this.focusedElement.nextElementSibling.tagName&&this.focusedElement.nextElementSibling.isContentEditable&&(this.setFocus(this.focusedElement.nextElementSibling),this.editImage()))},ncSimpleHtmlEditor.prototype.renderDialogLink=function(){var e='<dialog id="ncsedt-dialog-link" class="ncsedt-dialog"> <div class="ncsedt-btns"> <div class="ncsedt-btns-left"> <button type="button" class="sbutton dragger"><img class="" src="'+this.options.draggerIcon+'" title="Move"> <span id="ncsedt-dialog-link-title">Edit link</span></button> </div> <div class="ncsedt-btns-right"> <button type="button" class="sbutton cancel"> <b>⨯</b> </button> </div> </div> <div class="body"> <label for="ncsedt-dialog-link-anchor">Anchor:</label> <textarea id="ncsedt-dialog-link-anchor" rows="2" class="anchor sbutton" placeholder=" ( empty ) "></textarea> <label for="ncsedt-dialog-link-href">URL:</label> <input id="ncsedt-dialog-link-href" class="href sbutton" type="text"> <label for="ncsedt-dialog-link-target">Open in new:</label> <input id="ncsedt-dialog-link-target" class="target" type="checkbox"> <div class="link-remove" style="float: right"> <label for="ncsedt-dialog-link-remove">Remove link:</label> <input id="ncsedt-dialog-link-remove" class="remove" type="checkbox"> </div> </div> <div class="ncsedt-btns"> <div class="ncsedt-btns-left"> <button type="button" class="sbutton parent" title="Find parent">⇑</button> <button type="button" class="sbutton child" title="Find child">⇓</button> <button type="button" class="sbutton code"><img class="" src="'+this.options.buttons.code.icon+'" title="Edit code"></button> <button type="button" class="sbutton image"><img class="" src="'+this.options.buttons.image.icon+'" title="Edit image"></button> </div> <div class="ncsedt-btns-right"> <button type="button" class="sbutton ko">⨯ Ko</button> <button type="button" class="sbutton confirm">✓ Ok</button> </div> </div></dialog>';return this.container.insertAdjacentHTML("beforeend",e),document.getElementById("ncsedt-dialog-link")},ncSimpleHtmlEditor.prototype.setEventsDialogLink=function(){var e=this;document.querySelector("#ncsedt-dialog-link .cancel").addEventListener("click",(function(){e.dialogLink.close()})),document.querySelector("#ncsedt-dialog-link .ko").addEventListener("click",(function(){e.dialogLink.close()})),document.querySelector("#ncsedt-dialog-link .parent").addEventListener("click",(function(){e.editLinkParent()})),document.querySelector("#ncsedt-dialog-link .child").addEventListener("click",(function(){e.editLinkChild()})),document.querySelector("#ncsedt-dialog-link .confirm").addEventListener("click",(function(){e.editLinkConfirm()})),document.querySelector("#ncsedt-dialog-link .code").addEventListener("click",(function(){e.dialogLink.open&&e.dialogLink.close(),e.command(e.options.buttons.code)})),document.querySelector("#ncsedt-dialog-link .image").addEventListener("click",(function(){e.dialogLink.open&&e.dialogLink.close(),e.command(e.options.buttons.image)}))},ncSimpleHtmlEditor.prototype.editLink=function(){if(this.editingEnabled){if(this.currentSelection=window.getSelection(),this.currentRange=this.currentSelection.getRangeAt(0),"A"==this.focusedElement.parentElement.tagName&&this.editLinkParent(),this.focusedElement.firstElementChild&&this.focusedElement.lastElementChild&&("A"!=this.focusedElement.firstElementChild.tagName||"A"!=this.focusedElement.lastElementChild.tagName||this.currentSelection.toString()||this.editLinkChild()),"IMG"==this.focusedElement.tagName||this.focusedElement.firstElementChild&&"IMG"==this.focusedElement.firstElementChild.tagName?this.dialogLink.querySelector("#ncsedt-dialog-link .image").style.visibility="visible":this.dialogLink.querySelector("#ncsedt-dialog-link .image").style.visibility="hidden","A"==this.focusedElement.tagName)this.dialogLink.querySelector("#ncsedt-dialog-link-title").innerHTML="Link (Edit)",this.dialogLink.querySelector("#ncsedt-dialog-link-anchor").value=this.focusedElement.innerHTML,this.dialogLink.querySelector("#ncsedt-dialog-link-href").value=this.focusedElement.getAttribute("href"),this.dialogLink.querySelector("#ncsedt-dialog-link-remove").checked=!1,this.dialogLink.querySelector("#ncsedt-dialog-link .link-remove").style.visibility="visible","_blank"==this.focusedElement.getAttribute("target")?this.dialogLink.querySelector("#ncsedt-dialog-link-target").checked=!0:this.dialogLink.querySelector("#ncsedt-dialog-link-target").checked=!1;else{if(this.currentSelection.anchorNode.nodeType==Node.TEXT_NODE&&this.currentSelection.toString())var e=this.currentSelection;else e=this.focusedElement.innerHTML||this.focusedElement.outerHTML;this.dialogLink.querySelector("#ncsedt-dialog-link-title").innerHTML="Link (CREATE)",this.dialogLink.querySelector(".anchor").value=e,this.dialogLink.querySelector(".href").value="",this.dialogLink.querySelector("#ncsedt-dialog-link-target").checked=!1,this.dialogLink.querySelector("#ncsedt-dialog-link-remove").checked=!1,this.dialogLink.querySelector("#ncsedt-dialog-link .link-remove").style.visibility="hidden"}this.dialogLink.open||this.dialogLink.showModal()}},ncSimpleHtmlEditor.prototype.editLinkConfirm=function(){this.dialogLink.open&&this.dialogLink.close(),this.editingEnabled&&this.focusedElement.isContentEditable&&("A"==this.focusedElement.tagName?this.dialogLink.querySelector("#ncsedt-dialog-link-remove").checked?this.focusedElement.outerHTML=this.focusedElement.innerHTML:this.editLinkConfirmExisting():this.editLinkConfirmNew())},ncSimpleHtmlEditor.prototype.editLinkConfirmExisting=function(){var e=this.dialogLink.querySelector("#ncsedt-dialog-link-target").checked?"_blank":"",t=this.dialogLink.querySelector("#ncsedt-dialog-link-anchor").value,n=this.dialogLink.querySelector("#ncsedt-dialog-link-href").value,i=this.focusedElement.getAttribute("target"),o=this.focusedElement.innerHTML,s=this.focusedElement.getAttribute("href");i==e&&o==t&&s==n||(this.historyForcePush("href",n),this.historyForcePush("target",e),this.focusedElement.innerHTML=t,this.focusedElement.setAttribute("href",n),this.focusedElement.setAttribute("target",e))},ncSimpleHtmlEditor.prototype.editLinkConfirmNew=function(){var e=this.dialogLink.querySelector("#ncsedt-dialog-link-target").checked?"_blank":"",t=this.dialogLink.querySelector("#ncsedt-dialog-link-anchor").value,n=this.dialogLink.querySelector("#ncsedt-dialog-link-href").value;if(t.length||n.length){var i=document.createElement("a");i.setAttribute("href",n),i.setAttribute("target",e),this.focusedElement.contains(this.currentRange.commonAncestorContainer)?(this.currentRange.surroundContents(i),i.innerHTML=t):(i.innerHTML=t,this.focusedElement.outerHTML=i.outerHTML)}},ncSimpleHtmlEditor.prototype.editLinkParent=function(){this.editingEnabled&&this.focusedElement.parentElement&&this.focusedElement.parentElement.isContentEditable&&(this.setFocus(this.focusedElement.parentElement),this.editLink())},ncSimpleHtmlEditor.prototype.editLinkPrev=function(){this.editingEnabled&&this.focusedElementPrev&&this.focusedElementPrev.isContentEditable&&(this.setFocus(this.focusedElementPrev),this.editLink())},ncSimpleHtmlEditor.prototype.editLinkChild=function(){this.editingEnabled&&this.focusedElement.firstElementChild&&this.focusedElement.firstElementChild.isContentEditable&&(this.setFocus(this.focusedElement.firstElementChild),this.editLink())},ncSimpleHtmlEditor.prototype.renderDialogHead=function(){var e='<dialog id="ncsedt-dialog-head" class="ncsedt-dialog"> <div class="ncsedt-btns"> <div class="ncsedt-btns-left"> <button type="button" class="sbutton dragger"><img class="" src="'+this.options.draggerIcon+'" title="Move"> <span id="ncsedt-dialog-title">Edit head</span></button> </div> <div class="ncsedt-btns-right"> <button type="button" class="sbutton cancel"> <b>⨯</b> </button> </div> </div> <div class="body"> <label for="ncsedt-dialog-head-title">Title:</label> <input id="ncsedt-dialog-head-title" class="title sbutton" type="text"> <div class="separator"></div> <label for="ncsedt-dialog-head-description">Description:</label> <textarea id="ncsedt-dialog-head-description" rows="3" class="description sbutton" placeholder=" ( empty ) "></textarea> <div class="separator"></div> <div class="edit-all" style="display: none"> <label for="ncsedt-dialog-head-all">Edit source code:</label> <textarea id="ncsedt-dialog-head-all" rows="3" class="all sbutton" placeholder=" ( empty ) "></textarea> </div> </div> <div class="ncsedt-btns"> <div class="ncsedt-btns-left"> <button type="button" class="sbutton show-all"><img class="" src="'+this.options.buttons.code.icon+'" title="Edit code"> Edit all</button> </div> <div class="ncsedt-btns-right"> <button type="button" class="sbutton ko">⨯ Ko</button> <button type="button" class="sbutton confirm">✓ Ok</button> </div> </div></dialog>';return this.container.insertAdjacentHTML("beforeend",e),document.getElementById("ncsedt-dialog-head")},ncSimpleHtmlEditor.prototype.setEventsDialogHead=function(){var e=this;document.querySelector("#ncsedt-dialog-head .cancel").addEventListener("click",(function(){e.dialogHead.close()})),document.querySelector("#ncsedt-dialog-head .ko").addEventListener("click",(function(){e.dialogHead.close()})),document.querySelector("#ncsedt-dialog-head .show-all").addEventListener("click",(function(){"none"==e.dialogHead.querySelector("#ncsedt-dialog-head .edit-all").style.display?e.dialogHead.querySelector("#ncsedt-dialog-head .edit-all").style.display="inline-block":e.dialogHead.querySelector("#ncsedt-dialog-head .edit-all").style.display="none"})),document.querySelector("#ncsedt-dialog-head .confirm").addEventListener("click",(function(){e.editHeadConfirm()}))},ncSimpleHtmlEditor.prototype.editHead=function(){if(this.editingEnabled){if(document.head.querySelector('meta[name="description"]'))var e=document.head.querySelector('meta[name="description"]').getAttribute("content");else e="";this.dialogHead.querySelector("#ncsedt-dialog-head-title").value=document.title||"Untitled",this.dialogHead.querySelector("#ncsedt-dialog-head-description").value=e,this.dialogHead.querySelector("#ncsedt-dialog-head-all").value=document.head.innerHTML,this.dialogHead.open||this.dialogHead.showModal()}},ncSimpleHtmlEditor.prototype.editHeadConfirm=function(){if(this.dialogHead.open&&this.dialogHead.close(),this.editingEnabled){if(document.head.querySelector('meta[name="description"]'))var e=document.head.querySelector('meta[name="description"]').getAttribute("content");else e="";var t=this.dialogHead.querySelector("#ncsedt-dialog-head-title").value,n=this.dialogHead.querySelector("#ncsedt-dialog-head-description").value,i=this.dialogHead.querySelector("#ncsedt-dialog-head-all").value,o=document.title,s=e;if(i!=document.head.innerHTML&&(document.head.innerHTML=i),t!=o&&(document.title=t),n!=s){if(!document.head.querySelector('meta[name="description"]')){var l=document.createElement("meta");l.setAttribute("name","description"),document.head.appendChild(l)}this.historyForcePush("content",n),document.head.querySelector('meta[name="description"]').setAttribute("content",n)}}},window.ncSimpleMoveable=function(e,t){this.movable=document.querySelector(e),this.dragger=document.querySelector(t),"ontouchstart"in document.createElement("div")?this.movableOnTouch():this.movableOnDrag()},ncSimpleMoveable.prototype.movableOnDrag=function(){var e=this,t=0,n=0,i=0,o=0;function s(s){(s=s||window.event).preventDefault(),t=i-s.clientX,n=o-s.clientY,i=s.clientX,o=s.clientY,e.movable.style.top=e.movable.offsetTop-n+"px",e.movable.style.left=e.movable.offsetLeft-t+"px"}function l(){document.onmouseup=null,document.onmousemove=null;var t=e.dragger.offsetLeft,n=e.movable.offsetLeft+t,i=e.dragger.offsetTop,o=e.movable.offsetTop+i,s=window.innerWidth-e.dragger.offsetWidth,l=window.innerHeight-e.dragger.offsetHeight;o>l&&(e.movable.style.top=l-i+"px"),o<0&&(e.movable.style.top=0-i+"px"),n>s&&(e.movable.style.left=s-t+"px"),n<0&&(e.movable.style.left=0-t+"px")}this.movable.style.position="fixed",this.dragger.onmousedown=function(t){(t=t||window.event).preventDefault();var n=window.getComputedStyle(e.movable),a=parseInt(n.getPropertyValue("margin-top")),d=parseInt(n.getPropertyValue("margin-left"));e.movable.style.margin="0px",e.movable.style.top=e.movable.offsetTop+a+"px",e.movable.style.left=e.movable.offsetLeft+d+"px",i=t.clientX,o=t.clientY,document.onmouseup=l,document.onmousemove=s}},ncSimpleMoveable.prototype.movableOnTouch=function(){var e=this;this.movable.style.position="fixed",this.dragger.addEventListener("touchmove",(function(t){t.preventDefault();var n=e.dragger.offsetLeft+Math.round(e.dragger.offsetWidth/2),i=e.dragger.offsetTop+Math.round(e.dragger.offsetHeight/2);e.movable.style.margin="0px";var o=t.targetTouches[0];e.movable.style.left=o.pageX-n+"px",e.movable.style.top=o.pageY-window.pageYOffset-i+"px"})),this.movable.addEventListener("touchend",(function(t){var n=e.dragger.offsetLeft,i=e.movable.offsetLeft+n,o=e.dragger.offsetTop,s=e.movable.offsetTop+o,l=window.innerWidth-e.dragger.offsetWidth,a=window.innerHeight-e.dragger.offsetHeight;s>a&&(e.movable.style.top=a-o+"px"),s<0&&(e.movable.style.top=0-o+"px"),i>l&&(e.movable.style.left=l-n+"px"),i<0&&(e.movable.style.left=0-n+"px")}))},document.currentScript.dataset.ncsheditorauto&&window.addEventListener("DOMContentLoaded",(function(){"ncSHEditor"in window||(ncSHEditor=new ncSimpleHtmlEditor,ncSHEditor.start())}));