diff --git a/lib/editor/atto/plugins/link/yui/build/moodle-atto_link-button/moodle-atto_link-button-debug.js b/lib/editor/atto/plugins/link/yui/build/moodle-atto_link-button/moodle-atto_link-button-debug.js index 838fe817958..eeadd60561d 100644 --- a/lib/editor/atto/plugins/link/yui/build/moodle-atto_link-button/moodle-atto_link-button-debug.js +++ b/lib/editor/atto/plugins/link/yui/build/moodle-atto_link-button/moodle-atto_link-button-debug.js @@ -111,7 +111,7 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit _displayDialogue: function() { // Store the current selection. this._currentSelection = this.get('host').getSelection(); - if (this._currentSelection === false || this._currentSelection.collapsed) { + if (this._currentSelection === false) { return; } @@ -167,11 +167,11 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit }, /** - * Update the dialogue after an image was selected in the File Picker. + * Update the dialogue after a link was selected in the File Picker. * * @method _filepickerCallback * @param {object} params The parameters provided by the filepicker - * containing information about the image. + * containing information about the link. * @private */ _filepickerCallback: function(params) { @@ -180,9 +180,9 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit .hide(); if (params.url !== '') { - this.get('host').setSelection(this._currentSelection); - document.execCommand('unlink', false, null); - document.execCommand('createLink', false, params.url); + // Add the link. + this._setLinkOnSelection(params.url); + // And mark the text area as updated. this.markUpdated(); } @@ -202,8 +202,6 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit anchornodes, value; - var host = this.get('host'); - e.preventDefault(); this.getDialogue({ focusAfterHide: null @@ -213,8 +211,6 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit value = input.get('value'); if (value !== '') { - this.editor.focus(); - host.setSelection(this._currentSelection); // We add a prefix if it is not already prefixed. value = value.trim(); @@ -223,11 +219,8 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit value = 'http://' + value; } - document.execCommand('unlink', false, null); - document.execCommand('createLink', false, value); - - // Now set the target. - selectednode = host.getSelectionParentNode(); + // Add the link. + selectednode = this._setLinkOnSelection(value); // Note this is a document fragment and YUI doesn't like them. if (!selectednode) { @@ -248,6 +241,41 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit } }, + /** + * Final step setting the anchor on the selection. + * + * @private + * @method _setLinkOnSelection + * @param {String} url URL the link will point to. + * @return {Node} The added Node. + */ + _setLinkOnSelection: function(url) { + var host = this.get('host'), + link, + selectednode; + + this.editor.focus(); + host.setSelection(this._currentSelection); + + if (this._currentSelection[0].collapsed) { + // Firefox cannot add links when the selection is empty so we will add it manually. + link = Y.Node.create('' + url + ''); + link.setAttribute('href', url); + + // Add the node and select it to replicate the behaviour of execCommand. + selectednode = host.insertContentAtFocusPoint(link.get('outerHTML')); + host.setSelection(host.getSelectionFromNode(selectednode)); + } else { + document.execCommand('unlink', false, null); + document.execCommand('createLink', false, url); + + // Now set the target. + selectednode = host.getSelectionParentNode(); + } + + return selectednode; + }, + /** * Look up and down for the nearest anchor tags that are least partly contained in the selection. * diff --git a/lib/editor/atto/plugins/link/yui/build/moodle-atto_link-button/moodle-atto_link-button-min.js b/lib/editor/atto/plugins/link/yui/build/moodle-atto_link-button/moodle-atto_link-button-min.js index ba3cf0cb019..8d1e8f1c268 100644 --- a/lib/editor/atto/plugins/link/yui/build/moodle-atto_link-button/moodle-atto_link-button-min.js +++ b/lib/editor/atto/plugins/link/yui/build/moodle-atto_link-button/moodle-atto_link-button-min.js @@ -1 +1 @@ -YUI.add("moodle-atto_link-button",function(e,t){var n="atto_link",r={NEWWINDOW:"atto_link_openinnewwindow",URLINPUT:"atto_link_urlentry"},i={URLINPUT:".atto_link_urlentry"},s='
';e.namespace("M.atto_link").Button=e.Base.create("button",e.M.editor_atto.EditorPlugin,[],{_currentSelection:null,_content:null,initializer:function(){this.addButton({icon:"e/insert_edit_link",callback:this._displayDialogue,tags:"a",tagMatchRequiresAll:!1}),this.addButton({buttonName:"unlink",callback:this._unlink,icon:"e/remove_link",title:"unlink",tags:"a",tagMatchRequiresAll:!1})},_displayDialogue:function(){this._currentSelection=this.get("host").getSelection();if(this._currentSelection===!1||this._currentSelection.collapsed)return;var e=this.getDialogue({headerContent:M.util.get_string("createlink",n),focusAfterHide:!0,focusOnShowSelector:i.URLINPUT});e.set("bodyContent",this._getDialogueContent()),this._resolveAnchors(),e.show()},_resolveAnchors:function(){var t=this.get("host").getSelectionParentNode(),n,r,i,s;if(!t)return;n=this._findSelectedAnchors(e.one(t)),n.length>0&&(r=n[0],this._currentSelection=this.get("host").getSelectionFromNode(r),i=r.getAttribute("href"),s=r.getAttribute("target"),i!==""&&this._content.one(".url").setAttribute("value",i),s==="_blank"?this._content.one(".newwindow").setAttribute("checked","checked"):this._content.one(".newwindow").removeAttribute("checked"))},_filepickerCallback:function(e){this.getDialogue().set("focusAfterHide",null).hide(),e.url!==""&&(this.get("host").setSelection(this._currentSelection),document.execCommand("unlink",!1,null),document.execCommand("createLink",!1,e.url),this.markUpdated())},_setLink:function(t){var n,r,i,s,o,u=this.get("host");t.preventDefault(),this.getDialogue({focusAfterHide:null}).hide(),n=this._content.one(".url"),o=n.get("value");if(o!==""){this.editor.focus(),u.setSelection(this._currentSelection),o=o.trim();var a=new RegExp(/^[a-zA-Z]*\.*\/|^#|^[a-zA-Z]*:/);a.test(o)||(o="http://"+o),document.execCommand("unlink",!1,null),document.execCommand("createLink",!1,o),i=u.getSelectionParentNode();if(!i)return;s=this._findSelectedAnchors(e.one(i)),e.Array.each(s,function(e){r=this._content.one(".newwindow"),r.get("checked")?e.setAttribute("target","_blank"):e.removeAttribute("target")},this),this.markUpdated()}},_findSelectedAnchors:function(e){var t=e.get("tagName"),n,r;return t&&t.toLowerCase()==="a"?[e]:(r=[],e.all("a").each(function(e){!n&&this.get("host").selectionContainsNode(e)&&r.push(e)},this),r.length>0?r:(n=e.ancestor("a"),n?[n]:[]))},_getDialogueContent:function(){var t=this.get("host").canShowFilepicker("link"),i=e.Handlebars.compile(s);return this._content=e.Node.create(i({showFilepicker:t,component:n,CSS:r})),this._content.one(".submit").on("click",this._setLink,this),t&&this._content.one(".openlinkbrowser").on("click",function(e){e.preventDefault(),this.get("host").showFilepicker("link",this._filepickerCallback,this)},this),this._content},_unlink:function(){var e=this.get("host"),t=e.getSelection();if(t&&t.length)if(t[0].startOffset===t[0].endOffset){var n=e.getSelectedNodes();n&&(n.each(function(t){var n=t.ancestor("a",!0);n&&(e.setSelection(e.getSelectionFromNode(n)),document.execCommand("unlink",!1,null))},this),this.markUpdated())}else document.execCommand("unlink",!1,null),this.markUpdated()}})},"@VERSION@",{requires:["moodle-editor_atto-plugin"]}); +YUI.add("moodle-atto_link-button",function(e,t){var n="atto_link",r={NEWWINDOW:"atto_link_openinnewwindow",URLINPUT:"atto_link_urlentry"},i={URLINPUT:".atto_link_urlentry"},s='';e.namespace("M.atto_link").Button=e.Base.create("button",e.M.editor_atto.EditorPlugin,[],{_currentSelection:null,_content:null,initializer:function(){this.addButton({icon:"e/insert_edit_link",callback:this._displayDialogue,tags:"a",tagMatchRequiresAll:!1}),this.addButton({buttonName:"unlink",callback:this._unlink,icon:"e/remove_link",title:"unlink",tags:"a",tagMatchRequiresAll:!1})},_displayDialogue:function(){this._currentSelection=this.get("host").getSelection();if(this._currentSelection===!1)return;var e=this.getDialogue({headerContent:M.util.get_string("createlink",n),focusAfterHide:!0,focusOnShowSelector:i.URLINPUT});e.set("bodyContent",this._getDialogueContent()),this._resolveAnchors(),e.show()},_resolveAnchors:function(){var t=this.get("host").getSelectionParentNode(),n,r,i,s;if(!t)return;n=this._findSelectedAnchors(e.one(t)),n.length>0&&(r=n[0],this._currentSelection=this.get("host").getSelectionFromNode(r),i=r.getAttribute("href"),s=r.getAttribute("target"),i!==""&&this._content.one(".url").setAttribute("value",i),s==="_blank"?this._content.one(".newwindow").setAttribute("checked","checked"):this._content.one(".newwindow").removeAttribute("checked"))},_filepickerCallback:function(e){this.getDialogue().set("focusAfterHide",null).hide(),e.url!==""&&(this._setLinkOnSelection(e.url),this.markUpdated())},_setLink:function(t){var n,r,i,s,o;t.preventDefault(),this.getDialogue({focusAfterHide:null}).hide(),n=this._content.one(".url"),o=n.get("value");if(o!==""){o=o.trim();var u=new RegExp(/^[a-zA-Z]*\.*\/|^#|^[a-zA-Z]*:/);u.test(o)||(o="http://"+o),i=this._setLinkOnSelection(o);if(!i)return;s=this._findSelectedAnchors(e.one(i)),e.Array.each(s,function(e){r=this._content.one(".newwindow"),r.get("checked")?e.setAttribute("target","_blank"):e.removeAttribute("target")},this),this.markUpdated()}},_setLinkOnSelection:function(t){var n=this.get("host"),r,i;return this.editor.focus(),n.setSelection(this._currentSelection),this._currentSelection[0].collapsed?(r=e.Node.create(""+t+""),r.setAttribute("href",t),i=n.insertContentAtFocusPoint(r.get("outerHTML")),n.setSelection(n.getSelectionFromNode(i))):(document.execCommand("unlink",!1,null),document.execCommand("createLink",!1,t),i=n.getSelectionParentNode()),i},_findSelectedAnchors:function(e){var t=e.get("tagName"),n,r;return t&&t.toLowerCase()==="a"?[e]:(r=[],e.all("a").each(function(e){!n&&this.get("host").selectionContainsNode(e)&&r.push(e)},this),r.length>0?r:(n=e.ancestor("a"),n?[n]:[]))},_getDialogueContent:function(){var t=this.get("host").canShowFilepicker("link"),i=e.Handlebars.compile(s);return this._content=e.Node.create(i({showFilepicker:t,component:n,CSS:r})),this._content.one(".submit").on("click",this._setLink,this),t&&this._content.one(".openlinkbrowser").on("click",function(e){e.preventDefault(),this.get("host").showFilepicker("link",this._filepickerCallback,this)},this),this._content},_unlink:function(){var e=this.get("host"),t=e.getSelection();if(t&&t.length)if(t[0].startOffset===t[0].endOffset){var n=e.getSelectedNodes();n&&(n.each(function(t){var n=t.ancestor("a",!0);n&&(e.setSelection(e.getSelectionFromNode(n)),document.execCommand("unlink",!1,null))},this),this.markUpdated())}else document.execCommand("unlink",!1,null),this.markUpdated()}})},"@VERSION@",{requires:["moodle-editor_atto-plugin"]}); diff --git a/lib/editor/atto/plugins/link/yui/build/moodle-atto_link-button/moodle-atto_link-button.js b/lib/editor/atto/plugins/link/yui/build/moodle-atto_link-button/moodle-atto_link-button.js index 838fe817958..eeadd60561d 100644 --- a/lib/editor/atto/plugins/link/yui/build/moodle-atto_link-button/moodle-atto_link-button.js +++ b/lib/editor/atto/plugins/link/yui/build/moodle-atto_link-button/moodle-atto_link-button.js @@ -111,7 +111,7 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit _displayDialogue: function() { // Store the current selection. this._currentSelection = this.get('host').getSelection(); - if (this._currentSelection === false || this._currentSelection.collapsed) { + if (this._currentSelection === false) { return; } @@ -167,11 +167,11 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit }, /** - * Update the dialogue after an image was selected in the File Picker. + * Update the dialogue after a link was selected in the File Picker. * * @method _filepickerCallback * @param {object} params The parameters provided by the filepicker - * containing information about the image. + * containing information about the link. * @private */ _filepickerCallback: function(params) { @@ -180,9 +180,9 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit .hide(); if (params.url !== '') { - this.get('host').setSelection(this._currentSelection); - document.execCommand('unlink', false, null); - document.execCommand('createLink', false, params.url); + // Add the link. + this._setLinkOnSelection(params.url); + // And mark the text area as updated. this.markUpdated(); } @@ -202,8 +202,6 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit anchornodes, value; - var host = this.get('host'); - e.preventDefault(); this.getDialogue({ focusAfterHide: null @@ -213,8 +211,6 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit value = input.get('value'); if (value !== '') { - this.editor.focus(); - host.setSelection(this._currentSelection); // We add a prefix if it is not already prefixed. value = value.trim(); @@ -223,11 +219,8 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit value = 'http://' + value; } - document.execCommand('unlink', false, null); - document.execCommand('createLink', false, value); - - // Now set the target. - selectednode = host.getSelectionParentNode(); + // Add the link. + selectednode = this._setLinkOnSelection(value); // Note this is a document fragment and YUI doesn't like them. if (!selectednode) { @@ -248,6 +241,41 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit } }, + /** + * Final step setting the anchor on the selection. + * + * @private + * @method _setLinkOnSelection + * @param {String} url URL the link will point to. + * @return {Node} The added Node. + */ + _setLinkOnSelection: function(url) { + var host = this.get('host'), + link, + selectednode; + + this.editor.focus(); + host.setSelection(this._currentSelection); + + if (this._currentSelection[0].collapsed) { + // Firefox cannot add links when the selection is empty so we will add it manually. + link = Y.Node.create('' + url + ''); + link.setAttribute('href', url); + + // Add the node and select it to replicate the behaviour of execCommand. + selectednode = host.insertContentAtFocusPoint(link.get('outerHTML')); + host.setSelection(host.getSelectionFromNode(selectednode)); + } else { + document.execCommand('unlink', false, null); + document.execCommand('createLink', false, url); + + // Now set the target. + selectednode = host.getSelectionParentNode(); + } + + return selectednode; + }, + /** * Look up and down for the nearest anchor tags that are least partly contained in the selection. * diff --git a/lib/editor/atto/plugins/link/yui/src/button/js/button.js b/lib/editor/atto/plugins/link/yui/src/button/js/button.js index 0215e86ee1b..50e91fe407b 100644 --- a/lib/editor/atto/plugins/link/yui/src/button/js/button.js +++ b/lib/editor/atto/plugins/link/yui/src/button/js/button.js @@ -109,7 +109,7 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit _displayDialogue: function() { // Store the current selection. this._currentSelection = this.get('host').getSelection(); - if (this._currentSelection === false || this._currentSelection.collapsed) { + if (this._currentSelection === false) { return; } @@ -165,11 +165,11 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit }, /** - * Update the dialogue after an image was selected in the File Picker. + * Update the dialogue after a link was selected in the File Picker. * * @method _filepickerCallback * @param {object} params The parameters provided by the filepicker - * containing information about the image. + * containing information about the link. * @private */ _filepickerCallback: function(params) { @@ -178,9 +178,9 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit .hide(); if (params.url !== '') { - this.get('host').setSelection(this._currentSelection); - document.execCommand('unlink', false, null); - document.execCommand('createLink', false, params.url); + // Add the link. + this._setLinkOnSelection(params.url); + // And mark the text area as updated. this.markUpdated(); } @@ -200,8 +200,6 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit anchornodes, value; - var host = this.get('host'); - e.preventDefault(); this.getDialogue({ focusAfterHide: null @@ -211,8 +209,6 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit value = input.get('value'); if (value !== '') { - this.editor.focus(); - host.setSelection(this._currentSelection); // We add a prefix if it is not already prefixed. value = value.trim(); @@ -221,11 +217,8 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit value = 'http://' + value; } - document.execCommand('unlink', false, null); - document.execCommand('createLink', false, value); - - // Now set the target. - selectednode = host.getSelectionParentNode(); + // Add the link. + selectednode = this._setLinkOnSelection(value); // Note this is a document fragment and YUI doesn't like them. if (!selectednode) { @@ -246,6 +239,41 @@ Y.namespace('M.atto_link').Button = Y.Base.create('button', Y.M.editor_atto.Edit } }, + /** + * Final step setting the anchor on the selection. + * + * @private + * @method _setLinkOnSelection + * @param {String} url URL the link will point to. + * @return {Node} The added Node. + */ + _setLinkOnSelection: function(url) { + var host = this.get('host'), + link, + selectednode; + + this.editor.focus(); + host.setSelection(this._currentSelection); + + if (this._currentSelection[0].collapsed) { + // Firefox cannot add links when the selection is empty so we will add it manually. + link = Y.Node.create('' + url + ''); + link.setAttribute('href', url); + + // Add the node and select it to replicate the behaviour of execCommand. + selectednode = host.insertContentAtFocusPoint(link.get('outerHTML')); + host.setSelection(host.getSelectionFromNode(selectednode)); + } else { + document.execCommand('unlink', false, null); + document.execCommand('createLink', false, url); + + // Now set the target. + selectednode = host.getSelectionParentNode(); + } + + return selectednode; + }, + /** * Look up and down for the nearest anchor tags that are least partly contained in the selection. * diff --git a/lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-debug.js b/lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-debug.js index fbd5c05aa7a..829d055e0a6 100644 --- a/lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-debug.js +++ b/lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-debug.js @@ -1817,6 +1817,7 @@ EditorSelection.prototype = { * * @method insertContentAtFocusPoint * @param {String} html + * @return {Node} The YUI Node object added to the DOM. */ insertContentAtFocusPoint: function(html) { var selection = rangy.getSelection(), @@ -1829,6 +1830,7 @@ EditorSelection.prototype = { range.deleteContents(); range.insertNode(node.getDOMNode()); } + return node; } }; diff --git a/lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-min.js b/lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-min.js index 17f3959fd1c..aa206ae4616 100644 --- a/lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-min.js +++ b/lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-min.js @@ -1,3 +1,3 @@ YUI.add("moodle-editor_atto-editor",function(e,t){function s(){s.superclass.constructor.apply(this,arguments)}function f(){}function l(){}function d(){}function v(){}function m(){}function g(){}function y(){}function b(){}function w(){}var n="moodle-editor_atto-editor",r={CONTENT:"editor_atto_content",CONTENTWRAPPER:"editor_atto_content_wrap",TOOLBAR:"editor_atto_toolbar",WRAPPER:"editor_atto",HIGHLIGHT:"highlight"},i=window.rangy;e.extend(s,e.Base,{BLOCK_TAGS:["address","article","aside","audio","blockquote","canvas","dd","div","dl","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","noscript","ol","output","p","pre","section","table","tfoot","ul","video"],PLACEHOLDER_CLASS:"atto-tmp-class",ALL_NODES_SELECTOR:"[style],font[face]",FONT_FAMILY:"fontFamily",_wrapper:null,editor:null,textarea:null,textareaLabel:null,plugins:null,_eventHandles:null,initializer:function(){var t;this.textarea=e.one(document.getElementById(this.get("elementid")));if(!this.textarea)return;this._eventHandles=[],this._wrapper=e.Node.create(''),t=e.Handlebars.compile(''),this.editor=e.Node.create(t({elementid:this.get("elementid"),CSS:r})),this.textareaLabel=e.one('[for="'+this.get("elementid")+'"]'),this.textareaLabel&&(this.textareaLabel.generateID(),this.editor.setAttribute("aria-labelledby",this.textareaLabel.get("id"))),this.setupToolbar();var n=e.Node.create('');n.appendChild(this.editor),this._wrapper.appendChild(n),this.editor.setStyle("minHeight",20*this.textarea.getAttribute("rows")+8+"px"),e.UA.ie===0&&this.editor.setStyle("height",20*this.textarea.getAttribute("rows")+8+"px"),this.disableCssStyling(),document.queryCommandSupported("DefaultParagraphSeparator")&&document.execCommand("DefaultParagraphSeparator",!1,"p"),this.textarea.get("parentNode").insert(this._wrapper,this.textarea).setAttribute("class","editor_atto_wrap"),this.textarea.hide(),this.updateFromTextArea(),this.publishEvents(),this.setupSelectionWatchers(),this.setupAutomaticPolling(),this.setupPlugins(),this.setupAutosave(),this.setupNotifications()},focus:function(){return this.editor.focus(),this},publishEvents:function(){return this.publish("change",{broadcast:!0,preventable:!0}),this.publish("pluginsloaded",{fireOnce:!0}),this.publish("atto:selectionchanged",{prefix:"atto"}),this},setupAutomaticPolling:function(){return this._registerEventHandle(this.editor.on(["keyup","paste","cut"],this.updateOriginal,this)),this._registerEventHandle(this.editor.on("drop",this.updateOriginalDelayed,this)),this},updateOriginalDelayed:function(){return e.soon(e.bind(this.updateOriginal,this)),this},setupPlugins:function(){this.plugins={};var t=this.get("plugins"),n,r,i,s,o;for(n in t){r=t[n];if(!r.plugins)continue;for(i in r.plugins){s=r.plugins[i],o=e.mix({name:s.name,group:r.group,editor:this.editor,toolbar:this.toolbar,host:this},s);if(typeof e.M["atto_"+s.name]=="undefined")continue;this.plugins[s.name]=new e.M["atto_"+s.name].Button(o)}}return this.fire("pluginsloaded"),this},enablePlugins:function(e){this._setPluginState(!0,e)},disablePlugins:function(e){this._setPluginState(!1,e)},_setPluginState:function(t,n){var r="disableButtons";t&&(r="enableButtons"),n?this.plugins[n][r]():e.Object.each(this.plugins,function(e){e[r]()},this)},_registerEventHandle:function(e){this._eventHandles.push(e)}},{NS:"editor_atto",ATTRS:{elementid:{value:null,writeOnce:!0},contextid:{value:null,writeOnce:!0},plugins:{value:{},writeOnce:!0}}}),e.augment(s,e.EventTarget),e.namespace("M.editor_atto").Editor=s,e.namespace("M.editor_atto.Editor").init=function(t){return new e.M.editor_atto.Editor(t)};var o="moodle-editor_atto-editor-notify",u="info",a="warning";f.ATTRS={},f.prototype={messageOverlay:null,hideTimer:null,setupNotifications:function(){var e=new Image,t=new Image;return e.src=M.util.image_url("i/warning","moodle"),t.src=M.util.image_url("i/info","moodle"),this},showMessage:function(t,n,r){var i="",s,o;return this.messageOverlay===null&&(this.messageOverlay=e.Node.create(''),this.messageOverlay.hide(!0),this.textarea.get("parentNode").append(this.messageOverlay),this.messageOverlay.on("click",function(){this.messageOverlay.hide(!0)},this)),this.hideTimer!==null&&this.hideTimer.cancel(),n===a?i='"||n.result==="