home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 27 / IOPROG_27.ISO / SOFT / ADSDK.ZIP / adsi25.chm / devdoc / langref.js < prev    next >
Encoding:
JavaScript  |  1999-05-11  |  17.7 KB  |  776 lines

  1. /*
  2.  * If a page includes this script, its <BODY> tag must include
  3.  * the following attributes:
  4.  *
  5.  *        ONLOAD="bodyOnLoad()"
  6.  *        ONCLICK="bodyClick()"
  7.  */
  8.  
  9. /*
  10.  * Common code
  11.  */
  12. var ie4 = false;
  13. var advanced = false;
  14. var curLang = null;
  15. var showAll = true;
  16. var cook = null;
  17. var baseUrl = document.scripts[document.scripts.length - 1].src.replace(/[^\/]+.js/, "");
  18.  
  19. if (navigator.appName == "Microsoft Internet Explorer") {
  20.     var ver = navigator.appVersion;
  21.     var v = new Number(ver.substring(0,ver.indexOf(".", 0)));
  22.     if (v >= 4) {
  23.         advanced = true;
  24.         ie4 = true;
  25.  
  26.         // Look for 5.x buried somewhere in the version string.
  27.         var toks = ver.split(/[^0-9.]/);
  28.         if (toks) {
  29.             for (var i = 0; i < toks.length; i++) {
  30.                 var tok = toks[i];
  31.                 if (tok.indexOf(".", 0) > 0) {
  32.                     if (tok >= 5)
  33.                         ie4 = false;
  34.                 }
  35.             }
  36.         }
  37.     }
  38. }
  39.  
  40. function bodyOnClick()
  41. {
  42.     if (advanced) {
  43.         hideTip();
  44.         closeMenu();
  45.         hideSeeAlso();
  46.     }
  47. }
  48.  
  49. function bodyOnLoad()
  50. {
  51.     if (advanced) {
  52.         initLangs();
  53.         initReftips();
  54.         initSeeAlso();
  55.     }
  56. }
  57.  
  58. /*
  59.  * Language filtering
  60.  */
  61. function initLangs()
  62. {
  63.     var hdr = document.all.hdr;
  64.     if (!hdr)
  65.         return;
  66.  
  67.     var langs = new Array;
  68.     var spans = document.all.tags("SPAN");
  69.     if (spans) {
  70.         var iElem = spans.length;
  71.         for (iElem = 0; iElem < spans.length; iElem++) {
  72.             var elem = spans[iElem];
  73.             if (elem.className == "lang") {
  74.  
  75.                 // Update the array of unique language names.
  76.                 var a = elem.innerText.split(",");
  77.                 for (var iTok = 0; iTok < a.length; iTok++) {
  78.                     var m = a[iTok].match(/([A-Za-z].*[A-Za-z+])/);
  79.                     if (m) {
  80.                         var iLang = 0;
  81.                         while (iLang < langs.length && langs[iLang] < m[1])
  82.                             iLang++;
  83.                         if (iLang == langs.length || langs[iLang] != m[1]) {
  84.                             var before = langs.slice(0,iLang);
  85.                             var after = langs.slice(iLang);
  86.                             langs = before.concat(m[1]).concat(after);
  87.                         }
  88.                     }
  89.                 }
  90.             }
  91.         }
  92.     }
  93.  
  94.     if (langs.length > 0) {
  95.         var pres = document.all.tags("PRE");
  96.         if (pres) {
  97.             for (var iPre = 0; iPre < pres.length; iPre++)
  98.                 initPreElem(pres[iPre]);
  99.         }
  100.  
  101.         var obj = document.all.obj_cook;
  102.         if (obj && obj.object) {
  103.             cook = obj;
  104.             var lang = obj.getValue("lang");
  105.             var iLang = langs.length - 1;
  106.             while (iLang && langs[iLang] != lang)
  107.                 iLang--;
  108.             curLang = langs[iLang];
  109.             if (obj.getValue("lang.all") != "1")
  110.                 showAll = false;
  111.         }
  112.  
  113.         var iLim = document.body.children.length;
  114.         var head = null;
  115.         for (var i = 0; i < iLim; i++) {
  116.             var elem = document.body.children[i];
  117.             if (elem.tagName.match(/^(P)|(PRE)|([DOU]L)$/))
  118.                 break;
  119.             if (elem.tagName.match(/^H[1-6]$/)) {
  120.                 head = elem;
  121.                 head.insertAdjacentHTML('BeforeEnd', '<SPAN CLASS=ilang></SPAN>');
  122.             }
  123.         }
  124.  
  125.         var td = hdr.insertCell(0);
  126.         if (td) {
  127.  
  128.             // Add the language button to the button bar.
  129.             td.className = "button1";
  130.             td.style.width = "19px";
  131.             td.onclick = langMenu;
  132.             td.innerHTML = '<IMG SRC="' + baseUrl + 'Filter.gif' + '" ALT="Language Filtering" BORDER=0>';
  133.  
  134.             // Add the menu.
  135.             var div = '<DIV ID="lang_menu" CLASS=langMenu><B>Language</B><UL>';
  136.             for (var i = 0; i < langs.length; i++)
  137.                 div += '<LI><A HREF="" ONCLICK="chooseLang(this)">' + langs[i] + '</A><BR>';
  138.             div += '<LI><A HREF="" ONCLICK="chooseAll()">Show All</A></UL></DIV>';
  139.             document.body.insertAdjacentHTML('BeforeEnd', div);
  140.         }
  141.  
  142.         if (!showAll)
  143.             filterLang();
  144.     }
  145. }
  146.  
  147. function initPreElem(pre)
  148. {
  149.     var htm0 = pre.outerHTML;
  150.  
  151.     var reLang = /<span\b[^>]*class="?lang"?[^>]*>/i;
  152.     var iFirst = -1;
  153.     var iSecond = -1;
  154.  
  155.     iFirst = htm0.search(reLang);
  156.     if (iFirst >= 0) {
  157.         iPos = iFirst + 17;
  158.         iMatch = htm0.substr(iPos).search(reLang);
  159.         if (iMatch >= 0)
  160.             iSecond = iPos + iMatch;
  161.     }
  162.  
  163.     if (iSecond < 0) {
  164.         var htm1 = trimPreElem(htm0);
  165.         if (htm1 != htm0) {
  166.             pre.insertAdjacentHTML('AfterEnd', htm1);
  167.             pre.outerHTML = "";
  168.         }
  169.     }
  170.     else {
  171.         var rePairs = /<(\w+)\b[^>]*><\/\1>/gi;
  172.  
  173.         var substr1 = htm0.substring(0,iSecond);
  174.         var tags1 = substr1.replace(/>[^<>]+(<|$)/g, ">$1");
  175.         var open1 = tags1.replace(rePairs, "");
  176.         open1 = open1.replace(rePairs, "");
  177.  
  178.         var substr2 = htm0.substring(iSecond);
  179.         var tags2 = substr2.replace(/>[^<>]+</g, "><");
  180.         var open2 = tags2.replace(rePairs, "");
  181.         open2 = open2.replace(rePairs, "");
  182.  
  183.         pre.insertAdjacentHTML('AfterEnd', open1 + substr2);
  184.         pre.insertAdjacentHTML('AfterEnd', trimPreElem(substr1 + open2));
  185.         pre.outerHTML = "";
  186.     }    
  187. }
  188.  
  189. function trimPreElem(htm)
  190. {
  191.     return htm.replace(/[ \r\n]*((<\/[BI]>)*)[ \r\n]*<\/PRE>/g, "$1</PRE>").replace(
  192.         /\w*<\/SPAN>\w*((<[BI]>)*)\w*\r\n/g, "\r\n</SPAN>$1"
  193.         );
  194. }
  195.  
  196. function getBlock(elem)
  197. {
  198.     while (elem && elem.tagName.match(/^[BIUA]|(SPAN)|(CODE)|(TD)$/))
  199.         elem = elem.parentElement;
  200.     return elem;
  201. }
  202.  
  203. function langMenu()
  204. {
  205.     bodyOnClick();
  206.  
  207.     window.event.returnValue = false;
  208.     window.event.cancelBubble = true;
  209.  
  210.     var div = document.all.lang_menu;
  211.     var lnk = window.event.srcElement;
  212.     if (div && lnk) {
  213.         var x = lnk.offsetLeft + lnk.offsetWidth - div.offsetWidth;
  214.         div.style.pixelLeft = (x < 0) ? 0 : x;
  215.         div.style.pixelTop = lnk.offsetTop + lnk.offsetHeight;
  216.         div.style.visibility = "visible";
  217.     }
  218. }
  219.  
  220. function chooseLang(item)
  221. {
  222.     window.event.returnValue = false;
  223.     window.event.cancelBubble = true;
  224.  
  225.     if (item) {
  226.         closeMenu();
  227.         curLang = item.innerText;
  228.         showAll = false;
  229.     }
  230.  
  231.     if (cook) {
  232.         cook.putValue('lang', curLang);
  233.         cook.putValue('lang.all', '');
  234.     }
  235.  
  236.     filterLang();
  237. }
  238.  
  239. function chooseAll()
  240. {
  241.     window.event.returnValue = false;
  242.     window.event.cancelBubble = true;
  243.  
  244.     closeMenu();
  245.  
  246.     showAll = true;
  247.     if (cook)
  248.         cook.putValue('lang.all', '1');
  249.  
  250.     unfilterLang();
  251. }
  252.  
  253. function closeMenu()
  254. {
  255.     var div = document.all.lang_menu;
  256.     if (div && div.style.visibility != "hidden") {
  257.         var lnk = document.activeElement;
  258.         if (lnk && lnk.tagName == "A")
  259.             lnk.blur();
  260.  
  261.         div.style.visibility = "hidden";
  262.     }
  263. }
  264.  
  265. function getNext(elem)
  266. {
  267.     for (var i = elem.sourceIndex + 1; i < document.all.length; i++) {
  268.         var next = document.all[i];
  269.         if (!elem.contains(next))
  270.             return next;
  271.     }
  272.     return null;
  273. }
  274.  
  275. function filterMatch(text, name)
  276. {
  277.     var a = text.split(",");
  278.     for (var iTok = 0; iTok < a.length; iTok++) {
  279.         var m = a[iTok].match(/([A-Za-z].*[A-Za-z+])/);
  280.         if (m && m[1] == name)
  281.             return true;
  282.     }
  283.     return false;
  284. }
  285.  
  286. function topicHeading(head)
  287. {
  288.     var iLim = document.body.children.length;
  289.     var idxLim = head.sourceIndex;
  290.  
  291.     for (var i = 0; i < iLim; i++) {
  292.         var elem = document.body.children[i];
  293.         if (elem.sourceIndex < idxLim) {
  294.             if (elem.tagName.match(/^(P)|(PRE)|([DOU]L)$/))
  295.                 return false;
  296.         }
  297.         else
  298.             break;
  299.     }
  300.     return true;
  301. }
  302.  
  303. function filterLang()
  304. {
  305.     var spans = document.all.tags("SPAN");
  306.     for (var i = 0; i < spans.length; i++) {
  307.         var elem = spans[i];
  308.         if (elem.className == "lang") {
  309.             var newVal = filterMatch(elem.innerText, curLang) ? "block" : "none";
  310.             var block = getBlock(elem);
  311.             block.style.display = newVal;
  312.             elem.style.display = "none";
  313.  
  314.             if (block.tagName == "DT") {
  315.                 var next = getNext(block);
  316.                 if (next && next.tagName == "DD")
  317.                     next.style.display = newVal;
  318.             }
  319.             else if (block.tagName.match(/^H[1-6]$/)) {
  320.                 if (topicHeading(block)) {
  321.                     if (newVal != "none") {
  322.                         var tag = null;
  323.                         if (block.children && block.children.length) {
  324.                             tag = block.children[block.children.length - 1];
  325.                             if (tag.className == "ilang") {
  326.                                 tag.innerHTML = (newVal == "block") ?
  327.                                     '  [Language: ' + curLang + ']' : "";
  328.                             }
  329.                         }
  330.                     }
  331.                 }
  332.                 else {
  333.                     var next = getNext(block);
  334.                     while (next && !next.tagName.match(/^(H[1-6])|(DIV)$/)) {
  335.                         next.style.display = newVal;
  336.                         next = getNext(next);
  337.                     }
  338.                 }
  339.             }
  340.         }
  341.         else if (elem.className == "ilang") {
  342.             elem.innerHTML = '  [Language: ' + curLang + ']';
  343.         }
  344.     }
  345.  
  346.     if (ie4) {
  347.         document.body.style.display = "none";
  348.         document.body.style.display = "block";
  349.     }
  350. }
  351.  
  352. function unfilterLang(name)
  353. {
  354.     var spans = document.all.tags("SPAN");
  355.     for (var i = 0; i < spans.length; i++) {
  356.         var elem = spans[i];
  357.         if (elem.className == "lang") {
  358.             var block = getBlock(elem);
  359.             block.style.display = "block";
  360.             elem.style.display = "inline";
  361.  
  362.             if (block.tagName == "DT") {
  363.                 var next = getNext(block);
  364.                 if (next && next.tagName == "DD")
  365.                     next.style.display = "block";
  366.             }
  367.             else if (block.tagName.match(/^H[1-6]$/)) {
  368.                 if (topicHeading(block)) {
  369.                     var tag = null;
  370.                     if (block.children && block.children.length) {
  371.                         tag = block.children[block.children.length - 1];
  372.                         if (tag && tag.className == "ilang")
  373.                             tag.innerHTML = "";
  374.                     }
  375.                 }
  376.                 else {
  377.                     var next = getNext(block);
  378.                     while (next && !next.tagName.match(/^(H[1-6])|(DIV)$/)) {
  379.                         next.style.display = "block";
  380.                         next = getNext(next);
  381.                     }
  382.                 }
  383.             }
  384.         }
  385.         else if (elem.className == "ilang") {
  386.             elem.innerHTML = "";
  387.         }
  388.     }
  389. }
  390.  
  391.  
  392. /*
  393.  * Reftips (parameter popups)
  394.  */
  395. function initReftips()
  396. {
  397.     var DLs = document.all.tags("DL");
  398.     var PREs = document.all.tags("PRE");
  399.     if (DLs && PREs) {
  400.         var iDL = 0;
  401.         var iPRE = 0;
  402.         var iSyntax = -1;
  403.         for (var iPRE = 0; iPRE < PREs.length; iPRE++) {
  404.             if (PREs[iPRE].className == "syntax") {
  405.                 while (iDL < DLs.length && DLs[iDL].sourceIndex < PREs[iPRE].sourceIndex)
  406.                     iDL++;            
  407.                 if (iDL < DLs.length) {
  408.                     initSyntax(PREs[iPRE], DLs[iDL]);
  409.                     iSyntax = iPRE;
  410.                 }
  411.                 else
  412.                     break;
  413.             }
  414.         }
  415.  
  416.         if (iSyntax >= 0) {
  417.             var last = PREs[iSyntax];
  418.             last.insertAdjacentHTML(
  419.                 'AfterEnd',
  420.                 '<DIV ID=reftip CLASS=reftip STYLE="position:absolute;visibility:hidden;overflow:visible;"></DIV>'
  421.                 );
  422.         }
  423.     }
  424. }
  425.  
  426. function initSyntax(pre, dl)
  427. {
  428.     var strSyn = pre.outerHTML;
  429.     var ichStart = strSyn.indexOf('>', 0) + 1;
  430.     var terms = dl.children.tags("DT");
  431.     if (terms) {
  432.         for (var iTerm = 0; iTerm < terms.length; iTerm++) {
  433.             var words = terms[iTerm].innerText.replace(/\[.+\]/g, " ").replace(/,/g, " ").split(" ");
  434.             for (var iWord = 0; iWord < words.length; iWord++) {
  435.                 var word = words[iWord];
  436.                 if (word.length > 0) {
  437.                     var ichMatch = findTerm(strSyn, ichStart, word);
  438.                     while (ichMatch > 0) {
  439.                         var strTag = '<A HREF="" ONCLICK="showTip(this)" CLASS="synParam">' + word + '</A>';
  440.  
  441.                         strSyn =
  442.                             strSyn.slice(0, ichMatch) +
  443.                             strTag +
  444.                             strSyn.slice(ichMatch + word.length);
  445.  
  446.                         ichMatch = findTerm(strSyn, ichMatch + strTag.length, word);
  447.                     }
  448.                 }
  449.             }
  450.         }
  451.     }
  452.  
  453.     // Replace the syntax block with our modified version.
  454.     pre.outerHTML = strSyn;
  455. }
  456.  
  457. function findTerm(strSyn, ichPos, strTerm)
  458. {
  459.     var ichMatch = strSyn.indexOf(strTerm, ichPos);
  460.     while (ichMatch >= 0) {
  461.         if ((ichMatch == 0 || !isalnum(strSyn.charAt(ichMatch - 1))) && 
  462.                 !isalnum(strSyn.charAt(ichMatch + strTerm.length))) {
  463.             var ichComment = strSyn.indexOf("/*", ichPos);
  464.             while (ichComment >= 0) {
  465.                 if (ichComment > ichMatch) { 
  466.                     ichComment = -1;
  467.                     break; 
  468.                 }
  469.                 var ichEnd = strSyn.indexOf("*/", ichComment);
  470.                 if (ichEnd < 0 || ichEnd > ichMatch)
  471.                     break;
  472.                 ichComment = strSyn.indexOf("/*", ichEnd);
  473.             }
  474.             if (ichComment < 0) {
  475.                 ichComment = strSyn.indexOf("//", ichPos);
  476.                 while (ichComment >= 0) {
  477.                     if (ichComment > ichMatch) {
  478.                         ichComment = -1;
  479.                         break; 
  480.                     }
  481.                     var ichEnd = strSyn.indexOf("\n", ichComment);
  482.                     if (ichEnd < 0 || ichEnd > ichMatch)
  483.                         break;
  484.                     ichComment = strSyn.indexOf("//", ichEnd);
  485.                 }
  486.             }
  487.             if (ichComment < 0)
  488.                 break;
  489.         }
  490.         ichMatch = strSyn.indexOf(strTerm, ichMatch + strTerm.length);
  491.     }
  492.     return ichMatch;
  493. }
  494.  
  495. function isalnum(ch)
  496. {
  497.     return ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || (ch == '_'));
  498. }
  499.  
  500. function showTip(link)
  501. {
  502.     bodyOnClick();
  503.  
  504.     var tip = document.all.reftip;
  505.     if (!tip || !link)
  506.         return;
  507.  
  508.     window.event.returnValue = false;
  509.     window.event.cancelBubble = true;
  510.  
  511.     // Hide the tip if necessary and initialize its size.
  512.     tip.style.visibility = "hidden";
  513.     tip.style.pixelWidth = 260;
  514.     tip.style.pixelHeight = 24;
  515.  
  516.     // Find the link target.
  517.     var term = null;
  518.     var def = null;
  519.     var DLs = document.all.tags("DL");
  520.     for (var iDL = 0; iDL < DLs.length; iDL++) {
  521.         if (DLs[iDL].sourceIndex > link.sourceIndex) {
  522.             var dl = DLs[iDL];
  523.             var iMax = dl.children.length - 1;
  524.             for (var iElem = 0; iElem < iMax; iElem++) {
  525.                 var dt = dl.children[iElem];
  526.                 if (dt.tagName == "DT" && dt.style.display != "none") {
  527.                     if (findTerm(dt.innerText, 0, link.innerText) >= 0) {
  528.                         var dd = dl.children[iElem + 1];
  529.                         if (dd.tagName == "DD") {
  530.                             term = dt;
  531.                             def = dd;
  532.                         }
  533.                         break;
  534.                     }
  535.                 }
  536.             }
  537.             break;
  538.         }
  539.     }
  540.  
  541.     if (def) {
  542.         window.linkElement = link;
  543.         window.linkTarget = term;
  544.         tip.innerHTML = '<DL><DT>' + term.innerHTML + '</DT><DD>' + def.innerHTML + '</DD></DL>';
  545.         window.setTimeout("moveTip()", 0);
  546.     }
  547. }
  548.  
  549. function jumpParam()
  550. {
  551.     hideTip();
  552.  
  553.     window.linkTarget.scrollIntoView();
  554.     document.body.scrollLeft = 0;
  555.  
  556.     flash(3);
  557. }
  558.  
  559. function flash(c)
  560. {
  561.     window.linkTarget.style.background = (c & 1) ? "#FFFF80" : "";
  562.     if (c)
  563.         window.setTimeout("flash(" + (c-1) + ")", 200);
  564. }
  565.  
  566. function moveTip()
  567. {
  568.     var tip = document.all.reftip;
  569.     var link = window.linkElement;
  570.     if (!tip || !link)
  571.         return; //error
  572.  
  573.     var w = tip.offsetWidth;
  574.     var h = tip.offsetHeight;
  575.  
  576.     if (w > tip.style.pixelWidth) {
  577.         tip.style.pixelWidth = w;
  578.         window.setTimeout("moveTip()", 0);
  579.         return;
  580.     }
  581.  
  582.     var maxw = document.body.clientWidth;
  583.     var maxh = document.body.clientHeight;
  584.  
  585.     if (h > maxh) {
  586.         if (w < maxw) {
  587.             w = w * 3 / 2;
  588.             tip.style.pixelWidth = (w < maxw) ? w : maxw;
  589.             window.setTimeout("moveTip()", 0);
  590.             return;
  591.         }
  592.     }
  593.  
  594.     var x,y;
  595.  
  596.     var linkLeft = link.offsetLeft - document.body.scrollLeft;
  597.     var linkRight = linkLeft + link.offsetWidth;
  598.  
  599.     var linkTop = link.offsetTop - document.body.scrollTop;
  600.     var linkBottom = linkTop + link.offsetHeight;
  601.  
  602.     var cxMin = link.offsetWidth - 24;
  603.     if (cxMin < 16)
  604.         cxMin = 16;
  605.  
  606.     if (linkLeft + cxMin + w <= maxw) {
  607.         x = maxw - w;
  608.         if (x > linkRight + 8)
  609.             x = linkRight + 8;
  610.         y = maxh - h;
  611.         if (y > linkTop)
  612.             y = linkTop;
  613.     }
  614.     else if (linkBottom + h <= maxh) {
  615.         x = maxw - w;
  616.         if (x < 0)
  617.             x = 0;
  618.         y = linkBottom;
  619.     }
  620.     else if (w <= linkRight - cxMin) {
  621.         x = linkLeft - w - 8;
  622.         if (x < 0)
  623.             x = 0;
  624.         y = maxh - h;
  625.         if (y > linkTop)
  626.             y = linkTop;
  627.     }
  628.     else if (h <= linkTop) {
  629.         x = maxw - w;
  630.         if (x < 0)
  631.             x = 0;
  632.         y = linkTop - h;
  633.     }
  634.     else if (w >= maxw) {
  635.         x = 0;
  636.         y = linkBottom;
  637.     }
  638.     else {
  639.         w = w * 3 / 2;
  640.         tip.style.pixelWidth = (w < maxw) ? w : maxw;
  641.         window.setTimeout("moveTip()", 0);
  642.         return;
  643.     }
  644.     
  645.     link.style.background = "#FFFF80";
  646.     tip.style.pixelLeft = x + document.body.scrollLeft;
  647.     tip.style.pixelTop = y + document.body.scrollTop;
  648.     tip.style.visibility = "visible";
  649. }
  650.  
  651. function hideTip()
  652. {
  653.     if (window.linkElement) {
  654.         window.linkElement.style.background = "";
  655.         window.linkElement = null;
  656.     }
  657.  
  658.     var tip = document.all.reftip;
  659.     if (tip) {
  660.         tip.style.visibility = "hidden";
  661.         tip.innerHTML = "";
  662.     }
  663. }
  664.  
  665. /*
  666.  * See Also popups
  667.  */
  668. function initSeeAlso()
  669. {
  670.     var hdr = document.all.hdr;
  671.     if (!hdr)
  672.         return;
  673.  
  674.     var divS = new String;
  675.     var divR = new String;
  676.  
  677.     var heads = document.all.tags("H4");
  678.     if (heads) {
  679.         for (var i = 0; i < heads.length; i++) {
  680.             var head = heads[i];
  681.             var txt = head.innerText;
  682.             if (txt.match(/^(See Also)|(Related Topics)/)) {
  683.                 divS += head.outerHTML;
  684.                 var next = getNext(head);
  685.                 while (next && !next.tagName.match(/^(H[1-4])|(DIV)$/)) {
  686.                     divS += next.outerHTML;
  687.                     next = getNext(next);
  688.                 }
  689.             }
  690.             else if (txt.match(/^(Requirements)|(QuickInfo)/)) {
  691.                 divR += head.outerHTML;
  692.                 var next = getNext(head);
  693.                 while (next && !next.tagName.match(/^(H[1-4])|(DIV)$/)) {
  694.                     divR += next.outerHTML;
  695.                     next = getNext(next);
  696.                 }
  697.             }
  698.         }
  699.     }
  700.  
  701.     var pos = getNext(hdr.parentElement);
  702.     if (pos) {
  703.         if (divR != "") {
  704.             divR = '<DIV ID=rpop CLASS=sapop>' + divR + '</DIV>';
  705.             var td = hdr.insertCell(0);
  706.             if (td) {
  707.                 td.className = "button1";
  708.                 td.style.width = "19px";
  709.                 td.onclick = showRequirements;
  710.                 td.innerHTML = '<IMG SRC="' + baseUrl + 'Requirements.gif' + '" ALT="Requirements" BORDER=0>';
  711.                 if (ie4)
  712.                     document.body.insertAdjacentHTML('AfterBegin', divR);
  713.                 else
  714.                     document.body.insertAdjacentHTML('BeforeEnd', divR);
  715.             }
  716.         }
  717.         if (divS != "") {
  718.             divS = '<DIV ID=sapop CLASS=sapop>' + divS + '</DIV>';
  719.             var td = hdr.insertCell(0);
  720.             if (td) {
  721.                 td.className = "button1";
  722.                 td.style.width = "19px";
  723.                 td.onclick = showSeeAlso;
  724.                 td.innerHTML = '<IMG SRC="' + baseUrl + 'SeeAlso.gif' + '" ALT="See Also" BORDER=0>';
  725.                 if (ie4)
  726.                     document.body.insertAdjacentHTML('AfterBegin', divS);
  727.                 else
  728.                     document.body.insertAdjacentHTML('BeforeEnd', divS);
  729.             }
  730.         }
  731.     }
  732. }
  733.  
  734. function showSeeAlso()
  735. {
  736.     bodyOnClick();
  737.  
  738.     window.event.returnValue = false;
  739.     window.event.cancelBubble = true;
  740.  
  741.     var div = document.all.sapop;
  742.     var lnk = window.event.srcElement;
  743.  
  744.     if (div && lnk) {
  745.         div.style.pixelTop = lnk.offsetTop + lnk.offsetHeight;
  746.         div.style.visibility = "visible";
  747.     }
  748. }
  749.  
  750. function showRequirements()
  751. {
  752.     bodyOnClick();
  753.  
  754.     window.event.returnValue = false;
  755.     window.event.cancelBubble = true;
  756.  
  757.     var div = document.all.rpop;
  758.     var lnk = window.event.srcElement;
  759.  
  760.     if (div && lnk) {
  761.         div.style.pixelTop = lnk.offsetTop + lnk.offsetHeight;
  762.         div.style.visibility = "visible";
  763.     }
  764. }
  765.  
  766. function hideSeeAlso()
  767. {
  768.     var div = document.all.sapop;
  769.     if (div)
  770.         div.style.visibility = "hidden";
  771.  
  772.     var div = document.all.rpop;
  773.     if (div)
  774.         div.style.visibility = "hidden";
  775. }
  776.