Salome HOME
*** empty log message ***
[modules/smesh.git] / doc / salome / gui / SMESH / whhost.js
1 //      WebHelp 5.10.002\r
2 var gaChunks=new Array();\r
3 var gaFakes=new Array();\r
4 var gaDataCon=null;\r
5 var gaData=new Array();\r
6 \r
7 var gbFindCK=false;;\r
8 var gbNeedCalc=false;\r
9 var gbScrl=false;\r
10 var gbProcess=false;\r
11 var gbReady=false;\r
12 \r
13 var gnCheck=0;\r
14 var gnNum=0;\r
15 var gnIns=-1;\r
16 var gnLoad=0;\r
17 var gnRef=-1;\r
18 var gnMaxItems=0;\r
19 var gnMaxMargin=32000;\r
20 var gnNeeded=0;\r
21 var gnNKI=-1;\r
22 var gnRE=0;\r
23 var gnScrlMgn=30;\r
24 var gnSE=0;\r
25 var gnVisible=0;\r
26 var gnItems=0;\r
27 var gnUHeight=1;\r
28 \r
29 var gsBCK=null;\r
30 var gsChK=null;\r
31 var gsCK=null;\r
32 var gsLoadingDivID="LoadingDiv";\r
33 var gsLoadingMsg="Loading data, please wait...";\r
34 var gsSKA=null;\r
35 var gsSKB=null;\r
36 \r
37 var gbLoadInfo=false;\r
38 \r
39 function onLoadXMLError()\r
40 {\r
41         if(gbLoadInfo)\r
42         {\r
43                 var aChunk=new Array();\r
44                 projReady(aChunk);\r
45         }\r
46         else\r
47         {\r
48                 var aData=new Array();\r
49                 putData(aData);\r
50         }\r
51 }\r
52 \r
53 function putDataXML(xmlDoc,sDocPath)\r
54 {\r
55         if(gbLoadInfo)\r
56         {\r
57                 var node=xmlDoc.lastChild;\r
58                 if(node)\r
59                 {\r
60                         var nTotal=0\r
61                         var aChunk=new Array();\r
62                         var oC=node.firstChild;\r
63                         while(oC)\r
64                         {\r
65                                 if(oC.nodeName=="chunkinfo")\r
66                                 {\r
67                                         var item=new Object();\r
68                                         item.sBK=oC.getAttribute("first");\r
69                                         item.sEK=oC.getAttribute("last");\r
70                                         item.sFileName=oC.getAttribute("url");\r
71                                         item.nNum=parseInt(oC.getAttribute("num"));\r
72                                         nTotal+=item.nNum;\r
73                                         item.nTotal=nTotal;\r
74                                         aChunk[aChunk.length]=item;\r
75                                 }\r
76                                 oC=oC.nextSibling;\r
77                         }\r
78                         projReady(aChunk);\r
79                 }\r
80         }\r
81         else\r
82         {\r
83                 var node=xmlDoc.lastChild;\r
84                 if(node)\r
85                 {\r
86                         var aData=new Array();\r
87                         var nPrev=0;\r
88                         var nNext=0;\r
89                         var oC=node.firstChild;\r
90                         while(oC)\r
91                         {\r
92                                 nPrev=nNext;\r
93                                 if(oC.nodeName=="key")\r
94                                 {\r
95                                         var sName=oC.getAttribute("name");\r
96                                         if(sName&&sName.length>0)\r
97                                         {\r
98                                                 var sTarget=oC.getAttribute("target");\r
99                                                 var item=new Object();\r
100                                                 item.nType=2;\r
101                                                 item.sName=sName;\r
102                                                 if(sTarget)\r
103                                                         item.sTarget=sTarget;\r
104                                                 item.nPKOff=nPrev;\r
105                                                 aData[aData.length]=item;\r
106                                                 var nCurIndex=aData.length;\r
107                                                 processKey(oC,aData,item);\r
108                                                 nNext=aData.length-nCurIndex;\r
109                                                 item.nNKOff=nNext;\r
110                                         }\r
111                                 }\r
112                                 else if(oC.nodeName=="letter")\r
113                                 {\r
114                                         var name=oC.getAttribute("name");\r
115                                         if(name&&name.length>0)\r
116                                         {\r
117                                                 var item=new Object();\r
118                                                 item.nType=1;\r
119                                                 item.sName=name;\r
120                                                 item.nPKOff=nPrev;\r
121                                                 nNext=0;\r
122                                                 item.nNKOff=nNext;\r
123                                                 aData[aData.length]=item;\r
124                                         }\r
125                                 }\r
126                                 else if(oC.nodeName=="entry")\r
127                                 {\r
128                                         var name=oC.getAttribute("name");\r
129                                         var def=oC.getAttribute("value");\r
130                                         if(name&&name.length>0)\r
131                                         {\r
132                                                 var item=new Object();\r
133                                                 item.sName=name;\r
134                                                 item.sDef=def;\r
135                                                 item.nPKOff=nPrev;\r
136                                                 nNext=0;\r
137                                                 item.nNKOff=nNext;\r
138                                                 aData[aData.length]=item;\r
139                                         }\r
140                                 }\r
141                                 oC=oC.nextSibling;\r
142                         }\r
143                         putData(aData);\r
144                 }\r
145         }\r
146 }\r
147 \r
148 function processKey(element,aData,item)\r
149 {\r
150         var i=0;\r
151         var nPrev=0;\r
152         var nNext=0;\r
153         var oC=element.firstChild;\r
154         while(oC)\r
155         {\r
156                 if(oC.nodeName=="topic")\r
157                 {\r
158                         var name=oC.getAttribute("name");\r
159                         var url=oC.getAttribute("url");\r
160                         if(url&&url.length!=0)\r
161                         {\r
162                                 if(!name||name.length==0)\r
163                                         name=url;\r
164                                 var topic=new Object();\r
165                                 topic.sName=name;\r
166                                 topic.sURL=url;\r
167                                 if(!item.aTopics)\r
168                                         item.aTopics=new Array();\r
169                                 item.aTopics[item.aTopics.length]=topic;\r
170                         }\r
171                 }\r
172                 else if(oC.nodeName=="key")\r
173                 {\r
174                         nPrev=nNext;\r
175                         var name=oC.getAttribute("name");\r
176                         if(name&&name.length!=0)\r
177                         {\r
178                                 var subItem=new Object();\r
179                                 subItem.sName=name;\r
180                                 subItem.nType=3;\r
181                                 subItem.nPKOff=nPrev;\r
182                                 aData[aData.length]=subItem;\r
183                                 var nCurIndex=aData.length;\r
184                                 processKey(oC,aData,subItem);\r
185                                 nNext=aData.length-nCurIndex;\r
186                                 subItem.nNKOff=nNext;\r
187                         }\r
188                 }\r
189                 oC=oC.nextSibling;\r
190         }\r
191 }\r
192 \r
193 function putData(aData)\r
194 {\r
195         endLoading();\r
196         var oCData=goCData;\r
197         if(oCData)\r
198         {\r
199                 oCData.aKs=aData;\r
200                 if(gnNKI==-1)\r
201                         setTimeout("checkReady();",1);\r
202                 else\r
203                 {\r
204                         gsSKA=getKByIdx(oCData,gnNKI);\r
205                         gbNeedCalc=true;\r
206                         gbScrl=true;\r
207                         gnNKI=-1;\r
208                         if(gsSKA)\r
209                                 setTimeout("checkReady();",1);\r
210                         else\r
211                         {\r
212                                 markEnd();\r
213                                 setTimeout("checkAgain();",50);\r
214                         }\r
215                 }\r
216         }\r
217 }\r
218 \r
219 function markEnd()\r
220 {\r
221         if(gbProcess)\r
222                 gbProcess=false;\r
223 }\r
224 \r
225 function endLoading()\r
226 {\r
227         var oDiv=getElement(gsLoadingDivID);\r
228         if(oDiv)\r
229                 oDiv.style.visibility="hidden";\r
230 }\r
231 \r
232 function markBegin()\r
233 {\r
234         gbProcess=true;\r
235 }\r
236 \r
237 function beginLoading()\r
238 {\r
239         var oDiv=getElement(gsLoadingDivID);\r
240         if(oDiv)\r
241         {\r
242                 oDiv.style.top=document.body.scrollTop;\r
243                 oDiv.style.visibility="visible";\r
244         }\r
245 }\r
246 \r
247 function indexHTMLPart()\r
248 {\r
249         this.sHTML="";\r
250         this.nNeeded=0;\r
251         this.nCurrent=0;\r
252         this.nConsumed=0;\r
253         this.sFK=null;\r
254         this.sLK=null;\r
255         this.addHTML=function(sHTML,nConsumed,bDown,bK,sK){\r
256                 if(bDown)\r
257                         this.sHTML+=sHTML;\r
258                 else\r
259                         this.sHTML=sHTML+this.sHTML;\r
260                 this.nCurrent++;                        \r
261                 this.nConsumed+=nConsumed;\r
262                 if(bK)\r
263                 {\r
264                         if(!this.sFK)\r
265                                 this.sFK=sK;\r
266                         if(!this.sLK)\r
267                                 this.sLK=sK;\r
268                         if(bDown)\r
269                                 this.sLK=sK;\r
270                         else\r
271                                 this.sFK=sK;\r
272                 }\r
273         }\r
274         this.appendHTML=function(oHTML,bDown){\r
275                 this.addSubHTML(oHTML,bDown);\r
276                 if(!this.sFK)\r
277                         this.sFK=oHTML.sFK;\r
278                 if(!this.sLK)\r
279                         this.sLK=oHTML.sLK;\r
280                 if(bDown)\r
281                         this.sLK=oHTML.sLK;\r
282                 else\r
283                         this.sFK=oHTML.sFK;\r
284         }       \r
285         \r
286         this.addSubHTML=function(oHTML,bDown){\r
287                 if(bDown)\r
288                         this.sHTML+=oHTML.sHTML;\r
289                 else\r
290                         this.sHTML=oHTML.sHTML+this.sHTML;\r
291                 this.nCurrent+=oHTML.nCurrent;\r
292                 this.nConsumed+=oHTML.nConsumed;                        \r
293         }\r
294 }\r
295 \r
296 function getMaxUnits()\r
297 {\r
298         return Math.floor(gnMaxMargin/gnUHeight)+1;\r
299 }\r
300 \r
301 function getFakeItemsHTMLbyCount(nB,nCount)\r
302 {\r
303         var nMU=getMaxUnits();\r
304         var nNum=Math.floor(nCount/nMU);\r
305         var sHTML="";\r
306         for(var i=0;i<nNum;i++)\r
307                 sHTML+=getFakeItemHTML(nB,nMU-1);\r
308                 \r
309         var nRest=nCount%nMU;\r
310         sHTML+=getFakeItemHTML(nB,nRest-1);\r
311         return sHTML;\r
312 }\r
313 \r
314 function getFakeItemHTML(nB,nNum)\r
315 {\r
316         return "<h6 name=fk"+nB+" id=fk"+nB+" style=\"margin-top:"+gnUHeight*nNum+";margin-bottom:0\">&nbsp;</h6>";\r
317 }\r
318 \r
319 function fakeItemsArea(nB,n,sKA,sKB,obj)\r
320 {\r
321         this.nB=nB;\r
322         this.nNum=n;\r
323         this.sKA=sKA;\r
324         this.sKB=sKB;\r
325         this.obj=obj;\r
326         this.nMargin=(n-1)*gnUHeight;\r
327 \r
328         this.setNum=function(n)\r
329         {\r
330                 var nLastobj=-1;\r
331                 var nDelta=this.nMargin;\r
332                 this.nMargin=(n-1)*gnUHeight;\r
333                 nDelta=nDelta-this.nMargin;\r
334                 if(n>0)\r
335                 {\r
336                         this.nNum=n;\r
337                         var nMU=getMaxUnits();\r
338                         nLastobj=Math.floor((n-1)/nMU);\r
339                         if(this.obj.length)\r
340                                 this.obj[nLastobj].style.marginTop=((n-1)%nMU)*gnUHeight;\r
341                         else\r
342                                 this.obj.style.marginTop=((n-1)%nMU)*gnUHeight;\r
343                 }\r
344                 if(this.obj.length)\r
345                 {\r
346                         for(var i=this.obj.length-1;i>nLastobj;i--)\r
347                                 removeThis(this.obj[i]);\r
348                 }\r
349                 else\r
350                 {\r
351                         if(nLastobj==-1)\r
352                                 removeThis(this.obj);\r
353                 }\r
354                 return nDelta;\r
355         }\r
356         this.insertAdjacentHTML=function(sWhere,sHTML)\r
357         {\r
358                 if(sWhere=="beforeBegin")\r
359                 {\r
360                         if(this.obj.length)\r
361                                 this.obj[0].insertAdjacentHTML(sWhere,sHTML);\r
362                         else\r
363                                 this.obj.insertAdjacentHTML(sWhere,sHTML);\r
364                 }\r
365                 else if(sWhere=="afterEnd")\r
366                 {\r
367                         if(this.obj.length)\r
368                         {\r
369                                 if(gbMac&&gbIE5&&this.obj[this.obj.length-1].nextSibling)\r
370                                         this.obj[this.obj.length-1].nextSibling.insertAdjacentHTML("beforeBegin",sHTML);\r
371                                 else\r
372                                         this.obj[this.obj.length-1].insertAdjacentHTML(sWhere,sHTML);\r
373                         }\r
374                         else\r
375                         {\r
376                                 if(gbMac&&gbIE5&&this.obj.nextSibling)\r
377                                         this.obj.nextSibling.insertAdjacentHTML("beforeBegin",sHTML);\r
378                                 else\r
379                                         this.obj.insertAdjacentHTML(sWhere,sHTML);\r
380                         }\r
381                 }\r
382         }\r
383         this.getBtm=function()\r
384         {\r
385                 if(this.obj.length)\r
386                         return this.obj[this.obj.length-1].offsetTop;\r
387                 else\r
388                         return this.obj.offsetTop;\r
389         }\r
390         this.getTop=function()\r
391         {\r
392                 return this.getBtm()-this.nMargin;\r
393         }\r
394 }\r
395 \r
396 function usedItems(nB,nE)\r
397 {\r
398         this.nB=nB;\r
399         this.nE=nE;\r
400         this.oN=null;\r
401 }\r
402 \r
403 function checkReady()\r
404 {\r
405         var len=gaChunks.length;\r
406         var bNeedLoad=false;\r
407         var aDataCon;\r
408         var s=0;\r
409         var bDown=(gsSKB==null);\r
410         var sK=bDown?gsSKA:gsSKB;\r
411         if(sK==null)\r
412         {\r
413                 markEnd();\r
414                 setTimeout("checkAgain();",50);\r
415                 return;\r
416         }\r
417         if(!gsChK||sK!=gsChK||gnNum==0)\r
418         {\r
419                 gnCheck=0;\r
420                 gsChK=sK;\r
421                 aDataCon=new Array();\r
422         }\r
423         else{\r
424                 s=gnNum;\r
425                 aDataCon=gaDataCon;\r
426         }\r
427         for(var i=gnCheck;i<len;i++)\r
428         {\r
429                 var oCData=getChunkedData(i,bDown,sK);\r
430                 if(oCData)\r
431                 {\r
432                         if(!oCData.aKs&&oCData.sFileName!=null)\r
433                         {\r
434                                 bNeedLoad=true;\r
435                                 goCData=oCData;\r
436                                 gnNum=s;\r
437                                 gnCheck=i;\r
438                                 gaDataCon=aDataCon;\r
439                                 oCData.nProjId=i;\r
440                                 gbLoadInfo=false;\r
441                                 beginLoading();\r
442                                 loadData2(gaData[i].sPPath+gaData[i].sDPath+oCData.sFileName);\r
443                                 return;\r
444                         }\r
445                         else{\r
446                                 aDataCon[s++]=oCData;\r
447                         }\r
448                 }\r
449         }\r
450         if(!bNeedLoad)\r
451         {\r
452                 gnNum=0;\r
453                 gsSKA=gsSKB=gsShowK=null;\r
454                 \r
455                 var oHTML=new indexHTMLPart();\r
456                 var aPos=new Array();\r
457                 var aOriPos=new Array();\r
458                 var aMaxPos=new Array();\r
459                 var aMinPos=new Array();\r
460                 \r
461                 if(gbNeedCalc||gbFindCK) gnIns=0;\r
462                 for(i=0;i<aDataCon.length;i++)\r
463                 {\r
464                         aPos[i]=getIdxPos(aDataCon[i],bDown,sK);\r
465                         if(gbNeedCalc||gbFindCK)\r
466                         {\r
467                                 gnIns+=aPos[i]+aDataCon[i].nTotal-aDataCon[i].nNum;\r
468                                 if(!bDown)\r
469                                 {\r
470                                         if(aPos[i]!=-1)\r
471                                         {\r
472                                                 if(aDataCon[i].aKs)\r
473                                                         gnIns+=aDataCon[i].aKs[aPos[i]].nNKOff;\r
474                                                 else\r
475                                                 {\r
476                                                         var n=aPos[i]+1;\r
477                                                         while(n<aDataCon[i].aKsOnly.length&&!aDataCon[i].aKsOnly[n])\r
478                                                                 n++;\r
479                                                         n=n-aPos[i]-1;\r
480                                                         gnIns+=n;\r
481                                                 }\r
482                                         }\r
483                                 }\r
484                         }\r
485                         aOriPos[i]=aPos[i];\r
486                         getLimit(aDataCon,aPos,aMaxPos,aMinPos,i);\r
487                 }\r
488                 if((gbNeedCalc||gbFindCK)&&!bDown&&gnIns!=-1)\r
489                 {\r
490                         gnIns+=(aDataCon.length-1)\r
491                 }\r
492                 if(gnIns!=-1||gbFindCK)\r
493                 {\r
494                         oHTML.nNeeded=gnNeeded;\r
495                         var bDone=writeItems(oHTML,aDataCon,aPos,aMinPos,aMaxPos,bDown,1);\r
496                         if(oHTML.nConsumed!=0)\r
497                         {\r
498                                 var nB;\r
499                                 if(!bDown)\r
500                                         nB=gnIns-oHTML.nConsumed+1;\r
501                                 else\r
502                                         nB=gnIns;\r
503                                         \r
504                                 var oldScrollPos=document.body.scrollTop;\r
505                                 if(insertIdxKs(nB,oHTML,gbScrl))\r
506                                 {\r
507                                         updateUsedK(aDataCon,aOriPos,aPos,bDown);\r
508                                         if(!gbScrl&&gbMac)\r
509                                         {\r
510                                                 while(document.body.scrollTop!=oldScrollPos)\r
511                                                         document.body.scrollTop=oldScrollPos;\r
512                                         }\r
513                                         gbScrl=false;\r
514                                 }\r
515                                 if(gbFindCK)\r
516                                 {\r
517                                         gbFindCK=false;\r
518                                         gbNeedCalc=true;\r
519                                         gsSKB=oHTML.sFK;\r
520                                         gnIns=-1;\r
521                                         setTimeout("checkReady();",50);\r
522                                         return;\r
523                                 }\r
524                         }\r
525                         else if(gbFindCK)\r
526                         {\r
527                                 gbFindCK=false;\r
528                                 gbNeedCalc=true;\r
529                                 gsSKB=getFirstKeyFromPos(aDataCon,aPos);\r
530                                 gnIns=-1;\r
531                                 setTimeout("checkReady();",50);\r
532                                 return;\r
533                         }\r
534                         if(!findCKInDom()) return;\r
535 \r
536                         gnNeeded=gnNeeded-oHTML.nCurrent;\r
537                         gnIns=-1;\r
538                         markEnd();\r
539                         setTimeout("checkAgain();",50);\r
540                         gbNeedCalc=false;\r
541                 }\r
542                 else\r
543                 {\r
544                         if(!findCKInDom()) return;\r
545                         markEnd();\r
546                         setTimeout("checkAgain();",50);\r
547                 }\r
548         }\r
549 }\r
550 \r
551 function getFirstKeyFromPos(aDataCon,aPos)\r
552 {\r
553         var sCurrentK=getBiggestChar();\r
554         for(var i=0;i<aPos.length;i++)\r
555         {\r
556                 if(aDataCon[i].aKs&&aDataCon[i].aKs.length>0&&aPos[i]>=0&&aPos[i]<aDataCon[i].aKs.length)\r
557                 {\r
558                         if(sCurrentK==""||\r
559                                 compare(sCurrentK,aDataCon[i].aKs[aPos[i]].sName)>0)\r
560                         {\r
561                                 sCurrentK=aDataCon[i].aKs[aPos[i]].sName;\r
562                         }\r
563                 }\r
564         }\r
565         return sCurrentK;\r
566 }\r
567 \r
568 function checkAgain()\r
569 {\r
570         if(!gbProcess)\r
571         {\r
572                 if(gsBCK!=null)\r
573                 {\r
574                         gsCK=gsBCK;\r
575                         gsBCK=null;\r
576                         findCK();\r
577                 }\r
578                 else\r
579                 {\r
580                         markBegin();\r
581                         getUnitIdx(document.body.scrollTop,document.body.clientHeight);\r
582                 }\r
583         }\r
584         else\r
585                 setTimeout("checkAgain()",50);\r
586 }\r
587 \r
588 function getLimit(aDataCon,aPos,aMaxPos,aMinPos,i)\r
589 {\r
590         aMaxPos[i]=aDataCon[i].nNum;\r
591         aMinPos[i]=-1;\r
592         var oPNode=null;\r
593         if(aDataCon[i].oUsedItems)\r
594         {\r
595                 var oUsedItems=aDataCon[i].oUsedItems;\r
596                 do{\r
597                         if(oUsedItems.nB>aPos[i])\r
598                         {\r
599                                 aMaxPos[i]=oUsedItems.nB;\r
600                                 break;\r
601                         }\r
602                         oPNode=oUsedItems;\r
603                         oUsedItems=oUsedItems.oN;\r
604                 }while(oUsedItems!=null);\r
605                 if(oPNode)\r
606                         aMinPos[i]=oPNode.nE;\r
607         }\r
608         else if(aDataCon[i].aKs==null)\r
609         {\r
610                 aMaxPos[i]=aMinPos[i]=aPos[i];\r
611         }\r
612         if(aMinPos[i]>=aPos[i]||aMaxPos[i]<=aPos[i])\r
613         {\r
614                 aMaxPos[i]=aMinPos[i]=aPos[i];\r
615         }\r
616 }\r
617 \r
618 function getIdxPos(oIdx,bDown,sK)\r
619 {\r
620         var aKs=oIdx.aKs;\r
621         var nIdx;\r
622         if(bDown)\r
623                 nIdx=oIdx.nNum;\r
624         else\r
625                 nIdx=-1;\r
626         if(aKs!=null)\r
627         {\r
628                 for(var i=0;i<aKs.length;i++)\r
629                 {       \r
630                         if(bDown)\r
631                         {\r
632                                 if(compare(aKs[i].sName,sK)>0)\r
633                                 {\r
634                                         nIdx=i;\r
635                                         break;\r
636                                 }\r
637                         }\r
638                         else\r
639                         {\r
640                                 if(compare(aKs[i].sName,sK)<0)\r
641                                         nIdx=i;\r
642                                 else\r
643                                         break;\r
644                         }\r
645                         i+=aKs[i].nNKOff;\r
646                 }\r
647         }\r
648         else if(oIdx.aKsOnly)\r
649         {\r
650                 var aKsOnly=oIdx.aKsOnly;\r
651                 for(var i=0;i<aKsOnly.length;i++)\r
652                 {       \r
653                         if(aKsOnly[i])\r
654                         {\r
655                                 if(bDown)\r
656                                 {\r
657                                         if(compare(aKsOnly[i],sK)>0)\r
658                                         {\r
659                                                 nIdx=i;\r
660                                                 break;\r
661                                         }\r
662                                 }\r
663                                 else\r
664                                 {\r
665                                         if(compare(aKsOnly[i],sK)<0)\r
666                                                 nIdx=i;\r
667                                         else\r
668                                                 break;\r
669                                 }\r
670                         }\r
671                 }\r
672         }\r
673         return nIdx;\r
674 }\r
675 \r
676 function writeItems(oHTML,aDataCon,aPos,aMinPos,aMaxPos,bDown,nLevel)\r
677 {\r
678         var aOldPos=new Array();\r
679         for(var i=0;i<aPos.length;i++)\r
680         {\r
681                 aOldPos[i]=aPos[i];\r
682         }\r
683         var p;\r
684         do{\r
685                 var sCurrentK="";\r
686                 var aCurIdxSet=new Array();\r
687                 p=0;\r
688                 for(i=0;i<aDataCon.length;i++)\r
689                 {\r
690                         if(aDataCon[i].aKs&&aDataCon[i].aKs.length&&aPos[i]!=-1&&\r
691                                 (bDown&&aPos[i]<aMaxPos[i])||(!bDown&&aPos[i]>aMinPos[i]))\r
692                         {\r
693                                 if(sCurrentK==""||\r
694                                         (bDown&&compare(sCurrentK,aDataCon[i].aKs[aPos[i]].sName)>0)||\r
695                                         (!bDown&&compare(sCurrentK,aDataCon[i].aKs[aPos[i]].sName)<0))\r
696                                 {\r
697                                         sCurrentK=aDataCon[i].aKs[aPos[i]].sName;\r
698                                         p=0;\r
699                                         aCurIdxSet[p++]=i;\r
700                                 }\r
701                                 else if(compare(sCurrentK,aDataCon[i].aKs[aPos[i]].sName)==0){\r
702                                         aCurIdxSet[p++]=i;\r
703                                 }\r
704                         }\r
705                         else if(nLevel==1&&aMaxPos[i]!=aMinPos[i]){\r
706                                 if(bDown&&aPos[i]==aMaxPos[i])\r
707                                 {\r
708                                         if(aDataCon[i].aKs)\r
709                                         {\r
710                                                 gsSKA=aDataCon[i].aKs[aOldPos[i]].sName;\r
711                                                 return false;\r
712                                         }\r
713                                 }\r
714                                 else if(!bDown&&aPos[i]==aMinPos[i])\r
715                                 {\r
716                                         if(aDataCon[i].aKs)\r
717                                         {\r
718                                                 gsSKB=aDataCon[i].aKs[aOldPos[i]].sName;\r
719                                                 return false;\r
720                                         }\r
721                                 }\r
722                         }\r
723                 }\r
724                 if(p>=1){\r
725                         for(var s=0;s<p;s++)\r
726                         {\r
727                                 aOldPos[aCurIdxSet[s]]=aPos[aCurIdxSet[s]];\r
728                         }\r
729                         mergeItems(oHTML,bDown,aDataCon,aCurIdxSet,p,aPos,nLevel);\r
730                         adjustPosition(bDown,aDataCon,aCurIdxSet,p,aPos);\r
731                         \r
732                         if(nLevel==1&&oHTML.nNeeded<=oHTML.nCurrent){\r
733                                 return true;\r
734                         }\r
735                 }\r
736         }while(p>0);\r
737         return true;\r
738 }\r
739 \r
740 function updateUsedK(aDataCon,aOriPos,aOldPos,bDown)\r
741 {\r
742         for(var i=0;i<aDataCon.length;i++)\r
743         {\r
744                 if (aOldPos[i]!=aOriPos[i])\r
745                 {\r
746                         var nBP=0;\r
747                         var nEP=0;\r
748                         if(bDown)\r
749                         {\r
750                                 nBP=aOriPos[i];\r
751                                 nEP=aOldPos[i]-1;\r
752                         }\r
753                         else\r
754                         {\r
755                                 if (aOldPos[i]!=-1)\r
756                                         nBP=aOldPos[i]+aDataCon[i].aKs[aOldPos[i]].nNKOff+1;\r
757                                 else\r
758                                         nBP=0;\r
759                                 nEP=aOriPos[i]+aDataCon[i].aKs[aOriPos[i]].nNKOff;\r
760                         }\r
761                         if(nBP<=nEP)\r
762                         {\r
763                                 setContentsUsed(aDataCon[i],nBP,nEP);\r
764                                 \r
765                                 var oFirstPair=aDataCon[i].oUsedItems;\r
766                                 if(oFirstPair.oN==null&&oFirstPair.nB==0&&oFirstPair.nE==aDataCon[i].nNum-1)\r
767                                 {\r
768                                         storeKeysOnly(aDataCon[i]);\r
769                                         aDataCon[i].oUsedItems=aDataCon[i].aKs=aDataCon[i].sFileName=null;\r
770                                 }\r
771                         }\r
772                 }\r
773         }\r
774 }\r
775 \r
776 function storeKeysOnly(oCData)\r
777 {\r
778         oCData.aKsOnly=new Array();\r
779         for(var i=0;i<oCData.aKs.length;i++)\r
780         {\r
781                 oCData.aKsOnly[i]=oCData.aKs[i].sName;\r
782                 i+=oCData.aKs[i].nNKOff;\r
783         }\r
784 }\r
785 \r
786 function setContentsUsed(oIdx,nB,nE)\r
787 {\r
788         if(!oIdx.oUsedItems)\r
789                 oIdx.oUsedItems=new usedItems(nB,nE);\r
790         else\r
791         {\r
792                 var oUsedItems=oIdx.oUsedItems;\r
793                 var oPNode=null;\r
794                 do{\r
795                         if(oUsedItems.nB>nB)\r
796                         {\r
797                                 if(oUsedItems.nB==nE+1)\r
798                                 {\r
799                                         oUsedItems.nB=nB;\r
800                                 }\r
801                                 else{\r
802                                         var oNewNode=new usedItems(oUsedItems.nB,oUsedItems.nE);\r
803                                         oNewNode.oN=oUsedItems.oN;\r
804                                         oUsedItems.nB=nB;\r
805                                         oUsedItems.nE=nE;\r
806                                         oUsedItems.oN=oNewNode;\r
807                                 }\r
808                                 break;\r
809                         }\r
810                         oPNode=oUsedItems;\r
811                         oUsedItems=oUsedItems.oN;\r
812                 }while(oUsedItems);\r
813                 if(!oUsedItems)\r
814                 {\r
815                         if(oPNode!=null)\r
816                                 oPNode.oN=new usedItems(nB,nE);\r
817                 }\r
818                 if(oPNode!=null){\r
819                         if(oPNode.nE==oPNode.oN.nB-1)\r
820                         {\r
821                                 oPNode.nE=oPNode.oN.nE;\r
822                                 oPNode.oN=oPNode.oN.oN;\r
823                         }\r
824                 }\r
825         }\r
826 }\r
827 \r
828 function projInfo(sPPath,sDPath,sFile)\r
829 {\r
830         this.sPPath=sPPath;\r
831         this.sDPath=sDPath;\r
832         this.sFile=sFile;\r
833 }\r
834 \r
835 function addProjInfo(sPPath,sDPath,sFile)\r
836 {\r
837         var oIdxInfo=new projInfo(sPPath,sDPath,sFile);\r
838         gaData[gaData.length]=oIdxInfo;\r
839         return oIdxInfo;\r
840 }\r
841 \r
842 function writeDataIFrame()\r
843 {\r
844         if(gnLoad<gaData.length)\r
845         {\r
846                 gbLoadInfo=true;\r
847                 loadData2(gaData[gnLoad].sPPath+gaData[gnLoad].sDPath+gaData[gnLoad].sFile);\r
848         }\r
849         else{\r
850                 if(gnItems!=0)\r
851                 {\r
852                         markBegin();\r
853                         writeFakeItems();\r
854                         gsSKA="";\r
855                         gnNeeded=gnVisible;\r
856                         gnIns=0;\r
857                         checkReady();\r
858                 }\r
859         }\r
860 }\r
861 \r
862 function getH6ById(nPos)\r
863 {\r
864         if(document.all)\r
865                 return document.all("fk"+nPos);\r
866         else if(document.getElementsByName)\r
867                 return document.getElementsByName("fk"+nPos);\r
868         return null;            \r
869 }\r
870 \r
871 function showItemsInEvaluation(nBP)\r
872 {\r
873         var bRtn=true;\r
874         var fPer=nBP/gnItems;\r
875         var nB=Math.floor(fPer*gnMaxItems);\r
876         var oCData=getChunkByIdx(gnRef,nB);\r
877         if(oCData)\r
878         {\r
879                 if(!oCData.aKs&&oCData.sFileName!=null)\r
880                 {\r
881                         gnNKI=nB;\r
882                         goCData=oCData;\r
883                         oCData.nProjId=gnRef;\r
884                         gbLoadInfo=false;\r
885                         beginLoading();\r
886                         loadData2(gaData[gnRef].sPPath+gaData[gnRef].sDPath+oCData.sFileName);\r
887                 }\r
888                 else{\r
889                         gsSKA=getKByIdx(oCData,nB);\r
890                         if(gsSKA)\r
891                         {\r
892                                 gsSKB=null;\r
893                                 gbNeedCalc=true;\r
894                                 gbScrl=true;\r
895                                 checkReady()\r
896                         }\r
897                         else\r
898                         {\r
899                                 markEnd();\r
900                                 bRtn=false;\r
901                         }\r
902                 }\r
903         }\r
904         else\r
905         {\r
906                 markEnd();\r
907                 bRtn=false;\r
908         }\r
909         return bRtn;\r
910 }\r
911 \r
912 function isUsed(oCData,nPos)\r
913 {\r
914         var oUsed=oCData.oUsedItems;\r
915         while(oUsed&&oUsed.nB<=nPos)\r
916         {\r
917                 if(oUsed.nE>=nPos) return true;\r
918                 oUsed=oUsed.oN;\r
919         }\r
920         return false;\r
921 }\r
922 \r
923 function getKByIdx(oCData,nB)\r
924 {\r
925         var nRelPos=nB-(oCData.nTotal-oCData.nNum);\r
926         var aIKs=oCData.aKs;\r
927         if(nRelPos>=0&&aIKs&&nRelPos<aIKs.length)\r
928         {\r
929                 var oK=null;\r
930                 do{\r
931                         oK=aIKs[nRelPos++];\r
932                 }       \r
933                 while((oK.nType==3||isUsed(oCData,nRelPos-1))&&nRelPos<aIKs.length);\r
934                 if(oK.nType!=3)\r
935                 {\r
936                         return oK.sName;\r
937                 }\r
938                 else{\r
939                         nRelPos=nB-(oCData.nTotal-oCData.nNum)-1;\r
940                         if(nRelPos>=0)\r
941                         {\r
942                                 do{\r
943                                         oK=aIKs[nRelPos--];\r
944                                 }\r
945                                 while((oK.nType==3||isUsed(oCData,nRelPos+1))&&nRelPos>=0);\r
946                         }\r
947                         if(oK.nType!=3)\r
948                         {\r
949                                 return oK.sName;\r
950                         }\r
951                 }\r
952         }\r
953         return null;\r
954 }\r
955 \r
956 function loadData2(sFileName)\r
957 {\r
958         disEvt();\r
959         if(gbXML)\r
960                 loadDataXML(sFileName);\r
961         else\r
962                 loadData(sFileName);\r
963         enEvt();\r
964 }\r
965 \r
966 function projReady(aChunk)\r
967 {\r
968         gaChunks[gnLoad++]=aChunk;\r
969         var len=aChunk.length;\r
970         var nTotal=0;\r
971         if(len>0)\r
972                 nTotal=aChunk[len-1].nTotal;\r
973         gnItems+=nTotal;\r
974         if(nTotal>gnMaxItems)\r
975         {\r
976                 gnMaxItems=nTotal;\r
977                 gnRef=gnLoad-1;\r
978         }\r
979         setTimeout("writeDataIFrame();",1);\r
980 }\r
981 \r
982 function writeFakeItems()\r
983 {\r
984         disEvt();\r
985         gnUHeight=15;\r
986         var sHTML=getFakeItemsHTMLbyCount(0,gnItems);\r
987         document.body.insertAdjacentHTML("beforeEnd",sHTML);\r
988         var obj=getH6ById(0);\r
989         if (document.body != null)\r
990         {\r
991                 gnVisible=Math.ceil(document.body.clientHeight/gnUHeight);\r
992         }\r
993         gaFakes[0]=new fakeItemsArea(0,gnItems,"",getEndString(),obj);\r
994         enEvt();\r
995 }\r
996 \r
997 function getEndString()\r
998 {\r
999         var sBC=getBiggestChar();\r
1000         return sBC+sBC+sBC+sBC+sBC+sBC+sBC+sBC;\r
1001 }\r
1002 \r
1003 function getUnitIdx(nScrl,nHeight)\r
1004 {\r
1005         if(gaFakes.length==0)\r
1006         {\r
1007                 markEnd();\r
1008                 return;\r
1009         }\r
1010         var nB=0;\r
1011         var nE=gaFakes.length-1;\r
1012         var nM=-1;\r
1013         var nTop=0;\r
1014         var nBtm=0;\r
1015         var bF=false;\r
1016         do{\r
1017                 nM=(nB+nE)>>1;\r
1018                 nBtm=gaFakes[nM].getBtm();\r
1019                 nTop=gaFakes[nM].getTop();\r
1020                         \r
1021                 if(nTop>=nScrl+nHeight)\r
1022                         nE=nM-1;\r
1023                 else if(nBtm<nScrl)\r
1024                         nB=nM+1;\r
1025                 else{\r
1026                         bF=true;\r
1027                         break;\r
1028                 }\r
1029         }while(nE>=nB);\r
1030         if(bF)\r
1031         {\r
1032                 if(nTop>=nScrl){\r
1033                         gsSKA=gaFakes[nM].sKA;\r
1034                         gsSKB=null;\r
1035                         gnNeeded=Math.ceil((nHeight-nTop+nScrl)/gnUHeight);\r
1036                         gnIns=gaFakes[nM].nB;\r
1037                         checkReady();\r
1038                 }\r
1039                 else if(nBtm<=nScrl+nHeight){\r
1040                         gsSKB=gaFakes[nM].sKB;\r
1041                         gsSKA=null;\r
1042                         gnNeeded=Math.ceil((nBtm-nScrl+gnScrlMgn)/gnUHeight);\r
1043                         gbNeedCalc=true;\r
1044                         checkReady();\r
1045                 }\r
1046                 else{\r
1047                         gnNeeded=gnVisible;\r
1048                         var nUnitIdx=gaFakes[nM].nB+Math.floor((nScrl-nTop)/gnUHeight);\r
1049                         if (!showItemsInEvaluation(nUnitIdx))\r
1050                         {\r
1051                                 gsSKA=gaFakes[nM].sKA;\r
1052                                 gsSKB=null;\r
1053                                 gnNeeded=Math.ceil(nHeight/gnUHeight);\r
1054                                 gnIns=gaFakes[nM].nB;\r
1055                                 checkReady();\r
1056                         }\r
1057                 }\r
1058         }\r
1059         else\r
1060                 markEnd();\r
1061 }\r
1062 \r
1063 function disEvt()\r
1064 {\r
1065         window.onscroll=null;\r
1066         window.onresize=null;\r
1067 }\r
1068 \r
1069 function enEvt()\r
1070 {\r
1071         window.onscroll=window_OnScroll;\r
1072         window.onresize=window_OnResize;\r
1073 }\r
1074 \r
1075 function insertIdxKs(nIns,oHTML,bScrl)\r
1076 {\r
1077         var bRtn=true;\r
1078         disEvt();\r
1079         var nCount=oHTML.nConsumed;\r
1080         var nB=0;\r
1081         var nE=gaFakes.length-1;\r
1082         var nM=-1;\r
1083         var bF=false;\r
1084         do{\r
1085                 nM=(nB+nE)>>1;\r
1086                 if(gaFakes[nM].nB>nIns)\r
1087                         nE=nM-1;\r
1088                 else if(gaFakes[nM].nB+gaFakes[nM].nNum<=nIns)\r
1089                         nB=nM+1;\r
1090                 else{\r
1091                         bF=true;\r
1092                         break;\r
1093                 }\r
1094         }while(nE>=nB);\r
1095         if(bF)\r
1096         {\r
1097                 var oFIA=gaFakes[nM];\r
1098                 var nOffsetTop=oFIA.getTop();\r
1099                 var nOffsetBottom=oFIA.getBtm();\r
1100                 var nDelta=0;\r
1101                 var nHDiff=nIns-oFIA.nB;\r
1102                 var nTDiff=oFIA.nNum+oFIA.nB-(nIns+nCount);\r
1103                 if(nHDiff>0)\r
1104                 {\r
1105                         nDelta=oFIA.setNum(nHDiff);\r
1106                         var sOldKBefore=oFIA.sKB;\r
1107                         oFIA.sKB=oHTML.sFK;\r
1108                         if(nTDiff>0)\r
1109                         {\r
1110                                 var sHTML=getFakeItemsHTMLbyCount(nIns,nTDiff);\r
1111                                 oFIA.insertAdjacentHTML("afterEnd",sHTML);\r
1112                                 var obj=getH6ById(nIns);\r
1113                                 insertItemIntoArray(gaFakes,nM+1,new fakeItemsArea(nIns+nCount,nTDiff,oHTML.sLK,sOldKBefore,obj));\r
1114                         }\r
1115                         oFIA.insertAdjacentHTML("afterEnd",oHTML.sHTML);        \r
1116                         if(bScrl)\r
1117                         {\r
1118                                 if(gbMac&&gbIE4)\r
1119                                 {\r
1120                                         var nScrollPos=nOffsetBottom-nDelta;\r
1121                                         while(document.body.scrollTop!=nScrollPos)\r
1122                                                 document.body.scrollTop=nScrollPos;\r
1123                                 }\r
1124                                 else\r
1125                                         window.scrollTo(0,nOffsetBottom-nDelta);\r
1126                         }\r
1127                 }\r
1128                 else{\r
1129                         oFIA.insertAdjacentHTML("beforeBegin",oHTML.sHTML);\r
1130                         if(bScrl){\r
1131                                 if(gbMac&&gbIE4)\r
1132                                 {\r
1133                                         var nScrollPos=nOffsetTop;\r
1134                                         while(document.body.scrollTop!=nScrollPos)\r
1135                                                 document.body.scrollTop=nScrollPos;\r
1136                                 }\r
1137                                 else\r
1138                                         window.scrollTo(0,nOffsetTop);\r
1139                         }\r
1140                                         \r
1141                         if(nTDiff>0)\r
1142                         {\r
1143                                 oFIA.nB=nIns+nCount;\r
1144                                 nDelta=oFIA.setNum(nTDiff);\r
1145                                 oFIA.sKA=oHTML.sLK;\r
1146                         }       \r
1147                         else{\r
1148                                 gaFakes[nM].setNum(0);\r
1149                                 removeItemFromArray(gaFakes,nM);\r
1150                         }\r
1151                 }\r
1152         }\r
1153         else\r
1154                 bRtn=false;\r
1155         enEvt();\r
1156         return bRtn;\r
1157 }\r
1158 \r
1159 function window_OnScroll()\r
1160 {\r
1161         gnSE++;\r
1162         setTimeout("procScroll();",50); \r
1163 }\r
1164 \r
1165 function procScroll()\r
1166 {\r
1167         if(gnSE==1&&!gbProcess)\r
1168         {\r
1169                 markBegin();\r
1170                 getUnitIdx(document.body.scrollTop,document.body.clientHeight);\r
1171         }\r
1172         gnSE--;\r
1173 }\r
1174 \r
1175 function window_OnResize()\r
1176 {\r
1177         gnRE++;\r
1178         setTimeout("procResize();",50);\r
1179 }\r
1180 \r
1181 function procResize()\r
1182 {\r
1183         if(gnRE==1&&!gbProcess)\r
1184         {\r
1185                 markBegin();\r
1186                 gnVisible=Math.ceil(document.body.clientHeight/gnUHeight);\r
1187                 if(gnIns==-1)\r
1188                         getUnitIdx(document.body.scrollTop,document.body.clientHeight);\r
1189         }\r
1190         gnRE--;\r
1191 }\r
1192 \r
1193 function getChunkByIdx(nIdx,nPosition)\r
1194 {\r
1195         var oCData=null;\r
1196         if(nIdx<gaChunks.length)\r
1197         {\r
1198                 var len=gaChunks[nIdx].length;\r
1199                 if(len>0)\r
1200                 {\r
1201                         var nB=0;\r
1202                         var nE=len-1;\r
1203                         var bF=false;\r
1204                         do{\r
1205                                 var nM=(nB+nE)>>1;\r
1206                                 if(nPosition<gaChunks[nIdx][nM].nTotal)\r
1207                                 {\r
1208                                         bF=true;\r
1209                                         nE=nM;\r
1210                                 }\r
1211                                 else\r
1212                                         nB=nM+1;\r
1213                         }while(nE>nB);\r
1214                         if(bF)\r
1215                                 oCData=gaChunks[nIdx][nE];\r
1216                         else if(nPosition<gaChunks[nIdx][nB].nTotal)\r
1217                                 oCData=gaChunks[nIdx][nB];\r
1218                 }\r
1219         }\r
1220         return oCData;\r
1221 }\r
1222 \r
1223 function getChunkedData(nIdx,bDown,sK)\r
1224 {\r
1225         var oCData=null;\r
1226         var nCandId=-1;\r
1227         if(nIdx<gaChunks.length)\r
1228         {\r
1229                 var len=gaChunks[nIdx].length;\r
1230                 if(len>0)\r
1231                 {\r
1232                         var nB=0;\r
1233                         var nE=len-1;\r
1234                         var bF=false;\r
1235                         do{\r
1236                                 var nM=(nB+nE+(bDown?0:1))>>1;\r
1237                                 if(bDown)\r
1238                                 {\r
1239                                         if(compare(sK,gaChunks[nIdx][nM].sEK)<0)\r
1240                                         {\r
1241                                                 bF=true;\r
1242                                                 nE=nM;\r
1243                                         }\r
1244                                         else\r
1245                                                 nB=nM+1;\r
1246                                 }\r
1247                                 else\r
1248                                 {\r
1249                                         if(compare(sK,gaChunks[nIdx][nM].sBK)>0)\r
1250                                         {\r
1251                                                 bF=true;\r
1252                                                 nB=nM;\r
1253                                         }\r
1254                                         else\r
1255                                                 nE=nM-1;\r
1256                                 }\r
1257                         }while(nE>nB);\r
1258                         if(bF)\r
1259                         {\r
1260                                 if(bDown)\r
1261                                         nCandId=nE;\r
1262                                 else\r
1263                                         nCandId=nB;\r
1264                         }\r
1265                         else\r
1266                         {\r
1267                                 if(bDown)\r
1268                                 {\r
1269                                         if(gaChunks[nIdx].length>nB&&compare(sK,gaChunks[nIdx][nB].sEK)<0)\r
1270                                                 nCandId=nB;\r
1271                                         else\r
1272                                                 nCandId=gaChunks[nIdx].length-1;\r
1273                                 }\r
1274                                 else\r
1275                                 {\r
1276                                         if(0<=nE&&compare(sK,gaChunks[nIdx][nE].sBK)>0)\r
1277                                                 nCandId=nE;\r
1278                                         else\r
1279                                                 nCandId=0;\r
1280                                 }\r
1281                         }\r
1282                         return gaChunks[nIdx][nCandId];\r
1283                 }\r
1284         }\r
1285         return null;\r
1286 }\r
1287 \r
1288 function findCK()\r
1289 {\r
1290         if(gsCK!=null)\r
1291         {\r
1292                 gsSKA=gsCK;\r
1293                 gbFindCK=true;\r
1294                 gnNeeded=1;\r
1295                 markBegin();\r
1296                 checkReady();\r
1297         }\r
1298 }\r
1299 \r
1300 function writeLoadingDiv(nIIdx)\r
1301 {\r
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>";\r
1303 }\r
1304 \r
1305 var gbWhHost=true;