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