1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> |
---|
2 | <!-- |
---|
3 | * FCKeditor - The text editor for Internet - http://www.fckeditor.net |
---|
4 | * Copyright (C) 2003-2009 Frederico Caldeira Knabben |
---|
5 | * |
---|
6 | * == BEGIN LICENSE == |
---|
7 | * |
---|
8 | * Licensed under the terms of any of the following licenses at your |
---|
9 | * choice: |
---|
10 | * |
---|
11 | * - GNU General Public License Version 2 or later (the "GPL") |
---|
12 | * http://www.gnu.org/licenses/gpl.html |
---|
13 | * |
---|
14 | * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") |
---|
15 | * http://www.gnu.org/licenses/lgpl.html |
---|
16 | * |
---|
17 | * - Mozilla Public License Version 1.1 or later (the "MPL") |
---|
18 | * http://www.mozilla.org/MPL/MPL-1.1.html |
---|
19 | * |
---|
20 | * == END LICENSE == |
---|
21 | * |
---|
22 | * "Find" and "Replace" dialog box window. |
---|
23 | --> |
---|
24 | <html xmlns="http://www.w3.org/1999/xhtml"> |
---|
25 | <head> |
---|
26 | <title></title> |
---|
27 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
---|
28 | <meta content="noindex, nofollow" name="robots" /> |
---|
29 | <script src="common/fck_dialog_common.js" type="text/javascript"></script> |
---|
30 | <script type="text/javascript"> |
---|
31 | |
---|
32 | var dialog = window.parent ; |
---|
33 | var oEditor = dialog.InnerDialogLoaded() ; |
---|
34 | var dialogArguments = dialog.Args() ; |
---|
35 | |
---|
36 | var FCKLang = oEditor.FCKLang ; |
---|
37 | var FCKDomTools = oEditor.FCKDomTools ; |
---|
38 | var FCKDomRange = oEditor.FCKDomRange ; |
---|
39 | var FCKListsLib = oEditor.FCKListsLib ; |
---|
40 | var FCKTools = oEditor.FCKTools ; |
---|
41 | var EditorDocument = oEditor.FCK.EditorDocument ; |
---|
42 | var HighlightStyle = oEditor.FCKStyles.GetStyle( '_FCK_SelectionHighlight' ) ; |
---|
43 | |
---|
44 | dialog.AddTab( 'Find', FCKLang.DlgFindTitle ) ; |
---|
45 | dialog.AddTab( 'Replace', FCKLang.DlgReplaceTitle ) ; |
---|
46 | var idMap = {} ; |
---|
47 | |
---|
48 | function OnDialogTabChange( tabCode ) |
---|
49 | { |
---|
50 | ShowE( 'divFind', ( tabCode == 'Find' ) ) ; |
---|
51 | ShowE( 'divReplace', ( tabCode == 'Replace' ) ) ; |
---|
52 | idMap['FindText'] = 'txtFind' + tabCode ; |
---|
53 | idMap['CheckCase'] = 'chkCase' + tabCode ; |
---|
54 | idMap['CheckWord'] = 'chkWord' + tabCode ; |
---|
55 | |
---|
56 | if ( tabCode == 'Replace' ) |
---|
57 | dialog.SetAutoSize( true ) ; |
---|
58 | } |
---|
59 | |
---|
60 | GetNextNonEmptyTextNode = function( node, stopNode ) |
---|
61 | { |
---|
62 | while ( ( node = FCKDomTools.GetNextSourceNode( node, false, 3, stopNode ) ) && node && node.length < 1 ) |
---|
63 | 1 ; |
---|
64 | return node ; |
---|
65 | } |
---|
66 | |
---|
67 | CharacterCursor = function( arg ) |
---|
68 | { |
---|
69 | if ( arg.nodeType && arg.nodeType == 9 ) |
---|
70 | { |
---|
71 | this._textNode = GetNextNonEmptyTextNode( arg.body, arg.documentElement ) ; |
---|
72 | this._offset = 0 ; |
---|
73 | this._doc = arg ; |
---|
74 | } |
---|
75 | else |
---|
76 | { |
---|
77 | this._textNode = arguments[0] ; |
---|
78 | this._offset = arguments[1] ; |
---|
79 | this._doc = FCKTools.GetElementDocument( arguments[0] ) ; |
---|
80 | } |
---|
81 | } |
---|
82 | CharacterCursor.prototype = |
---|
83 | { |
---|
84 | GetCharacter : function() |
---|
85 | { |
---|
86 | return ( this._textNode && this._textNode.nodeValue.charAt( this._offset ) ) || null ; |
---|
87 | }, |
---|
88 | |
---|
89 | // Non-normalized. |
---|
90 | GetTextNode : function() |
---|
91 | { |
---|
92 | return this._textNode ; |
---|
93 | }, |
---|
94 | |
---|
95 | // Non-normalized. |
---|
96 | GetIndex : function() |
---|
97 | { |
---|
98 | return this._offset ; |
---|
99 | }, |
---|
100 | |
---|
101 | // Return value means whehther we've crossed a line break or a paragraph boundary. |
---|
102 | MoveNext : function() |
---|
103 | { |
---|
104 | if ( this._offset < this._textNode.length - 1 ) |
---|
105 | { |
---|
106 | this._offset++ ; |
---|
107 | return false ; |
---|
108 | } |
---|
109 | |
---|
110 | var crossed = false ; |
---|
111 | var curNode = this._textNode ; |
---|
112 | while ( ( curNode = FCKDomTools.GetNextSourceNode( curNode ) ) |
---|
113 | && curNode && ( curNode.nodeType != 3 || curNode.length < 1 ) ) |
---|
114 | { |
---|
115 | var tag = curNode.nodeName.toLowerCase() ; |
---|
116 | if ( FCKListsLib.BlockElements[tag] || tag == 'br' ) |
---|
117 | crossed = true ; |
---|
118 | } |
---|
119 | |
---|
120 | this._textNode = curNode ; |
---|
121 | this._offset = 0 ; |
---|
122 | return crossed ; |
---|
123 | }, |
---|
124 | |
---|
125 | // Return value means whehther we've crossed a line break or a paragraph boundary. |
---|
126 | MoveBack : function() |
---|
127 | { |
---|
128 | if ( this._offset > 0 && this._textNode.length > 0 ) |
---|
129 | { |
---|
130 | this._offset = Math.min( this._offset - 1, this._textNode.length - 1 ) ; |
---|
131 | return false ; |
---|
132 | } |
---|
133 | |
---|
134 | var crossed = false ; |
---|
135 | var curNode = this._textNode ; |
---|
136 | while ( ( curNode = FCKDomTools.GetPreviousSourceNode( curNode ) ) |
---|
137 | && curNode && ( curNode.nodeType != 3 || curNode.length < 1 ) ) |
---|
138 | { |
---|
139 | var tag = curNode.nodeName.toLowerCase() ; |
---|
140 | if ( FCKListsLib.BlockElements[tag] || tag == 'br' ) |
---|
141 | crossed = true ; |
---|
142 | } |
---|
143 | |
---|
144 | this._textNode = curNode ; |
---|
145 | this._offset = curNode && curNode.length - 1 ; |
---|
146 | return crossed ; |
---|
147 | }, |
---|
148 | |
---|
149 | Clone : function() |
---|
150 | { |
---|
151 | return new CharacterCursor( this._textNode, this._offset ) ; |
---|
152 | } |
---|
153 | } ; |
---|
154 | |
---|
155 | CharacterRange = function( initCursor, maxLength ) |
---|
156 | { |
---|
157 | this._cursors = initCursor.push ? initCursor : [initCursor] ; |
---|
158 | this._maxLength = maxLength ; |
---|
159 | this._highlightRange = null ; |
---|
160 | } |
---|
161 | CharacterRange.prototype = |
---|
162 | { |
---|
163 | ToDomRange : function() |
---|
164 | { |
---|
165 | var firstCursor = this._cursors[0] ; |
---|
166 | var lastCursor = this._cursors[ this._cursors.length - 1 ] ; |
---|
167 | var domRange = new FCKDomRange( FCKTools.GetElementWindow( firstCursor.GetTextNode() ) ) ; |
---|
168 | var w3cRange = domRange._Range = domRange.CreateRange() ; |
---|
169 | w3cRange.setStart( firstCursor.GetTextNode(), firstCursor.GetIndex() ) ; |
---|
170 | w3cRange.setEnd( lastCursor.GetTextNode(), lastCursor.GetIndex() + 1 ) ; |
---|
171 | domRange._UpdateElementInfo() ; |
---|
172 | return domRange ; |
---|
173 | }, |
---|
174 | |
---|
175 | Highlight : function() |
---|
176 | { |
---|
177 | if ( this._cursors.length < 1 ) |
---|
178 | return ; |
---|
179 | |
---|
180 | var domRange = this.ToDomRange() ; |
---|
181 | HighlightStyle.ApplyToRange( domRange, false, true ) ; |
---|
182 | this._highlightRange = domRange ; |
---|
183 | |
---|
184 | var charRange = CharacterRange.CreateFromDomRange( domRange ) ; |
---|
185 | var focusNode = domRange.StartNode ; |
---|
186 | if ( focusNode.nodeType != 1 ) |
---|
187 | focusNode = focusNode.parentNode ; |
---|
188 | FCKDomTools.ScrollIntoView( focusNode, false ) ; |
---|
189 | this._cursors = charRange._cursors ; |
---|
190 | }, |
---|
191 | |
---|
192 | RemoveHighlight : function() |
---|
193 | { |
---|
194 | if ( this._highlightRange ) |
---|
195 | { |
---|
196 | HighlightStyle.RemoveFromRange( this._highlightRange, false, true ) ; |
---|
197 | var charRange = CharacterRange.CreateFromDomRange( this._highlightRange ) ; |
---|
198 | this._cursors = charRange._cursors ; |
---|
199 | this._highlightRange = null ; |
---|
200 | } |
---|
201 | }, |
---|
202 | |
---|
203 | GetHighlightDomRange : function() |
---|
204 | { |
---|
205 | return this._highlightRange; |
---|
206 | }, |
---|
207 | |
---|
208 | MoveNext : function() |
---|
209 | { |
---|
210 | var next = this._cursors[ this._cursors.length - 1 ].Clone() ; |
---|
211 | var retval = next.MoveNext() ; |
---|
212 | if ( retval ) |
---|
213 | this._cursors = [] ; |
---|
214 | this._cursors.push( next ) ; |
---|
215 | if ( this._cursors.length > this._maxLength ) |
---|
216 | this._cursors.shift() ; |
---|
217 | return retval ; |
---|
218 | }, |
---|
219 | |
---|
220 | MoveBack : function() |
---|
221 | { |
---|
222 | var prev = this._cursors[0].Clone() ; |
---|
223 | var retval = prev.MoveBack() ; |
---|
224 | if ( retval ) |
---|
225 | this._cursors = [] ; |
---|
226 | this._cursors.unshift( prev ) ; |
---|
227 | if ( this._cursors.length > this._maxLength ) |
---|
228 | this._cursors.pop() ; |
---|
229 | return retval ; |
---|
230 | }, |
---|
231 | |
---|
232 | GetEndCharacter : function() |
---|
233 | { |
---|
234 | if ( this._cursors.length < 1 ) |
---|
235 | return null ; |
---|
236 | var retval = this._cursors[ this._cursors.length - 1 ].GetCharacter() ; |
---|
237 | return retval ; |
---|
238 | }, |
---|
239 | |
---|
240 | GetNextRange : function( len ) |
---|
241 | { |
---|
242 | if ( this._cursors.length == 0 ) |
---|
243 | return null ; |
---|
244 | var cur = this._cursors[ this._cursors.length - 1 ].Clone() ; |
---|
245 | cur.MoveNext() ; |
---|
246 | return new CharacterRange( cur, len ) ; |
---|
247 | }, |
---|
248 | |
---|
249 | GetCursors : function() |
---|
250 | { |
---|
251 | return this._cursors ; |
---|
252 | } |
---|
253 | } ; |
---|
254 | |
---|
255 | CharacterRange.CreateFromDomRange = function( domRange ) |
---|
256 | { |
---|
257 | var w3cRange = domRange._Range ; |
---|
258 | var startContainer = w3cRange.startContainer ; |
---|
259 | var endContainer = w3cRange.endContainer ; |
---|
260 | var startTextNode, startIndex, endTextNode, endIndex ; |
---|
261 | |
---|
262 | if ( startContainer.nodeType == 3 ) |
---|
263 | { |
---|
264 | startTextNode = startContainer ; |
---|
265 | startIndex = w3cRange.startOffset ; |
---|
266 | } |
---|
267 | else if ( domRange.StartNode.nodeType == 3 ) |
---|
268 | { |
---|
269 | startTextNode = domRange.StartNode ; |
---|
270 | startIndex = 0 ; |
---|
271 | } |
---|
272 | else |
---|
273 | { |
---|
274 | startTextNode = GetNextNonEmptyTextNode( domRange.StartNode, domRange.StartNode.parentNode ) ; |
---|
275 | if ( !startTextNode ) |
---|
276 | return null ; |
---|
277 | startIndex = 0 ; |
---|
278 | } |
---|
279 | |
---|
280 | if ( endContainer.nodeType == 3 && w3cRange.endOffset > 0 ) |
---|
281 | { |
---|
282 | endTextNode = endContainer ; |
---|
283 | endIndex = w3cRange.endOffset - 1 ; |
---|
284 | } |
---|
285 | else |
---|
286 | { |
---|
287 | endTextNode = domRange.EndNode ; |
---|
288 | while ( endTextNode.nodeType != 3 ) |
---|
289 | endTextNode = endTextNode.lastChild ; |
---|
290 | endIndex = endTextNode.length - 1 ; |
---|
291 | } |
---|
292 | |
---|
293 | var cursors = [] ; |
---|
294 | var current = new CharacterCursor( startTextNode, startIndex ) ; |
---|
295 | cursors.push( current ) ; |
---|
296 | if ( !( current.GetTextNode() == endTextNode && current.GetIndex() == endIndex ) && !domRange.CheckIsEmpty() ) |
---|
297 | { |
---|
298 | do |
---|
299 | { |
---|
300 | current = current.Clone() ; |
---|
301 | current.MoveNext() ; |
---|
302 | cursors.push( current ) ; |
---|
303 | } |
---|
304 | while ( !( current.GetTextNode() == endTextNode && current.GetIndex() == endIndex ) ) ; |
---|
305 | } |
---|
306 | |
---|
307 | return new CharacterRange( cursors, cursors.length ) ; |
---|
308 | } |
---|
309 | |
---|
310 | // Knuth-Morris-Pratt Algorithm for stream input |
---|
311 | KMP_NOMATCH = 0 ; |
---|
312 | KMP_ADVANCED = 1 ; |
---|
313 | KMP_MATCHED = 2 ; |
---|
314 | KmpMatch = function( pattern, ignoreCase ) |
---|
315 | { |
---|
316 | var overlap = [ -1 ] ; |
---|
317 | for ( var i = 0 ; i < pattern.length ; i++ ) |
---|
318 | { |
---|
319 | overlap.push( overlap[i] + 1 ) ; |
---|
320 | while ( overlap[ i + 1 ] > 0 && pattern.charAt( i ) != pattern.charAt( overlap[ i + 1 ] - 1 ) ) |
---|
321 | overlap[ i + 1 ] = overlap[ overlap[ i + 1 ] - 1 ] + 1 ; |
---|
322 | } |
---|
323 | this._Overlap = overlap ; |
---|
324 | this._State = 0 ; |
---|
325 | this._IgnoreCase = ( ignoreCase === true ) ; |
---|
326 | if ( ignoreCase ) |
---|
327 | this.Pattern = pattern.toLowerCase(); |
---|
328 | else |
---|
329 | this.Pattern = pattern ; |
---|
330 | } |
---|
331 | KmpMatch.prototype = { |
---|
332 | FeedCharacter : function( c ) |
---|
333 | { |
---|
334 | if ( this._IgnoreCase ) |
---|
335 | c = c.toLowerCase(); |
---|
336 | |
---|
337 | while ( true ) |
---|
338 | { |
---|
339 | if ( c == this.Pattern.charAt( this._State ) ) |
---|
340 | { |
---|
341 | this._State++ ; |
---|
342 | if ( this._State == this.Pattern.length ) |
---|
343 | { |
---|
344 | // found a match, start over, don't care about partial matches involving the current match |
---|
345 | this._State = 0; |
---|
346 | return KMP_MATCHED; |
---|
347 | } |
---|
348 | return KMP_ADVANCED ; |
---|
349 | } |
---|
350 | else if ( this._State == 0 ) |
---|
351 | return KMP_NOMATCH; |
---|
352 | else |
---|
353 | this._State = this._Overlap[ this._State ]; |
---|
354 | } |
---|
355 | |
---|
356 | return null ; |
---|
357 | }, |
---|
358 | |
---|
359 | Reset : function() |
---|
360 | { |
---|
361 | this._State = 0 ; |
---|
362 | } |
---|
363 | }; |
---|
364 | |
---|
365 | // Place a range at the start of document. |
---|
366 | function OnLoad() |
---|
367 | { |
---|
368 | // First of all, translate the dialog box texts. |
---|
369 | oEditor.FCKLanguageManager.TranslatePage( document ) ; |
---|
370 | |
---|
371 | // Show the appropriate tab at startup. |
---|
372 | if ( dialogArguments.CustomValue == 'Find' ) |
---|
373 | { |
---|
374 | dialog.SetSelectedTab( 'Find' ) ; |
---|
375 | dialog.SetAutoSize( true ) ; |
---|
376 | } |
---|
377 | else |
---|
378 | dialog.SetSelectedTab( 'Replace' ) ; |
---|
379 | |
---|
380 | SelectField( 'txtFind' + dialogArguments.CustomValue ) ; |
---|
381 | } |
---|
382 | |
---|
383 | function btnStat() |
---|
384 | { |
---|
385 | GetE('btnReplace').disabled = |
---|
386 | GetE('btnReplaceAll').disabled = |
---|
387 | GetE('btnFind').disabled = |
---|
388 | ( GetE(idMap["FindText"]).value.length == 0 ) ; |
---|
389 | } |
---|
390 | |
---|
391 | function btnStatDelayed() |
---|
392 | { |
---|
393 | setTimeout( btnStat, 1 ) ; |
---|
394 | } |
---|
395 | |
---|
396 | function GetSearchString() |
---|
397 | { |
---|
398 | return GetE(idMap['FindText']).value ; |
---|
399 | } |
---|
400 | |
---|
401 | function GetReplaceString() |
---|
402 | { |
---|
403 | return GetE("txtReplace").value ; |
---|
404 | } |
---|
405 | |
---|
406 | function GetCheckCase() |
---|
407 | { |
---|
408 | return !! ( GetE(idMap['CheckCase']).checked ) ; |
---|
409 | } |
---|
410 | |
---|
411 | function GetMatchWord() |
---|
412 | { |
---|
413 | return !! ( GetE(idMap['CheckWord']).checked ) ; |
---|
414 | } |
---|
415 | |
---|
416 | /* Is this character a unicode whitespace or a punctuation mark? |
---|
417 | * References: |
---|
418 | * http://unicode.org/Public/UNIDATA/PropList.txt (whitespaces) |
---|
419 | * http://php.chinaunix.net/manual/tw/ref.regex.php (punctuation marks) |
---|
420 | */ |
---|
421 | function CheckIsWordSeparator( c ) |
---|
422 | { |
---|
423 | if ( !c ) |
---|
424 | return true; |
---|
425 | var code = c.charCodeAt( 0 ); |
---|
426 | if ( code >= 9 && code <= 0xd ) |
---|
427 | return true; |
---|
428 | if ( code >= 0x2000 && code <= 0x200a ) |
---|
429 | return true; |
---|
430 | switch ( code ) |
---|
431 | { |
---|
432 | case 0x20: |
---|
433 | case 0x85: |
---|
434 | case 0xa0: |
---|
435 | case 0x1680: |
---|
436 | case 0x180e: |
---|
437 | case 0x2028: |
---|
438 | case 0x2029: |
---|
439 | case 0x202f: |
---|
440 | case 0x205f: |
---|
441 | case 0x3000: |
---|
442 | return true; |
---|
443 | default: |
---|
444 | } |
---|
445 | return /[.,"'?!;:]/.test( c ) ; |
---|
446 | } |
---|
447 | |
---|
448 | FindRange = null ; |
---|
449 | function _Find() |
---|
450 | { |
---|
451 | var searchString = GetSearchString() ; |
---|
452 | if ( !FindRange ) |
---|
453 | FindRange = new CharacterRange( new CharacterCursor( EditorDocument ), searchString.length ) ; |
---|
454 | else |
---|
455 | { |
---|
456 | FindRange.RemoveHighlight() ; |
---|
457 | FindRange = FindRange.GetNextRange( searchString.length ) ; |
---|
458 | } |
---|
459 | var matcher = new KmpMatch( searchString, ! GetCheckCase() ) ; |
---|
460 | var matchState = KMP_NOMATCH ; |
---|
461 | var character = '%' ; |
---|
462 | |
---|
463 | while ( character != null ) |
---|
464 | { |
---|
465 | while ( ( character = FindRange.GetEndCharacter() ) ) |
---|
466 | { |
---|
467 | matchState = matcher.FeedCharacter( character ) ; |
---|
468 | if ( matchState == KMP_MATCHED ) |
---|
469 | break ; |
---|
470 | if ( FindRange.MoveNext() ) |
---|
471 | matcher.Reset() ; |
---|
472 | } |
---|
473 | |
---|
474 | if ( matchState == KMP_MATCHED ) |
---|
475 | { |
---|
476 | if ( GetMatchWord() ) |
---|
477 | { |
---|
478 | var cursors = FindRange.GetCursors() ; |
---|
479 | var head = cursors[ cursors.length - 1 ].Clone() ; |
---|
480 | var tail = cursors[0].Clone() ; |
---|
481 | if ( !head.MoveNext() && !CheckIsWordSeparator( head.GetCharacter() ) ) |
---|
482 | continue ; |
---|
483 | if ( !tail.MoveBack() && !CheckIsWordSeparator( tail.GetCharacter() ) ) |
---|
484 | continue ; |
---|
485 | } |
---|
486 | |
---|
487 | FindRange.Highlight() ; |
---|
488 | return true ; |
---|
489 | } |
---|
490 | } |
---|
491 | |
---|
492 | FindRange = null ; |
---|
493 | return false ; |
---|
494 | } |
---|
495 | |
---|
496 | function Find() |
---|
497 | { |
---|
498 | if ( ! _Find() ) |
---|
499 | alert( FCKLang.DlgFindNotFoundMsg ) ; |
---|
500 | } |
---|
501 | |
---|
502 | function Replace() |
---|
503 | { |
---|
504 | var saveUndoStep = function( selectRange ) |
---|
505 | { |
---|
506 | var ieRange ; |
---|
507 | if ( oEditor.FCKBrowserInfo.IsIE ) |
---|
508 | ieRange = document.selection.createRange() ; |
---|
509 | |
---|
510 | selectRange.Select() ; |
---|
511 | oEditor.FCKUndo.SaveUndoStep() ; |
---|
512 | var cloneRange = selectRange.Clone() ; |
---|
513 | cloneRange.Collapse( false ) ; |
---|
514 | cloneRange.Select() ; |
---|
515 | |
---|
516 | if ( ieRange ) |
---|
517 | setTimeout( function(){ ieRange.select() ; }, 1 ) ; |
---|
518 | } |
---|
519 | |
---|
520 | if ( FindRange && FindRange.GetHighlightDomRange() ) |
---|
521 | { |
---|
522 | var range = FindRange.GetHighlightDomRange() ; |
---|
523 | var bookmark = range.CreateBookmark() ; |
---|
524 | FindRange.RemoveHighlight() ; |
---|
525 | range.MoveToBookmark( bookmark ) ; |
---|
526 | |
---|
527 | saveUndoStep( range ) ; |
---|
528 | range.DeleteContents() ; |
---|
529 | range.InsertNode( EditorDocument.createTextNode( GetReplaceString() ) ) ; |
---|
530 | range._UpdateElementInfo() ; |
---|
531 | |
---|
532 | FindRange = CharacterRange.CreateFromDomRange( range ) ; |
---|
533 | } |
---|
534 | else |
---|
535 | { |
---|
536 | if ( ! _Find() ) |
---|
537 | { |
---|
538 | FindRange && FindRange.RemoveHighlight() ; |
---|
539 | alert( FCKLang.DlgFindNotFoundMsg ) ; |
---|
540 | } |
---|
541 | } |
---|
542 | } |
---|
543 | |
---|
544 | function ReplaceAll() |
---|
545 | { |
---|
546 | oEditor.FCKUndo.SaveUndoStep() ; |
---|
547 | var replaceCount = 0 ; |
---|
548 | |
---|
549 | while ( _Find() ) |
---|
550 | { |
---|
551 | var range = FindRange.GetHighlightDomRange() ; |
---|
552 | var bookmark = range.CreateBookmark() ; |
---|
553 | FindRange.RemoveHighlight() ; |
---|
554 | range.MoveToBookmark( bookmark) ; |
---|
555 | |
---|
556 | range.DeleteContents() ; |
---|
557 | range.InsertNode( EditorDocument.createTextNode( GetReplaceString() ) ) ; |
---|
558 | range._UpdateElementInfo() ; |
---|
559 | |
---|
560 | FindRange = CharacterRange.CreateFromDomRange( range ) ; |
---|
561 | replaceCount++ ; |
---|
562 | } |
---|
563 | if ( replaceCount == 0 ) |
---|
564 | { |
---|
565 | FindRange && FindRange.RemoveHighlight() ; |
---|
566 | alert( FCKLang.DlgFindNotFoundMsg ) ; |
---|
567 | } |
---|
568 | dialog.Cancel() ; |
---|
569 | } |
---|
570 | |
---|
571 | window.onunload = function() |
---|
572 | { |
---|
573 | if ( FindRange ) |
---|
574 | { |
---|
575 | FindRange.RemoveHighlight() ; |
---|
576 | FindRange.ToDomRange().Select() ; |
---|
577 | } |
---|
578 | } |
---|
579 | </script> |
---|
580 | </head> |
---|
581 | <body onload="OnLoad()" style="overflow: hidden"> |
---|
582 | <div id="divFind" style="display: none"> |
---|
583 | <table cellspacing="3" cellpadding="2" width="100%" border="0"> |
---|
584 | <tr> |
---|
585 | <td nowrap="nowrap"> |
---|
586 | <label for="txtFindFind" fcklang="DlgReplaceFindLbl"> |
---|
587 | Find what:</label> |
---|
588 | </td> |
---|
589 | <td width="100%"> |
---|
590 | <input id="txtFindFind" onkeyup="btnStat()" oninput="btnStat()" onpaste="btnStatDelayed()" style="width: 100%" tabindex="1" |
---|
591 | type="text" /> |
---|
592 | </td> |
---|
593 | <td> |
---|
594 | <input id="btnFind" style="width: 80px" disabled="disabled" onclick="Find();" |
---|
595 | type="button" value="Find" fcklang="DlgFindFindBtn" /> |
---|
596 | </td> |
---|
597 | </tr> |
---|
598 | <tr> |
---|
599 | <td valign="bottom" colspan="3"> |
---|
600 | <input id="chkCaseFind" tabindex="3" type="checkbox" /><label for="chkCaseFind" fcklang="DlgReplaceCaseChk">Match |
---|
601 | case</label> |
---|
602 | <br /> |
---|
603 | <input id="chkWordFind" tabindex="4" type="checkbox" /><label for="chkWordFind" fcklang="DlgReplaceWordChk">Match |
---|
604 | whole word</label> |
---|
605 | </td> |
---|
606 | </tr> |
---|
607 | </table> |
---|
608 | </div> |
---|
609 | <div id="divReplace" style="display:none"> |
---|
610 | <table cellspacing="3" cellpadding="2" width="100%" border="0"> |
---|
611 | <tr> |
---|
612 | <td nowrap="nowrap"> |
---|
613 | <label for="txtFindReplace" fcklang="DlgReplaceFindLbl"> |
---|
614 | Find what:</label> |
---|
615 | </td> |
---|
616 | <td width="100%"> |
---|
617 | <input id="txtFindReplace" onkeyup="btnStat()" oninput="btnStat()" onpaste="btnStatDelayed()" style="width: 100%" tabindex="1" |
---|
618 | type="text" /> |
---|
619 | </td> |
---|
620 | <td> |
---|
621 | <input id="btnReplace" style="width: 80px" disabled="disabled" onclick="Replace();" |
---|
622 | type="button" value="Replace" fcklang="DlgReplaceReplaceBtn" /> |
---|
623 | </td> |
---|
624 | </tr> |
---|
625 | <tr> |
---|
626 | <td valign="top" nowrap="nowrap"> |
---|
627 | <label for="txtReplace" fcklang="DlgReplaceReplaceLbl"> |
---|
628 | Replace with:</label> |
---|
629 | </td> |
---|
630 | <td valign="top"> |
---|
631 | <input id="txtReplace" style="width: 100%" tabindex="2" type="text" /> |
---|
632 | </td> |
---|
633 | <td> |
---|
634 | <input id="btnReplaceAll" style="width: 80px" disabled="disabled" onclick="ReplaceAll()" type="button" |
---|
635 | value="Replace All" fcklang="DlgReplaceReplAllBtn" /> |
---|
636 | </td> |
---|
637 | </tr> |
---|
638 | <tr> |
---|
639 | <td valign="bottom" colspan="3"> |
---|
640 | <input id="chkCaseReplace" tabindex="3" type="checkbox" /><label for="chkCaseReplace" fcklang="DlgReplaceCaseChk">Match |
---|
641 | case</label> |
---|
642 | <br /> |
---|
643 | <input id="chkWordReplace" tabindex="4" type="checkbox" /><label for="chkWordReplace" fcklang="DlgReplaceWordChk">Match |
---|
644 | whole word</label> |
---|
645 | </td> |
---|
646 | </tr> |
---|
647 | </table> |
---|
648 | </div> |
---|
649 | </body> |
---|
650 | </html> |
---|