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