Salome HOME
DCQ : Merge with Ecole_Ete_a6.
[modules/smesh.git] / doc / salome / gui / SMESH / whfhost.js
diff --git a/doc/salome/gui/SMESH/whfhost.js b/doc/salome/gui/SMESH/whfhost.js
new file mode 100755 (executable)
index 0000000..a30564d
--- /dev/null
@@ -0,0 +1,916 @@
+var gsSK2=null;\r
+var gsSK=null;\r
+var gsFtsBreakChars="\t\r\n\"\\ .,!@#$%^&*()~'`:;<>?/{}[]|+-=\x85\x92\x93\x94\x95\x96\x97\x99\xA9\xAE\xB7";\r
+var gnCLF=0;\r
+var gsHelpCannotSearch="Cannot search for that phrase.";\r
+var gsNoTopics="No Topics Found.";\r
+var gsLoadingDivID="LoadingDiv";\r
+var gsLoadingMsg="Loading data, please wait...";\r
+var gsSearchMsg="Searching...";\r
+var gsResultDivID="ResultDiv";\r
+var gaaFCD=new Array();\r
+var gaaFTCD=new Array();\r
+var goCF=null;\r
+var goCTF=null;\r
+var gaTI=null;\r
+var gnCurrentOp=0;\r
+var gbNot=false;\r
+var gbReady=false;\r
+var gnLoadFts=1;\r
+var gnCacheLimits=5;\r
+var gaCCD=new Array();\r
+var gbXML=false;\r
+var gaData=new Array();\r
+var gsBgColor="#ffffff";\r
+var gsBgImage="";\r
+var gsMargin="0pt";\r
+var gsIndent="0pt";\r
+var gsCheckKey=null;\r
+var gnIndexNum=0;\r
+var gaFtsContentsCon=null;\r
+var gaTopicCheckInfo=null;\r
+var gnTopicCheck=0;\r
+var goFont=null;\r
+var goErrFont=null;\r
+var goHoverFont=null;\r
+var gsABgColor="#cccccc";\r
+var gbWhFHost=false;\r
+\r
+function setBackground(sBgImage)\r
+{\r
+       gsBgImage=sBgImage;\r
+}\r
+\r
+function setBackgroundcolor(sBgColor)\r
+{\r
+       gsBgColor=sBgColor;\r
+}\r
+\r
+function setFont(sType,sFontName,sFontSize,sFontColor,sFontStyle,sFontWeight,sFontDecoration)\r
+{\r
+       var vFont=new whFont(sFontName,sFontSize,sFontColor,sFontStyle,sFontWeight,sFontDecoration);\r
+       if(sType=="Normal")\r
+               goFont=vFont;\r
+       else if(sType=="Error")\r
+               goErrFont=vFont;\r
+       else if(sType=="Hover")\r
+               goHoverFont=vFont;\r
+}\r
+\r
+function setActiveBgColor(sBgColor)\r
+{\r
+       gsABgColor=sBgColor;\r
+}\r
+\r
+function setMargin(sMargin)\r
+{\r
+       gsMargin=sMargin;\r
+}\r
+\r
+function setIndent(sIndent)\r
+{\r
+       gsIndent=sIndent;\r
+}\r
+\r
+function updateCache(oCF)\r
+{\r
+       var len=gaCCD.length;\r
+       if(len<gnCacheLimits*gnCLF)\r
+               gaCCD[len]=oCF;\r
+       else{\r
+               gaCCD[0].aTopics=null;\r
+               gaCCD[0].aFtsKeys=null;\r
+               removeItemFromArray(gaCCD,0);\r
+               gaCCD[len-1]=oCF;\r
+       }\r
+}\r
+\r
+function addFtsInfo(sPPath,sDPath,sFtsFile)\r
+{\r
+       gaData[gaData.length]=new ftsInfo(sPPath,sDPath,sFtsFile);\r
+}\r
+\r
+function putDataXML(xmlDoc,sDocPath)\r
+{\r
+       if(gnLoadFts==1)\r
+       {\r
+               var node=xmlDoc.lastChild;\r
+               if(node)\r
+               {\r
+                       var oChild=node.firstChild;\r
+                       var aFCD=new Array();\r
+                       var aFTCD=new Array();\r
+                       while(oChild)\r
+                       {\r
+                               if(oChild.nodeName=="chunkinfo")\r
+                               {\r
+                                       var sURL=oChild.getAttribute("url");\r
+                                       var sFirst=oChild.getAttribute("first");\r
+                                       var sLast=oChild.getAttribute("last");\r
+                                       if(sURL&&sFirst&&sLast)\r
+                                       {\r
+                                               item=new Object();\r
+                                               item.sStartKey=sFirst;\r
+                                               item.sEndKey=sLast;\r
+                                               item.sFileName=sURL;\r
+                                               aFCD[aFCD.length]=item;\r
+                                       }\r
+                               }\r
+                               else if(oChild.nodeName=="tchunkinfo")\r
+                               {\r
+                                       var sURL=oChild.getAttribute("url");\r
+                                       var nB=parseInt(oChild.getAttribute("first"));\r
+                                       var nE=parseInt(oChild.getAttribute("last"));\r
+                                       if(sURL&&sFirst&&sLast)\r
+                                       {\r
+                                               item=new Object();\r
+                                               item.nBegin=nB;\r
+                                               item.nEnd=nE;\r
+                                               item.sFileName=sURL;\r
+                                               aFTCD[aFTCD.length]=item;\r
+                                       }\r
+\r
+                               }\r
+                               oChild=oChild.nextSibling;\r
+                       }\r
+                       ftsReady(aFCD,aFTCD);\r
+               }\r
+       }\r
+       else if(gnLoadFts==3)\r
+       {\r
+               var node=xmlDoc.lastChild;\r
+               if(node)\r
+               {\r
+                       var oChild=node.firstChild;\r
+                       var aTopics=new Array();\r
+                       while(oChild)\r
+                       {\r
+                               if(oChild.nodeName=="topic")\r
+                               {\r
+                                       var name=oChild.getAttribute("name");\r
+                                       var sURL=oChild.getAttribute("url");\r
+                                       if(name&&name.length>0&&sURL)\r
+                                       {\r
+                                               var topic=new Object();\r
+                                               topic.sTopicTitle=name;\r
+                                               topic.sTopicURL=sURL;\r
+                                               aTopics[aTopics.length]=topic;\r
+                                       }\r
+                               }\r
+                               oChild=oChild.nextSibling;\r
+                       }\r
+                       putFtsTData(aTopics);\r
+               }\r
+       }\r
+       else if(gnLoadFts==2)\r
+       {\r
+               var node=xmlDoc.lastChild;\r
+               if(node)\r
+               {\r
+                       var oChild=node.firstChild;\r
+                       var aFtsContents=new Array();\r
+                       while(oChild)\r
+                       {\r
+                               if(oChild.nodeName=="key")\r
+                               {\r
+                                       var name=oChild.getAttribute("name");\r
+                                       if(name&&name.length>0)\r
+                                       {\r
+                                               var item=new Object();\r
+                                               item.sItemName=name;\r
+                                               aFtsContents[aFtsContents.length]=item;\r
+                                               var oChildChild=oChild.firstChild;\r
+                                               while(oChildChild)\r
+                                               {\r
+                                                       if(oChildChild.nodeName=="#text")\r
+                                                       {\r
+                                                               var sIDs=oChildChild.nodeValue;\r
+                                                               if(sIDs)\r
+                                                               {\r
+                                                                       var nBPos=0;\r
+                                                                       do\r
+                                                                       {\r
+                                                                               var nPos=sIDs.indexOf(",",nBPos);\r
+                                                                               var sID=null;\r
+                                                                               if(nPos!=-1)\r
+                                                                                       sID=sIDs.substring(nBPos,nPos);\r
+                                                                               else\r
+                                                                                       sID=sIDs.substring(nBPos);\r
+\r
+                                                                               if(sID)\r
+                                                                               {\r
+                                                                                       var id=parseInt(sID);\r
+                                                                                       if(!isNaN(id))\r
+                                                                                       {\r
+                                                                                               if(!item.aTopics)\r
+                                                                                                       item.aTopics=new Array();\r
+                                                                                               item.aTopics[item.aTopics.length]=id;\r
+                                                                                       }\r
+                                                                               }\r
+                                                                               nBPos=nPos+1;\r
+                                                                       }while(nBPos!=0&&nBPos<sIDs.length);\r
+                                                               }\r
+                                                       }\r
+                                                       oChildChild=oChildChild.nextSibling;\r
+                                               }\r
+                                       }\r
+                               }\r
+                               oChild=oChild.nextSibling;\r
+                       }\r
+                       putFtsWData(aFtsContents);\r
+               }\r
+       }\r
+}\r
+\r
+function ftsInfo(sPPath,sDPath,sFtsFile)\r
+{\r
+       this.sPPath=sPPath;\r
+       this.sDPath=sDPath;\r
+       this.sFtsFile=sFtsFile;\r
+}\r
+\r
+function window_OnLoad()\r
+{\r
+       if(gsBgImage&&gsBgImage.length>0)\r
+       {\r
+               document.body.background=gsBgImage;\r
+       }\r
+       if(gsBgColor&&gsBgColor.length>0)\r
+       {\r
+               document.body.bgColor=gsBgColor;\r
+       }\r
+       writeResultDiv();\r
+       loadFts();\r
+       var oMsg=new whMessage(WH_MSG_SHOWFTS,this,1,null)\r
+       SendMessage(oMsg);\r
+}\r
+\r
+function writeResultDiv()\r
+{\r
+       var sHTML="<div id=\""+gsResultDivID+"\" style=\"POSITION:absolute;\"></div>";\r
+       document.body.insertAdjacentHTML("beforeEnd",sHTML);\r
+}\r
+\r
+function loadFts()\r
+{\r
+       if(!gbReady)\r
+       {\r
+               var oResMsg=new whMessage(WH_MSG_GETPROJINFO,this,1,null);\r
+               if(SendMessage(oResMsg)&&oResMsg.oParam)\r
+               {\r
+                       gbReady=true;\r
+                       var oProj=oResMsg.oParam;\r
+                       var aProj=oProj.aProj;\r
+                       gbXML=oProj.bXML;\r
+                       if(aProj.length>0)\r
+                       {\r
+                               var sLangId=aProj[0].sLangId;\r
+                               for(var i=0;i<aProj.length;i++)\r
+                               {\r
+                                       if(aProj[i].sFts!=null&&aProj[i].sFts!=""&&aProj[i].sLangId==sLangId)\r
+                                       {\r
+                                               addFtsInfo(aProj[i].sPPath,aProj[i].sDPath,aProj[i].sFts);\r
+                                       }\r
+                               }\r
+                       }\r
+                       loadFD();\r
+\r
+               }                               \r
+       }\r
+}\r
+\r
+function loadFD()\r
+{\r
+       if(gnCLF<gaData.length)\r
+       {\r
+               gnLoadFts=1;\r
+               loadData2(gaData[gnCLF].sPPath+gaData[gnCLF].sDPath+gaData[gnCLF].sFtsFile);\r
+       }\r
+       else \r
+       {\r
+               var oMsg = new whMessage(WH_MSG_BACKUPSEARCH, this, 1, null);\r
+               if (SendMessage(oMsg))\r
+               {\r
+                       if (oMsg.oParam)\r
+                       {\r
+                               gsSK=oMsg.oParam.toLowerCase();\r
+                               findFTSKey();\r
+                       }\r
+               }\r
+               RegisterListener2(this, WH_MSG_SEARCHFTSKEY);\r
+       }\r
+}\r
+\r
+function loadData2(sFile)\r
+{\r
+       if(gbXML)\r
+               loadDataXML(sFile);\r
+       else\r
+               loadData(sFile);\r
+}\r
+\r
+function findFTSKey()\r
+{\r
+       gaTI=new Array();\r
+       gnCurrentOp=0;\r
+       gbNot=false;\r
+       displayMsg(gsSearchMsg);\r
+       if(gsSK!="")\r
+               findOneKey();\r
+}\r
+\r
+function findOneKey()\r
+{\r
+       if(gsSK && gsSK!="")\r
+       {\r
+               var sInput=gsSK;\r
+               var sCW="";\r
+               var nS=-1;\r
+               var nSep=-1;\r
+               for(var nChar=0;nChar<gsFtsBreakChars.length;nChar++){\r
+                       var nFound=sInput.indexOf(gsFtsBreakChars.charAt(nChar));\r
+                       if((nFound!=-1)&&((nS==-1)||(nFound<nS))){\r
+                               nS=nFound;\r
+                               nSep=nChar;\r
+                       }\r
+               }\r
+               if(nS==-1){\r
+                       sCW=sInput;\r
+                       sInput="";\r
+               }else{\r
+                       sCW=sInput.substring(0,nS);\r
+                       sInput=sInput.substring(nS+1);\r
+               }\r
+\r
+               gsSK=sInput;\r
+               \r
+               if((sCW=="or")||((nSep>=0)&&(gsFtsBreakChars.charAt(nSep)=="|"))){\r
+                       gnCurrentOp=0;\r
+                       gbNot=false;\r
+               }else if((sCW=="and")||((nSep>=0)&&(gsFtsBreakChars.charAt(nSep)=="&"))){\r
+                       gnCurrentOp=1;\r
+                       gbNot=false;\r
+               }else if((sCW=="not")||\r
+                       ((nSep>=0)&&(gsFtsBreakChars.charAt(nSep)=="~"))){\r
+                       gbNot=!gbNot;\r
+               }else if(sCW!=""&&!IsStopWord(sCW,gaFtsStop)){\r
+                       var sCurrentStem=GetStem(sCW);\r
+                       gsCW=sCurrentStem;\r
+                       ftsFindKeyword();\r
+                       return;\r
+               }\r
+               findOneKey();\r
+               return;\r
+       }\r
+       else{\r
+               displayTopics();\r
+               checkAgain();\r
+       }\r
+}\r
+\r
+function checkAgain()\r
+{\r
+       gsSK=gsSK2;\r
+       gsSK2=null;\r
+       if(gsSK!=null)\r
+               setTimeout("findFTSKey();",1);\r
+}\r
+\r
+function displayTopics()\r
+{\r
+       var sHTML="";\r
+       var sLine="";\r
+       for(var i=0;i<gaTI.length;i++){\r
+               sLine+="<dt><nobr><a href='"+_textToHtml(gaTI[i].sTopicURL)+"'>"+_textToHtml(gaTI[i].sTopicTitle)+"</a></nobr></dt>";\r
+               if(i>>4<<4==i)\r
+               {\r
+                       sHTML+=sLine;\r
+                       sLine="";\r
+               }\r
+       }\r
+       if(sLine.length>0)\r
+               sHTML+=sLine;\r
+\r
+       if(sHTML.length==0)\r
+               sHTML="<P>"+gsNoTopics+"</P>"\r
+       else\r
+               sHTML="<dl>"+sHTML+"</dl>";\r
+\r
+       var resultDiv=getElement(gsResultDivID);\r
+       if(resultDiv)\r
+               resultDiv.innerHTML=sHTML;\r
+}\r
+\r
+function displayMsg(sErrorMsg)\r
+{\r
+       var sHTML="<P>"+sErrorMsg+"</P>";\r
+\r
+       var resultDiv=getElement(gsResultDivID);\r
+       if(resultDiv)\r
+               resultDiv.innerHTML=sHTML;\r
+}\r
+\r
+function ftsFindKeyword()\r
+{\r
+       var sKey=gsCW;\r
+       var bNeedLoad=false;\r
+       var aFtsContentsCon=null;\r
+       var s=0;\r
+       if(sKey==null) return;\r
+       if(!gsCheckKey||sKey!=gsCheckKey||gnIndexNum==0)\r
+       {\r
+               aFtsContentsCon=new Array();\r
+               gnCheck=0;\r
+               gsCheckKey=sKey;\r
+               gnTopicCheck=0;\r
+               gaTopicCheckInfo=null;\r
+       }\r
+       else{\r
+               s=gnIndexNum;\r
+               aFtsContentsCon=gaFtsContentsCon;\r
+       }\r
+       for(var i=gnCheck;i<gaaFCD.length;i++)\r
+       {\r
+               var oCF=getChunkedFts(i,sKey);\r
+               if(oCF)\r
+               {\r
+                       if(!oCF.aFtsKeys&&oCF.sFileName!=null)\r
+                       {\r
+                               bNeedLoad=true;\r
+                               oCF.nProjId=i;\r
+                               goCF=oCF;\r
+                               gnIndexNum=s;\r
+                               gnCheck=i;\r
+                               gaFtsContentsCon=aFtsContentsCon;\r
+                               gnLoadFts=2;\r
+                               beginLoading();\r
+                               loadData2(gaData[i].sPPath+gaData[i].sDPath+oCF.sFileName);\r
+                               break;\r
+                       }\r
+                       else{\r
+                               aFtsContentsCon[s++]=oCF;\r
+                       }\r
+               }\r
+       }\r
+       if(!bNeedLoad)\r
+       {\r
+               var aTI=gaTopicCheckInfo;\r
+               for(var m=gnTopicCheck;m<aFtsContentsCon.length;m++)\r
+               {\r
+                       var aTIPart=getTopics(aFtsContentsCon[m],sKey);\r
+                       if(aTIPart==null)\r
+                       {\r
+                               gnCheck=gaaFCD.length;\r
+                               gnTopicCheck=m;\r
+                               gaTopicCheckInfo=aTI;\r
+                               gaFtsContentsCon=aFtsContentsCon;\r
+                               return;\r
+                       }\r
+                       if(m==0)\r
+                               aTI=aTIPart;\r
+                       else\r
+                               aTI=mergeTopics(aTI,aTIPart);\r
+               }\r
+               if(mergewithPreviousResult(aTI))\r
+                       findOneKey();\r
+               else\r
+                       checkAgain();\r
+       }\r
+}\r
+\r
+function mergewithPreviousResult(aTI)\r
+{\r
+       if(aTI!=null&&aTI.length!=0)\r
+       {\r
+               var nNumTopics=aTI.length;\r
+               if(gnCurrentOp==0){\r
+                       if(gbNot){\r
+                               displayMsg(gsHelpCannotSearch);\r
+                               return false;\r
+                       }else{\r
+                               var aLS,aSS;\r
+                               if(gaTI.length>=aTI.length)\r
+                               {\r
+                                       aLS=gaTI;\r
+                                       aSS=aTI;\r
+                               }\r
+                               else\r
+                               {\r
+                                       aLS=aTI;\r
+                                       aSS=gaTI;\r
+                               }\r
+                               var s=0;\r
+                               for(var i=0;i<aSS.length;i++)\r
+                               {\r
+                                       var bAlreadyThere=false;\r
+                                       for(var j=s;j<aLS.length;j++)\r
+                                       {\r
+                                               if(aSS[i].equalTo(aLS[j]))\r
+                                               {\r
+                                                       bAlreadyThere=true;\r
+                                                       s=j;\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                                       if(!bAlreadyThere)\r
+                                       {\r
+                                               insertTopic(aLS,aSS[i]);\r
+                                       }\r
+                               }\r
+                               gaTI=aLS;\r
+                       }\r
+               }else if(gnCurrentOp==1){\r
+                       if(gbNot){\r
+                               var s=0;\r
+                               for(var i=0;i<aTI.length;i++)\r
+                               {\r
+                                       for(var j=s;j<gaTI.length;j++)\r
+                                       {\r
+                                               if(aTI[i].equalTo(gaTI[j]))\r
+                                               {\r
+                                                       removeItemFromArray(gaTI,j);\r
+                                                       s=j;\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }else{\r
+                               var s=0;\r
+                               for(var i=0;i<gaTI.length;i++)\r
+                               {\r
+                                       var bFound=false;\r
+                                       for(var j=s;j<aTI.length;j++)\r
+                                       {\r
+                                               if(gaTI[i].equalTo(aTI[j]))\r
+                                               {\r
+                                                       bFound=true;\r
+                                                       s=j;\r
+                                               }\r
+                                       }\r
+                                       if(!bFound)\r
+                                       {\r
+                                               removeItemFromArray(gaTI,i);\r
+                                               i--;\r
+                                       }\r
+                               }                               \r
+                       }\r
+               }\r
+       }else{\r
+               if((gnCurrentOp==1)&&(!gbNot)){\r
+                       gaTI.length=0;\r
+               }else if((gnCurrentOp==0)&&(gbNot)){\r
+                       displayMsg(gsHelpCannotSearch);\r
+                       return false;\r
+               }\r
+       }\r
+       return true;\r
+}\r
+\r
+function insertTopic(aTI,oTI)\r
+{\r
+       var nB=0;\r
+       var nE=aTI.length-1;\r
+       if(nE>=0)\r
+       {\r
+               var nM;\r
+               var bFound=false;\r
+               do{\r
+                       nM=(nB+nE)>>1;\r
+                       if(compare(aTI[nM].sTopicTitle,oTI.sTopicTitle)>0)\r
+                               nE=nM-1;\r
+                       else if(compare(aTI[nM].sTopicTitle,oTI.sTopicTitle)<0)\r
+                               nB=nM+1;\r
+                       else\r
+                       {\r
+                               bFound=true;\r
+                               break;\r
+                       }\r
+               }while(nB<=nE);\r
+               if(bFound)\r
+                       insertItemIntoArray(aTI,nM,oTI);\r
+               else\r
+               {\r
+                       if(compare(aTI[nM].sTopicTitle,oTI.sTopicTitle)<0)\r
+                               insertItemIntoArray(aTI,nM+1,oTI);\r
+                       else\r
+                               insertItemIntoArray(aTI,nM,oTI);\r
+               }\r
+       }\r
+       else\r
+               aTI[0]=oTI;\r
+}\r
+\r
+function mergeTopics(aTI1,aTI2)\r
+{\r
+       var i1=0;\r
+       var i2=0;\r
+       var len1=aTI1.length;\r
+       var len2=aTI2.length;\r
+       var aTopicNew=new Array();\r
+       var i=0;\r
+       while(i1<len1||i2<len2)\r
+       {\r
+               if(i1<len1&&i2<len2)\r
+               {\r
+                       if(compare(aTI1[i1].sTopicTitle,aTI2[i2].sTopicTitle)<0)\r
+                               aTopicNew[i++]=aTI1[i1++];\r
+                       else\r
+                               aTopicNew[i++]=aTI2[i2++];\r
+               }\r
+               else if(i1<len1)\r
+                       aTopicNew[i++]=aTI1[i1++];\r
+               else if(i2<len2)\r
+                       aTopicNew[i++]=aTI2[i2++];\r
+       }\r
+       return aTopicNew;\r
+}\r
+\r
+function getTopics(oCF,sKey)\r
+{\r
+       var aTIPart=new Array();\r
+       if(oCF&&oCF.aFtsKeys)\r
+       {\r
+               var keys=oCF.aFtsKeys;\r
+               var nB=0;\r
+               var nE=keys.length-1;\r
+               var nM=-1;\r
+               var bFound=false;\r
+               do{\r
+                       nM=(nB+nE)>>1;\r
+                       if(compare(keys[nM].sItemName,sKey)>0)\r
+                               nE=nM-1;\r
+                       else if(compare(keys[nM].sItemName,sKey)<0)\r
+                               nB=nM+1;\r
+                       else{\r
+                               bFound=true;\r
+                               break;\r
+                       }\r
+               }while(nB<=nE);\r
+               if(bFound)\r
+               {\r
+                       if(keys[nM].aTopics)\r
+                       {\r
+                               for(var i=0;i<keys[nM].aTopics.length;i++)\r
+                               {\r
+                                       var oTC=getTopicChunk(gaaFTCD[oCF.nProjId],keys[nM].aTopics[i]);\r
+                                       if(oTC.aTopics)\r
+                                       {\r
+                                               aTIPart[aTIPart.length]=\r
+                                                       new topicInfo(oTC.aTopics[keys[nM].aTopics[i]-oTC.nBegin].sTopicTitle,\r
+                                                               gaData[oCF.nProjId].sPPath+oTC.aTopics[keys[nM].aTopics[i]-oTC.nBegin].sTopicURL);\r
+                                       }\r
+                                       else{\r
+                                               goCTF=oTC;\r
+                                               gnLoadFts=3;\r
+                                               beginLoading();\r
+                                               loadData2(gaData[oCF.nProjId].sPPath+gaData[oCF.nProjId].sDPath+oTC.sFileName);\r
+                                               return null;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       return aTIPart;\r
+}\r
+\r
+function getTopicChunk(aFTCD,nTopicId)\r
+{\r
+       if(aFTCD&&aFTCD.length)\r
+       {\r
+               var nB=0;\r
+               var nE=aFTCD.length-1;\r
+               var nM=-1;\r
+               var bFound=false;\r
+               do{\r
+                       nM=(nB+nE)>>1;\r
+                       if(aFTCD[nM].nBegin>nTopicId)\r
+                               nE=nM-1;\r
+                       else if(aFTCD[nM].nEnd<nTopicId)\r
+                               nB=nM+1;\r
+                       else{\r
+                               bFound=true;\r
+                               break;\r
+                       }\r
+               }while(nB<=nE);\r
+               if(bFound)\r
+                       return aFTCD[nM];\r
+       }\r
+       return null;\r
+}\r
+\r
+function endLoading()\r
+{\r
+       var oDiv=getElement(gsLoadingDivID);\r
+       if(oDiv)\r
+               oDiv.style.visibility="hidden";\r
+}\r
+\r
+function beginLoading()\r
+{\r
+       var oDiv=getElement(gsLoadingDivID);\r
+       if(!oDiv)\r
+       {\r
+               document.body.insertAdjacentHTML("afterBegin",writeLoadingDiv());\r
+               oDiv=getElement(gsLoadingDivID);\r
+       }\r
+       \r
+       if(oDiv)\r
+       {\r
+               oDiv.style.top=document.body.scrollTop;\r
+               oDiv.style.visibility="visible";\r
+       }\r
+}\r
+\r
+function writeLoadingDiv(nIIdx)\r
+{\r
+       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>";\r
+}\r
+\r
+function topicInfo(sTopicTitle,sTopicURL)\r
+{\r
+       this.sTopicTitle=sTopicTitle;\r
+       this.sTopicURL=sTopicURL;\r
+       this.equalTo=function(oTI)\r
+       {\r
+               return ((this.sTopicTitle==oTI.sTopicTitle)&&\r
+                       (this.sTopicURL==oTI.sTopicURL));\r
+       }\r
+}\r
+\r
+function getChunkedFts(nIndex,sKey)\r
+{\r
+       var oCF=null;\r
+       if(nIndex<gaaFCD.length)\r
+       {\r
+               var len=gaaFCD[nIndex].length;\r
+               if(len>0)\r
+               {\r
+                       var nB=0;\r
+                       var nE=len-1;\r
+                       var bFound=false;\r
+                       do{\r
+                               var nM=(nB+nE)>>1;\r
+                               if(compare(sKey,gaaFCD[nIndex][nM].sEndKey)>0)\r
+                               {\r
+                                       nB=nM+1;\r
+                               }\r
+                               else if(compare(sKey,gaaFCD[nIndex][nM].sStartKey)<0)\r
+                               {\r
+                                       nE=nM-1;\r
+                               }\r
+                               else{\r
+                                       bFound=true;\r
+                                       break;\r
+                               }\r
+                       }while(nE>=nB);\r
+                       if(bFound)\r
+                               oCF=gaaFCD[nIndex][nM];\r
+               }\r
+       }\r
+       return oCF;\r
+}\r
+\r
+function ftsReady(aFCD,aFTCD)\r
+{\r
+       endLoading();\r
+       gaaFTCD[gnCLF]=aFTCD;\r
+       gaaFCD[gnCLF++]=aFCD;\r
+       setTimeout("loadFD();",1);\r
+}\r
+\r
+function putFtsTData(aTopics)\r
+{\r
+       endLoading();\r
+       var oCTF=goCTF;\r
+       if(oCTF)\r
+       {\r
+               oCTF.aTopics=aTopics;\r
+               setTimeout("ftsFindKeyword();",1);\r
+       }\r
+}\r
+\r
+function putFtsWData(aFtsContents)\r
+{\r
+       endLoading();\r
+       var oCF=goCF;\r
+       if(oCF)\r
+       {\r
+               updateCache(oCF);\r
+               oCF.aFtsKeys=aFtsContents;\r
+               setTimeout("ftsFindKeyword();",1);\r
+       }\r
+}\r
+\r
+function IsStopWord(sCW,aFtsStopArray)\r
+{\r
+       var nStopArrayLen=aFtsStopArray.length;\r
+       var nB=0;\r
+       var nE=nStopArrayLen-1;\r
+       var nM=0;\r
+       var bFound=false;\r
+       var sStopWord="";\r
+       while(nB<=nE){\r
+               nM=(nB+nE);\r
+               nM>>=1;\r
+               sStopWord=aFtsStopArray[nM];\r
+               if(compare(sCW,sStopWord)>0){\r
+                       nB=(nB==nM)?nM+1:nM;\r
+               }else{\r
+                       if(compare(sCW,sStopWord)<0){\r
+                               nE=(nE==nM)?nM-1:nM;\r
+                       }else{\r
+                               bFound=true;\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+       return bFound;\r
+}\r
+\r
+function GetStem(szWord)\r
+{\r
+       if(gaFtsStem==null||gaFtsStem.length==0)return szWord;\r
+       var aStems=gaFtsStem;\r
+\r
+       var nStemPos=0;\r
+       var csStem="";\r
+       for(var iStem=0;iStem<aStems.length;iStem++){\r
+\r
+               if(aStems[iStem].length>=szWord.length-1)       break;\r
+               nStemPos=szWord.lastIndexOf(aStems[iStem]);\r
+               if(nStemPos>0){\r
+                       var cssub=szWord.substring(nStemPos);\r
+                       if(cssub==aStems[iStem]){\r
+                               csStem=szWord;\r
+                               if(szWord.charAt(nStemPos-2)==szWord.charAt(nStemPos-1)){\r
+                                       csStem=csStem.substring(0,nStemPos-1);\r
+                               }else{\r
+                                       csStem=csStem.substring(0,nStemPos);\r
+                               }\r
+                               return csStem;\r
+                       }\r
+               }\r
+       }\r
+       return szWord;\r
+}\r
+\r
+function FtsWriteClassStyle()\r
+{\r
+       var sStyle="<STYLE TYPE='text/css'>\n";\r
+       if (gsBgImage)\r
+               sStyle+="body {border-top:"+gsBgColor+" 1px solid;}\n";\r
+       else\r
+               sStyle+="body {border-top:black 1px solid;}\n";\r
+       sStyle+="P {"+getFontStyle(goErrFont)+"margin-left:"+gsIndent+";margin-top:"+gsMargin+";}\n";\r
+       sStyle+="dl {"+getFontStyle(goFont)+"margin-left:"+gsIndent+";margin-top:"+gsMargin+";}\n";\r
+       sStyle+="A:link {"+getFontStyle(goFont)+"}\n";\r
+       sStyle+="A:visited {"+getFontStyle(goFont)+"}\n";\r
+       sStyle+="A:active {background-color:"+gsABgColor+";}\n";\r
+       sStyle+="A:hover {"+getFontStyle(goHoverFont)+"}\n";\r
+       sStyle+="</STYLE>";\r
+       document.write(sStyle);\r
+}\r
+\r
+function window_Unload()\r
+{\r
+       UnRegisterListener2(this,WH_MSG_PROJECTREADY);\r
+       UnRegisterListener2(this, WH_MSG_SEARCHFTSKEY);\r
+}\r
+\r
+\r
+function onSendMessage(oMsg)\r
+{\r
+       var nMsgId=oMsg.nMessageId;\r
+       if(nMsgId==WH_MSG_SEARCHFTSKEY)\r
+       {\r
+               if(oMsg.oParam)\r
+               {\r
+                       if(gsSK==null||gsSK=="")\r
+                       {\r
+                               gsSK=oMsg.oParam.toLowerCase();\r
+                               findFTSKey();\r
+                       }\r
+                       else\r
+                               gsSK2=oMsg.oParam.toLowerCase();\r
+               }\r
+       }\r
+       else if(nMsgId==WH_MSG_PROJECTREADY)\r
+       {\r
+               loadFts();\r
+       }\r
+       return true;\r
+}\r
+\r
+if (window.gbWhUtil&&window.gbWhLang&&window.gbWhProxy&&window.gbWhVer&&window.gbWhMsg)\r
+{\r
+       goFont=new whFont("Verdana","8pt","#000000","normal","normal","none");\r
+       goErrFont=new whFont("Verdana","8pt","#000000","normal","bold","none");\r
+       goHoverFont=new whFont("Verdana","8pt","#007f00","normal","normal","underline");\r
+       window.onload=window_OnLoad;\r
+       window.onbeforeunload=window_BUnload;\r
+       window.onunload=window_Unload;\r
+       RegisterListener2(this,WH_MSG_PROJECTREADY);\r
+       gbWhFHost=true;\r
+}\r
+else\r
+       document.location.reload();
\ No newline at end of file