2 var gaChunks=new Array();
3 var gaFakes=new Array();
5 var gaData=new Array();
19 var gnMaxMargin=32000;
32 var gsLoadingDivID="LoadingDiv";
33 var gsLoadingMsg="Loading data, please wait...";
39 function onLoadXMLError()
43 var aChunk=new Array();
48 var aData=new Array();
53 function putDataXML(xmlDoc,sDocPath)
57 var node=xmlDoc.lastChild;
61 var aChunk=new Array();
62 var oC=node.firstChild;
65 if(oC.nodeName=="chunkinfo")
67 var item=new Object();
68 item.sBK=oC.getAttribute("first");
69 item.sEK=oC.getAttribute("last");
70 item.sFileName=oC.getAttribute("url");
71 item.nNum=parseInt(oC.getAttribute("num"));
74 aChunk[aChunk.length]=item;
83 var node=xmlDoc.lastChild;
86 var aData=new Array();
89 var oC=node.firstChild;
93 if(oC.nodeName=="key")
95 var sName=oC.getAttribute("name");
96 if(sName&&sName.length>0)
98 var sTarget=oC.getAttribute("target");
99 var item=new Object();
103 item.sTarget=sTarget;
105 aData[aData.length]=item;
106 var nCurIndex=aData.length;
107 processKey(oC,aData,item);
108 nNext=aData.length-nCurIndex;
112 else if(oC.nodeName=="letter")
114 var name=oC.getAttribute("name");
115 if(name&&name.length>0)
117 var item=new Object();
123 aData[aData.length]=item;
126 else if(oC.nodeName=="entry")
128 var name=oC.getAttribute("name");
129 var def=oC.getAttribute("value");
130 if(name&&name.length>0)
132 var item=new Object();
138 aData[aData.length]=item;
148 function processKey(element,aData,item)
153 var oC=element.firstChild;
156 if(oC.nodeName=="topic")
158 var name=oC.getAttribute("name");
159 var url=oC.getAttribute("url");
160 if(url&&url.length!=0)
162 if(!name||name.length==0)
164 var topic=new Object();
168 item.aTopics=new Array();
169 item.aTopics[item.aTopics.length]=topic;
172 else if(oC.nodeName=="key")
175 var name=oC.getAttribute("name");
176 if(name&&name.length!=0)
178 var subItem=new Object();
181 subItem.nPKOff=nPrev;
182 aData[aData.length]=subItem;
183 var nCurIndex=aData.length;
184 processKey(oC,aData,subItem);
185 nNext=aData.length-nCurIndex;
186 subItem.nNKOff=nNext;
193 function putData(aData)
201 setTimeout("checkReady();",1);
204 gsSKA=getKByIdx(oCData,gnNKI);
209 setTimeout("checkReady();",1);
213 setTimeout("checkAgain();",50);
225 function endLoading()
227 var oDiv=getElement(gsLoadingDivID);
229 oDiv.style.visibility="hidden";
237 function beginLoading()
239 var oDiv=getElement(gsLoadingDivID);
242 oDiv.style.top=document.body.scrollTop;
243 oDiv.style.visibility="visible";
247 function indexHTMLPart()
255 this.addHTML=function(sHTML,nConsumed,bDown,bK,sK){
259 this.sHTML=sHTML+this.sHTML;
261 this.nConsumed+=nConsumed;
274 this.appendHTML=function(oHTML,bDown){
275 this.addSubHTML(oHTML,bDown);
286 this.addSubHTML=function(oHTML,bDown){
288 this.sHTML+=oHTML.sHTML;
290 this.sHTML=oHTML.sHTML+this.sHTML;
291 this.nCurrent+=oHTML.nCurrent;
292 this.nConsumed+=oHTML.nConsumed;
296 function getMaxUnits()
298 return Math.floor(gnMaxMargin/gnUHeight)+1;
301 function getFakeItemsHTMLbyCount(nB,nCount)
303 var nMU=getMaxUnits();
304 var nNum=Math.floor(nCount/nMU);
306 for(var i=0;i<nNum;i++)
307 sHTML+=getFakeItemHTML(nB,nMU-1);
309 var nRest=nCount%nMU;
310 sHTML+=getFakeItemHTML(nB,nRest-1);
314 function getFakeItemHTML(nB,nNum)
316 return "<h6 name=fk"+nB+" id=fk"+nB+" style=\"margin-top:"+gnUHeight*nNum+";margin-bottom:0\"> </h6>";
319 function fakeItemsArea(nB,n,sKA,sKB,obj)
326 this.nMargin=(n-1)*gnUHeight;
328 this.setNum=function(n)
331 var nDelta=this.nMargin;
332 this.nMargin=(n-1)*gnUHeight;
333 nDelta=nDelta-this.nMargin;
337 var nMU=getMaxUnits();
338 nLastobj=Math.floor((n-1)/nMU);
340 this.obj[nLastobj].style.marginTop=((n-1)%nMU)*gnUHeight;
342 this.obj.style.marginTop=((n-1)%nMU)*gnUHeight;
346 for(var i=this.obj.length-1;i>nLastobj;i--)
347 removeThis(this.obj[i]);
352 removeThis(this.obj);
356 this.insertAdjacentHTML=function(sWhere,sHTML)
358 if(sWhere=="beforeBegin")
361 this.obj[0].insertAdjacentHTML(sWhere,sHTML);
363 this.obj.insertAdjacentHTML(sWhere,sHTML);
365 else if(sWhere=="afterEnd")
369 if(gbMac&&gbIE5&&this.obj[this.obj.length-1].nextSibling)
370 this.obj[this.obj.length-1].nextSibling.insertAdjacentHTML("beforeBegin",sHTML);
372 this.obj[this.obj.length-1].insertAdjacentHTML(sWhere,sHTML);
376 if(gbMac&&gbIE5&&this.obj.nextSibling)
377 this.obj.nextSibling.insertAdjacentHTML("beforeBegin",sHTML);
379 this.obj.insertAdjacentHTML(sWhere,sHTML);
383 this.getBtm=function()
386 return this.obj[this.obj.length-1].offsetTop;
388 return this.obj.offsetTop;
390 this.getTop=function()
392 return this.getBtm()-this.nMargin;
396 function usedItems(nB,nE)
403 function checkReady()
405 var len=gaChunks.length;
409 var bDown=(gsSKB==null);
410 var sK=bDown?gsSKA:gsSKB;
414 setTimeout("checkAgain();",50);
417 if(!gsChK||sK!=gsChK||gnNum==0)
421 aDataCon=new Array();
427 for(var i=gnCheck;i<len;i++)
429 var oCData=getChunkedData(i,bDown,sK);
432 if(!oCData.aKs&&oCData.sFileName!=null)
442 loadData2(gaData[i].sPPath+gaData[i].sDPath+oCData.sFileName);
446 aDataCon[s++]=oCData;
453 gsSKA=gsSKB=gsShowK=null;
455 var oHTML=new indexHTMLPart();
456 var aPos=new Array();
457 var aOriPos=new Array();
458 var aMaxPos=new Array();
459 var aMinPos=new Array();
461 if(gbNeedCalc||gbFindCK) gnIns=0;
462 for(i=0;i<aDataCon.length;i++)
464 aPos[i]=getIdxPos(aDataCon[i],bDown,sK);
465 if(gbNeedCalc||gbFindCK)
467 gnIns+=aPos[i]+aDataCon[i].nTotal-aDataCon[i].nNum;
473 gnIns+=aDataCon[i].aKs[aPos[i]].nNKOff;
477 while(n<aDataCon[i].aKsOnly.length&&!aDataCon[i].aKsOnly[n])
486 getLimit(aDataCon,aPos,aMaxPos,aMinPos,i);
488 if((gbNeedCalc||gbFindCK)&&!bDown&&gnIns!=-1)
490 gnIns+=(aDataCon.length-1)
492 if(gnIns!=-1||gbFindCK)
494 oHTML.nNeeded=gnNeeded;
495 var bDone=writeItems(oHTML,aDataCon,aPos,aMinPos,aMaxPos,bDown,1);
496 if(oHTML.nConsumed!=0)
500 nB=gnIns-oHTML.nConsumed+1;
504 var oldScrollPos=document.body.scrollTop;
505 if(insertIdxKs(nB,oHTML,gbScrl))
507 updateUsedK(aDataCon,aOriPos,aPos,bDown);
510 while(document.body.scrollTop!=oldScrollPos)
511 document.body.scrollTop=oldScrollPos;
521 setTimeout("checkReady();",50);
529 gsSKB=getFirstKeyFromPos(aDataCon,aPos);
531 setTimeout("checkReady();",50);
534 if(!findCKInDom()) return;
536 gnNeeded=gnNeeded-oHTML.nCurrent;
539 setTimeout("checkAgain();",50);
544 if(!findCKInDom()) return;
546 setTimeout("checkAgain();",50);
551 function getFirstKeyFromPos(aDataCon,aPos)
553 var sCurrentK=getBiggestChar();
554 for(var i=0;i<aPos.length;i++)
556 if(aDataCon[i].aKs&&aDataCon[i].aKs.length>0&&aPos[i]>=0&&aPos[i]<aDataCon[i].aKs.length)
559 compare(sCurrentK,aDataCon[i].aKs[aPos[i]].sName)>0)
561 sCurrentK=aDataCon[i].aKs[aPos[i]].sName;
568 function checkAgain()
581 getUnitIdx(document.body.scrollTop,document.body.clientHeight);
585 setTimeout("checkAgain()",50);
588 function getLimit(aDataCon,aPos,aMaxPos,aMinPos,i)
590 aMaxPos[i]=aDataCon[i].nNum;
593 if(aDataCon[i].oUsedItems)
595 var oUsedItems=aDataCon[i].oUsedItems;
597 if(oUsedItems.nB>aPos[i])
599 aMaxPos[i]=oUsedItems.nB;
603 oUsedItems=oUsedItems.oN;
604 }while(oUsedItems!=null);
606 aMinPos[i]=oPNode.nE;
608 else if(aDataCon[i].aKs==null)
610 aMaxPos[i]=aMinPos[i]=aPos[i];
612 if(aMinPos[i]>=aPos[i]||aMaxPos[i]<=aPos[i])
614 aMaxPos[i]=aMinPos[i]=aPos[i];
618 function getIdxPos(oIdx,bDown,sK)
628 for(var i=0;i<aKs.length;i++)
632 if(compare(aKs[i].sName,sK)>0)
640 if(compare(aKs[i].sName,sK)<0)
648 else if(oIdx.aKsOnly)
650 var aKsOnly=oIdx.aKsOnly;
651 for(var i=0;i<aKsOnly.length;i++)
657 if(compare(aKsOnly[i],sK)>0)
665 if(compare(aKsOnly[i],sK)<0)
676 function writeItems(oHTML,aDataCon,aPos,aMinPos,aMaxPos,bDown,nLevel)
678 var aOldPos=new Array();
679 for(var i=0;i<aPos.length;i++)
686 var aCurIdxSet=new Array();
688 for(i=0;i<aDataCon.length;i++)
690 if(aDataCon[i].aKs&&aDataCon[i].aKs.length&&aPos[i]!=-1&&
691 (bDown&&aPos[i]<aMaxPos[i])||(!bDown&&aPos[i]>aMinPos[i]))
694 (bDown&&compare(sCurrentK,aDataCon[i].aKs[aPos[i]].sName)>0)||
695 (!bDown&&compare(sCurrentK,aDataCon[i].aKs[aPos[i]].sName)<0))
697 sCurrentK=aDataCon[i].aKs[aPos[i]].sName;
701 else if(compare(sCurrentK,aDataCon[i].aKs[aPos[i]].sName)==0){
705 else if(nLevel==1&&aMaxPos[i]!=aMinPos[i]){
706 if(bDown&&aPos[i]==aMaxPos[i])
710 gsSKA=aDataCon[i].aKs[aOldPos[i]].sName;
714 else if(!bDown&&aPos[i]==aMinPos[i])
718 gsSKB=aDataCon[i].aKs[aOldPos[i]].sName;
727 aOldPos[aCurIdxSet[s]]=aPos[aCurIdxSet[s]];
729 mergeItems(oHTML,bDown,aDataCon,aCurIdxSet,p,aPos,nLevel);
730 adjustPosition(bDown,aDataCon,aCurIdxSet,p,aPos);
732 if(nLevel==1&&oHTML.nNeeded<=oHTML.nCurrent){
740 function updateUsedK(aDataCon,aOriPos,aOldPos,bDown)
742 for(var i=0;i<aDataCon.length;i++)
744 if (aOldPos[i]!=aOriPos[i])
756 nBP=aOldPos[i]+aDataCon[i].aKs[aOldPos[i]].nNKOff+1;
759 nEP=aOriPos[i]+aDataCon[i].aKs[aOriPos[i]].nNKOff;
763 setContentsUsed(aDataCon[i],nBP,nEP);
765 var oFirstPair=aDataCon[i].oUsedItems;
766 if(oFirstPair.oN==null&&oFirstPair.nB==0&&oFirstPair.nE==aDataCon[i].nNum-1)
768 storeKeysOnly(aDataCon[i]);
769 aDataCon[i].oUsedItems=aDataCon[i].aKs=aDataCon[i].sFileName=null;
776 function storeKeysOnly(oCData)
778 oCData.aKsOnly=new Array();
779 for(var i=0;i<oCData.aKs.length;i++)
781 oCData.aKsOnly[i]=oCData.aKs[i].sName;
782 i+=oCData.aKs[i].nNKOff;
786 function setContentsUsed(oIdx,nB,nE)
789 oIdx.oUsedItems=new usedItems(nB,nE);
792 var oUsedItems=oIdx.oUsedItems;
797 if(oUsedItems.nB==nE+1)
802 var oNewNode=new usedItems(oUsedItems.nB,oUsedItems.nE);
803 oNewNode.oN=oUsedItems.oN;
806 oUsedItems.oN=oNewNode;
811 oUsedItems=oUsedItems.oN;
816 oPNode.oN=new usedItems(nB,nE);
819 if(oPNode.nE==oPNode.oN.nB-1)
821 oPNode.nE=oPNode.oN.nE;
822 oPNode.oN=oPNode.oN.oN;
828 function projInfo(sPPath,sDPath,sFile)
835 function addProjInfo(sPPath,sDPath,sFile)
837 var oIdxInfo=new projInfo(sPPath,sDPath,sFile);
838 gaData[gaData.length]=oIdxInfo;
842 function writeDataIFrame()
844 if(gnLoad<gaData.length)
847 loadData2(gaData[gnLoad].sPPath+gaData[gnLoad].sDPath+gaData[gnLoad].sFile);
862 function getH6ById(nPos)
865 return document.all("fk"+nPos);
866 else if(document.getElementsByName)
867 return document.getElementsByName("fk"+nPos);
871 function showItemsInEvaluation(nBP)
874 var fPer=nBP/gnItems;
875 var nB=Math.floor(fPer*gnMaxItems);
876 var oCData=getChunkByIdx(gnRef,nB);
879 if(!oCData.aKs&&oCData.sFileName!=null)
883 oCData.nProjId=gnRef;
886 loadData2(gaData[gnRef].sPPath+gaData[gnRef].sDPath+oCData.sFileName);
889 gsSKA=getKByIdx(oCData,nB);
912 function isUsed(oCData,nPos)
914 var oUsed=oCData.oUsedItems;
915 while(oUsed&&oUsed.nB<=nPos)
917 if(oUsed.nE>=nPos) return true;
923 function getKByIdx(oCData,nB)
925 var nRelPos=nB-(oCData.nTotal-oCData.nNum);
927 if(nRelPos>=0&&aIKs&&nRelPos<aIKs.length)
933 while((oK.nType==3||isUsed(oCData,nRelPos-1))&&nRelPos<aIKs.length);
939 nRelPos=nB-(oCData.nTotal-oCData.nNum)-1;
945 while((oK.nType==3||isUsed(oCData,nRelPos+1))&&nRelPos>=0);
956 function loadData2(sFileName)
960 loadDataXML(sFileName);
966 function projReady(aChunk)
968 gaChunks[gnLoad++]=aChunk;
969 var len=aChunk.length;
972 nTotal=aChunk[len-1].nTotal;
974 if(nTotal>gnMaxItems)
979 setTimeout("writeDataIFrame();",1);
982 function writeFakeItems()
986 var sHTML=getFakeItemsHTMLbyCount(0,gnItems);
987 document.body.insertAdjacentHTML("beforeEnd",sHTML);
988 var obj=getH6ById(0);
989 if (document.body != null)
991 gnVisible=Math.ceil(document.body.clientHeight/gnUHeight);
993 gaFakes[0]=new fakeItemsArea(0,gnItems,"",getEndString(),obj);
997 function getEndString()
999 var sBC=getBiggestChar();
1000 return sBC+sBC+sBC+sBC+sBC+sBC+sBC+sBC;
1003 function getUnitIdx(nScrl,nHeight)
1005 if(gaFakes.length==0)
1011 var nE=gaFakes.length-1;
1018 nBtm=gaFakes[nM].getBtm();
1019 nTop=gaFakes[nM].getTop();
1021 if(nTop>=nScrl+nHeight)
1033 gsSKA=gaFakes[nM].sKA;
1035 gnNeeded=Math.ceil((nHeight-nTop+nScrl)/gnUHeight);
1036 gnIns=gaFakes[nM].nB;
1039 else if(nBtm<=nScrl+nHeight){
1040 gsSKB=gaFakes[nM].sKB;
1042 gnNeeded=Math.ceil((nBtm-nScrl+gnScrlMgn)/gnUHeight);
1048 var nUnitIdx=gaFakes[nM].nB+Math.floor((nScrl-nTop)/gnUHeight);
1049 if (!showItemsInEvaluation(nUnitIdx))
1051 gsSKA=gaFakes[nM].sKA;
1053 gnNeeded=Math.ceil(nHeight/gnUHeight);
1054 gnIns=gaFakes[nM].nB;
1065 window.onscroll=null;
1066 window.onresize=null;
1071 window.onscroll=window_OnScroll;
1072 window.onresize=window_OnResize;
1075 function insertIdxKs(nIns,oHTML,bScrl)
1079 var nCount=oHTML.nConsumed;
1081 var nE=gaFakes.length-1;
1086 if(gaFakes[nM].nB>nIns)
1088 else if(gaFakes[nM].nB+gaFakes[nM].nNum<=nIns)
1097 var oFIA=gaFakes[nM];
1098 var nOffsetTop=oFIA.getTop();
1099 var nOffsetBottom=oFIA.getBtm();
1101 var nHDiff=nIns-oFIA.nB;
1102 var nTDiff=oFIA.nNum+oFIA.nB-(nIns+nCount);
1105 nDelta=oFIA.setNum(nHDiff);
1106 var sOldKBefore=oFIA.sKB;
1110 var sHTML=getFakeItemsHTMLbyCount(nIns,nTDiff);
1111 oFIA.insertAdjacentHTML("afterEnd",sHTML);
1112 var obj=getH6ById(nIns);
1113 insertItemIntoArray(gaFakes,nM+1,new fakeItemsArea(nIns+nCount,nTDiff,oHTML.sLK,sOldKBefore,obj));
1115 oFIA.insertAdjacentHTML("afterEnd",oHTML.sHTML);
1120 var nScrollPos=nOffsetBottom-nDelta;
1121 while(document.body.scrollTop!=nScrollPos)
1122 document.body.scrollTop=nScrollPos;
1125 window.scrollTo(0,nOffsetBottom-nDelta);
1129 oFIA.insertAdjacentHTML("beforeBegin",oHTML.sHTML);
1133 var nScrollPos=nOffsetTop;
1134 while(document.body.scrollTop!=nScrollPos)
1135 document.body.scrollTop=nScrollPos;
1138 window.scrollTo(0,nOffsetTop);
1143 oFIA.nB=nIns+nCount;
1144 nDelta=oFIA.setNum(nTDiff);
1148 gaFakes[nM].setNum(0);
1149 removeItemFromArray(gaFakes,nM);
1159 function window_OnScroll()
1162 setTimeout("procScroll();",50);
1165 function procScroll()
1167 if(gnSE==1&&!gbProcess)
1170 getUnitIdx(document.body.scrollTop,document.body.clientHeight);
1175 function window_OnResize()
1178 setTimeout("procResize();",50);
1181 function procResize()
1183 if(gnRE==1&&!gbProcess)
1186 gnVisible=Math.ceil(document.body.clientHeight/gnUHeight);
1188 getUnitIdx(document.body.scrollTop,document.body.clientHeight);
1193 function getChunkByIdx(nIdx,nPosition)
1196 if(nIdx<gaChunks.length)
1198 var len=gaChunks[nIdx].length;
1206 if(nPosition<gaChunks[nIdx][nM].nTotal)
1215 oCData=gaChunks[nIdx][nE];
1216 else if(nPosition<gaChunks[nIdx][nB].nTotal)
1217 oCData=gaChunks[nIdx][nB];
1223 function getChunkedData(nIdx,bDown,sK)
1227 if(nIdx<gaChunks.length)
1229 var len=gaChunks[nIdx].length;
1236 var nM=(nB+nE+(bDown?0:1))>>1;
1239 if(compare(sK,gaChunks[nIdx][nM].sEK)<0)
1249 if(compare(sK,gaChunks[nIdx][nM].sBK)>0)
1269 if(gaChunks[nIdx].length>nB&&compare(sK,gaChunks[nIdx][nB].sEK)<0)
1272 nCandId=gaChunks[nIdx].length-1;
1276 if(0<=nE&&compare(sK,gaChunks[nIdx][nE].sBK)>0)
1282 return gaChunks[nIdx][nCandId];
1300 function writeLoadingDiv(nIIdx)
1302 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>";