searchreplace.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. tinyMCEPopup.requireLangPack();
  2. var SearchReplaceDialog = {
  3. init : function(ed) {
  4. var t = this, f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode");
  5. t.switchMode(m);
  6. f[m + '_panel_searchstring'].value = tinyMCEPopup.getWindowArg("search_string");
  7. // Focus input field
  8. f[m + '_panel_searchstring'].focus();
  9. mcTabs.onChange.add(function(tab_id, panel_id) {
  10. t.switchMode(tab_id.substring(0, tab_id.indexOf('_')));
  11. });
  12. },
  13. switchMode : function(m) {
  14. var f, lm = this.lastMode;
  15. if (lm != m) {
  16. f = document.forms[0];
  17. if (lm) {
  18. f[m + '_panel_searchstring'].value = f[lm + '_panel_searchstring'].value;
  19. f[m + '_panel_backwardsu'].checked = f[lm + '_panel_backwardsu'].checked;
  20. f[m + '_panel_backwardsd'].checked = f[lm + '_panel_backwardsd'].checked;
  21. f[m + '_panel_casesensitivebox'].checked = f[lm + '_panel_casesensitivebox'].checked;
  22. }
  23. mcTabs.displayTab(m + '_tab', m + '_panel');
  24. document.getElementById("replaceBtn").style.display = (m == "replace") ? "inline" : "none";
  25. document.getElementById("replaceAllBtn").style.display = (m == "replace") ? "inline" : "none";
  26. this.lastMode = m;
  27. }
  28. },
  29. searchNext : function(a) {
  30. 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;
  31. // Get input
  32. f = document.forms[0];
  33. s = f[m + '_panel_searchstring'].value;
  34. b = f[m + '_panel_backwardsu'].checked;
  35. ca = f[m + '_panel_casesensitivebox'].checked;
  36. rs = f['replace_panel_replacestring'].value;
  37. if (tinymce.isIE) {
  38. r = ed.getDoc().selection.createRange();
  39. }
  40. if (s == '')
  41. return;
  42. function fix() {
  43. // Correct Firefox graphics glitches
  44. // TODO: Verify if this is actually needed any more, maybe it was for very old FF versions?
  45. r = se.getRng().cloneRange();
  46. ed.getDoc().execCommand('SelectAll', false, null);
  47. se.setRng(r);
  48. };
  49. function replace() {
  50. ed.selection.setContent(rs); // Needs to be duplicated due to selection bug in IE
  51. };
  52. // IE flags
  53. if (ca)
  54. fl = fl | 4;
  55. switch (a) {
  56. case 'all':
  57. // Move caret to beginning of text
  58. ed.execCommand('SelectAll');
  59. ed.selection.collapse(true);
  60. if (tinymce.isIE) {
  61. ed.focus();
  62. r = ed.getDoc().selection.createRange();
  63. while (r.findText(s, b ? -1 : 1, fl)) {
  64. r.scrollIntoView();
  65. r.select();
  66. replace();
  67. fo = 1;
  68. if (b) {
  69. r.moveEnd("character", -(rs.length)); // Otherwise will loop forever
  70. }
  71. }
  72. tinyMCEPopup.storeSelection();
  73. } else {
  74. while (w.find(s, ca, b, false, false, false, false)) {
  75. replace();
  76. fo = 1;
  77. }
  78. }
  79. if (fo)
  80. tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.allreplaced'));
  81. else
  82. tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound'));
  83. return;
  84. case 'current':
  85. if (!ed.selection.isCollapsed())
  86. replace();
  87. break;
  88. }
  89. se.collapse(b);
  90. r = se.getRng();
  91. // Whats the point
  92. if (!s)
  93. return;
  94. if (tinymce.isIE) {
  95. ed.focus();
  96. r = ed.getDoc().selection.createRange();
  97. if (r.findText(s, b ? -1 : 1, fl)) {
  98. r.scrollIntoView();
  99. r.select();
  100. } else
  101. tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound'));
  102. tinyMCEPopup.storeSelection();
  103. } else {
  104. if (!w.find(s, ca, b, false, false, false, false))
  105. tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound'));
  106. else
  107. fix();
  108. }
  109. }
  110. };
  111. tinyMCEPopup.onInit.add(SearchReplaceDialog.init, SearchReplaceDialog);