home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 October / CHIP1002.ISO / exe / COMPUGUI.exe / whfhost.js < prev    next >
Encoding:
Text File  |  2002-04-23  |  18.2 KB  |  916 lines

  1. var gsSK2=null;
  2. var gsSK=null;
  3. var gsFtsBreakChars="\t\r\n\"\\ .,!@#$%^&*()~'`:;<>?/{}[]|+-=\x85\x92\x93\x94\x95\x96\x97\x99\xA9\xAE\xB7";
  4. var gnCLF=0;
  5. var gsHelpCannotSearch="Keine Suche mit dieser Wortverbindung m÷glich.";
  6. var gsNoTopics="Keine Themen vorhanden.";
  7. var gsLoadingDivID="LoadingDiv";
  8. var gsLoadingMsg="Bitte warten, Daten werden geladen ...";
  9. var gsSearchMsg="Suche lΣuft...";
  10. var gsResultDivID="ResultDiv";
  11. var gaaFCD=new Array();
  12. var gaaFTCD=new Array();
  13. var goCF=null;
  14. var goCTF=null;
  15. var gaTI=null;
  16. var gnCurrentOp=0;
  17. var gbNot=false;
  18. var gbReady=false;
  19. var gnLoadFts=1;
  20. var gnCacheLimits=5;
  21. var gaCCD=new Array();
  22. var gbXML=false;
  23. var gaData=new Array();
  24. var gsBgColor="#ffffff";
  25. var gsBgImage="";
  26. var gsMargin="0pt";
  27. var gsIndent="0pt";
  28. var gsCheckKey=null;
  29. var gnIndexNum=0;
  30. var gaFtsContentsCon=null;
  31. var gaTopicCheckInfo=null;
  32. var gnTopicCheck=0;
  33. var goFont=null;
  34. var goErrFont=null;
  35. var goHoverFont=null;
  36. var gsABgColor="#cccccc";
  37. var gbWhFHost=false;
  38.  
  39. function setBackground(sBgImage)
  40. {
  41.     gsBgImage=sBgImage;
  42. }
  43.  
  44. function setBackgroundcolor(sBgColor)
  45. {
  46.     gsBgColor=sBgColor;
  47. }
  48.  
  49. function setFont(sType,sFontName,sFontSize,sFontColor,sFontStyle,sFontWeight,sFontDecoration)
  50. {
  51.     var vFont=new whFont(sFontName,sFontSize,sFontColor,sFontStyle,sFontWeight,sFontDecoration);
  52.     if(sType=="Normal")
  53.         goFont=vFont;
  54.     else if(sType=="Error")
  55.         goErrFont=vFont;
  56.     else if(sType=="Hover")
  57.         goHoverFont=vFont;
  58. }
  59.  
  60. function setActiveBgColor(sBgColor)
  61. {
  62.     gsABgColor=sBgColor;
  63. }
  64.  
  65. function setMargin(sMargin)
  66. {
  67.     gsMargin=sMargin;
  68. }
  69.  
  70. function setIndent(sIndent)
  71. {
  72.     gsIndent=sIndent;
  73. }
  74.  
  75. function updateCache(oCF)
  76. {
  77.     var len=gaCCD.length;
  78.     if(len<gnCacheLimits*gnCLF)
  79.         gaCCD[len]=oCF;
  80.     else{
  81.         gaCCD[0].aTopics=null;
  82.         gaCCD[0].aFtsKeys=null;
  83.         removeItemFromArray(gaCCD,0);
  84.         gaCCD[len-1]=oCF;
  85.     }
  86. }
  87.  
  88. function addFtsInfo(sPPath,sDPath,sFtsFile)
  89. {
  90.     gaData[gaData.length]=new ftsInfo(sPPath,sDPath,sFtsFile);
  91. }
  92.  
  93. function putDataXML(xmlDoc,sDocPath)
  94. {
  95.     if(gnLoadFts==1)
  96.     {
  97.         var node=xmlDoc.lastChild;
  98.         if(node)
  99.         {
  100.             var oChild=node.firstChild;
  101.             var aFCD=new Array();
  102.             var aFTCD=new Array();
  103.             while(oChild)
  104.             {
  105.                 if(oChild.nodeName=="chunkinfo")
  106.                 {
  107.                     var sURL=oChild.getAttribute("url");
  108.                     var sFirst=oChild.getAttribute("first");
  109.                     var sLast=oChild.getAttribute("last");
  110.                     if(sURL&&sFirst&&sLast)
  111.                     {
  112.                         item=new Object();
  113.                         item.sStartKey=sFirst;
  114.                         item.sEndKey=sLast;
  115.                         item.sFileName=sURL;
  116.                         aFCD[aFCD.length]=item;
  117.                     }
  118.                 }
  119.                 else if(oChild.nodeName=="tchunkinfo")
  120.                 {
  121.                     var sURL=oChild.getAttribute("url");
  122.                     var nB=parseInt(oChild.getAttribute("first"));
  123.                     var nE=parseInt(oChild.getAttribute("last"));
  124.                     if(sURL&&sFirst&&sLast)
  125.                     {
  126.                         item=new Object();
  127.                         item.nBegin=nB;
  128.                         item.nEnd=nE;
  129.                         item.sFileName=sURL;
  130.                         aFTCD[aFTCD.length]=item;
  131.                     }
  132.  
  133.                 }
  134.                 oChild=oChild.nextSibling;
  135.             }
  136.             ftsReady(aFCD,aFTCD);
  137.         }
  138.     }
  139.     else if(gnLoadFts==3)
  140.     {
  141.         var node=xmlDoc.lastChild;
  142.         if(node)
  143.         {
  144.             var oChild=node.firstChild;
  145.             var aTopics=new Array();
  146.             while(oChild)
  147.             {
  148.                 if(oChild.nodeName=="topic")
  149.                 {
  150.                     var name=oChild.getAttribute("name");
  151.                     var sURL=oChild.getAttribute("url");
  152.                     if(name&&name.length>0&&sURL)
  153.                     {
  154.                         var topic=new Object();
  155.                         topic.sTopicTitle=name;
  156.                         topic.sTopicURL=sURL;
  157.                         aTopics[aTopics.length]=topic;
  158.                     }
  159.                 }
  160.                 oChild=oChild.nextSibling;
  161.             }
  162.             putFtsTData(aTopics);
  163.         }
  164.     }
  165.     else if(gnLoadFts==2)
  166.     {
  167.         var node=xmlDoc.lastChild;
  168.         if(node)
  169.         {
  170.             var oChild=node.firstChild;
  171.             var aFtsContents=new Array();
  172.             while(oChild)
  173.             {
  174.                 if(oChild.nodeName=="key")
  175.                 {
  176.                     var name=oChild.getAttribute("name");
  177.                     if(name&&name.length>0)
  178.                     {
  179.                         var item=new Object();
  180.                         item.sItemName=name;
  181.                         aFtsContents[aFtsContents.length]=item;
  182.                         var oChildChild=oChild.firstChild;
  183.                         while(oChildChild)
  184.                         {
  185.                             if(oChildChild.nodeName=="#text")
  186.                             {
  187.                                 var sIDs=oChildChild.nodeValue;
  188.                                 if(sIDs)
  189.                                 {
  190.                                     var nBPos=0;
  191.                                     do
  192.                                     {
  193.                                         var nPos=sIDs.indexOf(",",nBPos);
  194.                                         var sID=null;
  195.                                         if(nPos!=-1)
  196.                                             sID=sIDs.substring(nBPos,nPos);
  197.                                         else
  198.                                             sID=sIDs.substring(nBPos);
  199.  
  200.                                         if(sID)
  201.                                         {
  202.                                             var id=parseInt(sID);
  203.                                             if(!isNaN(id))
  204.                                             {
  205.                                                 if(!item.aTopics)
  206.                                                     item.aTopics=new Array();
  207.                                                 item.aTopics[item.aTopics.length]=id;
  208.                                             }
  209.                                         }
  210.                                         nBPos=nPos+1;
  211.                                     }while(nBPos!=0&&nBPos<sIDs.length);
  212.                                 }
  213.                             }
  214.                             oChildChild=oChildChild.nextSibling;
  215.                         }
  216.                     }
  217.                 }
  218.                 oChild=oChild.nextSibling;
  219.             }
  220.             putFtsWData(aFtsContents);
  221.         }
  222.     }
  223. }
  224.  
  225. function ftsInfo(sPPath,sDPath,sFtsFile)
  226. {
  227.     this.sPPath=sPPath;
  228.     this.sDPath=sDPath;
  229.     this.sFtsFile=sFtsFile;
  230. }
  231.  
  232. function window_OnLoad()
  233. {
  234.     if(gsBgImage&&gsBgImage.length>0)
  235.     {
  236.         document.body.background=gsBgImage;
  237.     }
  238.     if(gsBgColor&&gsBgColor.length>0)
  239.     {
  240.         document.body.bgColor=gsBgColor;
  241.     }
  242.     writeResultDiv();
  243.     loadFts();
  244.     var oMsg=new whMessage(WH_MSG_SHOWFTS,this,1,null)
  245.     SendMessage(oMsg);
  246. }
  247.  
  248. function writeResultDiv()
  249. {
  250.     var sHTML="<div id=\""+gsResultDivID+"\" style=\"POSITION:absolute;\"></div>";
  251.     document.body.insertAdjacentHTML("beforeEnd",sHTML);
  252. }
  253.  
  254. function loadFts()
  255. {
  256.     if(!gbReady)
  257.     {
  258.         var oResMsg=new whMessage(WH_MSG_GETPROJINFO,this,1,null);
  259.         if(SendMessage(oResMsg)&&oResMsg.oParam)
  260.         {
  261.             gbReady=true;
  262.             var oProj=oResMsg.oParam;
  263.             var aProj=oProj.aProj;
  264.             gbXML=oProj.bXML;
  265.             if(aProj.length>0)
  266.             {
  267.                 var sLangId=aProj[0].sLangId;
  268.                 for(var i=0;i<aProj.length;i++)
  269.                 {
  270.                     if(aProj[i].sFts!=null&&aProj[i].sFts!=""&&aProj[i].sLangId==sLangId)
  271.                     {
  272.                         addFtsInfo(aProj[i].sPPath,aProj[i].sDPath,aProj[i].sFts);
  273.                     }
  274.                 }
  275.             }
  276.             loadFD();
  277.  
  278.         }                
  279.     }
  280. }
  281.  
  282. function loadFD()
  283. {
  284.     if(gnCLF<gaData.length)
  285.     {
  286.         gnLoadFts=1;
  287.         loadData2(gaData[gnCLF].sPPath+gaData[gnCLF].sDPath+gaData[gnCLF].sFtsFile);
  288.     }
  289.     else 
  290.     {
  291.         var oMsg = new whMessage(WH_MSG_BACKUPSEARCH, this, 1, null);
  292.         if (SendMessage(oMsg))
  293.         {
  294.             if (oMsg.oParam)
  295.             {
  296.                 gsSK=oMsg.oParam.toLowerCase();
  297.                 findFTSKey();
  298.             }
  299.         }
  300.         RegisterListener2(this, WH_MSG_SEARCHFTSKEY);
  301.     }
  302. }
  303.  
  304. function loadData2(sFile)
  305. {
  306.     if(gbXML)
  307.         loadDataXML(sFile);
  308.     else
  309.         loadData(sFile);
  310. }
  311.  
  312. function findFTSKey()
  313. {
  314.     gaTI=new Array();
  315.     gnCurrentOp=0;
  316.     gbNot=false;
  317.     displayMsg(gsSearchMsg);
  318.     if(gsSK!="")
  319.         findOneKey();
  320. }
  321.  
  322. function findOneKey()
  323. {
  324.     if(gsSK && gsSK!="")
  325.     {
  326.         var sInput=gsSK;
  327.         var sCW="";
  328.         var nS=-1;
  329.         var nSep=-1;
  330.         for(var nChar=0;nChar<gsFtsBreakChars.length;nChar++){
  331.             var nFound=sInput.indexOf(gsFtsBreakChars.charAt(nChar));
  332.             if((nFound!=-1)&&((nS==-1)||(nFound<nS))){
  333.                 nS=nFound;
  334.                 nSep=nChar;
  335.             }
  336.         }
  337.         if(nS==-1){
  338.             sCW=sInput;
  339.             sInput="";
  340.         }else{
  341.             sCW=sInput.substring(0,nS);
  342.             sInput=sInput.substring(nS+1);
  343.         }
  344.  
  345.         gsSK=sInput;
  346.         
  347.         if((sCW=="or")||((nSep>=0)&&(gsFtsBreakChars.charAt(nSep)=="|"))){
  348.             gnCurrentOp=0;
  349.             gbNot=false;
  350.         }else if((sCW=="and")||((nSep>=0)&&(gsFtsBreakChars.charAt(nSep)=="&"))){
  351.             gnCurrentOp=1;
  352.             gbNot=false;
  353.         }else if((sCW=="not")||
  354.             ((nSep>=0)&&(gsFtsBreakChars.charAt(nSep)=="~"))){
  355.             gbNot=!gbNot;
  356.         }else if(sCW!=""&&!IsStopWord(sCW,gaFtsStop)){
  357.             var sCurrentStem=GetStem(sCW);
  358.             gsCW=sCurrentStem;
  359.             ftsFindKeyword();
  360.             return;
  361.         }
  362.         findOneKey();
  363.         return;
  364.     }
  365.     else{
  366.         displayTopics();
  367.         checkAgain();
  368.     }
  369. }
  370.  
  371. function checkAgain()
  372. {
  373.     gsSK=gsSK2;
  374.     gsSK2=null;
  375.     if(gsSK!=null)
  376.         setTimeout("findFTSKey();",1);
  377. }
  378.  
  379. function displayTopics()
  380. {
  381.     var sHTML="";
  382.     var sLine="";
  383.     for(var i=0;i<gaTI.length;i++){
  384.         sLine+="<dt><nobr><a href='"+_textToHtml(gaTI[i].sTopicURL)+"'>"+_textToHtml(gaTI[i].sTopicTitle)+"</a></nobr></dt>";
  385.         if(i>>4<<4==i)
  386.         {
  387.             sHTML+=sLine;
  388.             sLine="";
  389.         }
  390.     }
  391.     if(sLine.length>0)
  392.         sHTML+=sLine;
  393.  
  394.     if(sHTML.length==0)
  395.         sHTML="<P>"+gsNoTopics+"</P>"
  396.     else
  397.         sHTML="<dl>"+sHTML+"</dl>";
  398.  
  399.     var resultDiv=getElement(gsResultDivID);
  400.     if(resultDiv)
  401.         resultDiv.innerHTML=sHTML;
  402. }
  403.  
  404. function displayMsg(sErrorMsg)
  405. {
  406.     var sHTML="<P>"+sErrorMsg+"</P>";
  407.  
  408.     var resultDiv=getElement(gsResultDivID);
  409.     if(resultDiv)
  410.         resultDiv.innerHTML=sHTML;
  411. }
  412.  
  413. function ftsFindKeyword()
  414. {
  415.     var sKey=gsCW;
  416.     var bNeedLoad=false;
  417.     var aFtsContentsCon=null;
  418.     var s=0;
  419.     if(sKey==null) return;
  420.     if(!gsCheckKey||sKey!=gsCheckKey||gnIndexNum==0)
  421.     {
  422.         aFtsContentsCon=new Array();
  423.         gnCheck=0;
  424.         gsCheckKey=sKey;
  425.         gnTopicCheck=0;
  426.         gaTopicCheckInfo=null;
  427.     }
  428.     else{
  429.         s=gnIndexNum;
  430.         aFtsContentsCon=gaFtsContentsCon;
  431.     }
  432.     for(var i=gnCheck;i<gaaFCD.length;i++)
  433.     {
  434.         var oCF=getChunkedFts(i,sKey);
  435.         if(oCF)
  436.         {
  437.             if(!oCF.aFtsKeys&&oCF.sFileName!=null)
  438.             {
  439.                 bNeedLoad=true;
  440.                 oCF.nProjId=i;
  441.                 goCF=oCF;
  442.                 gnIndexNum=s;
  443.                 gnCheck=i;
  444.                 gaFtsContentsCon=aFtsContentsCon;
  445.                 gnLoadFts=2;
  446.                 beginLoading();
  447.                 loadData2(gaData[i].sPPath+gaData[i].sDPath+oCF.sFileName);
  448.                 break;
  449.             }
  450.             else{
  451.                 aFtsContentsCon[s++]=oCF;
  452.             }
  453.         }
  454.     }
  455.     if(!bNeedLoad)
  456.     {
  457.         var aTI=gaTopicCheckInfo;
  458.         for(var m=gnTopicCheck;m<aFtsContentsCon.length;m++)
  459.         {
  460.             var aTIPart=getTopics(aFtsContentsCon[m],sKey);
  461.             if(aTIPart==null)
  462.             {
  463.                 gnCheck=gaaFCD.length;
  464.                 gnTopicCheck=m;
  465.                 gaTopicCheckInfo=aTI;
  466.                 gaFtsContentsCon=aFtsContentsCon;
  467.                 return;
  468.             }
  469.             if(m==0)
  470.                 aTI=aTIPart;
  471.             else
  472.                 aTI=mergeTopics(aTI,aTIPart);
  473.         }
  474.         if(mergewithPreviousResult(aTI))
  475.             findOneKey();
  476.         else
  477.             checkAgain();
  478.     }
  479. }
  480.  
  481. function mergewithPreviousResult(aTI)
  482. {
  483.     if(aTI!=null&&aTI.length!=0)
  484.     {
  485.         var nNumTopics=aTI.length;
  486.         if(gnCurrentOp==0){
  487.             if(gbNot){
  488.                 displayMsg(gsHelpCannotSearch);
  489.                 return false;
  490.             }else{
  491.                 var aLS,aSS;
  492.                 if(gaTI.length>=aTI.length)
  493.                 {
  494.                     aLS=gaTI;
  495.                     aSS=aTI;
  496.                 }
  497.                 else
  498.                 {
  499.                     aLS=aTI;
  500.                     aSS=gaTI;
  501.                 }
  502.                 var s=0;
  503.                 for(var i=0;i<aSS.length;i++)
  504.                 {
  505.                     var bAlreadyThere=false;
  506.                     for(var j=s;j<aLS.length;j++)
  507.                     {
  508.                         if(aSS[i].equalTo(aLS[j]))
  509.                         {
  510.                             bAlreadyThere=true;
  511.                             s=j;
  512.                             break;
  513.                         }
  514.                     }
  515.                     if(!bAlreadyThere)
  516.                     {
  517.                         insertTopic(aLS,aSS[i]);
  518.                     }
  519.                 }
  520.                 gaTI=aLS;
  521.             }
  522.         }else if(gnCurrentOp==1){
  523.             if(gbNot){
  524.                 var s=0;
  525.                 for(var i=0;i<aTI.length;i++)
  526.                 {
  527.                     for(var j=s;j<gaTI.length;j++)
  528.                     {
  529.                         if(aTI[i].equalTo(gaTI[j]))
  530.                         {
  531.                             removeItemFromArray(gaTI,j);
  532.                             s=j;
  533.                             break;
  534.                         }
  535.                     }
  536.                 }
  537.             }else{
  538.                 var s=0;
  539.                 for(var i=0;i<gaTI.length;i++)
  540.                 {
  541.                     var bFound=false;
  542.                     for(var j=s;j<aTI.length;j++)
  543.                     {
  544.                         if(gaTI[i].equalTo(aTI[j]))
  545.                         {
  546.                             bFound=true;
  547.                             s=j;
  548.                         }
  549.                     }
  550.                     if(!bFound)
  551.                     {
  552.                         removeItemFromArray(gaTI,i);
  553.                         i--;
  554.                     }
  555.                 }                
  556.             }
  557.         }
  558.     }else{
  559.         if((gnCurrentOp==1)&&(!gbNot)){
  560.             gaTI.length=0;
  561.         }else if((gnCurrentOp==0)&&(gbNot)){
  562.             displayMsg(gsHelpCannotSearch);
  563.             return false;
  564.         }
  565.     }
  566.     return true;
  567. }
  568.  
  569. function insertTopic(aTI,oTI)
  570. {
  571.     var nB=0;
  572.     var nE=aTI.length-1;
  573.     if(nE>=0)
  574.     {
  575.         var nM;
  576.         var bFound=false;
  577.         do{
  578.             nM=(nB+nE)>>1;
  579.             if(compare(aTI[nM].sTopicTitle,oTI.sTopicTitle)>0)
  580.                 nE=nM-1;
  581.             else if(compare(aTI[nM].sTopicTitle,oTI.sTopicTitle)<0)
  582.                 nB=nM+1;
  583.             else
  584.             {
  585.                 bFound=true;
  586.                 break;
  587.             }
  588.         }while(nB<=nE);
  589.         if(bFound)
  590.             insertItemIntoArray(aTI,nM,oTI);
  591.         else
  592.         {
  593.             if(compare(aTI[nM].sTopicTitle,oTI.sTopicTitle)<0)
  594.                 insertItemIntoArray(aTI,nM+1,oTI);
  595.             else
  596.                 insertItemIntoArray(aTI,nM,oTI);
  597.         }
  598.     }
  599.     else
  600.         aTI[0]=oTI;
  601. }
  602.  
  603. function mergeTopics(aTI1,aTI2)
  604. {
  605.     var i1=0;
  606.     var i2=0;
  607.     var len1=aTI1.length;
  608.     var len2=aTI2.length;
  609.     var aTopicNew=new Array();
  610.     var i=0;
  611.     while(i1<len1||i2<len2)
  612.     {
  613.         if(i1<len1&&i2<len2)
  614.         {
  615.             if(compare(aTI1[i1].sTopicTitle,aTI2[i2].sTopicTitle)<0)
  616.                 aTopicNew[i++]=aTI1[i1++];
  617.             else
  618.                 aTopicNew[i++]=aTI2[i2++];
  619.         }
  620.         else if(i1<len1)
  621.             aTopicNew[i++]=aTI1[i1++];
  622.         else if(i2<len2)
  623.             aTopicNew[i++]=aTI2[i2++];
  624.     }
  625.     return aTopicNew;
  626. }
  627.  
  628. function getTopics(oCF,sKey)
  629. {
  630.     var aTIPart=new Array();
  631.     if(oCF&&oCF.aFtsKeys)
  632.     {
  633.         var keys=oCF.aFtsKeys;
  634.         var nB=0;
  635.         var nE=keys.length-1;
  636.         var nM=-1;
  637.         var bFound=false;
  638.         do{
  639.             nM=(nB+nE)>>1;
  640.             if(compare(keys[nM].sItemName,sKey)>0)
  641.                 nE=nM-1;
  642.             else if(compare(keys[nM].sItemName,sKey)<0)
  643.                 nB=nM+1;
  644.             else{
  645.                 bFound=true;
  646.                 break;
  647.             }
  648.         }while(nB<=nE);
  649.         if(bFound)
  650.         {
  651.             if(keys[nM].aTopics)
  652.             {
  653.                 for(var i=0;i<keys[nM].aTopics.length;i++)
  654.                 {
  655.                     var oTC=getTopicChunk(gaaFTCD[oCF.nProjId],keys[nM].aTopics[i]);
  656.                     if(oTC.aTopics)
  657.                     {
  658.                         aTIPart[aTIPart.length]=
  659.                             new topicInfo(oTC.aTopics[keys[nM].aTopics[i]-oTC.nBegin].sTopicTitle,
  660.                                 gaData[oCF.nProjId].sPPath+oTC.aTopics[keys[nM].aTopics[i]-oTC.nBegin].sTopicURL);
  661.                     }
  662.                     else{
  663.                         goCTF=oTC;
  664.                         gnLoadFts=3;
  665.                         beginLoading();
  666.                         loadData2(gaData[oCF.nProjId].sPPath+gaData[oCF.nProjId].sDPath+oTC.sFileName);
  667.                         return null;
  668.                     }
  669.                 }
  670.             }
  671.         }
  672.     }
  673.     return aTIPart;
  674. }
  675.  
  676. function getTopicChunk(aFTCD,nTopicId)
  677. {
  678.     if(aFTCD&&aFTCD.length)
  679.     {
  680.         var nB=0;
  681.         var nE=aFTCD.length-1;
  682.         var nM=-1;
  683.         var bFound=false;
  684.         do{
  685.             nM=(nB+nE)>>1;
  686.             if(aFTCD[nM].nBegin>nTopicId)
  687.                 nE=nM-1;
  688.             else if(aFTCD[nM].nEnd<nTopicId)
  689.                 nB=nM+1;
  690.             else{
  691.                 bFound=true;
  692.                 break;
  693.             }
  694.         }while(nB<=nE);
  695.         if(bFound)
  696.             return aFTCD[nM];
  697.     }
  698.     return null;
  699. }
  700.  
  701. function endLoading()
  702. {
  703.     var oDiv=getElement(gsLoadingDivID);
  704.     if(oDiv)
  705.         oDiv.style.visibility="hidden";
  706. }
  707.  
  708. function beginLoading()
  709. {
  710.     var oDiv=getElement(gsLoadingDivID);
  711.     if(!oDiv)
  712.     {
  713.         document.body.insertAdjacentHTML("afterBegin",writeLoadingDiv());
  714.         oDiv=getElement(gsLoadingDivID);
  715.     }
  716.     
  717.     if(oDiv)
  718.     {
  719.         oDiv.style.top=document.body.scrollTop;
  720.         oDiv.style.visibility="visible";
  721.     }
  722. }
  723.  
  724. function writeLoadingDiv(nIIdx)
  725. {
  726.     return "<div id=\""+gsLoadingDivID+"\" style=\"position:absolute;top:0;left:0;z-index:600;visibility:hidden;padding-left:4px;background-color:ivory;border-width:1;border-style:solid;border-color:black;width:150px;\">"+gsLoadingMsg+"</div>";
  727. }
  728.  
  729. function topicInfo(sTopicTitle,sTopicURL)
  730. {
  731.     this.sTopicTitle=sTopicTitle;
  732.     this.sTopicURL=sTopicURL;
  733.     this.equalTo=function(oTI)
  734.     {
  735.         return ((this.sTopicTitle==oTI.sTopicTitle)&&
  736.             (this.sTopicURL==oTI.sTopicURL));
  737.     }
  738. }
  739.  
  740. function getChunkedFts(nIndex,sKey)
  741. {
  742.     var oCF=null;
  743.     if(nIndex<gaaFCD.length)
  744.     {
  745.         var len=gaaFCD[nIndex].length;
  746.         if(len>0)
  747.         {
  748.             var nB=0;
  749.             var nE=len-1;
  750.             var bFound=false;
  751.             do{
  752.                 var nM=(nB+nE)>>1;
  753.                 if(compare(sKey,gaaFCD[nIndex][nM].sEndKey)>0)
  754.                 {
  755.                     nB=nM+1;
  756.                 }
  757.                 else if(compare(sKey,gaaFCD[nIndex][nM].sStartKey)<0)
  758.                 {
  759.                     nE=nM-1;
  760.                 }
  761.                 else{
  762.                     bFound=true;
  763.                     break;
  764.                 }
  765.             }while(nE>=nB);
  766.             if(bFound)
  767.                 oCF=gaaFCD[nIndex][nM];
  768.         }
  769.     }
  770.     return oCF;
  771. }
  772.  
  773. function ftsReady(aFCD,aFTCD)
  774. {
  775.     endLoading();
  776.     gaaFTCD[gnCLF]=aFTCD;
  777.     gaaFCD[gnCLF++]=aFCD;
  778.     setTimeout("loadFD();",1);
  779. }
  780.  
  781. function putFtsTData(aTopics)
  782. {
  783.     endLoading();
  784.     var oCTF=goCTF;
  785.     if(oCTF)
  786.     {
  787.         oCTF.aTopics=aTopics;
  788.         setTimeout("ftsFindKeyword();",1);
  789.     }
  790. }
  791.  
  792. function putFtsWData(aFtsContents)
  793. {
  794.     endLoading();
  795.     var oCF=goCF;
  796.     if(oCF)
  797.     {
  798.         updateCache(oCF);
  799.         oCF.aFtsKeys=aFtsContents;
  800.         setTimeout("ftsFindKeyword();",1);
  801.     }
  802. }
  803.  
  804. function IsStopWord(sCW,aFtsStopArray)
  805. {
  806.     var nStopArrayLen=aFtsStopArray.length;
  807.     var nB=0;
  808.     var nE=nStopArrayLen-1;
  809.     var nM=0;
  810.     var bFound=false;
  811.     var sStopWord="";
  812.     while(nB<=nE){
  813.         nM=(nB+nE);
  814.         nM>>=1;
  815.         sStopWord=aFtsStopArray[nM];
  816.         if(compare(sCW,sStopWord)>0){
  817.             nB=(nB==nM)?nM+1:nM;
  818.         }else{
  819.             if(compare(sCW,sStopWord)<0){
  820.                 nE=(nE==nM)?nM-1:nM;
  821.             }else{
  822.                 bFound=true;
  823.                 break;
  824.             }
  825.         }
  826.     }
  827.     return bFound;
  828. }
  829.  
  830. function GetStem(szWord)
  831. {
  832.     if(gaFtsStem==null||gaFtsStem.length==0)return szWord;
  833.     var aStems=gaFtsStem;
  834.  
  835.     var nStemPos=0;
  836.     var csStem="";
  837.     for(var iStem=0;iStem<aStems.length;iStem++){
  838.  
  839.         if(aStems[iStem].length>=szWord.length-1)    break;
  840.         nStemPos=szWord.lastIndexOf(aStems[iStem]);
  841.         if(nStemPos>0){
  842.             var cssub=szWord.substring(nStemPos);
  843.             if(cssub==aStems[iStem]){
  844.                 csStem=szWord;
  845.                 if(szWord.charAt(nStemPos-2)==szWord.charAt(nStemPos-1)){
  846.                     csStem=csStem.substring(0,nStemPos-1);
  847.                 }else{
  848.                     csStem=csStem.substring(0,nStemPos);
  849.                 }
  850.                 return csStem;
  851.             }
  852.         }
  853.     }
  854.     return szWord;
  855. }
  856.  
  857. function FtsWriteClassStyle()
  858. {
  859.     var sStyle="<STYLE TYPE='text/css'>\n";
  860.     if (gsBgImage)
  861.         sStyle+="body {border-top:"+gsBgColor+" 1px solid;}\n";
  862.     else
  863.         sStyle+="body {border-top:black 1px solid;}\n";
  864.     sStyle+="P {"+getFontStyle(goErrFont)+"margin-left:"+gsIndent+";margin-top:"+gsMargin+";}\n";
  865.     sStyle+="dl {"+getFontStyle(goFont)+"margin-left:"+gsIndent+";margin-top:"+gsMargin+";}\n";
  866.     sStyle+="A:link {"+getFontStyle(goFont)+"}\n";
  867.     sStyle+="A:visited {"+getFontStyle(goFont)+"}\n";
  868.     sStyle+="A:active {background-color:"+gsABgColor+";}\n";
  869.     sStyle+="A:hover {"+getFontStyle(goHoverFont)+"}\n";
  870.     sStyle+="</STYLE>";
  871.     document.write(sStyle);
  872. }
  873.  
  874. function window_Unload()
  875. {
  876.     UnRegisterListener2(this,WH_MSG_PROJECTREADY);
  877.     UnRegisterListener2(this, WH_MSG_SEARCHFTSKEY);
  878. }
  879.  
  880.  
  881. function onSendMessage(oMsg)
  882. {
  883.     var nMsgId=oMsg.nMessageId;
  884.     if(nMsgId==WH_MSG_SEARCHFTSKEY)
  885.     {
  886.         if(oMsg.oParam)
  887.         {
  888.             if(gsSK==null||gsSK=="")
  889.             {
  890.                 gsSK=oMsg.oParam.toLowerCase();
  891.                 findFTSKey();
  892.             }
  893.             else
  894.                 gsSK2=oMsg.oParam.toLowerCase();
  895.         }
  896.     }
  897.     else if(nMsgId==WH_MSG_PROJECTREADY)
  898.     {
  899.         loadFts();
  900.     }
  901.     return true;
  902. }
  903.  
  904. if (window.gbWhUtil&&window.gbWhLang&&window.gbWhProxy&&window.gbWhVer&&window.gbWhMsg)
  905. {
  906.     goFont=new whFont("Verdana","8pt","#000000","normal","normal","none");
  907.     goErrFont=new whFont("Verdana","8pt","#000000","normal","bold","none");
  908.     goHoverFont=new whFont("Verdana","8pt","#007f00","normal","normal","underline");
  909.     window.onload=window_OnLoad;
  910.     window.onbeforeunload=window_BUnload;
  911.     window.onunload=window_Unload;
  912.     RegisterListener2(this,WH_MSG_PROJECTREADY);
  913.     gbWhFHost=true;
  914. }
  915. else
  916.     document.location.reload();