|
[ Back to Pikes Peak Perl Mongers Home page ] This is the JavaScript used at this site to simulate balloon hints. It was obtained from http://gocho.pm.org/majorcool/ and customized by tbchambers at yahoo dot com (tbc). Insert it directly after the
<SCRIPT LANGUAGE="JavaScript">
<!-- Hide Script from Ill-Behaved Browsers
//--------------------------------------------------------------------
// Tool Tip/Balloon Help: dynamic mouseOver/mouseOut windowing
//
// o Shows/hides text in pop-up window.
//
// o Delayed open to only pop those who pause for help.
//
// o mouseOut->mouseOver will re-use open window rather than
// than close & reopen.
//
// o Window closes after timeout. Timeout varies with amount
// of text displayed. More text, larger timeout.
//
// o Harmless to non-compliant browsers.
//
// Known bugs:
//
// o No control of window.open() placement.
//
// o In Win MSIE3.x: if tipWin is closed manually, the object
// is still valid but the window is not open. The timeout
// of the tip will result in 'scripting error 80010012'.
// Luckily, other browsers support onMouseOut, so the problem
// is not widespread.
//
//--------------------------------------------------------------------
// Bill Houle NCR Corporation
// bhoule@conveyanced.com bill.houle@sandiegoca.ncr.com
//--------------------------------------------------------------------
// Global settings; tweak as required
//
tipTitle = "Pikes Peak Perl Mongers link description";
tipBgColor = "#000080"; // or Post-It yellow #FFFF80
tipFgColor = "#FFFFFF";
tipWidth = 400;
tipHeight = 50;
// Timing
tipOpen = 100; // open msecs after mouseover
tipClose = 500; // close msecs after mouseout
tipFactor = 10; // est: chars read in 1 msec
// Null defaults
tipWin = null;
tipOTime = null; tipOFlag = 0;
tipCTime = null; tipCFlag = 0;
//--------------------------------------------------------------------
// tip(tipLocation, tipText, later)
// tipLocation -- handle: a Window name
// tipText -- string: the message to display in tipLocation
// null string to close tipLocation
// later -- boolean: show text immediately or after pause
//
// Usage:
// onMouseOver='tip(win,"This is descriptive.",1); return true;'
// onMouseOut='tip(win,"",0); return true;'
// onClick='tip(win,"",0); return true;'
//
// o Don't forget the onClick(), or else the tip window may pop
// up while you are off doing whatever the click action was.
//
function tip(tipLocation, tipText, later) {
window.status = tipText; // my customization (tbc)
//
// Clear any pending window opens or closes. Please note:
// uninitialized "timeout id" in NN3.x is untestable 'opaque'
// object, while "timeout id" in MSIE *must* be tested before
// clearTimeout(). Therefore, use global integers to bypass
// this Catch-22 situation.
//
if (tipOFlag != 0) { clearTimeout(tipOTime); tipOFlag = 0; }
if (tipCFlag != 0) { clearTimeout(tipCTime); tipCFlag = 0; }
//
// Remove the tip from display
//
if (tipText == '') {
if (tipWin == null) return; // already gone
//
// Close window in the future (extra delay is to
// avoid popping down & up if there is a subsequent
// mouseOver).
//
tipCTime = window.setTimeout(
"if (tipWin != null) {tipWin.close(); tipWin=null;}",
tipClose);
tipCFlag = 1;
}
//
// Display the tip
//
else {
//
// If not yet open and requesting delayed open...
//
if (tipWin == null && later > 0) {
tipOTime = window.setTimeout(
"tip('"+tipLocation+"','"+tipText+"',0);",
tipOpen);
tipOFlag = 1;
return;
}
//
// MSIE requires explicit options on open(). Also,
// contrary to appearances, this double open is not
// for the known NN2 open() bug (which ignores the
// location URL), but rather for an IE3 problem that
// creates a window object without a valid document
// object within.
// The 'dependent' attribute is Netscapism to indicate
// a window child relationship.
//
tipWin = window.open("",tipLocation,
"width="+tipWidth+",height="+tipHeight+","+
"toolbar=0,menubar=0,scrollbars=0,"+
"location=0,status=0,resizable=0,"+
"directories=0,dependent=1");
tipWin = window.open("",tipLocation,
"width="+tipWidth+",height="+tipHeight+","+
"toolbar=0,menubar=0,scrollbars=0,"+
"location=0,status=0,resizable=0,"+
"directories=0,dependent=1");
if (tipWin == null) return; // whoops!
// bring window to front
if (parseInt(navigator.appVersion) > 2) tipWin.focus();
if (tipWin.document) {
tipWin.document.open('text/html');
tipWin.document.write("<HEAD><TITLE>");
tipWin.document.write(tipTitle);
tipWin.document.write("</TITLE></HEAD>");
tipWin.document.write("<BODY BGCOLOR='"+tipBgColor+"' TEXT='"+tipFgColor+"'>");
tipWin.document.write("<P><FONT SIZE=2>");
tipWin.document.write(tipText.bold());
// this is a total kludge to work around server blindly looking for </BODY> (tbc)
tipWin.document.write("</FONT></"+"BODY>");
tipWin.document.close();
}
else if (tipWin) {
// open window, but still no document?!?
tipWin.close();
return;
}
//
// Estimate how long it takes to read this much text;
// blank the tip text after a suitable delay for
// reading.
//
tipRead = Math.round(tipText.length/tipFactor) * 1000;
tipOTime = window.setTimeout(
"tip('"+tipLocation+"','',0);",
tipRead);
tipOFlag = 1;
}
}
//====================================================================
// End of JavaScript -->
</SCRIPT>
|