Aleksander Machniak
2012-07-24 0afe27901189a5416dc696eef32e2bc2e5fe3844
program/js/tiny_mce/plugins/searchreplace/js/searchreplace.js
New file
@@ -0,0 +1,142 @@
tinyMCEPopup.requireLangPack();
var SearchReplaceDialog = {
   init : function(ed) {
      var t = this, f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode");
      t.switchMode(m);
      f[m + '_panel_searchstring'].value = tinyMCEPopup.getWindowArg("search_string");
      // Focus input field
      f[m + '_panel_searchstring'].focus();
      mcTabs.onChange.add(function(tab_id, panel_id) {
         t.switchMode(tab_id.substring(0, tab_id.indexOf('_')));
      });
   },
   switchMode : function(m) {
      var f, lm = this.lastMode;
      if (lm != m) {
         f = document.forms[0];
         if (lm) {
            f[m + '_panel_searchstring'].value = f[lm + '_panel_searchstring'].value;
            f[m + '_panel_backwardsu'].checked = f[lm + '_panel_backwardsu'].checked;
            f[m + '_panel_backwardsd'].checked = f[lm + '_panel_backwardsd'].checked;
            f[m + '_panel_casesensitivebox'].checked = f[lm + '_panel_casesensitivebox'].checked;
         }
         mcTabs.displayTab(m + '_tab',  m + '_panel');
         document.getElementById("replaceBtn").style.display = (m == "replace") ? "inline" : "none";
         document.getElementById("replaceAllBtn").style.display = (m == "replace") ? "inline" : "none";
         this.lastMode = m;
      }
   },
   searchNext : function(a) {
      var ed = tinyMCEPopup.editor, se = ed.selection, r = se.getRng(), f, m = this.lastMode, s, b, fl = 0, w = ed.getWin(), wm = ed.windowManager, fo = 0;
      // Get input
      f = document.forms[0];
      s = f[m + '_panel_searchstring'].value;
      b = f[m + '_panel_backwardsu'].checked;
      ca = f[m + '_panel_casesensitivebox'].checked;
      rs = f['replace_panel_replacestring'].value;
      if (tinymce.isIE) {
         r = ed.getDoc().selection.createRange();
      }
      if (s == '')
         return;
      function fix() {
         // Correct Firefox graphics glitches
         // TODO: Verify if this is actually needed any more, maybe it was for very old FF versions?
         r = se.getRng().cloneRange();
         ed.getDoc().execCommand('SelectAll', false, null);
         se.setRng(r);
      };
      function replace() {
         ed.selection.setContent(rs); // Needs to be duplicated due to selection bug in IE
      };
      // IE flags
      if (ca)
         fl = fl | 4;
      switch (a) {
         case 'all':
            // Move caret to beginning of text
            ed.execCommand('SelectAll');
            ed.selection.collapse(true);
            if (tinymce.isIE) {
               ed.focus();
               r = ed.getDoc().selection.createRange();
               while (r.findText(s, b ? -1 : 1, fl)) {
                  r.scrollIntoView();
                  r.select();
                  replace();
                  fo = 1;
                  if (b) {
                     r.moveEnd("character", -(rs.length)); // Otherwise will loop forever
                  }
               }
               tinyMCEPopup.storeSelection();
            } else {
               while (w.find(s, ca, b, false, false, false, false)) {
                  replace();
                  fo = 1;
               }
            }
            if (fo)
               tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.allreplaced'));
            else
               tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound'));
            return;
         case 'current':
            if (!ed.selection.isCollapsed())
               replace();
            break;
      }
      se.collapse(b);
      r = se.getRng();
      // Whats the point
      if (!s)
         return;
      if (tinymce.isIE) {
         ed.focus();
         r = ed.getDoc().selection.createRange();
         if (r.findText(s, b ? -1 : 1, fl)) {
            r.scrollIntoView();
            r.select();
         } else
            tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound'));
         tinyMCEPopup.storeSelection();
      } else {
         if (!w.find(s, ca, b, false, false, false, false))
            tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound'));
         else
            fix();
      }
   }
};
tinyMCEPopup.onInit.add(SearchReplaceDialog.init, SearchReplaceDialog);