home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 December / PCWorld_2006-12_cd.bin / komunikace / netscape / nsb-install-8-1-2.exe / chrome / toolkit.jar / content / global / findBar.js < prev    next >
Encoding:
Text File  |  2006-01-06  |  22.6 KB  |  790 lines

  1.  
  2. const FIND_NORMAL = 0;
  3. const FIND_TYPEAHEAD = 1;
  4. const FIND_LINKS = 2;
  5.  
  6. // Global find variables
  7. var gFindMode = FIND_NORMAL;
  8. var gQuickFindTimeout = null;
  9. var gQuickFindTimeoutLength = 0;
  10. var gHighlightTimeout = null;
  11. var gUseTypeAheadFind = false;
  12. var gWrappedToTopStr = "";
  13. var gWrappedToBottomStr = "";
  14. var gNotFoundStr = "";
  15. var gTypeAheadFindBuffer = "";
  16. var gIsBack = true;
  17. var gBackProtectBuffer = 3;
  18. var gFlashFindBar = 0;
  19. var gFlashFindBarCount = 6;
  20. var gFlashFindBarTimeout = null;
  21. var gLastHighlightString = "";
  22. var gTypeAheadLinksOnly = false;
  23.  
  24. // MERC BML - adding findService of previous findDialog for use by Trident engine
  25. /* attributes are: searchString, matchCase, wrapFind,findBackwards  */
  26. var gFindService = null;
  27.  
  28. // DOMRange used during highlighting
  29. var searchRange;
  30. var startPt;
  31. var endPt;
  32.  
  33. var gTypeAheadFind = {
  34.   useTAFPref: "accessibility.typeaheadfind",
  35.   searchLinksPref: "accessibility.typeaheadfind.linksonly",
  36.  
  37.   observe: function(aSubject, aTopic, aPrefName)
  38.   {
  39.     if (aTopic != "nsPref:changed" || (aPrefName != this.useTAFPref && aPrefName != this.searchLinksPref))
  40.       return;
  41.  
  42.     var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  43.                                 .getService(Components.interfaces.nsIPrefBranch);
  44.  
  45.     gUseTypeAheadFind = prefService.getBoolPref("accessibility.typeaheadfind");
  46.     gTypeAheadLinksOnly = gPrefService.getBoolPref("accessibility.typeaheadfind.linksonly");
  47.   }
  48. };
  49.  
  50. function initFindBar()
  51. {
  52.   // MERC BML - adding findService for use by Trident engine
  53.   gFindService =  Components.classes["@mozilla.org/find/find_service;1"]
  54.                            .getService(Components.interfaces.nsIFindService);
  55.   // set wrapFind to true as it's set to default in old findService
  56.   // & there's no option for it in findBar
  57.   gFindService.wrapFind = true;
  58.  
  59.   getBrowser().addEventListener("keypress", onBrowserKeyPress, false);
  60.   getBrowser().addEventListener("mousedown", onBrowserMouseDown, false);
  61.  
  62.   var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  63.                               .getService(Components.interfaces.nsIPrefBranch);
  64.  
  65.   var pbi = prefService.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
  66.  
  67.   gQuickFindTimeoutLength = prefService.getIntPref("accessibility.typeaheadfind.timeout");
  68.   gFlashFindBar = prefService.getIntPref("accessibility.typeaheadfind.flashBar");
  69.  
  70.   pbi.addObserver(gTypeAheadFind.useTAFPref, gTypeAheadFind, false);
  71.   pbi.addObserver(gTypeAheadFind.searchLinksPref, gTypeAheadFind, false);
  72.   gUseTypeAheadFind = prefService.getBoolPref("accessibility.typeaheadfind");
  73.   gTypeAheadLinksOnly = prefService.getBoolPref("accessibility.typeaheadfind.linksonly");
  74. }
  75.  
  76. function uninitFindBar()
  77. {
  78.    var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  79.                                .getService(Components.interfaces.nsIPrefBranch);
  80.  
  81.    var pbi = prefService.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
  82.    pbi.removeObserver(gTypeAheadFind.useTAFPref, gTypeAheadFind);
  83.    pbi.removeObserver(gTypeAheadFind.searchLinksPref, gTypeAheadFind);
  84.  
  85.    getBrowser().removeEventListener("keypress", onBrowserKeyPress, false);
  86.    getBrowser().removeEventListener("mousedown", onBrowserMouseDown, false);
  87. }
  88.  
  89. function toggleHighlight(aHighlight)
  90. {
  91.   var word = document.getElementById("find-field").value;
  92.   if (aHighlight) {
  93.     highlightDoc('yellow', word);
  94.   } else {
  95.     highlightDoc(null, null);
  96.     gLastHighlightString = null;
  97.   }
  98. }
  99.  
  100. function highlightDoc(color, word, win)
  101. {
  102.     var hpDoc= null;
  103.     if (self.getTridentDocument)
  104.         hpDoc = getTridentDocument();
  105.     if (hpDoc) {
  106.         // gFindService should already have the word, direction, and case settings
  107.         // call hpDoc.highlightDoc to perform actions
  108. //        dump("calling hpDoc.highlightDoc("+color+","+gLastHighlightString+")\n");
  109.     gFindService.searchString   = document.getElementById("find-field").value;
  110.     gFindService.matchCase      = document.getElementById("find-case-sensitive").checked;
  111.     gFindService.findBackwards  = false;
  112.         hpDoc.highlightDoc(color,gLastHighlightString);
  113.         gLastHighlightString=word;
  114.         return;
  115.     }
  116.   if (!win)
  117.     win = window._content;
  118.  
  119.   for (var i = 0; win.frames && i < win.frames.length; i++) {
  120.     highlightDoc(color, word, win.frames[i]);
  121.   }
  122.  
  123.   var doc = win.document;
  124.   if (!doc)
  125.     return;
  126.  
  127.   if (!("body" in doc))
  128.     return;
  129.  
  130.   var body = doc.body;
  131.  
  132.   var count = body.childNodes.length;
  133.   searchRange = doc.createRange();
  134.   startPt = doc.createRange();
  135.   endPt = doc.createRange();
  136.  
  137.   searchRange.setStart(body, 0);
  138.   searchRange.setEnd(body, count);
  139.  
  140.   startPt.setStart(body, 0);
  141.   startPt.setEnd(body, 0);
  142.   endPt.setStart(body, count);
  143.   endPt.setEnd(body, count);
  144.  
  145.   // Remove highlighting.  We use the find API again rather than
  146.   // searching for our span elements by id so that we gain access to the
  147.   // anonymous content that nsIFind searches.
  148.  
  149.   // MERC MSD: Better to use getAnonymousElementByAttribute since gLastHighlightString
  150.   // is volitile in a tab browser interface.
  151.   try {
  152. //      dump("trying to get anon element\n");
  153.     for (var elem = doc.getAnonymousElementByAttribute(body,"anonid","__firefox-findbar-search-id");
  154.          elem;
  155.          elem = doc.getAnonymousElementByAttribute(body,"anonid","__firefox-findbar-search-id"))
  156.     {
  157. //        dump("have elem\n");
  158.       var child = null;
  159.       var docfrag = doc.createDocumentFragment();
  160.       var next = elem.nextSibling;
  161.       var parent = elem.parentNode;
  162.  
  163.       while ((child = elem.firstChild)) {
  164.         docfrag.appendChild(child);
  165.       }
  166.  
  167.       startPt = doc.createRange();
  168.       startPt.setStartAfter(elem);
  169.  
  170.       parent.removeChild(elem);
  171.       parent.insertBefore(docfrag, next);
  172.     }
  173.       var elemList = body.getElementsByTagName("span");
  174.       while (elemList && elemList.length)
  175.       {
  176.           var found = false;
  177.           for (var i = 0;i< elemList.length;i++)
  178.           {
  179.               var elem = elemList.item(i);
  180.               if (!elem) continue;
  181. //            dump("have span\n");
  182.             var anonid = elem.getAttribute("anonid");
  183.             if (!(anonid && anonid =="__firefox-findbar-search-id"))
  184.                    continue;
  185. //               dump("have right span\n");
  186.                found = true;
  187.           var child = null;
  188.           var docfrag = doc.createDocumentFragment();
  189.           var next = elem.nextSibling;
  190.           var parent = elem.parentNode;
  191.  
  192.           while ((child = elem.firstChild)) {
  193.             docfrag.appendChild(child);
  194.           }
  195.  
  196.           startPt = doc.createRange();
  197.           startPt.setStartAfter(elem);
  198.  
  199.           parent.removeChild(elem);
  200.           parent.insertBefore(docfrag, next);
  201.         }
  202.           if (found)
  203.               elemList = body.getElementsByTagName("span");
  204.           else
  205.               break;
  206.       }
  207.   } catch (e) { dump("error occurred\n"+e+"\n");}
  208.  
  209. //    if (!gLastHighlightString)
  210. //      return;
  211. //
  212. //    var retRange = null;
  213. //    var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"].createInstance()
  214. //                         .QueryInterface(Components.interfaces.nsIFind);
  215. //
  216. //    while ((retRange = finder.Find(gLastHighlightString, searchRange,startPt, endPt))) {
  217. //      var startContainer = retRange.startContainer;
  218. //      var elem = null;
  219. //      try {
  220. //        elem = startContainer.parentNode;
  221. //      }
  222. //      catch (e) { }
  223. //
  224. //      if (elem && elem.getAttribute("id") == "__firefox-findbar-search-id") {
  225. //        var child = null;
  226. //        var docfrag = doc.createDocumentFragment();
  227. //        var next = elem.nextSibling;
  228. //        var parent = elem.parentNode;
  229. //
  230. //        while ((child = elem.firstChild)) {
  231. //          docfrag.appendChild(child);
  232. //        }
  233. //
  234. //        startPt = doc.createRange();
  235. //        startPt.setStartAfter(elem);
  236. //
  237. //        parent.removeChild(elem);
  238. //        parent.insertBefore(docfrag, next);
  239. //      }
  240. //      else {
  241. //        // Somehow we didn't highlight this instance; just skip it.
  242. //        startPt = doc.createRange();
  243. //        startPt.setStart(retRange.endContainer, retRange.endOffset);
  244. //      }
  245. //
  246. //      startPt.collapse(true);
  247. //    }
  248.   if (!color) {
  249.     return; // if color is null, no need to continue
  250.   }
  251.  
  252.   var baseNode = doc.createElement("span");
  253.   baseNode.setAttribute("style", "background-color: " + color + ";");
  254.   baseNode.setAttribute("anonid", "__firefox-findbar-search-id");
  255.  
  256.   highlightText(word, baseNode);
  257. }
  258.  
  259. function highlightText(word, baseNode)
  260. {
  261.   var retRange = null;
  262.   var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"].createInstance()
  263.                          .QueryInterface(Components.interfaces.nsIFind);
  264.  
  265.   finder.caseSensitive = document.getElementById("find-case-sensitive").checked;
  266.  
  267.   while((retRange = finder.Find(word, searchRange, startPt, endPt))) {
  268.     // Highlight
  269.     var nodeSurround = baseNode.cloneNode(true);
  270.     var node = highlight(retRange, nodeSurround);
  271.     startPt = node.ownerDocument.createRange();
  272.     startPt.setStart(node, node.childNodes.length);
  273.     startPt.setEnd(node, node.childNodes.length);
  274.   }
  275.  
  276.   gLastHighlightString = word;
  277. }
  278.  
  279. function highlight(range, node)
  280. {
  281.   var startContainer = range.startContainer;
  282.   var startOffset = range.startOffset;
  283.   var endOffset = range.endOffset;
  284.   var docfrag = range.extractContents();
  285.   var before = startContainer.splitText(startOffset);
  286.   var parent = before.parentNode;
  287.   node.appendChild(docfrag);
  288.   parent.insertBefore(node, before);
  289.   return node;
  290. }
  291.  
  292. function getSelectionControllerForFindToolbar(ds)
  293. {
  294.   var display = ds.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsISelectionDisplay);
  295.   if (!display)
  296.     return null;
  297.   return display.QueryInterface(Components.interfaces.nsISelectionController);
  298. }
  299.  
  300. function toggleCaseSensitivity(aCaseSensitive)
  301. {
  302.   var fastFind = getBrowser().fastFind;
  303.   fastFind.caseSensitive = aCaseSensitive;
  304.  
  305.   if (gFindMode != FIND_NORMAL)
  306.     setFindCloseTimeout();
  307. }
  308.  
  309. function changeSelectionColor(aAttention)
  310. {
  311.   var ds = getBrowser().docShell;
  312.   var dsEnum = ds.getDocShellEnumerator(Components.interfaces.nsIDocShellTreeItem.typeContent,
  313.                                         Components.interfaces.nsIDocShell.ENUMERATE_FORWARDS);
  314.   while (dsEnum.hasMoreElements()) {
  315.     ds = dsEnum.getNext().QueryInterface(Components.interfaces.nsIDocShell);
  316.     var controller = getSelectionControllerForFindToolbar(ds);
  317.     if (!controller)
  318.       continue;
  319.     const selCon = Components.interfaces.nsISelectionController;
  320.     controller.setDisplaySelection(aAttention? selCon.SELECTION_ATTENTION : selCon.SELECTION_ON);
  321.   }
  322. }
  323.  
  324. function openFindBar()
  325. {
  326.   if (!gNotFoundStr || !gWrappedToTopStr || !gWrappedToBottomStr) {
  327.     var bundle = document.getElementById("bundle_findBar");
  328.     gNotFoundStr = bundle.getString("NotFound");
  329.     gWrappedToTopStr = bundle.getString("WrappedToTop");
  330.     gWrappedToBottomStr = bundle.getString("WrappedToBottom");
  331.   }
  332.  
  333.   var findToolbar = document.getElementById("FindToolbar");
  334.   if (findToolbar.hidden) {
  335.     findToolbar.hidden = false;
  336.  
  337.     var statusIcon = document.getElementById("find-status-icon");
  338.     var statusText = document.getElementById("find-status");
  339.     var findField = document.getElementById("find-field");
  340.     findField.removeAttribute("status");
  341.     statusIcon.removeAttribute("status");
  342.     statusText.value = "";
  343.  
  344.     return true;
  345.   }
  346.   return false;
  347. }
  348.  
  349. function focusFindBar()
  350. {
  351.   var findField = document.getElementById("find-field");
  352.   findField.focus();
  353. }
  354.  
  355. function selectFindBar()
  356. {
  357.   var findField = document.getElementById("find-field");
  358.   findField.select();
  359. }
  360.  
  361. function closeFindBar()
  362. {
  363.   var findField = document.getElementById("find-field");
  364.   var ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
  365.                      .getService(Components.interfaces.nsIWindowWatcher);
  366.   if (window == ww.activeWindow && document.commandDispatcher.focusedElement &&
  367.       document.commandDispatcher.focusedElement.parentNode.parentNode == findField) {
  368.     _content.focus();
  369.   }
  370.  
  371.   var findToolbar = document.getElementById("FindToolbar");
  372.   findToolbar.hidden = true;
  373.   gTypeAheadFindBuffer = "";
  374.   changeSelectionColor(false);
  375.   if (gQuickFindTimeout) {
  376.     clearTimeout(gQuickFindTimeout);
  377.     gQuickFindTimeout = null;
  378.   }
  379. }
  380.  
  381. function shouldFastFind(evt)
  382. {
  383.   if (evt.ctrlKey || evt.altKey || evt.metaKey || evt.getPreventDefault())
  384.     return false;
  385.  
  386.   var elt = document.commandDispatcher.focusedElement;
  387.   if (elt) {
  388.     var ln = elt.localName.toLowerCase();
  389.     if (ln == "input" || ln == "textarea" || ln == "select" || ln == "button" || ln == "isindex")
  390.       return false;
  391.   }
  392.  
  393.   var win = document.commandDispatcher.focusedWindow;
  394.   if (win && win.document.designMode == "on")
  395.     return false;
  396.  
  397.   return true;
  398. }
  399.  
  400. function onFindBarFocus()
  401. {
  402.   toggleLinkFocus(false);
  403. }
  404.  
  405. function onFindBarBlur()
  406. {
  407.   toggleLinkFocus(true);
  408.   changeSelectionColor(false);
  409. }
  410.  
  411. function onBrowserMouseDown(evt)
  412. {
  413.   var findToolbar = document.getElementById("FindToolbar");
  414.   if (!findToolbar.hidden && gFindMode != FIND_NORMAL)
  415.     closeFindBar();
  416. }
  417.  
  418. function onBrowserKeyPress(evt)
  419. {
  420.   // Check focused elt
  421.   if (!shouldFastFind(evt))
  422.     return;
  423.  
  424.   var findField = document.getElementById("find-field");
  425.   if (gFindMode != FIND_NORMAL && gQuickFindTimeout) {
  426.     if (evt.keyCode == 8) { // Backspace
  427.       if (findField.value) {
  428.         findField.value = findField.value.substr(0, findField.value.length - 1);
  429.         gIsBack = true;
  430.         gBackProtectBuffer = 3;
  431.       }
  432.       else if (gBackProtectBuffer > 0) {
  433.         gBackProtectBuffer--;
  434.       }
  435.  
  436.       if (gIsBack || gBackProtectBuffer > 0)
  437.         evt.preventDefault();
  438.  
  439.       find(findField.value);
  440.     }
  441.     else if (evt.keyCode == 27) { // Escape
  442.       closeFindBar();
  443.       evt.preventDefault();
  444.     }
  445.     else if (evt.charCode) {
  446.       if (evt.charCode == 32) // Space
  447.         evt.preventDefault();
  448.  
  449.       findField.value += String.fromCharCode(evt.charCode);
  450.       find(findField.value);
  451.     }
  452.     return;
  453.   }
  454.  
  455.   if (evt.charCode == 39 /* ' */ || evt.charCode == 47 /* / */ || (gUseTypeAheadFind && evt.charCode && evt.charCode != 32)) {
  456.     gFindMode = (evt.charCode == 39 || (gTypeAheadLinksOnly && evt.charCode != 47)) ? FIND_LINKS : FIND_TYPEAHEAD;
  457.     toggleLinkFocus(true);
  458.     if (openFindBar()) {
  459.       setFindCloseTimeout();
  460.       if (gUseTypeAheadFind && evt.charCode != 39 && evt.charCode != 47) {
  461.         gTypeAheadFindBuffer += String.fromCharCode(evt.charCode);
  462.         findField.value = gTypeAheadFindBuffer;
  463.         find(findField.value);
  464.       }
  465.       else {
  466.         findField.value = "";
  467.       }
  468.     }
  469.     else {
  470.       if (gFindMode == FIND_NORMAL) {
  471.         selectFindBar();
  472.         focusFindBar();
  473.       }
  474.       else {
  475.         findField.value = String.fromCharCode(evt.charCode);
  476.         find(findField.value);
  477.       }
  478.     }
  479.   }
  480. }
  481.  
  482. function toggleLinkFocus(aFocusLinks)
  483. {
  484.   var fastFind = getBrowser().fastFind;
  485.   fastFind.focusLinks = aFocusLinks;
  486. }
  487.  
  488. function onBrowserKeyUp(evt)
  489. {
  490.   if (evt.keyCode == 8)
  491.     gIsBack = false;
  492. }
  493.  
  494. function onFindBarKeyPress(evt)
  495. {
  496.   if (evt.keyCode == KeyEvent.DOM_VK_RETURN) {
  497.     var findString = document.getElementById("find-field");
  498.     if (!findString.value)
  499.       return;
  500.  
  501.     if (evt.ctrlKey) {
  502.       document.getElementById("highlight").click();
  503.       return;
  504.     }
  505.  
  506.     if (evt.shiftKey)
  507.       findPrevious();
  508.     else
  509.       findNext();
  510.   }
  511.   else if (evt.keyCode == KeyEvent.DOM_VK_ESCAPE) {
  512.     closeFindBar();
  513.     evt.preventDefault();
  514.   }
  515.   else if (evt.keyCode == KeyEvent.DOM_VK_PAGE_UP) {
  516.     window.top._content.scrollByPages(-1);
  517.     evt.preventDefault();
  518.   }
  519.   else if (evt.keyCode == KeyEvent.DOM_VK_PAGE_DOWN) {
  520.     window.top._content.scrollByPages(1);
  521.     evt.preventDefault();
  522.   }
  523.   else if (evt.keyCode == KeyEvent.DOM_VK_UP) {
  524.     window.top._content.scrollByLines(-1);
  525.     evt.preventDefault();
  526.   }
  527.   else if (evt.keyCode == KeyEvent.DOM_VK_DOWN) {
  528.     window.top._content.scrollByLines(1);
  529.     evt.preventDefault();
  530.   }
  531.  
  532. }
  533.  
  534. function enableFindButtons(aEnable)
  535. {
  536.   var findNext = document.getElementById("find-next");
  537.   var findPrev = document.getElementById("find-previous");
  538.   var highlight = document.getElementById("highlight");
  539.   findNext.disabled = findPrev.disabled = highlight.disabled = !aEnable;
  540. }
  541.  
  542. function find(val)
  543. {
  544.   if (!val)
  545.     val = document.getElementById("find-field").value;
  546.  
  547.   enableFindButtons(val);
  548.  
  549.   var highlightBtn = document.getElementById("highlight");
  550.   if (highlightBtn.checked)
  551.     setHighlightTimeout();
  552.  
  553.   // what's this do?
  554.   changeSelectionColor(true);
  555.  
  556.   // MERC BML - adding code for findBar to work in Trident
  557.   var hpDoc = null;
  558.   if (self.getTridentDocument) {
  559.       hpDoc = getTridentDocument();
  560.   }
  561.   var res;
  562.   if(hpDoc){
  563.     // TRIDENT - using
  564. //    dump("\n\nMERC BML findBar.js - line 521 - calling Trident hpDoc.find()...\n\n");
  565.  
  566.     // Set data attributes of findService
  567.     gFindService.searchString  = val;
  568.     gFindService.matchCase     = document.getElementById("find-case-sensitive").checked;
  569.     gFindService.findBackwards = false;
  570.     res = hpDoc.find();
  571.   }else{
  572.     //  GECKO
  573. //    dump("\n\nMERC BML findBar.js - line 540 - calling Gecko find()...\n\n");
  574.     var fastFind = getBrowser().fastFind;
  575.     res = fastFind.find(val, gFindMode == FIND_LINKS);
  576.   }
  577.  
  578.   // this takes result of find function from Gecko
  579.   // but what's it do?
  580.   updateStatus(res, true);
  581.  
  582.   if (gFindMode != FIND_NORMAL)
  583.     setFindCloseTimeout();
  584.  
  585. //  dump("\n\nMERC BML findBar.js - line 535 - leaving find(val)...\n\n");
  586.  
  587. }
  588.  
  589. function flashFindBar()
  590. {
  591.   var findToolbar = document.getElementById("FindToolbar");
  592.   if (gFlashFindBarCount-- == 0) {
  593.     clearInterval(gFlashFindBarTimeout);
  594.     findToolbar.removeAttribute("flash");
  595.     gFlashFindBarCount = 6;
  596.     return true;
  597.   }
  598.  
  599.   findToolbar.setAttribute("flash", (gFlashFindBarCount % 2 == 0) ? "false" : "true");
  600. }
  601.  
  602. function onFindCmd()
  603. {
  604.   gFindMode = FIND_NORMAL;
  605.   openFindBar();
  606.   if (gFlashFindBar) {
  607.     gFlashFindBarTimeout = setInterval(flashFindBar, 500);
  608.     var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  609.                                 .getService(Components.interfaces.nsIPrefBranch);
  610.  
  611.     prefService.setIntPref("accessibility.typeaheadfind.flashBar", --gFlashFindBar);
  612.   }
  613.   selectFindBar();
  614.   focusFindBar();
  615. }
  616.  
  617. function onFindAgainCmd()
  618. {
  619.   var findString = getBrowser().findString;
  620.   if (!findString)
  621.     return onFindCmd();
  622.  
  623.   var res = findNext();
  624.   if (res == Components.interfaces.nsITypeAheadFind.FIND_NOTFOUND) {
  625.     if (openFindBar()) {
  626.       focusFindBar();
  627.       selectFindBar();
  628.       if (gFindMode != FIND_NORMAL)
  629.         setFindCloseTimeout();
  630.  
  631.       updateStatus(res, true);
  632.     }
  633.   }
  634. }
  635.  
  636. function onFindPreviousCmd()
  637. {
  638.   var findString = getBrowser().findString;
  639.   if (!findString)
  640.     return onFindCmd();
  641.  
  642.   var res = findPrevious();
  643.   if (res == Components.interfaces.nsITypeAheadFind.FIND_NOTFOUND) {
  644.     if (openFindBar()) {
  645.       focusFindBar();
  646.       selectFindBar();
  647.       if (gFindMode != FIND_NORMAL)
  648.         setFindCloseTimeout();
  649.  
  650.       updateStatus(res, false);
  651.     }
  652.   }
  653. }
  654.  
  655. function setHighlightTimeout()
  656. {
  657.   if (gHighlightTimeout)
  658.     clearTimeout(gHighlightTimeout);
  659.   gHighlightTimeout = setTimeout(function() { toggleHighlight(false); toggleHighlight(true); }, 500);
  660. }
  661.  
  662. function isFindBarVisible()
  663. {
  664.   var findBar = document.getElementById("FindToolbar");
  665.   return !findBar.hidden;
  666. }
  667.  
  668. function findNext()
  669. {
  670.   // MERC BML - adding code for findBar to work in Trident
  671. //  dump("\n\nMERC BML - findbar.js line 645 findnext() called...\n\n");
  672.   var res;
  673.   var hpDoc;
  674.   
  675.   if (self.getTridentDocument)
  676.       hpDoc = getTridentDocument();
  677.   if(hpDoc){
  678.     // Trident
  679. //    dump("\n\nMERC BML - findbar.js line 650 calling TRIDENT findNext()...\n\n");
  680.  
  681.     // set the findService with current state
  682.     gFindService.searchString   = document.getElementById("find-field").value;
  683.     gFindService.matchCase      = document.getElementById("find-case-sensitive").checked;
  684.     gFindService.findBackwards  = false; // this is findNext
  685.  
  686.     res = hpDoc.findNext();
  687.  
  688.   }else{
  689.     // Gecko
  690.     changeSelectionColor(true);
  691.     
  692.     //Merc BH: fix for Blt#210490: Clicking 'Find Next' in 'Find' Bar highlights the incorrect text i.e other than the text displayed in 'Find' Text box.
  693.     brows = getBrowser();
  694.         
  695.         var fastFind = brows.fastFind;
  696.         
  697.         if(brows.findString != document.getElementById("find-field").value)
  698.     {
  699.         res = fastFind.find(document.getElementById("find-field").value, false);
  700.     }
  701.       else
  702.       {
  703.           res = fastFind.findNext();
  704.       }
  705.  
  706.     if (gFindMode != FIND_NORMAL && isFindBarVisible())
  707.       setFindCloseTimeout();
  708.   }
  709.   updateStatus(res, true);
  710.   return res;
  711. }
  712.  
  713. function findPrevious()
  714. {
  715.   // MERC BML - adding code for findBar to work in Trident
  716. //  dump("\n\nMERC BML - findbar.js line 676 findPrevious() called...\n\n");
  717.   var res;
  718.   var hpDoc;
  719.   if (self.getTridentDocument)
  720.       hpDoc = getTridentDocument();
  721.   if(hpDoc){
  722.     // Trident
  723. //    dump("\n\nMERC BML - findbar.js line 681 calling TRIDENT findPrevious()...\n\n");
  724.  
  725.     // set the findService with current state
  726.  
  727.     gFindService.searchString   = document.getElementById("find-field").value;
  728.     gFindService.matchCase      = document.getElementById("find-case-sensitive").checked;
  729.     gFindService.findBackwards  = true; // this is findPrevious
  730.     res = hpDoc.findNext();
  731.  
  732.   }else{
  733.     // Gecko
  734. //    dump("\n\nMERC BML - findbar.js line 691 calling Gecko findPrevious()...\n\n");
  735.     changeSelectionColor(true);
  736.  
  737.     //Merc BH: fix for Blt#210490: Clicking 'Find Next' in 'Find' Bar highlights the incorrect text i.e other than the text displayed in 'Find' Text box.
  738.     brows = getBrowser();
  739.         
  740.         var fastFind = brows.fastFind;
  741.         
  742.         if(brows.findString != document.getElementById("find-field").value)
  743.     {
  744.         res = fastFind.find(document.getElementById("find-field").value, false);
  745.     }
  746.       else
  747.       {
  748.           res = fastFind.findPrevious();
  749.       }
  750.  
  751.     if (gFindMode != FIND_NORMAL && isFindBarVisible())
  752.       setFindCloseTimeout();
  753.   }
  754.   updateStatus(res, false);
  755.   return res;
  756. }
  757.  
  758. function updateStatus(res, findNext)
  759. {
  760. //    dump("updateStatus("+res+","+findNext+")\n");
  761.   var findBar = document.getElementById("FindToolbar");
  762.   var field = document.getElementById("find-field");
  763.   var statusIcon = document.getElementById("find-status-icon");
  764.   var statusText = document.getElementById("find-status");
  765.   switch(res) {
  766.     case Components.interfaces.nsITypeAheadFind.FIND_WRAPPED:
  767.       statusIcon.setAttribute("status", "wrapped");
  768.       statusText.value = findNext ? gWrappedToTopStr : gWrappedToBottomStr;
  769.       break;
  770.     case Components.interfaces.nsITypeAheadFind.FIND_NOTFOUND:
  771.       statusIcon.setAttribute("status", "notfound");
  772.       statusText.value = gNotFoundStr;
  773.       field.setAttribute("status", "notfound");
  774.       break;
  775.     case Components.interfaces.nsITypeAheadFind.FIND_FOUND:
  776.     default:
  777.       statusIcon.removeAttribute("status");
  778.       statusText.value = "";
  779.       field.removeAttribute("status");
  780.       break;
  781.   }
  782. }
  783.  
  784. function setFindCloseTimeout()
  785. {
  786.   if (gQuickFindTimeout)
  787.     clearTimeout(gQuickFindTimeout);
  788.   gQuickFindTimeout = setTimeout(function() { if (gFindMode != FIND_NORMAL) closeFindBar(); }, gQuickFindTimeoutLength);
  789. }
  790.