
<!--

// *** COMMON CROSS-BROWSER COMPATIBILITY CODE ***

var isDOM=document.getElementById?1:0;
var isIE=document.all?1:0;
var isNS4=navigator.appName=='Netscape'&&!isDOM?1:0;
var isOp=window.opera?1:0;
var isWin=navigator.platform.indexOf('Win')!=-1?1:0;
var isDyn=isDOM||isIE||isNS4;


function getRef(id, par)
{
 par=!par?document:(par.navigator?par.document:par);
 return isIE ? par.all[id] :
  (isDOM ? (par.getElementById?par:par.ownerDocument).getElementById(id) :
  (isNS4 ? par.layers[id] : null));
}

function getSty(id, par)
{
 var r=getRef(id, par);
 return r?(isNS4?r:r.style):null;
}


if (!window.LayerObj) var LayerObj = new Function('id', 'par',
 'this.ref=getRef(id, par); this.sty=getSty(id, par); return this');
function getLyr(id, par) { return new LayerObj(id, par) }

function LyrFn(fn, fc)
{
 LayerObj.prototype[fn] = new Function('var a=arguments,p=a[0],px=isNS4||isOp?0:"px"; ' +
  'with (this) { '+fc+' }');
}
LyrFn('x','if (!isNaN(p)) sty.left=p+px; else return parseInt(sty.left)');
LyrFn('y','if (!isNaN(p)) sty.top=p+px; else return parseInt(sty.top)');
LyrFn('w','if (p) (isNS4?sty.clip:sty).width=p+px; ' +
 'else return (isNS4?ref.document.width:ref.offsetWidth)');
LyrFn('h','if (p) (isNS4?sty.clip:sty).height=p+px; ' +
 'else return (isNS4?ref.document.height:ref.offsetHeight)');
LyrFn('vis','sty.visibility=p');
LyrFn('write','if (isNS4) with (ref.document){write(p);close()} else ref.innerHTML=p');
LyrFn('alpha','var f=ref.filters,d=(p==null); if (f) {' +
 'if (!d&&sty.filter.indexOf("alpha")==-1) sty.filter+=" alpha(opacity="+p+")"; ' +
 'else if (f.length&&f.alpha) with(f.alpha){if(d)enabled=false;else{opacity=p;enabled=true}} }' +
 'else if (isDOM) sty.MozOpacity=d?"":p+"%"');


var CSSmode=document.compatMode;
CSSmode=(CSSmode&&CSSmode.indexOf('CSS')!=-1)||isDOM&&!isIE||isOp?1:0;

if (!window.page) var page = { win: window, minW: 0, minH: 0, MS: isIE&&!isOp,
 db: CSSmode?'documentElement':'body' }

page.winW=function()
 { with (this) return Math.max(minW, MS?win.document[db].clientWidth:win.innerWidth) }
page.winH=function()
 { with (this) return Math.max(minH, MS?win.document[db].clientHeight:win.innerHeight) }

page.scrollY=function()
 { with (this) return MS?win.document[db].scrollTop:win.pageYOffset }
page.scrollX=function()
 { with (this) return MS?win.document[db].scrollLeft:win.pageXOffset }




<!--- // *** TIP FUNCTIONS AND OBJECT *** --->

function tipTrack(evt, always) { with (this)
{
<!---  // Reference the correct event object. --->
 evt=evt?evt:window.event;

<!---  // Figure out the mouse co-ordinates and call the position function.
 // Also set sX and sY as the scroll position of the document. --->
 sX = page.scrollX();
 sY = page.scrollY();
 mX = isNS4 ? evt.pageX : sX + evt.clientX;
 mY = isNS4 ? evt.pageY : sY + evt.clientY;
<!--- 
 // If we've set tip tracking, call the position function. --->
 if (tipStick == 1) position();
}}

function tipPosition(forcePos) { with (this)
{
<!---  // Can't position a tip if there isn't one available... --->
 if (!actTip) return;

<!---  // Pull the window sizes from the page object.
 // In NS we size down the window a little as it includes scrollbars. --->
 var wW = page.winW()-(isIE?0:15), wH = page.winH()-(isIE?0:15);

<!---  // Pull the compulsory information out of the tip array. --->
 var t=tips[actTip], tipX=eval(t[0]), tipY=eval(t[1]), tipW=div.w(), tipH=div.h(), adjY = 1;

<!---  // Add mouse position onto relatively positioned tips. --->
 if (typeof(t[0])=='number') tipX += mX;
 if (typeof(t[1])=='number') tipY += mY;

<!---  // Check the tip is not within 5px of the screen boundaries. --->
 if (tipX + tipW + 5 > sX + wW) { tipX = sX + wW - tipW - 5; adjY = 2 }
 if (tipY + tipH + 5 > sY + wH) tipY = sY + wH - (adjY*tipH) - 5;
 if (tipX < sX+ 5) tipX = sX + 5;
 if (tipY < sY + 5) tipY = sY + 5;

<!---  // If the tip is currently invisible, show at the calculated position.
 // Also do this if we're passed the 'forcePos' parameter. --->
 if ((!showTip && (doFades ? !alpha : true)) || forcePos)
 {
  xPos = tipX;
  yPos = tipY;
 }

<!---  // Otherwise move the tip towards the calculated position by the stickiness factor.
 // Low stickinesses will result in slower catchup times. --->
 xPos += (tipX - xPos) * tipStick;
 yPos += (tipY - yPos) * tipStick;

 div.x(xPos);
 div.y(yPos);
}}

function tipShow(tipN) { with (this)
{
 if (!isDyn) return;

<!---  // If this tip is nested, call the 'show' function of its parent too. --->
 if (tips[tipN].parentObj) tips[tipN].parentObj.show(tips[tipN].parentTip);

<!---  // My layer object we use. --->
 if (!div) div = getLyr(myName + 'Layer');
 
<!---  // IE4 requires a small width set otherwise tip divs expand to full body size. --->
 if (isDOM) div.sty.width = 'auto';

<!---  // If we're mousing over a different or new tip... --->
 if (actTip != tipN)
 {
<!---   // Remember this tip number as active, for the other functions. --->
  actTip = tipN;

  <!--- // Set tip's onmouseover and onmouseout handlers for static tips. --->
  if (tipStick == 0)
  {
   if (isNS4) div.ref.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
   div.ref.onmouseover = new Function('evt', myName + '.show("' + tipN + '"); ' +
    'if (isNS4) return this.routeEvent(evt)');
   div.ref.onmouseout = new Function('evt', myName + '.hide(); ' +
   'if (isNS4) return this.routeEvent(evt)');
  }

<!---   // Place it somewhere onscreen - pass true to force a complete reposition. --->
  position(true);

  <!--- // Go through and replace %0% with the array's 0 index, %1% with tips[tipN][1] etc... --->
  var str = template;
  for (var i=0; i<tips[tipN].length; i++) str = str.replace('%'+i+'%', tips[tipN][i]);
 <!---  // Write the proper content... the last <br> strangely helps IE5/Mac...? --->
  div.write(str + ((document.all && !isWin) ? '<small><br></small>' : ''));
 }

<!---  // For non-integer stickiness values, we need to use setInterval to animate the tip,
 // if it's 0 or 1 we can just use onmousemove to position it. --->
 clearInterval(trackTimer);
 if (tipStick != parseInt(tipStick)) trackTimer = setInterval(myName+'.position()', 50);

<!---  // Finally either fade in immediately or after 'showDelay' milliseconds.
 // NS4 must always delay by a small amount as sometimes hide events come before show events
 // from a previous mouseout (when two tip triggers overlap), because it's a weird browser.
 // So, this show call can cancel a (slightly later) hide. --->
 clearTimeout(fadeTimer);
 if (showDelay || isNS4)
  fadeTimer = setTimeout('with ('+myName+') { showTip = true; fade() }', showDelay + 10);
 else { showTip = true; fade() }
}}


function tipHide() { with (this)
{
<!---  // We've got to be a DHTML-capable browser that has a tip currently active. --->
 if (!isDyn || !actTip) return;

<!---  // If the mouse position is within the tip boundaries, we know NS4 is telling us stories
 // as often it makes hide events unaccompanied by overs or in a weird order.
 // Only applies to static tips that we want the user to mouseover... --->
 if (isNS4 && tipStick==0 && xPos<=mX && mX<=xPos+div.w() && yPos<=mY && mY<=yPos+div.h())
  return;

<!---  // If this tip is nested, call the 'hide' function of its parent too. --->
 if (tips[actTip].parentObj) tips[actTip].parentObj.hide();

<!---  // Fade out after a delay so another mouseover can cancel this fade.
 // This allows the user to mouseover a static tip before its hides. --->
 clearTimeout(fadeTimer);
 fadeTimer = setTimeout('with (' + myName + ') { showTip=false; fade() }', hideDelay);
}}


function tipFade() { with (this)
{
<!---  // Clear to stop existing fades. --->
 clearTimeout(fadeTimer);

 // Show it and optionally increment alpha from minAlpha to maxAlpha or back again.
 if (showTip)
 {
  div.vis('visible');
  if (doFades)
  {
   alpha += fadeSpeed;
   if (alpha > maxAlpha) alpha = maxAlpha;
   div.alpha(alpha);
   // Call this function again shortly, fading tip in further.
   if (alpha < maxAlpha) fadeTimer = setTimeout(myName + '.fade()', 50);
  }
 }

 else
 {
  // Similar to before but counting down and hiding at the end.
  if (doFades && alpha > minAlpha)
  {
   alpha -= fadeSpeed;
   if (alpha < minAlpha) alpha = minAlpha;
   div.alpha(alpha);
   fadeTimer = setTimeout(myName + '.fade()', 50);
   return;
  }
  div.vis('hidden');
  // Clear the active tip flag so it is repositioned next time.
  actTip = '';
  // Stop any sticky-tip tracking if it's invisible.
  clearInterval(trackTimer);
 }
}}



function TipObj(myName)
{
 // Holds the properties the functions above use.
 this.myName = myName;
 this.tips = new Array();
 this.template = '';
 this.actTip = '';
 this.showTip = false;
 this.tipStick = 0;
 this.showDelay = 50;
 this.hideDelay = 250;
 this.xPos = this.yPos = this.sX = this.sY = this.mX = this.mY = 0;

 this.track = tipTrack;
 this.position = tipPosition;
 this.show = tipShow;
 this.hide = tipHide;
 this.fade = tipFade;
 
 this.div = null;
 this.trackTimer = this.fadeTimer = 0;
 this.alpha = 0;
 this.doFades = true;
 this.minAlpha = 0;
 this.maxAlpha = 100;
 this.fadeSpeed = 10;
}















<!--- // *** START EDITING HERE ***

// This script is object orientated. That means we create 'tip objects', with a collection
// of settings, a template to display tips, and a list of tips to show in that template.
// Here are some examples:

// First, create a new tip object, and pass it its own name so it can reference itself. --->
var docTips = new TipObj('docTips');
with (docTips)
{
<!---  // Next, set its properties like the tips it will display.
 
 // We organise tips in arrays like so: tips.name = new Array(X, Y, width, text, ....);
 // The first two parameters, X and Y, are the distances of the tip from the mouse cursor position
 // if they're set as numbers. If they're strings (with quotes ''), the script calculates them as
 // formulae and ignores the mouse position. They are the only compulsory parameters.
 // So that means you can use the page object included with this script for fancy positioning
 // effects. Functions include page.winW() and page.winH() for the window area dimensions,
 // and page.scrollX() and page.scrollY() for the current scroll position -- see the examples. --->
 
 
 
  tips.engagement = new Array(300, -2, 300, 'Pedals offer either single or dual-sided engagement. Single-sided pedals require the user to locate the top of the pedal with the cleat before engagement. With single-sided pedals, even the most experienced rider must look down occasionally to clip in. Conversely, dual-sided engagement eliminates the randomness of the engagement process. Either side of the pedal can be engaged. No flipping the pedal over, no looking down, no hesitation; just step down, lock in, and go.');
  
    tips.weight3 = new Array(300, -2, 400, 'The combined weight of the pedals and cleats used for 3-hole mounting standard.');
    tips.weight4 = new Array(300, -2, 400, 'The combined weight of the pedals and cleats used for 4-hole mounting standard.');
	
	
	  tips.weighteach = new Array(300, -2, 300, 'Actual weight of a single pedal alone, without the cleat. <br><br>Lightweight cycling components make cycling easier. Reducing the weight of rotating parts on a bike has twice the effect of reducing the weight of static parts.');
	
 
  tips.weightpair = new Array(300, -2, 300, 'Actual weight of the pedals alone, without the cleat. <br><br>Lightweight cycling components make cycling easier. Reducing the weight of rotating parts on a bike has twice the effect of reducing the weight of static parts.');

 tips.cleat3 = new Array(300, -2, 300, 'The combined weight of the cleats and required mounting hardware used for 3-hole mounting standard.');
 tips.cleat4 = new Array(300, -2, 300, 'The combined weight of the cleats and required mounting hardware used for 4-hole mounting standard.');
 
   tips.stack3 = new Array(300, -2, 400, 'Stack height for pedal and cleat used on 3-hole mounting standard. Stack height is the vertical distance from the top of the cleat to the center of the pedal spindle. The closer the foot is positioned to the spindle, the more efficiently power is transmitted from the rider to the bike.');
 
   tips.stack4 = new Array(300, -2, 400, 'Stack height for pedal and cleat used on 4-hole mounting standard. Stack height is the vertical distance from the top of the cleat to the center of the pedal spindle. The closer the foot is positioned to the spindle, the more efficiently power is transmitted from the rider to the bike.');
 
 
  tips.range = new Array(300, -10, 400, 'Available float range. Range of rotational freedom is the amount of lateral heel play, measured in degrees, within a pedal system design.');


  tips.float = new Array(300, -2, 400, 'Float allows riders with knee problems or those trying to avoid knee problems the benefit of some side-to-side heel motion. This allows the pedal to adapt to a rider\'s biomechanics.There are three variations of float found in pedals: "free float," "spring-recentered" float and "float with friction." Free float allows the foot to float without any resistance. Spring-recentered float features a spring that returns the foot to a center point that may or may not be adjusted by the positioning of the cleat to a neutral point. Float with friction inhibits rotational motion between the pedal and cleat. As a result, a rider can reposition the foot by moving it within the rotational range, but the foot does not move freely on its own.');

  tips.fixed = new Array(300, -2, 400, 'Can the pedals be set for a no float "fixed" position?  Some riders simply prefer no lateral heel movement.');


  tips.lock = new Array(300, -75, 450, 'By isolating spring tension from locking security, as is done with a true-locking mechanism, entry and release can be accomplished effortlessly and without compromising retention security.<br><br>Modern clipless pedals use one of two types of retention mechanisms: "true-locking" or a "spring-restrained" jaw system. The type of retention mechanism used determines entry effort, retention security and ease of release. A true-locking system does not rely on the tension of a spring for security. With spring-restrained jaw systems you must adjust the spring tension to achieve adequate locking security. A low spring tension setting in a spring-restrained jaw system makes entry and release efforts easy, however, it is also easier to pull out of the system inadvertently during hard pedaling efforts. If spring tension is set high for secure retention, the effort required to enter and release will also be more difficult. The high twisting force necessary to disengage pedals with highly tensioned springs is a common cause of knee pain and can even prevent a rider from disengaging under certain circumstances. ');

  tips.standards = new Array(300, -50, 400, 'Three unique cleat mounting patterns have gained wide market acceptance on road shoes. Look uses a three-bolt cleat interface. Time uses a four-bolt cleat interface, and Shimano\'s SPD pattern uses a two-bolt cleat interface. While other companies have tried to launch their own interface designs, none have made a significant impact on the market.');

  tips.spindle = new Array(300, -200, 400, 'Pedal spindles are typically made of alloy steel, but titanium is commonly used for high-performance applications. Some alloy steels are ideal for spindle materials because they are extremely strong and stiff. Titanium, while significantly lighter than alloy steel, costs many times more and is neither as strong nor or as stiff. Both steel and titanium come in a variety of alloys, which are a mixture of metals or other elements.<br><br> Alloys used in pedals are chosen for their strength, stiffness, wear resistance, machinability and corrosion resistance. Stainless steels are also used in spindles although stainless steels cost far more than non-stainless alloy steels. The advantage of stainless steels is that they never rust. All non-stainless steels require a surface coating, such as chrome or black oxide, to inhibit rust.<br><br>Speedplay uses centerless-ground 17-4 stainless steel for both X\/2 road and frog pedal spindles, while X\/3 pedal spindles use 4130 chrome-moly. The spindles in X\/1 and Frog Ti pedals are American 6Al\/4V grade titanium. <br><br>To maximize the life of the bearings and ensure their smoothness, the stepped bearing races on Speedplay spindles are all centerless-ground simultaneously. By grinding the critical bearing races all at once, the precise tolerances needed for in-line concentricity are accurately maintained.');


  tips.bearings = new Array(300, -250, 400, 'Pedals use one of two types of bearings to reduce the friction of the pedal body turning on the spindle: rolling element bearings, bushings or a combination of both. <br><br>Rolling element bearings use small steel balls or cylinders that rotate between two metal rings called raceways. A bushing is a cylindrical sleeve made of a slippery material that spins directly on the spindle. Rolling element bearings have a big performance advantage over bushings in that they have a lower coefficient of friction. A rolling element bearing offers about a 40% reduction in friction over that of a bushing doing the same job.<br><br> There are three types of rolling element bearings: cartridge bearings, needle bearings and cup-and-cone bearings. Cartridge bearings are made to very precise tolerances and need no adjustment. Cartridge bearings can support radial (vertical) and axial (side-to-side) loads. Needle bearings can support higher radial loads than cartridge bearings but cannot support axial loads. When used in pedals, a needle bearing is always used in conjunction with a cartridge bearing to support the axial load. Cup-and-cone bearings use two rows of loose balls that ride between cup and cone shaped raceways. Cup-and-cone bearings, when used in paired sets, support radial and axial loads.');


   tips.help = new Array(300, -2, 280, '<strong>Need more information on how we get our comparisons? <br><br> Just look for the "+" and point your curser on it. A box will open with more detailed information!</strong><br><br>See:<br><img src="images/helpimage.gif" alt="" width="366" height="124" border="0">');


  tips.lotnumber = new Array(300, -50, 300, 'Pedal Lot Number is located in the white section on the underside of the pedal box top cover.<br><img src="images/lotnumber.jpg" alt="" width="300" height="321" border="0">');

 tips.lookkeo = new Array(350, -150, 372, '<img src="images/cleatarealook.jpg" alt="" width="372" height="324" border="0">');
 tips.shimano = new Array(350, -135, 372, '<img src="images/cleatareashimano.jpg" alt="" width="372" height="324" border="0">');
 tips.speedplay = new Array(350, -115, 372, '<img src="images/cleatareaspeedplay.jpg" alt="" width="372" height="324" border="0">');

  tips.whichshims = new Array(-650, -200, 300, 'The Snap Shims are removable, curved, gray plastic shims that snap onto the forward and rear ends of the underside of each Black plastic Base Plate.  The Snap Shims allow the flat Black plastic Base Plate to closely match the curvature of the sole of most shoe brands.  Remember, the shoe sole must have a continuous curvature (radius) and be flat from side-to-side at the Cleat-contact area to closely match the contour of the Base Plate.  The 1-F & 1-R Snap-Shims are factory-installed on the Base Plate.  If your shoes require a different curvature,  different thickness Snap Shims are supplied and are marked 3R & 3F or 4R &4F.<br><img src="images/whichshims.jpg" border="0">');













<!---  // Now, set the appearance and style of the tips displayed by this tip object.
 // Each tip object must have a string called 'template' that contains some specially-formatted
 // HTML to write to the document. This example is two nested tables, a border and a background.
 // The special bits are the %2%, %3% and so on halfway through. These correspond to values we
 // set in the tip.tipName arrays above -- %0% is the X value, %1% is Y, and %2% onwards are
 // whatever other info we have in there (width, text etc...). This example sets the width %2%
 // of the table, and inserts some content which is the text %3%.
 // You might want to put extra information in the arrays above, and use %4%, %5% onwards in the
 // template for tip headers, footers, customisable colours etc... see the next tip object for
 // another example. --->

 template = '<table bgcolor="#dadbdb" cellpadding="4" cellspacing="3" width="%2%" border="0">' +
  '<tr><td><table bgcolor="#3b3b3c" cellpadding="8" cellspacing="8" width="100%" border="0">' +
  '<tr><td class="tipClass">%3%</td></tr></table></td></tr></table>';

<!---  // Finally, you can set some optional properties to customise the behavious of this object.

 // How much of a delay do you want between pointing and action? Defaults are:
 //showDelay = 50;
 //hideDelay = 200;

 // False will hide tips instantaneously. Fading only works under IE/Win and NS6+.
 //doFades = false;
 // You can change the minimum and maximum opacity percentages, defaults:
 //minAlpha = 0;
 //maxAlpha = 100;

 // How fast the transparency changes (between 1 and 100), higher means faster fades.
 //fadeSpeed = 10;

 // Tip stickiness, from 0 to 1, defines how readily the tip follows the cursor. 1 means it
 // follows it perfectly (the default), 0 is a static tip, and decimals are 'floating' tips.
 //tipStick = 0; --->
}


<!--- // Here's a second tip object. Feel free to delete it, but be sure to remove it from the
// onmousemove event section below and its DIV from the body of the page if you do!
// I've included a tip header here in this template, %3% is the header text and %4% is
// now the main text. As you can see you can basically format your tips any way you want.
// This tip also includes mouse event handlers to show a second-level tip, just like in
// the body of the page below, so you can nest tips within tips. --->
var staticTip = new TipObj('staticTip');
with (staticTip)
{
 tips.links = new Array(5, 5, 100, 'Extra Links',
  '- <a href="javascript:alert(\'Useful indeed...\')">Section 1</a> -<br />' +
  '- <a href="#" name="nest1trig" onmouseover="nestTip.show(\'nest1\')" onmouseout="nestTip.hide()">' +
  'NESTED TIP 1 &gt;</a> -<br />' +
  '- <a href="#" name="nest2trig" onmouseover="nestTip.show(\'nest2\')" onmouseout="nestTip.hide()">' +
  'NESTED TIP 2 &gt;</a> -<br />');

 template = '<table bgcolor="#000000" cellpadding="0" cellspacing="0" width="%2%" border="0">' +
  '<tr><td><table cellpadding="3" cellspacing="1" width="100%" border="0">' +
  '<tr><td bgcolor="#336666" align="center" height="18" class="tipClass">%3%</td></tr>' +
  '<tr><td bgcolor="#009999" align="center" height="*" class="tipClass">%4%</td></tr>' +
  '</table></td></tr></table>';

 tipStick = 0;
}

<!--- // Here's another example tip object -- multilevel static tips within tips... --->
var nestTip = new TipObj('nestTip');
with (nestTip)
{
 tips.nest1 = new Array(10, 0, 90,
  '<a href="javascript:alert(\'A regular popup menu...\')">Relative Position</a>');
<!---  // If you're using nested tips, for each tip you have to tell the script its parent tip
 // object and tip name within that object, so it knows to sync their showing and hiding. --->
 tips.nest1.parentObj = staticTip;
 tips.nest1.parentTip = 'links';

<!---  // This tip is positioned via formulae based on its parent tip's position... --->
 tips.nest2 = new Array('staticTip.xPos + 95', 'staticTip.yPos + 50', 120,
  '<a href="javascript:alert(\'Nested tip 2\')">Absolutely positioned static tip...</a>');
 tips.nest2.parentObj = staticTip;
 tips.nest2.parentTip = 'links';

 template = '<table bgcolor="#000000" cellpadding="1" cellspacing="0" width="%2%" border="0">' +
  '<tr><td><table bgcolor="#009999" cellpadding="3" cellspacing="0" width="100%" border="0">' +
  '<tr><td class="tipClass">%3%</td></tr></table></td></tr></table>';

 tipStick = 0;
}


<!--- // Here's one illustrating a decimal tipStick value so it tags along behind the cursor. --->
var stickyTip = new TipObj('stickyTip');
with (stickyTip)
{
 tips.floating = new Array(5, 5, 100, 'Floating tips can have extra effect!');

 template = '<table bgcolor="#000000" cellpadding="1" cellspacing="0" width="%2%" border="0">' +
  '<tr><td><table bgcolor="#339966" cellpadding="4" cellspacing="0" width="100%" border="0">' +
  '<tr><td align="center" class="tipClass">%3%</td></tr></table></td></tr></table>';

 tipStick = 0.2;
}



<!--- // Capture the onmousemove event so tips can follow the mouse. Add in all your tip objects here
// and also any functions from other scripts that need this event (e.g. my DHTML Scroller) too. --->
if (isNS4) document.captureEvents(Event.MOUSEMOVE);
document.onmousemove = function(evt)
{

<!---  // Add or remove all your tip objects from here! --->
 docTips.track(evt);
 staticTip.track(evt);
 nestTip.track(evt);
 stickyTip.track(evt);

 if (isNS4) return document.routeEvent(evt);
}

<!--- 
// A small function that refreshes NS4 on horizontal resize. --->
var nsWinW = window.innerWidth, nsWinH = window.innerHeight;
function ns4BugCheck()
{
 if (isNS4 && (nsWinW!=innerWidth || nsWinH!=innerHeight)) location.reload()
}

window.onresize = function()
{
 ns4BugCheck();
}


//-->

