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