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