4 var gsFtsBreakChars="\t\r\n\"\\ .,!@#$%^&*()~'`:;<>?/{}[]|+-=\x85\x92\x93\x94\x95\x96\x97\x99\xA9\xAE\xB7";
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();
22 var gaCCD=new Array();
24 var gaData=new Array();
25 var gsBgColor="#ffffff";
31 var gaFtsContentsCon=null;
32 var gaTopicCheckInfo=null;
37 var gsABgColor="#cccccc";
41 function setBackground(sBgImage)
46 function setBackgroundcolor(sBgColor)
51 function setFont(sType,sFontName,sFontSize,sFontColor,sFontStyle,sFontWeight,sFontDecoration)
53 var vFont=new whFont(sFontName,sFontSize,sFontColor,sFontStyle,sFontWeight,sFontDecoration);
56 else if(sType=="Error")
58 else if(sType=="Hover")
62 function setActiveBgColor(sBgColor)
67 function setMargin(sMargin)
72 function setIndent(sIndent)
77 function updateCache(oCF)
80 if(len<gnCacheLimits*gnCLF)
83 gaCCD[0].aTopics=null;
84 gaCCD[0].aFtsKeys=null;
85 removeItemFromArray(gaCCD,0);
90 function addFtsInfo(sPPath,sDPath,sFtsFile)
92 gaData[gaData.length]=new ftsInfo(sPPath,sDPath,sFtsFile);
95 function onLoadXMLError()
100 var aFTCD=new Array();
101 ftsReady(aFCD,aFTCD);
103 else if(gnLoadFts==3)
105 var aTopics=new Array();
106 putFtsTData(aTopics);
108 else if(gnLoadFts==2)
110 putFtsWData(aFtsContents);
111 var aFtsContents=new Array();
115 function putDataXML(xmlDoc,sDocPath)
119 var node=xmlDoc.lastChild;
122 var oChild=node.firstChild;
123 var aFCD=new Array();
124 var aFTCD=new Array();
127 if(oChild.nodeName=="chunkinfo")
129 var sURL=oChild.getAttribute("url");
130 var sFirst=oChild.getAttribute("first");
131 var sLast=oChild.getAttribute("last");
132 if(sURL&&sFirst&&sLast)
135 item.sStartKey=sFirst;
138 aFCD[aFCD.length]=item;
141 else if(oChild.nodeName=="tchunkinfo")
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)
152 aFTCD[aFTCD.length]=item;
156 oChild=oChild.nextSibling;
158 ftsReady(aFCD,aFTCD);
161 else if(gnLoadFts==3)
163 var node=xmlDoc.lastChild;
166 var oChild=node.firstChild;
167 var aTopics=new Array();
170 if(oChild.nodeName=="topic")
172 var name=oChild.getAttribute("name");
173 var sURL=oChild.getAttribute("url");
174 if(name&&name.length>0&&sURL)
176 var topic=new Object();
177 topic.sTopicTitle=name;
178 topic.sTopicURL=sURL;
179 aTopics[aTopics.length]=topic;
182 oChild=oChild.nextSibling;
184 putFtsTData(aTopics);
187 else if(gnLoadFts==2)
189 var node=xmlDoc.lastChild;
192 var oChild=node.firstChild;
193 var aFtsContents=new Array();
196 if(oChild.nodeName=="key")
198 var name=oChild.getAttribute("name");
199 if(name&&name.length>0)
201 var item=new Object();
203 aFtsContents[aFtsContents.length]=item;
204 var oChildChild=oChild.firstChild;
207 if(oChildChild.nodeName=="#text")
209 var sIDs=oChildChild.nodeValue;
215 var nPos=sIDs.indexOf(",",nBPos);
218 sID=sIDs.substring(nBPos,nPos);
220 sID=sIDs.substring(nBPos);
224 var id=parseInt(sID);
228 item.aTopics=new Array();
229 item.aTopics[item.aTopics.length]=id;
233 }while(nBPos!=0&&nBPos<sIDs.length);
236 oChildChild=oChildChild.nextSibling;
240 oChild=oChild.nextSibling;
242 putFtsWData(aFtsContents);
247 function ftsInfo(sPPath,sDPath,sFtsFile)
251 this.sFtsFile=sFtsFile;
254 function window_OnLoad()
256 if(gsBgImage&&gsBgImage.length>0)
258 document.body.background=gsBgImage;
260 if(gsBgColor&&gsBgColor.length>0)
262 document.body.bgColor=gsBgColor;
266 var oMsg=new whMessage(WH_MSG_SHOWFTS,this,1,null)
270 function writeResultDiv()
272 var sHTML="<div id=\""+gsResultDivID+"\" style=\"POSITION:absolute;\"></div>";
273 document.body.insertAdjacentHTML("beforeEnd",sHTML);
280 var oResMsg=new whMessage(WH_MSG_GETPROJINFO,this,1,null);
281 if(SendMessage(oResMsg)&&oResMsg.oParam)
284 var oProj=oResMsg.oParam;
285 var aProj=oProj.aProj;
289 var sLangId=aProj[0].sLangId;
290 for(var i=0;i<aProj.length;i++)
292 if(aProj[i].sFts&&aProj[i].sLangId==sLangId)
294 addFtsInfo(aProj[i].sPPath,aProj[i].sDPath,aProj[i].sFts);
306 if(gnCLF<gaData.length)
309 loadData2(gaData[gnCLF].sPPath+gaData[gnCLF].sDPath+gaData[gnCLF].sFtsFile);
313 var oMsg = new whMessage(WH_MSG_BACKUPSEARCH, this, 1, null);
314 if (SendMessage(oMsg))
318 gsSK=oMsg.oParam.toLowerCase();
322 RegisterListener2(this, WH_MSG_SEARCHFTSKEY);
326 function loadData2(sFile)
334 function findFTSKey()
339 displayMsg(gsSearchMsg);
347 function findOneKey()
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))){
366 sCW=sInput.substring(0,nS);
367 sInput=sInput.substring(nS+1);
372 if((sCW=="or")||((nSep>=0)&&(gsFtsBreakChars.charAt(nSep)=="|"))){
375 }else if((sCW=="and")||((nSep>=0)&&(gsFtsBreakChars.charAt(nSep)=="&"))){
378 }else if((sCW=="not")||
379 ((nSep>=0)&&(gsFtsBreakChars.charAt(nSep)=="~"))){
381 }else if(sCW!=""&&!IsStopWord(sCW,gaFtsStop)){
382 var sCurrentStem=GetStem(sCW);
395 function checkAgain()
402 setTimeout("findFTSKey();",1);
405 function displayTopics()
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>";
421 sHTML="<P>"+gsNoTopics+"</P>"
423 sHTML="<dl>"+sHTML+"</dl>";
425 var resultDiv=getElement(gsResultDivID);
427 resultDiv.innerHTML=sHTML;
430 function displayMsg(sErrorMsg)
432 var sHTML="<P>"+sErrorMsg+"</P>";
434 var resultDiv=getElement(gsResultDivID);
436 resultDiv.innerHTML=sHTML;
439 function ftsFindKeyword()
443 var aFtsContentsCon=null;
445 if(sKey==null) return;
446 if(!gsCheckKey||sKey!=gsCheckKey||gnIndexNum==0)
448 aFtsContentsCon=new Array();
452 gaTopicCheckInfo=null;
456 aFtsContentsCon=gaFtsContentsCon;
458 for(var i=gnCheck;i<gaaFCD.length;i++)
460 var oCF=getChunkedFts(i,sKey);
463 if(!oCF.aFtsKeys&&oCF.sFileName!=null)
470 gaFtsContentsCon=aFtsContentsCon;
473 loadData2(gaData[i].sPPath+gaData[i].sDPath+oCF.sFileName);
477 aFtsContentsCon[s++]=oCF;
483 var aTI=gaTopicCheckInfo;
484 for(var m=gnTopicCheck;m<aFtsContentsCon.length;m++)
486 var aTIPart=getTopics(aFtsContentsCon[m],sKey);
489 gnCheck=gaaFCD.length;
491 gaTopicCheckInfo=aTI;
492 gaFtsContentsCon=aFtsContentsCon;
498 aTI=mergeTopics(aTI,aTIPart);
500 if(mergewithPreviousResult(aTI))
510 function mergewithPreviousResult(aTI)
512 if(aTI!=null&&aTI.length!=0)
514 var nNumTopics=aTI.length;
515 if(gnCurrentOp==0||gbFirst){
517 displayMsg(gsHelpCannotSearch);
521 if(gaTI.length>=aTI.length)
532 for(var i=0;i<aSS.length;i++)
534 var bAlreadyThere=false;
535 for(var j=s;j<aLS.length;j++)
537 if(aSS[i].equalTo(aLS[j]))
546 insertTopic(aLS,aSS[i]);
551 }else if(gnCurrentOp==1){
554 for(var i=0;i<aTI.length;i++)
556 for(var j=s;j<gaTI.length;j++)
558 if(aTI[i].equalTo(gaTI[j]))
560 removeItemFromArray(gaTI,j);
568 for(var i=0;i<gaTI.length;i++)
571 for(var j=s;j<aTI.length;j++)
573 if(gaTI[i].equalTo(aTI[j]))
581 removeItemFromArray(gaTI,i);
588 if((gnCurrentOp==1)&&(!gbNot)){
590 }else if((gnCurrentOp==0)&&(gbNot)){
591 displayMsg(gsHelpCannotSearch);
598 function insertTopic(aTI,oTI)
608 if(compare(aTI[nM].sTopicTitle,oTI.sTopicTitle)>0)
610 else if(compare(aTI[nM].sTopicTitle,oTI.sTopicTitle)<0)
619 insertItemIntoArray(aTI,nM,oTI);
622 if(compare(aTI[nM].sTopicTitle,oTI.sTopicTitle)<0)
623 insertItemIntoArray(aTI,nM+1,oTI);
625 insertItemIntoArray(aTI,nM,oTI);
632 function mergeTopics(aTI1,aTI2)
636 var len1=aTI1.length;
637 var len2=aTI2.length;
638 var aTopicNew=new Array();
640 while(i1<len1||i2<len2)
644 if(compare(aTI1[i1].sTopicTitle,aTI2[i2].sTopicTitle)<0)
645 aTopicNew[i++]=aTI1[i1++];
647 aTopicNew[i++]=aTI2[i2++];
650 aTopicNew[i++]=aTI1[i1++];
652 aTopicNew[i++]=aTI2[i2++];
657 function getTopics(oCF,sKey)
659 var aTIPart=new Array();
660 if(oCF&&oCF.aFtsKeys)
662 var keys=oCF.aFtsKeys;
664 var nE=keys.length-1;
669 if(compare(keys[nM].sItemName,sKey)>0)
671 else if(compare(keys[nM].sItemName,sKey)<0)
682 for(var i=0;i<keys[nM].aTopics.length;i++)
684 var oTC=getTopicChunk(gaaFTCD[oCF.nProjId],keys[nM].aTopics[i]);
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);
695 loadData2(gaData[oCF.nProjId].sPPath+gaData[oCF.nProjId].sDPath+oTC.sFileName);
705 function getTopicChunk(aFTCD,nTopicId)
707 if(aFTCD&&aFTCD.length)
710 var nE=aFTCD.length-1;
715 if(aFTCD[nM].nBegin>nTopicId)
717 else if(aFTCD[nM].nEnd<nTopicId)
730 function endLoading()
732 var oDiv=getElement(gsLoadingDivID);
734 oDiv.style.visibility="hidden";
737 function beginLoading()
739 var oDiv=getElement(gsLoadingDivID);
742 document.body.insertAdjacentHTML("afterBegin",writeLoadingDiv());
743 oDiv=getElement(gsLoadingDivID);
748 oDiv.style.top=document.body.scrollTop;
749 oDiv.style.visibility="visible";
753 function writeLoadingDiv(nIIdx)
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>";
758 function topicInfo(sTopicTitle,sTopicURL)
760 this.sTopicTitle=sTopicTitle;
761 this.sTopicURL=sTopicURL;
762 this.equalTo=function(oTI)
764 return ((this.sTopicTitle==oTI.sTopicTitle)&&
765 (this.sTopicURL==oTI.sTopicURL));
769 function getChunkedFts(nIndex,sKey)
772 if(nIndex<gaaFCD.length)
774 var len=gaaFCD[nIndex].length;
782 if(compare(sKey,gaaFCD[nIndex][nM].sEndKey)>0)
786 else if(compare(sKey,gaaFCD[nIndex][nM].sStartKey)<0)
796 oCF=gaaFCD[nIndex][nM];
802 function ftsReady(aFCD,aFTCD)
805 gaaFTCD[gnCLF]=aFTCD;
806 gaaFCD[gnCLF++]=aFCD;
807 setTimeout("loadFD();",1);
810 function putFtsTData(aTopics)
816 oCTF.aTopics=aTopics;
817 setTimeout("ftsFindKeyword();",1);
821 function putFtsWData(aFtsContents)
828 oCF.aFtsKeys=aFtsContents;
829 setTimeout("ftsFindKeyword();",1);
833 function IsStopWord(sCW,aFtsStopArray)
835 var nStopArrayLen=aFtsStopArray.length;
837 var nE=nStopArrayLen-1;
844 sStopWord=aFtsStopArray[nM];
845 if(compare(sCW,sStopWord)>0){
848 if(compare(sCW,sStopWord)<0){
859 function GetStem(szWord)
861 if(gaFtsStem==null||gaFtsStem.length==0)return szWord;
862 var aStems=gaFtsStem;
866 for(var iStem=0;iStem<aStems.length;iStem++){
868 if(aStems[iStem].length>=szWord.length-1) continue;
869 nStemPos=szWord.lastIndexOf(aStems[iStem]);
871 var cssub=szWord.substring(nStemPos);
872 if(cssub==aStems[iStem]){
874 if(szWord.charAt(nStemPos-2)==szWord.charAt(nStemPos-1)){
875 csStem=csStem.substring(0,nStemPos-1);
877 csStem=csStem.substring(0,nStemPos);
886 function FtsWriteClassStyle()
888 var sStyle="<STYLE TYPE='text/css'>\n";
890 sStyle+="body {border-top:"+gsBgColor+" 1px solid;}\n";
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";
900 document.write(sStyle);
903 function window_Unload()
905 UnRegisterListener2(this,WH_MSG_PROJECTREADY);
906 UnRegisterListener2(this, WH_MSG_SEARCHFTSKEY);
910 function onSendMessage(oMsg)
912 var nMsgId=oMsg.nMessageId;
913 if(nMsgId==WH_MSG_SEARCHFTSKEY)
917 if(gsSK==null||gsSK=="")
919 gsSK=oMsg.oParam.toLowerCase();
923 gsSK2=oMsg.oParam.toLowerCase();
926 else if(nMsgId==WH_MSG_PROJECTREADY)
933 if (window.gbWhUtil&&window.gbWhLang&&window.gbWhProxy&&window.gbWhVer&&window.gbWhMsg)
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);
945 document.location.reload();