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