3 var gsFtsBreakChars="\t\r\n\"\\ .,!@#$%^&*()~'`:;<>?/{}[]|+-=\x85\x92\x93\x94\x95\x96\x97\x99\xA9\xAE\xB7";
\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
20 var gnCacheLimits=5;
\r
21 var gaCCD=new Array();
\r
23 var gaData=new Array();
\r
24 var gsBgColor="#ffffff";
\r
28 var gsCheckKey=null;
\r
30 var gaFtsContentsCon=null;
\r
31 var gaTopicCheckInfo=null;
\r
35 var goHoverFont=null;
\r
36 var gsABgColor="#cccccc";
\r
37 var gbWhFHost=false;
\r
39 function setBackground(sBgImage)
\r
44 function setBackgroundcolor(sBgColor)
\r
49 function setFont(sType,sFontName,sFontSize,sFontColor,sFontStyle,sFontWeight,sFontDecoration)
\r
51 var vFont=new whFont(sFontName,sFontSize,sFontColor,sFontStyle,sFontWeight,sFontDecoration);
\r
54 else if(sType=="Error")
\r
56 else if(sType=="Hover")
\r
60 function setActiveBgColor(sBgColor)
\r
62 gsABgColor=sBgColor;
\r
65 function setMargin(sMargin)
\r
70 function setIndent(sIndent)
\r
75 function updateCache(oCF)
\r
77 var len=gaCCD.length;
\r
78 if(len<gnCacheLimits*gnCLF)
\r
81 gaCCD[0].aTopics=null;
\r
82 gaCCD[0].aFtsKeys=null;
\r
83 removeItemFromArray(gaCCD,0);
\r
88 function addFtsInfo(sPPath,sDPath,sFtsFile)
\r
90 gaData[gaData.length]=new ftsInfo(sPPath,sDPath,sFtsFile);
\r
93 function putDataXML(xmlDoc,sDocPath)
\r
97 var node=xmlDoc.lastChild;
\r
100 var oChild=node.firstChild;
\r
101 var aFCD=new Array();
\r
102 var aFTCD=new Array();
\r
105 if(oChild.nodeName=="chunkinfo")
\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
113 item.sStartKey=sFirst;
\r
114 item.sEndKey=sLast;
\r
115 item.sFileName=sURL;
\r
116 aFCD[aFCD.length]=item;
\r
119 else if(oChild.nodeName=="tchunkinfo")
\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
129 item.sFileName=sURL;
\r
130 aFTCD[aFTCD.length]=item;
\r
134 oChild=oChild.nextSibling;
\r
136 ftsReady(aFCD,aFTCD);
\r
139 else if(gnLoadFts==3)
\r
141 var node=xmlDoc.lastChild;
\r
144 var oChild=node.firstChild;
\r
145 var aTopics=new Array();
\r
148 if(oChild.nodeName=="topic")
\r
150 var name=oChild.getAttribute("name");
\r
151 var sURL=oChild.getAttribute("url");
\r
152 if(name&&name.length>0&&sURL)
\r
154 var topic=new Object();
\r
155 topic.sTopicTitle=name;
\r
156 topic.sTopicURL=sURL;
\r
157 aTopics[aTopics.length]=topic;
\r
160 oChild=oChild.nextSibling;
\r
162 putFtsTData(aTopics);
\r
165 else if(gnLoadFts==2)
\r
167 var node=xmlDoc.lastChild;
\r
170 var oChild=node.firstChild;
\r
171 var aFtsContents=new Array();
\r
174 if(oChild.nodeName=="key")
\r
176 var name=oChild.getAttribute("name");
\r
177 if(name&&name.length>0)
\r
179 var item=new Object();
\r
180 item.sItemName=name;
\r
181 aFtsContents[aFtsContents.length]=item;
\r
182 var oChildChild=oChild.firstChild;
\r
185 if(oChildChild.nodeName=="#text")
\r
187 var sIDs=oChildChild.nodeValue;
\r
193 var nPos=sIDs.indexOf(",",nBPos);
\r
196 sID=sIDs.substring(nBPos,nPos);
\r
198 sID=sIDs.substring(nBPos);
\r
202 var id=parseInt(sID);
\r
206 item.aTopics=new Array();
\r
207 item.aTopics[item.aTopics.length]=id;
\r
211 }while(nBPos!=0&&nBPos<sIDs.length);
\r
214 oChildChild=oChildChild.nextSibling;
\r
218 oChild=oChild.nextSibling;
\r
220 putFtsWData(aFtsContents);
\r
225 function ftsInfo(sPPath,sDPath,sFtsFile)
\r
227 this.sPPath=sPPath;
\r
228 this.sDPath=sDPath;
\r
229 this.sFtsFile=sFtsFile;
\r
232 function window_OnLoad()
\r
234 if(gsBgImage&&gsBgImage.length>0)
\r
236 document.body.background=gsBgImage;
\r
238 if(gsBgColor&&gsBgColor.length>0)
\r
240 document.body.bgColor=gsBgColor;
\r
244 var oMsg=new whMessage(WH_MSG_SHOWFTS,this,1,null)
\r
248 function writeResultDiv()
\r
250 var sHTML="<div id=\""+gsResultDivID+"\" style=\"POSITION:absolute;\"></div>";
\r
251 document.body.insertAdjacentHTML("beforeEnd",sHTML);
\r
258 var oResMsg=new whMessage(WH_MSG_GETPROJINFO,this,1,null);
\r
259 if(SendMessage(oResMsg)&&oResMsg.oParam)
\r
262 var oProj=oResMsg.oParam;
\r
263 var aProj=oProj.aProj;
\r
267 var sLangId=aProj[0].sLangId;
\r
268 for(var i=0;i<aProj.length;i++)
\r
270 if(aProj[i].sFts!=null&&aProj[i].sFts!=""&&aProj[i].sLangId==sLangId)
\r
272 addFtsInfo(aProj[i].sPPath,aProj[i].sDPath,aProj[i].sFts);
\r
284 if(gnCLF<gaData.length)
\r
287 loadData2(gaData[gnCLF].sPPath+gaData[gnCLF].sDPath+gaData[gnCLF].sFtsFile);
\r
291 var oMsg = new whMessage(WH_MSG_BACKUPSEARCH, this, 1, null);
\r
292 if (SendMessage(oMsg))
\r
296 gsSK=oMsg.oParam.toLowerCase();
\r
300 RegisterListener2(this, WH_MSG_SEARCHFTSKEY);
\r
304 function loadData2(sFile)
\r
307 loadDataXML(sFile);
\r
312 function findFTSKey()
\r
317 displayMsg(gsSearchMsg);
\r
322 function findOneKey()
\r
324 if(gsSK && gsSK!="")
\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
341 sCW=sInput.substring(0,nS);
\r
342 sInput=sInput.substring(nS+1);
\r
347 if((sCW=="or")||((nSep>=0)&&(gsFtsBreakChars.charAt(nSep)=="|"))){
\r
350 }else if((sCW=="and")||((nSep>=0)&&(gsFtsBreakChars.charAt(nSep)=="&"))){
\r
353 }else if((sCW=="not")||
\r
354 ((nSep>=0)&&(gsFtsBreakChars.charAt(nSep)=="~"))){
\r
356 }else if(sCW!=""&&!IsStopWord(sCW,gaFtsStop)){
\r
357 var sCurrentStem=GetStem(sCW);
\r
371 function checkAgain()
\r
376 setTimeout("findFTSKey();",1);
\r
379 function displayTopics()
\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
394 if(sHTML.length==0)
\r
395 sHTML="<P>"+gsNoTopics+"</P>"
\r
397 sHTML="<dl>"+sHTML+"</dl>";
\r
399 var resultDiv=getElement(gsResultDivID);
\r
401 resultDiv.innerHTML=sHTML;
\r
404 function displayMsg(sErrorMsg)
\r
406 var sHTML="<P>"+sErrorMsg+"</P>";
\r
408 var resultDiv=getElement(gsResultDivID);
\r
410 resultDiv.innerHTML=sHTML;
\r
413 function ftsFindKeyword()
\r
416 var bNeedLoad=false;
\r
417 var aFtsContentsCon=null;
\r
419 if(sKey==null) return;
\r
420 if(!gsCheckKey||sKey!=gsCheckKey||gnIndexNum==0)
\r
422 aFtsContentsCon=new Array();
\r
426 gaTopicCheckInfo=null;
\r
430 aFtsContentsCon=gaFtsContentsCon;
\r
432 for(var i=gnCheck;i<gaaFCD.length;i++)
\r
434 var oCF=getChunkedFts(i,sKey);
\r
437 if(!oCF.aFtsKeys&&oCF.sFileName!=null)
\r
444 gaFtsContentsCon=aFtsContentsCon;
\r
447 loadData2(gaData[i].sPPath+gaData[i].sDPath+oCF.sFileName);
\r
451 aFtsContentsCon[s++]=oCF;
\r
457 var aTI=gaTopicCheckInfo;
\r
458 for(var m=gnTopicCheck;m<aFtsContentsCon.length;m++)
\r
460 var aTIPart=getTopics(aFtsContentsCon[m],sKey);
\r
463 gnCheck=gaaFCD.length;
\r
465 gaTopicCheckInfo=aTI;
\r
466 gaFtsContentsCon=aFtsContentsCon;
\r
472 aTI=mergeTopics(aTI,aTIPart);
\r
474 if(mergewithPreviousResult(aTI))
\r
481 function mergewithPreviousResult(aTI)
\r
483 if(aTI!=null&&aTI.length!=0)
\r
485 var nNumTopics=aTI.length;
\r
486 if(gnCurrentOp==0){
\r
488 displayMsg(gsHelpCannotSearch);
\r
492 if(gaTI.length>=aTI.length)
\r
503 for(var i=0;i<aSS.length;i++)
\r
505 var bAlreadyThere=false;
\r
506 for(var j=s;j<aLS.length;j++)
\r
508 if(aSS[i].equalTo(aLS[j]))
\r
510 bAlreadyThere=true;
\r
517 insertTopic(aLS,aSS[i]);
\r
522 }else if(gnCurrentOp==1){
\r
525 for(var i=0;i<aTI.length;i++)
\r
527 for(var j=s;j<gaTI.length;j++)
\r
529 if(aTI[i].equalTo(gaTI[j]))
\r
531 removeItemFromArray(gaTI,j);
\r
539 for(var i=0;i<gaTI.length;i++)
\r
542 for(var j=s;j<aTI.length;j++)
\r
544 if(gaTI[i].equalTo(aTI[j]))
\r
552 removeItemFromArray(gaTI,i);
\r
559 if((gnCurrentOp==1)&&(!gbNot)){
\r
561 }else if((gnCurrentOp==0)&&(gbNot)){
\r
562 displayMsg(gsHelpCannotSearch);
\r
569 function insertTopic(aTI,oTI)
\r
572 var nE=aTI.length-1;
\r
579 if(compare(aTI[nM].sTopicTitle,oTI.sTopicTitle)>0)
\r
581 else if(compare(aTI[nM].sTopicTitle,oTI.sTopicTitle)<0)
\r
590 insertItemIntoArray(aTI,nM,oTI);
\r
593 if(compare(aTI[nM].sTopicTitle,oTI.sTopicTitle)<0)
\r
594 insertItemIntoArray(aTI,nM+1,oTI);
\r
596 insertItemIntoArray(aTI,nM,oTI);
\r
603 function mergeTopics(aTI1,aTI2)
\r
607 var len1=aTI1.length;
\r
608 var len2=aTI2.length;
\r
609 var aTopicNew=new Array();
\r
611 while(i1<len1||i2<len2)
\r
613 if(i1<len1&&i2<len2)
\r
615 if(compare(aTI1[i1].sTopicTitle,aTI2[i2].sTopicTitle)<0)
\r
616 aTopicNew[i++]=aTI1[i1++];
\r
618 aTopicNew[i++]=aTI2[i2++];
\r
621 aTopicNew[i++]=aTI1[i1++];
\r
623 aTopicNew[i++]=aTI2[i2++];
\r
628 function getTopics(oCF,sKey)
\r
630 var aTIPart=new Array();
\r
631 if(oCF&&oCF.aFtsKeys)
\r
633 var keys=oCF.aFtsKeys;
\r
635 var nE=keys.length-1;
\r
640 if(compare(keys[nM].sItemName,sKey)>0)
\r
642 else if(compare(keys[nM].sItemName,sKey)<0)
\r
651 if(keys[nM].aTopics)
\r
653 for(var i=0;i<keys[nM].aTopics.length;i++)
\r
655 var oTC=getTopicChunk(gaaFTCD[oCF.nProjId],keys[nM].aTopics[i]);
\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
666 loadData2(gaData[oCF.nProjId].sPPath+gaData[oCF.nProjId].sDPath+oTC.sFileName);
\r
676 function getTopicChunk(aFTCD,nTopicId)
\r
678 if(aFTCD&&aFTCD.length)
\r
681 var nE=aFTCD.length-1;
\r
686 if(aFTCD[nM].nBegin>nTopicId)
\r
688 else if(aFTCD[nM].nEnd<nTopicId)
\r
701 function endLoading()
\r
703 var oDiv=getElement(gsLoadingDivID);
\r
705 oDiv.style.visibility="hidden";
\r
708 function beginLoading()
\r
710 var oDiv=getElement(gsLoadingDivID);
\r
713 document.body.insertAdjacentHTML("afterBegin",writeLoadingDiv());
\r
714 oDiv=getElement(gsLoadingDivID);
\r
719 oDiv.style.top=document.body.scrollTop;
\r
720 oDiv.style.visibility="visible";
\r
724 function writeLoadingDiv(nIIdx)
\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
729 function topicInfo(sTopicTitle,sTopicURL)
\r
731 this.sTopicTitle=sTopicTitle;
\r
732 this.sTopicURL=sTopicURL;
\r
733 this.equalTo=function(oTI)
\r
735 return ((this.sTopicTitle==oTI.sTopicTitle)&&
\r
736 (this.sTopicURL==oTI.sTopicURL));
\r
740 function getChunkedFts(nIndex,sKey)
\r
743 if(nIndex<gaaFCD.length)
\r
745 var len=gaaFCD[nIndex].length;
\r
753 if(compare(sKey,gaaFCD[nIndex][nM].sEndKey)>0)
\r
757 else if(compare(sKey,gaaFCD[nIndex][nM].sStartKey)<0)
\r
767 oCF=gaaFCD[nIndex][nM];
\r
773 function ftsReady(aFCD,aFTCD)
\r
776 gaaFTCD[gnCLF]=aFTCD;
\r
777 gaaFCD[gnCLF++]=aFCD;
\r
778 setTimeout("loadFD();",1);
\r
781 function putFtsTData(aTopics)
\r
787 oCTF.aTopics=aTopics;
\r
788 setTimeout("ftsFindKeyword();",1);
\r
792 function putFtsWData(aFtsContents)
\r
799 oCF.aFtsKeys=aFtsContents;
\r
800 setTimeout("ftsFindKeyword();",1);
\r
804 function IsStopWord(sCW,aFtsStopArray)
\r
806 var nStopArrayLen=aFtsStopArray.length;
\r
808 var nE=nStopArrayLen-1;
\r
815 sStopWord=aFtsStopArray[nM];
\r
816 if(compare(sCW,sStopWord)>0){
\r
817 nB=(nB==nM)?nM+1:nM;
\r
819 if(compare(sCW,sStopWord)<0){
\r
820 nE=(nE==nM)?nM-1:nM;
\r
830 function GetStem(szWord)
\r
832 if(gaFtsStem==null||gaFtsStem.length==0)return szWord;
\r
833 var aStems=gaFtsStem;
\r
837 for(var iStem=0;iStem<aStems.length;iStem++){
\r
839 if(aStems[iStem].length>=szWord.length-1) break;
\r
840 nStemPos=szWord.lastIndexOf(aStems[iStem]);
\r
842 var cssub=szWord.substring(nStemPos);
\r
843 if(cssub==aStems[iStem]){
\r
845 if(szWord.charAt(nStemPos-2)==szWord.charAt(nStemPos-1)){
\r
846 csStem=csStem.substring(0,nStemPos-1);
\r
848 csStem=csStem.substring(0,nStemPos);
\r
857 function FtsWriteClassStyle()
\r
859 var sStyle="<STYLE TYPE='text/css'>\n";
\r
861 sStyle+="body {border-top:"+gsBgColor+" 1px solid;}\n";
\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
874 function window_Unload()
\r
876 UnRegisterListener2(this,WH_MSG_PROJECTREADY);
\r
877 UnRegisterListener2(this, WH_MSG_SEARCHFTSKEY);
\r
881 function onSendMessage(oMsg)
\r
883 var nMsgId=oMsg.nMessageId;
\r
884 if(nMsgId==WH_MSG_SEARCHFTSKEY)
\r
888 if(gsSK==null||gsSK=="")
\r
890 gsSK=oMsg.oParam.toLowerCase();
\r
894 gsSK2=oMsg.oParam.toLowerCase();
\r
897 else if(nMsgId==WH_MSG_PROJECTREADY)
\r
904 if (window.gbWhUtil&&window.gbWhLang&&window.gbWhProxy&&window.gbWhVer&&window.gbWhMsg)
\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
916 document.location.reload();