FCKeditor 2.6.6
[freeside.git] / httemplate / elements / fckeditor / editor / dialog / fck_replace.html
index fe5a788..2c574d2 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">\r
 <!--\r
  * FCKeditor - The text editor for Internet - http://www.fckeditor.net\r
- * Copyright (C) 2003-2007 Frederico Caldeira Knabben\r
+ * Copyright (C) 2003-2010 Frederico Caldeira Knabben\r
  *\r
  * == BEGIN LICENSE ==\r
  *\r
  *\r
  * == END LICENSE ==\r
  *\r
- * "Replace" dialog box window.\r
+ * "Find" and "Replace" dialog box window.\r
 -->\r
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
        <title></title>\r
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\r
        <meta content="noindex, nofollow" name="robots" />\r
+       <script src="common/fck_dialog_common.js" type="text/javascript"></script>\r
        <script type="text/javascript">\r
 \r
-var oEditor = window.parent.InnerDialogLoaded() ;\r
+var dialog     = window.parent ;\r
+var oEditor = dialog.InnerDialogLoaded() ;\r
+var dialogArguments = dialog.Args() ;\r
 \r
-function OnLoad()\r
+var FCKLang = oEditor.FCKLang ;\r
+var FCKDomTools = oEditor.FCKDomTools ;\r
+var FCKDomRange = oEditor.FCKDomRange ;\r
+var FCKListsLib = oEditor.FCKListsLib ;\r
+var FCKTools = oEditor.FCKTools ;\r
+var EditorDocument = oEditor.FCK.EditorDocument ;\r
+var HighlightStyle = oEditor.FCKStyles.GetStyle( '_FCK_SelectionHighlight' )  ;\r
+\r
+dialog.AddTab( 'Find', FCKLang.DlgFindTitle ) ;\r
+dialog.AddTab( 'Replace', FCKLang.DlgReplaceTitle ) ;\r
+var idMap = {} ;\r
+\r
+function OnDialogTabChange( tabCode )\r
 {\r
-       // First of all, translate the dialog box texts\r
-       oEditor.FCKLanguageManager.TranslatePage( document ) ;\r
+       ShowE( 'divFind', ( tabCode == 'Find' ) ) ;\r
+       ShowE( 'divReplace', ( tabCode == 'Replace' ) ) ;\r
+       idMap['FindText'] = 'txtFind' + tabCode ;\r
+       idMap['CheckCase'] = 'chkCase' + tabCode ;\r
+       idMap['CheckWord'] = 'chkWord' + tabCode ;\r
 \r
-       window.parent.SetAutoSize( true ) ;\r
+       if ( tabCode == 'Replace' )\r
+               dialog.SetAutoSize( true ) ;\r
+}\r
 \r
-       oEditor.FCKUndo.SaveUndoStep() ;\r
+GetNextNonEmptyTextNode = function( node, stopNode )\r
+{\r
+       while ( ( node = FCKDomTools.GetNextSourceNode( node, false, 3, stopNode ) ) && node && node.length < 1 )\r
+               1 ;\r
+       return node ;\r
 }\r
 \r
-function btnStat(frm)\r
+CharacterCursor = function( arg )\r
 {\r
-       document.getElementById('btnReplace').disabled =\r
-               document.getElementById('btnReplaceAll').disabled =\r
-                       ( document.getElementById('txtFind').value.length == 0 ) ;\r
+       if ( arg.nodeType && arg.nodeType == 9 )\r
+       {\r
+               this._textNode = GetNextNonEmptyTextNode( arg.body, arg.documentElement ) ;\r
+               this._offset = 0 ;\r
+               this._doc = arg ;\r
+       }\r
+       else\r
+       {\r
+               this._textNode = arguments[0] ;\r
+               this._offset = arguments[1] ;\r
+               this._doc = FCKTools.GetElementDocument( arguments[0] ) ;\r
+       }\r
 }\r
+CharacterCursor.prototype =\r
+{\r
+       GetCharacter : function()\r
+       {\r
+               return ( this._textNode && this._textNode.nodeValue.charAt( this._offset ) ) || null ;\r
+       },\r
+\r
+       // Non-normalized.\r
+       GetTextNode : function()\r
+       {\r
+               return this._textNode ;\r
+       },\r
 \r
-function ReplaceTextNodes( parentNode, regex, replaceValue, replaceAll, hasFound )\r
+       // Non-normalized.\r
+       GetIndex : function()\r
+       {\r
+               return this._offset ;\r
+       },\r
+\r
+       // Return value means whehther we've crossed a line break or a paragraph boundary.\r
+       MoveNext : function()\r
+       {\r
+               if ( this._offset < this._textNode.length - 1 )\r
+               {\r
+                       this._offset++ ;\r
+                       return false ;\r
+               }\r
+\r
+               var crossed = false ;\r
+               var curNode = this._textNode ;\r
+               while ( ( curNode = FCKDomTools.GetNextSourceNode( curNode ) )\r
+                               && curNode && ( curNode.nodeType != 3 || curNode.length < 1 ) )\r
+               {\r
+                       var tag = curNode.nodeName.toLowerCase() ;\r
+                       if ( FCKListsLib.BlockElements[tag] || tag == 'br' )\r
+                               crossed = true ;\r
+               }\r
+\r
+               this._textNode = curNode ;\r
+               this._offset = 0 ;\r
+               return crossed ;\r
+       },\r
+\r
+       // Return value means whehther we've crossed a line break or a paragraph boundary.\r
+       MoveBack : function()\r
+       {\r
+               if ( this._offset > 0 && this._textNode.length > 0 )\r
+               {\r
+                       this._offset = Math.min( this._offset - 1, this._textNode.length - 1 ) ;\r
+                       return false ;\r
+               }\r
+\r
+               var crossed = false ;\r
+               var curNode = this._textNode ;\r
+               while ( ( curNode = FCKDomTools.GetPreviousSourceNode( curNode ) )\r
+                               && curNode && ( curNode.nodeType != 3 || curNode.length < 1 ) )\r
+               {\r
+                       var tag = curNode.nodeName.toLowerCase() ;\r
+                       if ( FCKListsLib.BlockElements[tag] || tag == 'br' )\r
+                               crossed = true ;\r
+               }\r
+\r
+               this._textNode = curNode ;\r
+               this._offset = curNode && curNode.length - 1 ;\r
+               return crossed ;\r
+       },\r
+\r
+       Clone : function()\r
+       {\r
+               return new CharacterCursor( this._textNode, this._offset ) ;\r
+       }\r
+} ;\r
+\r
+CharacterRange = function( initCursor, maxLength )\r
+{\r
+       this._cursors = initCursor.push ? initCursor : [initCursor] ;\r
+       this._maxLength = maxLength ;\r
+       this._highlightRange = null ;\r
+}\r
+CharacterRange.prototype =\r
 {\r
-       for ( var i = 0 ; i < parentNode.childNodes.length ; i++ )\r
+       ToDomRange : function()\r
        {\r
-               var oNode = parentNode.childNodes[i] ;\r
-               if ( oNode.nodeType == 3 )\r
+               var firstCursor = this._cursors[0] ;\r
+               var lastCursor = this._cursors[ this._cursors.length - 1 ] ;\r
+               var domRange = new FCKDomRange( FCKTools.GetElementWindow( firstCursor.GetTextNode() ) ) ;\r
+               var w3cRange = domRange._Range = domRange.CreateRange() ;\r
+               w3cRange.setStart( firstCursor.GetTextNode(), firstCursor.GetIndex() ) ;\r
+               w3cRange.setEnd( lastCursor.GetTextNode(), lastCursor.GetIndex() + 1 ) ;\r
+               domRange._UpdateElementInfo() ;\r
+               return domRange ;\r
+       },\r
+\r
+       Highlight : function()\r
+       {\r
+               if ( this._cursors.length < 1 )\r
+                       return ;\r
+\r
+               var domRange = this.ToDomRange() ;\r
+               HighlightStyle.ApplyToRange( domRange, false, true ) ;\r
+               this._highlightRange = domRange ;\r
+\r
+               var charRange = CharacterRange.CreateFromDomRange( domRange ) ;\r
+               var focusNode = domRange.StartNode ;\r
+               if ( focusNode.nodeType != 1 )\r
+                       focusNode = focusNode.parentNode ;\r
+               FCKDomTools.ScrollIntoView( focusNode, false ) ;\r
+               this._cursors = charRange._cursors ;\r
+       },\r
+\r
+       RemoveHighlight : function()\r
+       {\r
+               if ( this._highlightRange )\r
+               {\r
+                       HighlightStyle.RemoveFromRange( this._highlightRange, false, true ) ;\r
+                       var charRange = CharacterRange.CreateFromDomRange( this._highlightRange ) ;\r
+                       this._cursors = charRange._cursors ;\r
+                       this._highlightRange = null ;\r
+               }\r
+       },\r
+\r
+       GetHighlightDomRange : function()\r
+       {\r
+               return this._highlightRange;\r
+       },\r
+\r
+       MoveNext : function()\r
+       {\r
+               var next = this._cursors[ this._cursors.length - 1 ].Clone() ;\r
+               var retval = next.MoveNext() ;\r
+               if ( retval )\r
+                       this._cursors = [] ;\r
+               this._cursors.push( next ) ;\r
+               if ( this._cursors.length > this._maxLength )\r
+                       this._cursors.shift() ;\r
+               return retval ;\r
+       },\r
+\r
+       MoveBack : function()\r
+       {\r
+               var prev = this._cursors[0].Clone() ;\r
+               var retval = prev.MoveBack() ;\r
+               if ( retval )\r
+                       this._cursors = [] ;\r
+               this._cursors.unshift( prev ) ;\r
+               if ( this._cursors.length > this._maxLength )\r
+                       this._cursors.pop() ;\r
+               return retval ;\r
+       },\r
+\r
+       GetEndCharacter : function()\r
+       {\r
+               if ( this._cursors.length < 1 )\r
+                       return null ;\r
+               var retval = this._cursors[ this._cursors.length - 1 ].GetCharacter() ;\r
+               return retval ;\r
+       },\r
+\r
+       GetNextRange : function( len )\r
+       {\r
+               if ( this._cursors.length == 0 )\r
+                       return null ;\r
+               var cur = this._cursors[ this._cursors.length - 1 ].Clone() ;\r
+               cur.MoveNext() ;\r
+               return new CharacterRange( cur, len ) ;\r
+       },\r
+\r
+       GetCursors : function()\r
+       {\r
+               return this._cursors ;\r
+       }\r
+} ;\r
+\r
+CharacterRange.CreateFromDomRange = function( domRange )\r
+{\r
+       var w3cRange = domRange._Range ;\r
+       var startContainer = w3cRange.startContainer ;\r
+       var endContainer = w3cRange.endContainer ;\r
+       var startTextNode, startIndex, endTextNode, endIndex ;\r
+\r
+       if ( startContainer.nodeType == 3 )\r
+       {\r
+               startTextNode = startContainer ;\r
+               startIndex = w3cRange.startOffset ;\r
+       }\r
+       else if ( domRange.StartNode.nodeType == 3 )\r
+       {\r
+               startTextNode = domRange.StartNode ;\r
+               startIndex = 0 ;\r
+       }\r
+       else\r
+       {\r
+               startTextNode = GetNextNonEmptyTextNode( domRange.StartNode, domRange.StartNode.parentNode ) ;\r
+               if ( !startTextNode )\r
+                       return null ;\r
+               startIndex = 0 ;\r
+       }\r
+\r
+       if ( endContainer.nodeType == 3 && w3cRange.endOffset > 0 )\r
+       {\r
+               endTextNode = endContainer ;\r
+               endIndex = w3cRange.endOffset - 1 ;\r
+       }\r
+       else\r
+       {\r
+               endTextNode = domRange.EndNode ;\r
+               while ( endTextNode.nodeType != 3 )\r
+                       endTextNode = endTextNode.lastChild ;\r
+               endIndex = endTextNode.length - 1 ;\r
+       }\r
+\r
+       var cursors = [] ;\r
+       var current = new CharacterCursor( startTextNode, startIndex ) ;\r
+       cursors.push( current ) ;\r
+       if ( !( current.GetTextNode() == endTextNode && current.GetIndex() == endIndex ) && !domRange.CheckIsEmpty() )\r
+       {\r
+               do\r
                {\r
-                       var sReplaced = oNode.nodeValue.replace( regex, replaceValue ) ;\r
-                       if ( oNode.nodeValue != sReplaced )\r
+                       current = current.Clone() ;\r
+                       current.MoveNext() ;\r
+                       cursors.push( current ) ;\r
+               }\r
+               while ( !( current.GetTextNode() == endTextNode && current.GetIndex() == endIndex ) ) ;\r
+       }\r
+\r
+       return new CharacterRange( cursors, cursors.length ) ;\r
+}\r
+\r
+// Knuth-Morris-Pratt Algorithm for stream input\r
+KMP_NOMATCH = 0 ;\r
+KMP_ADVANCED = 1 ;\r
+KMP_MATCHED = 2 ;\r
+KmpMatch = function( pattern, ignoreCase )\r
+{\r
+       var overlap = [ -1 ] ;\r
+       for ( var i = 0 ; i < pattern.length ; i++ )\r
+       {\r
+               overlap.push( overlap[i] + 1 ) ;\r
+               while ( overlap[ i + 1 ] > 0 && pattern.charAt( i ) != pattern.charAt( overlap[ i + 1 ] - 1 ) )\r
+                       overlap[ i + 1 ] = overlap[ overlap[ i + 1 ] - 1 ] + 1 ;\r
+       }\r
+       this._Overlap = overlap ;\r
+       this._State = 0 ;\r
+       this._IgnoreCase = ( ignoreCase === true ) ;\r
+       if ( ignoreCase )\r
+               this.Pattern = pattern.toLowerCase();\r
+       else\r
+               this.Pattern = pattern ;\r
+}\r
+KmpMatch.prototype = {\r
+       FeedCharacter : function( c )\r
+       {\r
+               if ( this._IgnoreCase )\r
+                       c = c.toLowerCase();\r
+\r
+               while ( true )\r
+               {\r
+                       if ( c == this.Pattern.charAt( this._State ) )\r
                        {\r
-                               oNode.nodeValue = sReplaced ;\r
-                               if ( ! replaceAll )\r
-                                       return true ;\r
-                               hasFound = true ;\r
+                               this._State++ ;\r
+                               if ( this._State == this.Pattern.length )\r
+                               {\r
+                                       // found a match, start over, don't care about partial matches involving the current match\r
+                                       this._State = 0;\r
+                                       return KMP_MATCHED;\r
+                               }\r
+                               return KMP_ADVANCED ;\r
                        }\r
+                       else if ( this._State == 0 )\r
+                               return KMP_NOMATCH;\r
+                       else\r
+                               this._State = this._Overlap[ this._State ];\r
                }\r
 \r
-               hasFound = ReplaceTextNodes( oNode, regex, replaceValue, replaceAll, hasFound ) ;\r
-               if ( ! replaceAll && hasFound )\r
-                       return true ;\r
+               return null ;\r
+       },\r
+\r
+       Reset : function()\r
+       {\r
+               this._State = 0 ;\r
+       }\r
+};\r
+\r
+// Place a range at the start of document.\r
+function OnLoad()\r
+{\r
+       // First of all, translate the dialog box texts.\r
+       oEditor.FCKLanguageManager.TranslatePage( document ) ;\r
+\r
+       // Show the appropriate tab at startup.\r
+       if ( dialogArguments.CustomValue == 'Find' )\r
+       {\r
+               dialog.SetSelectedTab( 'Find' ) ;\r
+               dialog.SetAutoSize( true ) ;\r
        }\r
+       else\r
+               dialog.SetSelectedTab( 'Replace' ) ;\r
 \r
-       return hasFound ;\r
+       SelectField( 'txtFind' + dialogArguments.CustomValue ) ;\r
 }\r
 \r
-function GetRegexExpr()\r
+function btnStat()\r
 {\r
-       var sExpr = EscapeRegexString( document.getElementById('txtFind').value ) ;\r
+       GetE('btnReplace').disabled =\r
+               GetE('btnReplaceAll').disabled =\r
+                       GetE('btnFind').disabled =\r
+                               ( GetE(idMap["FindText"]).value.length == 0 ) ;\r
+}\r
+\r
+function btnStatDelayed()\r
+{\r
+       setTimeout( btnStat, 1 ) ;\r
+}\r
 \r
-       if ( document.getElementById('chkWord').checked )\r
-               sExpr = '\\b' + sExpr + '\\b' ;\r
+function GetSearchString()\r
+{\r
+       return GetE(idMap['FindText']).value ;\r
+}\r
 \r
-       return sExpr ;\r
+function GetReplaceString()\r
+{\r
+       return GetE("txtReplace").value ;\r
 }\r
 \r
-function GetCase()\r
+function GetCheckCase()\r
 {\r
-       return ( document.getElementById('chkCase').checked ? '' : 'i' ) ;\r
+       return !! ( GetE(idMap['CheckCase']).checked ) ;\r
 }\r
 \r
-function GetReplacement()\r
+function GetMatchWord()\r
 {\r
-       return document.getElementById('txtReplace').value.replace( /\$/g, '$$$$' ) ;\r
+       return !! ( GetE(idMap['CheckWord']).checked ) ;\r
+}\r
+\r
+/* Is this character a unicode whitespace or a punctuation mark?\r
+ * References:\r
+ * http://unicode.org/Public/UNIDATA/PropList.txt (whitespaces)\r
+ * http://php.chinaunix.net/manual/tw/ref.regex.php (punctuation marks)\r
+ */\r
+function CheckIsWordSeparator( c )\r
+{\r
+       if ( !c )\r
+               return true;\r
+       var code = c.charCodeAt( 0 );\r
+       if ( code >= 9 && code <= 0xd )\r
+               return true;\r
+       if ( code >= 0x2000 && code <= 0x200a )\r
+               return true;\r
+       switch ( code )\r
+       {\r
+               case 0x20:\r
+               case 0x85:\r
+               case 0xa0:\r
+               case 0x1680:\r
+               case 0x180e:\r
+               case 0x2028:\r
+               case 0x2029:\r
+               case 0x202f:\r
+               case 0x205f:\r
+               case 0x3000:\r
+                       return true;\r
+               default:\r
+       }\r
+       return /[.,"'?!;:]/.test( c ) ;\r
+}\r
+\r
+FindRange = null ;\r
+function _Find()\r
+{\r
+       var searchString = GetSearchString() ;\r
+       if ( !FindRange )\r
+               FindRange = new CharacterRange( new CharacterCursor( EditorDocument ), searchString.length ) ;\r
+       else\r
+       {\r
+               FindRange.RemoveHighlight() ;\r
+               FindRange = FindRange.GetNextRange( searchString.length ) ;\r
+       }\r
+       var matcher = new KmpMatch( searchString, ! GetCheckCase() ) ;\r
+       var matchState = KMP_NOMATCH ;\r
+       var character = '%' ;\r
+\r
+       while ( character != null )\r
+       {\r
+               while ( ( character = FindRange.GetEndCharacter() ) )\r
+               {\r
+                       matchState = matcher.FeedCharacter( character ) ;\r
+                       if ( matchState == KMP_MATCHED )\r
+                               break ;\r
+                       if ( FindRange.MoveNext() )\r
+                               matcher.Reset() ;\r
+               }\r
+\r
+               if ( matchState == KMP_MATCHED )\r
+               {\r
+                       if ( GetMatchWord() )\r
+                       {\r
+                               var cursors = FindRange.GetCursors() ;\r
+                               var head = cursors[ cursors.length - 1 ].Clone() ;\r
+                               var tail = cursors[0].Clone() ;\r
+                               if ( !head.MoveNext() && !CheckIsWordSeparator( head.GetCharacter() ) )\r
+                                       continue ;\r
+                               if ( !tail.MoveBack() && !CheckIsWordSeparator( tail.GetCharacter() ) )\r
+                                       continue ;\r
+                       }\r
+\r
+                       FindRange.Highlight() ;\r
+                       return true ;\r
+               }\r
+       }\r
+\r
+       FindRange = null ;\r
+       return false ;\r
 }\r
 \r
-function EscapeRegexString( str )\r
+function Find()\r
 {\r
-       return str.replace( /[\\\^\$\*\+\?\{\}\.\(\)\!\|\[\]\-]/g, '\\$&' ) ;\r
+       if ( ! _Find() )\r
+               alert( FCKLang.DlgFindNotFoundMsg ) ;\r
 }\r
 \r
 function Replace()\r
 {\r
-       var oRegex = new RegExp( GetRegexExpr(), GetCase() ) ;\r
-       if ( !ReplaceTextNodes( oEditor.FCK.EditorDocument.body, oRegex, GetReplacement(), false, false ) )\r
-               alert( oEditor.FCKLang.DlgFindNotFoundMsg ) ;\r
+       var saveUndoStep = function( selectRange )\r
+       {\r
+               var ieRange ;\r
+               if ( oEditor.FCKBrowserInfo.IsIE )\r
+                       ieRange = document.selection.createRange() ;\r
+\r
+               selectRange.Select() ;\r
+               oEditor.FCKUndo.SaveUndoStep() ;\r
+               var cloneRange = selectRange.Clone() ;\r
+               cloneRange.Collapse( false ) ;\r
+               cloneRange.Select() ;\r
+\r
+               if ( ieRange )\r
+                       setTimeout( function(){ ieRange.select() ; }, 1 ) ;\r
+       }\r
+\r
+       if ( FindRange && FindRange.GetHighlightDomRange() )\r
+       {\r
+               var range = FindRange.GetHighlightDomRange() ;\r
+               var bookmark = range.CreateBookmark() ;\r
+               FindRange.RemoveHighlight() ;\r
+               range.MoveToBookmark( bookmark ) ;\r
+\r
+               saveUndoStep( range ) ;\r
+               range.DeleteContents() ;\r
+               range.InsertNode( EditorDocument.createTextNode( GetReplaceString() ) ) ;\r
+               range._UpdateElementInfo() ;\r
+\r
+               FindRange = CharacterRange.CreateFromDomRange( range ) ;\r
+       }\r
+       else\r
+       {\r
+               if ( ! _Find() )\r
+               {\r
+                       FindRange && FindRange.RemoveHighlight() ;\r
+                       alert( FCKLang.DlgFindNotFoundMsg ) ;\r
+               }\r
+       }\r
 }\r
 \r
 function ReplaceAll()\r
 {\r
-       var oRegex = new RegExp( GetRegexExpr(), GetCase() + 'g' ) ;\r
-       if ( !ReplaceTextNodes( oEditor.FCK.EditorDocument.body, oRegex, GetReplacement(), true, false ) )\r
-               alert( oEditor.FCKLang.DlgFindNotFoundMsg ) ;\r
-       window.parent.Cancel() ;\r
+       oEditor.FCKUndo.SaveUndoStep() ;\r
+       var replaceCount = 0 ;\r
+\r
+       while ( _Find() )\r
+       {\r
+               var range = FindRange.GetHighlightDomRange() ;\r
+               var bookmark = range.CreateBookmark() ;\r
+               FindRange.RemoveHighlight() ;\r
+               range.MoveToBookmark( bookmark) ;\r
+\r
+               range.DeleteContents() ;\r
+               range.InsertNode( EditorDocument.createTextNode( GetReplaceString() ) ) ;\r
+               range._UpdateElementInfo() ;\r
+\r
+               FindRange = CharacterRange.CreateFromDomRange( range ) ;\r
+               replaceCount++ ;\r
+       }\r
+       if ( replaceCount == 0 )\r
+       {\r
+               FindRange && FindRange.RemoveHighlight() ;\r
+               alert( FCKLang.DlgFindNotFoundMsg ) ;\r
+       }\r
+       dialog.Cancel() ;\r
+}\r
+\r
+window.onunload = function()\r
+{\r
+       if ( FindRange )\r
+       {\r
+               FindRange.RemoveHighlight() ;\r
+               FindRange.ToDomRange().Select() ;\r
+       }\r
 }\r
        </script>\r
 </head>\r
 <body onload="OnLoad()" style="overflow: hidden">\r
-       <table cellspacing="3" cellpadding="2" width="100%" border="0">\r
-               <tr>\r
-                       <td nowrap="nowrap">\r
-                               <label for="txtFind" fcklang="DlgReplaceFindLbl">\r
-                                       Find what:</label>\r
-                       </td>\r
-                       <td width="100%">\r
-                               <input id="txtFind" onkeyup="btnStat(this.form)" style="width: 100%" tabindex="1"\r
-                                       type="text" />\r
-                       </td>\r
-                       <td>\r
-                               <input id="btnReplace" style="width: 100%" disabled="disabled" onclick="Replace();"\r
-                                       type="button" value="Replace" fcklang="DlgReplaceReplaceBtn" />\r
-                       </td>\r
-               </tr>\r
-               <tr>\r
-                       <td valign="top" nowrap="nowrap">\r
-                               <label for="txtReplace" fcklang="DlgReplaceReplaceLbl">\r
-                                       Replace with:</label>\r
-                       </td>\r
-                       <td valign="top">\r
-                               <input id="txtReplace" style="width: 100%" tabindex="2" type="text" />\r
-                       </td>\r
-                       <td>\r
-                               <input id="btnReplaceAll" disabled="disabled" onclick="ReplaceAll()" type="button"\r
-                                       value="Replace All" fcklang="DlgReplaceReplAllBtn" />\r
-                       </td>\r
-               </tr>\r
-               <tr>\r
-                       <td valign="bottom" colspan="3">\r
-                               &nbsp;<input id="chkCase" tabindex="3" type="checkbox" /><label for="chkCase" fcklang="DlgReplaceCaseChk">Match\r
-                                       case</label>\r
-                               <br />\r
-                               &nbsp;<input id="chkWord" tabindex="4" type="checkbox" /><label for="chkWord" fcklang="DlgReplaceWordChk">Match\r
-                                       whole word</label>\r
-                       </td>\r
-               </tr>\r
-       </table>\r
+       <div id="divFind" style="display: none">\r
+               <table cellspacing="3" cellpadding="2" width="100%" border="0">\r
+                       <tr>\r
+                               <td nowrap="nowrap">\r
+                                       <label for="txtFindFind" fcklang="DlgReplaceFindLbl">\r
+                                               Find what:</label>\r
+                               </td>\r
+                               <td width="100%">\r
+                                       <input id="txtFindFind" onkeyup="btnStat()" oninput="btnStat()" onpaste="btnStatDelayed()" style="width: 100%" tabindex="1"\r
+                                               type="text" />\r
+                               </td>\r
+                               <td>\r
+                                       <input id="btnFind" style="width: 80px" disabled="disabled" onclick="Find();"\r
+                                               type="button" value="Find" fcklang="DlgFindFindBtn" />\r
+                               </td>\r
+                       </tr>\r
+                       <tr>\r
+                               <td valign="bottom" colspan="3">\r
+                                       &nbsp;<input id="chkCaseFind" tabindex="3" type="checkbox" /><label for="chkCaseFind" fcklang="DlgReplaceCaseChk">Match\r
+                                               case</label>\r
+                                       <br />\r
+                                       &nbsp;<input id="chkWordFind" tabindex="4" type="checkbox" /><label for="chkWordFind" fcklang="DlgReplaceWordChk">Match\r
+                                               whole word</label>\r
+                               </td>\r
+                       </tr>\r
+               </table>\r
+       </div>\r
+       <div id="divReplace" style="display:none">\r
+               <table cellspacing="3" cellpadding="2" width="100%" border="0">\r
+                       <tr>\r
+                               <td nowrap="nowrap">\r
+                                       <label for="txtFindReplace" fcklang="DlgReplaceFindLbl">\r
+                                               Find what:</label>\r
+                               </td>\r
+                               <td width="100%">\r
+                                       <input id="txtFindReplace" onkeyup="btnStat()" oninput="btnStat()" onpaste="btnStatDelayed()" style="width: 100%" tabindex="1"\r
+                                               type="text" />\r
+                               </td>\r
+                               <td>\r
+                                       <input id="btnReplace" style="width: 80px" disabled="disabled" onclick="Replace();"\r
+                                               type="button" value="Replace" fcklang="DlgReplaceReplaceBtn" />\r
+                               </td>\r
+                       </tr>\r
+                       <tr>\r
+                               <td valign="top" nowrap="nowrap">\r
+                                       <label for="txtReplace" fcklang="DlgReplaceReplaceLbl">\r
+                                               Replace with:</label>\r
+                               </td>\r
+                               <td valign="top">\r
+                                       <input id="txtReplace" style="width: 100%" tabindex="2" type="text" />\r
+                               </td>\r
+                               <td>\r
+                                       <input id="btnReplaceAll" style="width: 80px" disabled="disabled" onclick="ReplaceAll()" type="button"\r
+                                               value="Replace All" fcklang="DlgReplaceReplAllBtn" />\r
+                               </td>\r
+                       </tr>\r
+                       <tr>\r
+                               <td valign="bottom" colspan="3">\r
+                                       &nbsp;<input id="chkCaseReplace" tabindex="3" type="checkbox" /><label for="chkCaseReplace" fcklang="DlgReplaceCaseChk">Match\r
+                                               case</label>\r
+                                       <br />\r
+                                       &nbsp;<input id="chkWordReplace" tabindex="4" type="checkbox" /><label for="chkWordReplace" fcklang="DlgReplaceWordChk">Match\r
+                                               whole word</label>\r
+                               </td>\r
+                       </tr>\r
+               </table>\r
+       </div>\r
 </body>\r
 </html>\r