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