726 lines
18 KiB
Plaintext
726 lines
18 KiB
Plaintext
//<SCRIPT language=javascript>
|
|
// The line above and the </SCRIPT> at the botttom of the file are so the
|
|
// localization tools work properly for this file.
|
|
// NOTE: because comments are taken out by the preprocessor,
|
|
// it's really included by findinc.sed
|
|
#include "dialogs.dh"
|
|
|
|
//+--------------------------------------------------
|
|
//
|
|
// Find dialog header file. This file contains functions
|
|
// common to the find.dlg and bidifind.dlg.
|
|
//
|
|
//---------------------------------------------------
|
|
|
|
//Find Text dialog box
|
|
#define IDH_FIND_WHOLE 50022 // was 0x3063
|
|
#define IDH_FIND_CASE 50023 // was 0x3064
|
|
#define IDH_FIND_UP 50025 // was 0x3065
|
|
#define IDH_FIND_DOWN 50024 // was 0x3066
|
|
#define IDH_FIND_NEXT 50026 // was 0x3067
|
|
#define IDH_FIND_WHAT 50027 // was 0x3068
|
|
#define IDH_FIND_DIACRITIC 50401
|
|
#define IDH_FIND_KASHIDA 50402
|
|
#define IDH_FIND_ALEF_HAMZA 50403
|
|
|
|
setState(Find, btnFind, txtFindText)
|
|
|
|
//
|
|
// global variables
|
|
//
|
|
var g_docLastFound; // the document we last searched through
|
|
var g_fFrameset = false; // Are we in a frameset?
|
|
var g_arrFrames = new Array(); // Array of path through framesets
|
|
var g_fSearchTopFrame = false; // Should we search the doc of
|
|
// the top frame?
|
|
var g_fFollowIframes = true; // Should we walk down iframes?
|
|
var g_fError = false; // Has a handled error occured?
|
|
|
|
var g_docSearch ;
|
|
|
|
var g_rngWorking; // The range we're going to search
|
|
var g_rngFoundText; // The found text
|
|
var g_fFoundText = false; // If the text has already been found
|
|
var g_intDirection; // What direction to search
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Synopsis: Turns off error messages in dialogs
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// returns: true (tells browser not to handle message)
|
|
//
|
|
//--------------------------------------------------------------------
|
|
|
|
function FindHandleError(message, url, line)
|
|
{
|
|
// NOTE TO LOCALIZERS! (krisma) The next two strings must exactly match
|
|
// the error text that appears if you comment out the
|
|
// "window.onerror = FindHandleError;" line in loadBdy() and
|
|
// launch the find dialog.
|
|
|
|
var L_Find_DIALOG_NoAction_ErrorMessage = "Object doesn't support this action";
|
|
var L_Find_DIALOG_NoProperty_ErrorMessage = "Object doesn't support this property or method";
|
|
|
|
if (message != L_Find_DIALOG_NoProperty_ErrorMessage)
|
|
{
|
|
if (message != L_Find_DIALOG_NoAction_ErrorMessage)
|
|
{
|
|
var str = L_Dialog_ErrorMessage + "\n\n"
|
|
+ L_ErrorNumber_Text + line + "\n"
|
|
+ message;
|
|
|
|
alert (str);
|
|
window.close();
|
|
}
|
|
else // We've got an iframe without trident.
|
|
{
|
|
g_fError = true;
|
|
g_fFrameset = false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//
|
|
// Frameset navigation functions
|
|
//
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Synopsis: Follows the path in g_arrFrames
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// Returns: window object at end of frameset path
|
|
//
|
|
//----------------------------------------------------------------------
|
|
|
|
function CrawlPath()
|
|
{
|
|
var win = window.dialogArguments.unsecuredWindowOfDocument;
|
|
var i = 0;
|
|
|
|
//
|
|
// Special case if top doc has iframe
|
|
//
|
|
if (g_fSearchTopFrame)
|
|
{
|
|
return win;
|
|
}
|
|
|
|
while (g_arrFrames[i] >= 0)
|
|
{
|
|
win = win.frames[g_arrFrames[i]];
|
|
i++;
|
|
}
|
|
return win;
|
|
} // CrawlPath
|
|
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Synopsis: Whether or not the end of the current path is
|
|
// at another frameset
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// Returns: 0 if false, non-zero if true
|
|
//
|
|
//----------------------------------------------------------------------
|
|
|
|
function AtFrameset()
|
|
{
|
|
var win = CrawlPath();
|
|
|
|
return win.frames.length;
|
|
} // AtFrameset
|
|
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Synopsis: Whether or not the end of the current path is
|
|
// at a document with iframes
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// Returns: 0 if false, non-zero if true
|
|
//
|
|
//----------------------------------------------------------------------
|
|
|
|
function AtIframe()
|
|
{
|
|
var win = CrawlPath();
|
|
return win.document.all.tags("IFRAME").length;
|
|
} // AtIFrame
|
|
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Synopsis: checks the extension of the current file against
|
|
// a list of file types we should search into
|
|
//
|
|
// Arguments: the window that contains the file we're checkin
|
|
//
|
|
// Returns: true if we can search it, false if we can't.
|
|
//
|
|
//----------------------------------------------------------------------
|
|
|
|
function IsLegalPage(win)
|
|
{
|
|
var arrBadFileTypes = new Array(".doc", ".xls", ".pdf");
|
|
var strHref = win.location.href;
|
|
|
|
for (i=0; i < arrBadFileTypes.length; i++)
|
|
{
|
|
if (strHref.lastIndexOf(arrBadFileTypes[i]) == (strHref.length - 4))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Synopsis: gets the position in the current frameset
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// Returns: 0-based integer representing position
|
|
//
|
|
//----------------------------------------------------------------------
|
|
|
|
function GetCurrentPos()
|
|
{
|
|
var i = GetCurrentDepth();
|
|
|
|
return g_arrFrames[i];
|
|
} // GetCurrentPos
|
|
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Synopsis: Tells how many frames deep we're currently at
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// Returns: 0-based integer representing depth
|
|
//
|
|
//----------------------------------------------------------------------
|
|
|
|
function GetCurrentDepth()
|
|
{
|
|
var i = 0;
|
|
|
|
while (g_arrFrames[i] >= 0)
|
|
{
|
|
i++;
|
|
}
|
|
|
|
return i-1;
|
|
|
|
} // GetCurrentDepth
|
|
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Synopsis: Can we move forward in the current frameset?
|
|
//
|
|
// Arguments: fForward Whether we're trying to move forwards or
|
|
// backwards
|
|
//
|
|
// Returns: 0 if false, non-zero if true
|
|
//
|
|
//----------------------------------------------------------------------
|
|
|
|
function MovePossible(fForward)
|
|
{
|
|
var intCurPos = GetCurrentPos();
|
|
var win = CrawlPath();
|
|
var winParent = win.parent;
|
|
|
|
if (fForward)
|
|
{
|
|
if ((winParent.frames.length - intCurPos - 1)
|
|
&& (IsLegalPage(winParent.frames[intCurPos + 1])))
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return (intCurPos != 0);
|
|
}
|
|
|
|
} // MovePossible
|
|
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Synopsis: Moves up in the frameset
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
//----------------------------------------------------------------------
|
|
|
|
function MoveUpFrameset()
|
|
{
|
|
var i = GetCurrentDepth();
|
|
g_arrFrames[i] = -1;
|
|
} // MoveUpFrameset
|
|
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Synopsis: Moves down in the frameset
|
|
//
|
|
// Arguments: fForward Whether we're trying to move forwards or
|
|
// backwards
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
//----------------------------------------------------------------------
|
|
|
|
function MoveDownFrameset(fForward)
|
|
{
|
|
var i = GetCurrentDepth();
|
|
var win = CrawlPath();
|
|
|
|
g_arrFrames[i+1] = fForward ? 0 : win.frames.length - 1;
|
|
g_arrFrames[i+2] = -1;
|
|
|
|
} // MoveDownFrameset
|
|
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Synopsis: moves one window in the current frameset
|
|
//
|
|
// Arguments: fForward Whether we're trying to move forwards or
|
|
// backwards
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
//----------------------------------------------------------------------
|
|
|
|
function MoveWin(fForward)
|
|
{
|
|
var intDepth = GetCurrentDepth();
|
|
var intPos = GetCurrentPos();
|
|
|
|
g_arrFrames[intDepth] = fForward ? ++intPos : --intPos;
|
|
|
|
} // MoveWin
|
|
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Synopsis: Moves to the next document
|
|
//
|
|
// Arguments: fForward Whether we're trying to move forwards or
|
|
// backwards
|
|
//
|
|
// Returns: true if sucessful or false if fails
|
|
//
|
|
//----------------------------------------------------------------------
|
|
|
|
function MoveDoc(fForward)
|
|
{
|
|
//
|
|
// Special case of top document contains an iframe.
|
|
//
|
|
if (g_fSearchTopFrame) // special case forward
|
|
{
|
|
if (fForward)
|
|
{
|
|
g_fSearchTopFrame = false;
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
// special case backwards
|
|
if (!fForward && (g_arrFrames[0] == 0) && (g_arrFrames[1] < 0)
|
|
&& window.dialogArguments.document.all.tags("IFRAME").length)
|
|
{
|
|
g_fSearchTopFrame = true;
|
|
return true;
|
|
}
|
|
|
|
if (g_fFollowIframes && AtIframe())
|
|
{
|
|
MoveDownFrameset(fForward);
|
|
|
|
while (!AtIframe() && AtFrameset())
|
|
{
|
|
MoveDownFrameset(fForward);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
if (MovePossible(fForward))
|
|
{
|
|
MoveWin(fForward);
|
|
g_fFollowIframes = true;
|
|
|
|
while (!AtIframe() && AtFrameset())
|
|
{
|
|
MoveDownFrameset(fForward);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
if (GetCurrentDepth() > 0)
|
|
{
|
|
MoveUpFrameset();
|
|
|
|
while (AtIframe() && !MovePossible(fForward)
|
|
&& (GetCurrentDepth() >= 0))
|
|
{
|
|
MoveUpFrameset();
|
|
}
|
|
|
|
if (AtIframe() && MovePossible(fForward))
|
|
{
|
|
g_fFollowIframes = false;
|
|
}
|
|
|
|
return MoveDoc(fForward);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
|
|
} // MoveDoc
|
|
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Synopsis: walks to first document
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// Returns: document object
|
|
//
|
|
//----------------------------------------------------------------------
|
|
|
|
function GetFirstDoc()
|
|
{
|
|
var win;
|
|
var doc = window.dialogArguments.document;
|
|
|
|
//
|
|
// If the main document conttains an iframe, we need to special
|
|
// case it.
|
|
//
|
|
if (doc.all.tags("IFRAME").length)
|
|
{
|
|
g_fSearchTopFrame = true;
|
|
return doc;
|
|
}
|
|
|
|
while (!AtIframe() && AtFrameset())
|
|
{
|
|
MoveDownFrameset(true);
|
|
}
|
|
|
|
win = CrawlPath();
|
|
return win.document;
|
|
|
|
} // GetFirstDoc
|
|
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Set the initial range to the enitire document or the selection
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
//-----------------------------------------------------------------------
|
|
|
|
function setInitSearchRng()
|
|
{
|
|
//
|
|
// Determine starting location
|
|
//
|
|
findStartPoint();
|
|
|
|
//
|
|
// Are we in a frameset?
|
|
//
|
|
if (g_fFrameset)
|
|
{
|
|
var win;
|
|
|
|
//
|
|
// Check to see if we're still in a frameset.
|
|
// (This could happen if there's a frameset in an
|
|
// inline frame.)
|
|
//
|
|
if (!AtIframe() && AtFrameset())
|
|
{
|
|
MoveDownFrameset(!radDirection[0].checked);
|
|
|
|
while (!AtIframe() && AtFrameset())
|
|
{
|
|
MoveDownFrameset(!radDirection[0].checked);
|
|
}
|
|
}
|
|
|
|
win = CrawlPath();
|
|
g_docSearch = win.document;
|
|
}
|
|
else
|
|
{
|
|
g_docSearch = window.dialogArguments.document;
|
|
}
|
|
|
|
//
|
|
// If we're in browse mode and nothing is selected,
|
|
// set the range to the entire body.
|
|
//
|
|
if (g_docSearch .queryCommandState("BrowseMode")
|
|
&& g_docSearch .selection.type != "Text")
|
|
{
|
|
if (g_docSearch .body == null)
|
|
return;
|
|
|
|
g_rngWorking = g_docSearch .body.createTextRange();
|
|
}
|
|
else
|
|
{
|
|
g_rngWorking = g_docSearch .selection.createRange();
|
|
}
|
|
} // setInitSearchRng
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Set direction and adjust range
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
//-----------------------------------------------------------------------
|
|
|
|
function directionAdjust()
|
|
{
|
|
//
|
|
// If there's a current selection, we'll start from the
|
|
// selection
|
|
//
|
|
g_fFoundText = (g_docSearch .selection.type == "Text");
|
|
|
|
//
|
|
// rngWorking starts as the entire body, and is then narrowed
|
|
// down by the 'set direction' code.
|
|
//
|
|
|
|
//
|
|
// Set direction
|
|
//
|
|
if (radDirection[0].checked) // Search backwards
|
|
{
|
|
//
|
|
// set range to search
|
|
//
|
|
if (g_fFoundText)
|
|
{
|
|
//
|
|
// Search from the end of the current selection
|
|
// minus 1 so we don't find the text we just found
|
|
//
|
|
g_rngWorking.moveEnd("character" , -1);
|
|
}
|
|
//
|
|
// Move the beginning of the range to the beginning
|
|
// of the document
|
|
//
|
|
// This use to move one character at a time, but since it
|
|
// will move as many characters as possible, it is more
|
|
// efficient to move in big jumps.
|
|
//
|
|
while (0 != g_rngWorking.moveStart("textedit", -10000))
|
|
{
|
|
}
|
|
|
|
g_intDirection = -1000000000;
|
|
}
|
|
else // Search forwards
|
|
{
|
|
//
|
|
// set range to search
|
|
//
|
|
if (g_fFoundText)
|
|
{
|
|
//
|
|
// Search from the start of the current selection plus
|
|
// one so we don't find the text we just found
|
|
//
|
|
g_rngWorking.moveStart("character", 1);
|
|
}
|
|
|
|
//
|
|
// Move the end of the range to the end
|
|
// of the document
|
|
//
|
|
//
|
|
// This use to move one character at a time, but since it
|
|
// will move as many characters as possible, it is more
|
|
// efficient to move in big jumps.
|
|
//
|
|
while (0 != g_rngWorking.moveEnd("textedit", 10000))
|
|
{
|
|
}
|
|
|
|
g_intDirection = 1000000000;
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------
|
|
//
|
|
// Synopsis: Three steps:
|
|
// 1. Make sure there's something to find.
|
|
// 2. Determine the direction and how far to search.
|
|
// 3. Find and select the text.
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
//-----------------------------------------------------------------------
|
|
|
|
function btnFindClick()
|
|
{
|
|
var fDone = false;
|
|
var L_FinishedDocument_Text = "Finished searching the document.";
|
|
|
|
var index;
|
|
|
|
//
|
|
// Initial range is the entire document or the selection
|
|
//
|
|
setInitSearchRng();
|
|
|
|
//
|
|
// Set direction and adjust range based on direction
|
|
//
|
|
directionAdjust();
|
|
|
|
//
|
|
// We have to loop, because findText includes text that may be hidden.
|
|
//
|
|
|
|
g_rngFoundText = g_rngWorking.duplicate();
|
|
|
|
success = g_rngFoundText.findText(txtFindText.value,
|
|
g_intDirection,
|
|
findFlags());
|
|
|
|
while ((!fDone) && success)
|
|
{
|
|
fDone = true;
|
|
|
|
//
|
|
// Using try catch on select, because selecting invisible text
|
|
// results in an exception.
|
|
//
|
|
|
|
try
|
|
{
|
|
g_rngFoundText.select();
|
|
}
|
|
catch (exception)
|
|
{
|
|
if (g_intDirection == 1000000000) // forward
|
|
{
|
|
g_rngFoundText.moveStart("character" , 1);
|
|
|
|
while (0 != g_rngFoundText.moveEnd("textedit", 10000))
|
|
{
|
|
}
|
|
}
|
|
else
|
|
{
|
|
g_rngFoundText.moveEnd("character" , -1);
|
|
|
|
while (0 != g_rngFoundText.moveStart("textedit", -10000))
|
|
{
|
|
}
|
|
}
|
|
|
|
fDone = false;
|
|
|
|
success = g_rngFoundText.findText(txtFindText.value,
|
|
g_intDirection,
|
|
findFlags());
|
|
}
|
|
|
|
}
|
|
|
|
if (!success) // Text was not found
|
|
{
|
|
if (g_fFrameset)
|
|
{
|
|
if (MoveDoc(!radDirection[0].checked))
|
|
{
|
|
btnFindClick();
|
|
return;
|
|
}
|
|
}
|
|
|
|
alert(L_FinishedDocument_Text);
|
|
txtFindText.focus();
|
|
}
|
|
else // Text was found
|
|
{
|
|
//
|
|
// If we're in a frameset, we have to unselect
|
|
// the previously searched document
|
|
//
|
|
if (g_fFrameset)
|
|
{
|
|
g_docLastFound.execCommand("Unselect", false);
|
|
g_docLastFound = g_docSearch ;
|
|
}
|
|
g_rngFoundText.select();
|
|
g_rngFoundText.scrollIntoView(true);
|
|
}
|
|
} // btnFindClick
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
//
|
|
// Synopsis: Save the last search, then discard the user's
|
|
// changes and dismiss the dialog.
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
//----------------------------------------------------------------------
|
|
|
|
function btnCancelClick2()
|
|
{
|
|
window.dialogArguments.findText = txtFindText.value;
|
|
window.close();
|
|
} // btnCancelClick2
|
|
//</SCRIPT>
|