File:  [LON-CAPA] / rat / client / Attic / code.html
Revision 1.64: download - view: text, annotated - select for diffs
Tue Feb 25 14:42:02 2003 UTC (21 years, 3 months ago) by www
Branches: MAIN
CVS tags: version_1_2_X, version_1_2_1, version_1_2_0, version_1_1_X, version_1_1_99_5, version_1_1_99_4, version_1_1_99_3, version_1_1_99_2, version_1_1_99_1, version_1_1_99_0, version_1_1_3, version_1_1_2, version_1_1_1, version_1_1_0, version_1_0_99_3, version_1_0_99_2, version_1_0_99_1, version_1_0_99, version_1_0_3, version_1_0_2, version_1_0_1, version_1_0_0, version_0_99_5, version_0_99_4, version_0_99_3, version_0_99_2, version_0_99_1, version_0_99_0, conference_2003, HEAD
Bugs #1249, #1250
Parameters to the same resource in objparms kept appending every time
finishload() was called, which was sort of intentional for ease of coding,
and no problem whatsoever for small maps. Blew up for large maps.

    1: <html>
    2: 
    3: <!--
    4: The LearningOnline Network
    5: Resource Assembly Tool
    6: //
    7: // $Id: code.html,v 1.64 2003/02/25 14:42:02 www Exp $
    8: //
    9: // Copyright Michigan State University Board of Trustees
   10: //
   11: // This file is part of the LearningOnline Network with CAPA (LON-CAPA).
   12: //
   13: // LON-CAPA is free software; you can redistribute it and/or modify
   14: // it under the terms of the GNU General Public License as published by
   15: // the Free Software Foundation; either version 2 of the License, or
   16: // (at your option) any later version.
   17: //
   18: // LON-CAPA is distributed in the hope that it will be useful,
   19: // but WITHOUT ANY WARRANTY; without even the implied warranty of
   20: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   21: // GNU General Public License for more details.
   22: //
   23: // You should have received a copy of the GNU General Public License
   24: // along with LON-CAPA; if not, write to the Free Software
   25: // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   26: //
   27: // /home/httpd/html/adm/gpl.txt
   28: //
   29: // http://www.lon-capa.org/
   30: //
   31: YEAR 2000
   32: 7/23,7/24,7/26,
   33: 8/11,8/14,8/18,8/19,8/20,8/21,8/22,8/25,8/26,8/28,8/30,8/31,
   34: 9/1,9/2,9/4,9/5,9/6,
   35: 1/7,1/8,1/10,1/14,1/15,1/16,1/21,1/22,1/29,1/30,1/31,
   36: 2/2,2/3,2/10,2/12,2/13,2/14,2/15,2/17,2/18,2/19,2/20,2/21,2/22,
   37: 5/2,5/3,5/4,5/5,5/6,5/8,5/9,5/13,5/18,5/20,5/22,5/24,5/25,
   38: 6/7,6/8,6/9,6/10,6/12,6/15,7/4,7/26,7/28,7/31,8/5,8/19,8/24,
   39: YEAR 2001
   40: 01/17/01,03/03,03/05 Gerd Kortemeyer
   41: 04/20 Gerd Kortemeyer
   42: 06/11,06/25,06/27,06/28,06/29,07/04 Gerd Kortemeyer
   43: 03/01/02 Matthew Hall
   44: -->
   45: 
   46: 
   47: <head>
   48: <script language="JavaScript">
   49: 
   50: var row=new Array();
   51: var maxrow=-1;
   52: var col=new Array();
   53: var maxcol=-1;
   54: 
   55: var colmap=new Array();
   56: var colmap2=new Array();
   57: var colmap3=new Array();
   58: var colmap4=new Array();
   59: var colmap5=new Array();
   60: var colmap6=new Array();
   61: var obj=new Array();
   62: var objcont=new Array();
   63: var objparms=new Array();
   64: var objlinks=new Array();
   65: var rowcont=new Array();
   66: var rowtype=new Array();
   67: var coltype=new Array();
   68: var rcol=new Array();
   69: var rrow=new Array();
   70: var cw=new Array();
   71: var rh=new Array();
   72: 
   73: var undostack=new Array();
   74: var undopointer=0;
   75: var stored=0;
   76: var editmode=0;
   77: var notclear=0;
   78: var linkmode=0;
   79: var lastinfo='';
   80: var graphdef='no';
   81: var mode='';
   82: var mainrun=0;
   83: var tablemode=0;
   84: var mostrecent=0;
   85: var zscale=3;
   86: 
   87: var disrows=0;
   88: var discols=0;
   89: 
   90: var finishdone=0;
   91: var tim=0;
   92: var funny='|';
   93: var reqaction='';
   94: var canceltim;
   95: 
   96: var expense=0;
   97: 
   98: var data1=new Array(1024);
   99: var data2=new Array(1024);
  100: var data3=new Array(1024);
  101: var data4=new Array(1024);
  102: var data5=new Array(1024);
  103: 
  104: var inf;
  105: var srch;
  106: var srchflag=-1; // 1 means currently open
  107:                  // 0 means closed (but has been open)
  108:                  // -1 means never yet opened/defined
  109: var srchmode='';
  110: 
  111: var idx;
  112: var idxflag=-1; // 1 means currently open
  113:                  // 0 means closed (but has been open)
  114:                  // -1 means never yet opened/defined
  115: var idxmode='';
  116: 
  117: var copydx;
  118: var copydxflag=-1; // 1 means currently open
  119:                  // 0 means closed (but has been open)
  120:                  // -1 means never yet opened/defined
  121: var copydxmode='';
  122: 
  123: var parm;
  124: var parmflag=-1; // 1 means currently open
  125:                  // 0 means closed (but has been open)
  126:                  // -1 means never yet opened/defined
  127:                  
  128: var iconpath='/adm/lonIcons/';
  129: var raticons='/adm/rat/';
  130: 
  131: function testfunction() {
  132:    inf.document.forms.resinfo.elements.t.value="ABC";
  133: }
  134: 
  135: // ------------------------------------------------ Insert a row into the table
  136: function insertrow(j,ex1,ex2) {
  137:    var kj;
  138:    stored=0;
  139:    expense++; expense++;
  140:    objects1='';
  141:    objects2='';
  142:    for (kj=0;kj<=maxrow;kj++) {
  143:       if ( row[kj]==j )   { objects1=rowcont[kj]; }
  144:       if ( row[kj]==j+1 ) { objects2=rowcont[kj]; } 
  145:       if ( row[kj]>j ) { row[kj]++; } 
  146:    }
  147:    maxrow++;
  148:    row[maxrow]=j+1;
  149:    rowcont[maxrow]=':';
  150:    colcover=':'+ex1+':'+ex2+':';
  151:    objects=objects1+':'+objects2;
  152:    data1=objects.split(':');
  153:    for (kj=0;kj<data1.length;kj++) {
  154:      if ((data1[kj]!='') && (typeof(data1[kj])!="undefined")) {
  155:        thisisobj=obj[data1[kj]];
  156:        thisobjtype=thisisobj.split('&')[0];
  157:        if (thisobjtype=='v') {
  158:           if (rowcont[maxrow].indexOf(':'+data1[kj]+':',0)==-1) {
  159:              thisobjcol=thisisobj.split('&')[1];
  160:              if (colcover.indexOf(':'+thisobjcol+':',0)==-1) {
  161:                 colcover+=thisobjcol+':';  
  162:                 rowcont[maxrow]+=data1[kj]+':';
  163:              }
  164:           }
  165:        }
  166:        if (thisobjtype=='h') {
  167:              updown=thisisobj.split('&')[4];
  168:              leftupdown=updown.split(':')[0];
  169:              rightupdown=updown.split(':')[1];          
  170:              thisobjdest=thisisobj.split('&')[3];
  171:              thisobjtofrom=thisisobj.split('&')[2];
  172:              thisobjfrom=thisobjtofrom.split(':')[0];
  173:              thisobjto=thisobjtofrom.split(':')[1];
  174:              thisobjdir=col[thisobjto]-col[thisobjfrom];
  175:              thisobjrow=row[thisisobj.split('&')[1]];
  176:              topbottom=thisobjrow-j-1;
  177:              newobj='';
  178:              if (leftupdown==-1) {
  179:                 if (topbottom<0) {
  180:                    if (thisobjdir<0) {
  181:                       newobj='v&'+thisobjto+'&'+thisobjdest+'&-1';
  182:                    } else {
  183:                       newobj='v&'+thisobjfrom+'&'+thisobjdest+'&1';
  184:                    }
  185:                 }
  186:              } else {
  187:                 if (topbottom>0) {
  188:                    if (thisobjdir<0) {
  189:                       newobj='v&'+thisobjto+'&'+thisobjdest+'&1';
  190:                    } else {
  191:                       newobj='v&'+thisobjfrom+'&'+thisobjdest+'&-1';
  192:                    }
  193:                 }
  194:              }
  195:              if ((newobj!='') && (typeof(newobj)!="undefined")) {
  196:                 thisobjcol=newobj.split('&')[1];
  197:                 if (colcover.indexOf(':'+thisobjcol+':',0)==-1) {
  198:                    colcover+=thisobjcol+':';  
  199:                    rowcont[maxrow]+=obj.length+':';
  200:                    obj[obj.length]=newobj;
  201:                 }
  202:              }
  203:              newobj=''; 
  204:              if (rightupdown==-1) {
  205:                 if (topbottom<0) {
  206:                    if (thisobjdir<0) {
  207:                       newobj='v&'+thisobjfrom+'&'+thisobjdest+'&1';
  208:                    } else {
  209:                       newobj='v&'+thisobjto+'&'+thisobjdest+'&-1';
  210:                    }
  211:                 }
  212:              } else {
  213:                 if (topbottom>0) {
  214:                    if (thisobjdir<0) {
  215:                       newobj='v&'+thisobjfrom+'&'+thisobjdest+'&-1';
  216:                    } else {
  217:                       newobj='v&'+thisobjto+'&'+thisobjdest+'&1';
  218:                    }
  219:                 }
  220:              }
  221:              if ((newobj!='') && (typeof(newobj)!="undefined")) {
  222:                 thisobjcol=newobj.split('&')[1];
  223:                 if (colcover.indexOf(':'+thisobjcol+':',0)==-1) {
  224:                    colcover+=thisobjcol+':';  
  225:                    rowcont[maxrow]+=obj.length+':';
  226:                    obj[obj.length]=newobj;
  227:                 }
  228:              } 
  229:        }
  230:      }
  231:    }
  232:    if (rowcont[maxrow]!=':') {
  233:       rowcont[maxrow]=rowcont[maxrow].substring(1,rowcont[maxrow].length-1);
  234:    } else {
  235:       rowcont[maxrow]='';
  236:    }
  237: }
  238: 
  239: // --------------------------------------------- Creates a new condition object
  240: function newcondition(content,type) {
  241:    var ko;
  242:    stored=0;
  243:    ko=obj.length;
  244:    obj[ko]='c';
  245:    objcont[ko]=content+':'+type+':cond';
  246:    return ko;
  247: }
  248: 
  249: // ---------------------------------------------- Creates a new resource object
  250: function newresource(rid,cid,text,url,ext,type) {
  251:    stored=0;
  252:    objcont[addobj(rid,'b&'+rid+'&'+cid+':0:0:0')]=
  253:     text+':'+url+':'+ext+':'+type+':res';
  254: }
  255: 
  256: 
  257: // -------------------------------- Insert a condition into a port of an object
  258: function insertcond(obj1,portnr,cond) {
  259:    var k;
  260:    stored=0;
  261:    data1=obj[obj1].split('&');
  262:    for (k=2;k<data1.length;k++) {
  263:        data2=data1[k].split(':');
  264:        if (data2[0]==portnr) {
  265:           data2[3]=cond;
  266:           data1[k]=data2.join(':');
  267:        }
  268:    }
  269:    obj[obj1]=data1.join('&');
  270: }
  271:  
  272: // --------------------------------------------- Insert a column into the table
  273: // Inserts a new table column after table column j
  274: function insertcol(j) {
  275:    var kj;
  276:    stored=0;
  277:    for (kj=0;kj<=maxcol;kj++) {
  278:       if ( col[kj]>j ) { col[kj]++; } 
  279:    }
  280:    maxcol++;
  281:    expense++; expense++;
  282:    col[maxcol]=j+1;
  283: }
  284:      
  285: // --------------------------------------------------------------- Find the row
  286: function findrow(jid) {
  287:    var j;
  288:    for (j=0;j<=maxrow;j++) { if (row[j]==jid) { return j; } }
  289:    return -1;
  290: }
  291: 
  292: // --------------------------------------------------------------- Find the col
  293: function findcol(jid) {
  294:    var j;
  295:    for (j=0;j<=maxcol;j++) { if (col[j]==jid) { return j; } }
  296:    return -1;
  297: }
  298: 
  299: // -------------------------------------------------------------- Map out a row
  300: //
  301: // b&rowID&colID:inObj:outObj:outCond&...
  302: // h&rowID&incolID:outcolID&inObj:outObj&inupdown:outupdown
  303: // v&colID&inObj:outObj&updown
  304: //
  305: // returns middle (col number of middle of obj1)
  306: // sets colmap (map of cols with object numbers)
  307: function maprow (jid,obj1,ign) {
  308:  var j; var k; var left; var right; var middle;
  309:  middle=-1;
  310:  for (j=0;j<=maxcol;j++) { colmap[j]=0; }
  311:  if ((rowcont[jid]!='') && (typeof(rowcont[jid])!="undefined")) {
  312:    data2=rowcont[jid].split(':');
  313:    for (j=0;j<data2.length;j++) {
  314:       data3=obj[data2[j]].split('&');
  315:       if (data3[0]=='b') {
  316:          left=maxcol;
  317:          right=0;
  318:          for (k=2;k<data3.length;k++) {
  319:             thiscol=col[data3[k].split(':')[0]];
  320:             if (thiscol<left)  { left=thiscol;  }
  321:             if (thiscol>right) { right=thiscol; }
  322:          }
  323:       }
  324:       if (data3[0]=='h') {
  325:          data4=data3[2].split(':');
  326:          if (col[data4[1]]>col[data4[0]]) {
  327:             left=col[data4[0]];
  328:             right=col[data4[1]];
  329:          } else {
  330:             right=col[data4[0]];
  331:             left=col[data4[1]];
  332:          }
  333:       }
  334:       if (data3[0]=='v') { left=col[data3[1]]; right=left; }
  335:       if (data2[j]==obj1) { middle=Math.round((left+right)/2); }
  336:       if ((data3[0]!='h') || (ign!=1)) {
  337:          for (k=left;k<=right;k++) { colmap[k]=data2[j]; }
  338:       } else {
  339:          colmap[left]=data2[j];
  340:          colmap[right]=data2[j];
  341:       }
  342:    }
  343:  }
  344:  return middle;
  345: }
  346: 
  347: // --------------------------------------------------------- Find hole in a row
  348: // jid: rowID
  349: // kid: colID, find point close to this
  350: // dkid: destination colID
  351: // returns colID
  352: function comingthru (jid,kid,dkid) {
  353:    var k;
  354:    maprow(jid,-1,1);
  355:    knum=col[kid];
  356:    if (colmap[knum]==0) { return kid; }
  357:    right=-1;
  358:    for (k=knum+1;(k<colmap.length) && (right==-1);k++) {
  359:       if ((right==-1) && (colmap[k]!=colmap[knum])) { right=k; }
  360:    }
  361:    left=-1;
  362:    for (k=knum-1;(k>=0) && (left==-1);k--) {
  363:       if ((left==-1) && (colmap[k]!=colmap[knum])) { left=k; }
  364:    }
  365:    kup=-1;
  366: 
  367:    if ((left==-1) && (right==-1)) { right=colmap.length; }
  368: 
  369:    dknum=col[dkid];
  370:    dleft=left-dknum;
  371:    dright=right-dknum;
  372: 
  373:    if (dleft<0) { dleft=-dleft; }
  374:    if (dright<0) { dright=-dright; }
  375:    if ((dright<=dleft) && (right!=-1)) { kup=right; }
  376:    if ((dright>=dleft) && (left!=-1)) { kup=left; }
  377:    if (colmap[kup]==0) { return findcol(kup); }
  378: 
  379:    if (kup==right) { kup--; }
  380: 
  381:    if (kup<0) { 
  382:       insertcol(-1);
  383:       insertcol(0);
  384:    } else {
  385:       insertcol(kup);
  386:    }
  387:    return maxcol;
  388: }
  389: 
  390: // ----------------------------------------------------- Insert port into block
  391: // obj1: object number
  392: // d: direction from middle (>0: right, <0 left)
  393: // inout: in or out port (1: in, 2: out)
  394: // linkobj: object that the link goes to/comes from
  395: // sets inrow or outrow
  396: // return column
  397: function insertport (obj1,d,inout,linkobj) {
  398:    var k; var port; var revport;
  399:    stored=0;
  400:    data1=obj[obj1].split('&');
  401:    middle=maprow(data1[1],obj1,0);
  402:    if (inout==1) {
  403:       inrow=data1[1];
  404:    } else {
  405:       outrow=data1[1];
  406:    }
  407:    if (d>0) {
  408:       for (k=middle;(colmap[k]==obj1) && (k<colmap.length);k++) { data3[k]=0; }
  409:    } else {
  410:       for (k=middle;(colmap[k]==obj1) && (k>=0);k--) { data3[k]=0; }
  411:    }
  412:    for (k=2;k<data1.length;k++) { 
  413:       data2=data1[k].split(':');
  414:       data3[col[data2[0]]]=data2[inout];
  415:    }
  416:    port=-1;
  417:    if (d>0) {
  418:       for (k=middle;(colmap[k]==obj1) && (k<colmap.length);k++) {
  419:          if ((data3[k]==0) && (colmap[k]==obj1) && (port==-1)) { port=k; }
  420:       }
  421:    } else {
  422:       for (k=middle;(colmap[k]==obj1) && (k>=0);k--) {
  423:          if ((data3[k]==0) && (colmap[k]==obj1) && (port==-1)) { port=k; } 
  424:       }
  425:    }
  426:    if (port==-1) {
  427:       if (colmap[k]==0) {
  428:          revport=findcol(k);
  429:          if (inout==1) {
  430:             data1[data1.length]=revport+":"+linkobj+":0:0";
  431:          } else {
  432:             data1[data1.length]=revport+":0:"+linkobj+":0";
  433:          }
  434:       } else {
  435:          if (d>0) {
  436:             insertcol(k-1);
  437:          } else {
  438:             insertcol(k);
  439:          }
  440:          revport=maxcol;
  441:          if (inout==1) {
  442:             data1[data1.length]=revport+":"+linkobj+":0:0";
  443:          } else {
  444:             data1[data1.length]=revport+":0:"+linkobj+":0";
  445:          }
  446:       }
  447:    } else {
  448:       portfound=-1;
  449:       for (k=2;k<data1.length;k++) { 
  450:          data2=data1[k].split(':');
  451:          if (col[data2[0]]==port) {
  452:             data2[inout]=linkobj;
  453:             data1[k]=data2.join(':');
  454:             portfound=1;
  455:          }
  456:       }
  457:       revport=findcol(port);
  458:       if (portfound==-1) {
  459:          if (inout==1) {
  460:             data1[data1.length]=revport+":"+linkobj+":0:0";
  461:          } else {
  462:             data1[data1.length]=revport+":0:"+linkobj+":0";
  463:          }
  464:       }
  465:    }
  466:    obj[obj1]=data1.join('&');
  467:    return revport;
  468: }
  469: 
  470: // ---------------------------- Make a new object and add it to the row content
  471: // returns object number of generated object
  472: function addobj(kjid,objs) {
  473:    stored=0;
  474:    expense++;
  475:    if ((rowcont[kjid]!='') && (typeof(rowcont[kjid])!="undefined")) { 
  476:       rowcont[kjid]+=':'; 
  477:    }
  478:    rowcont[kjid]+=obj.length;
  479:    obj[obj.length]=objs;
  480:    return obj.length-1;
  481: } 
  482: 
  483: // ---------------------------------------- Make horizontal connection for hrid
  484: // hoffs=-1: this line goes on top of hrid
  485: function horizontal(hrid,hoffs,hfcol,htcol,hdest,hends) {
  486:    hcrid=-1;
  487:    if (hoffs==-1) {
  488:       hbrid=findrow(row[hrid]-1);
  489:    } else {
  490:       hbrid=findrow(row[hrid]+1);
  491:    }
  492:    if (hbrid!=-1) {
  493:       maprow(hbrid,-1,0);
  494:       hcrid=hbrid;
  495:       if (col[hfcol]>col[htcol]) { left=col[htcol]; right=col[hfcol]; }
  496:                             else { right=col[htcol]; left=col[hfcol]; }
  497:       if (colmap[left]!=0) {
  498:          hcrid=-1;
  499:       } else {
  500:          if (colmap[right]!=0) {
  501:             hcrid=-1;
  502:          } else {
  503:             for (kh=left+1;kh<right;kh++) {
  504:                if (colmap[kh]!=0) { 
  505:                   if (obj[colmap[kh]].split('&')[0]!='v') { hcrid=-1; }
  506:                }
  507:             }
  508:          }
  509:       }
  510:    }
  511:    if (hcrid==-1) {
  512:       insertrow(row[hrid]+hoffs,hfcol,htcol);
  513:       addobj(maxrow,'h&'+maxrow+'&'+hfcol+':'+htcol+'&'+hdest+'&'+hends);
  514:    } else {
  515:       addobj(hcrid,'h&'+hcrid+'&'+hfcol+':'+htcol+'&'+hdest+'&'+hends);
  516:    }   
  517: }
  518: 
  519: // --------------------------------------- Deletes all references to object obj
  520: function delobj(obj1) {
  521:    var k;
  522:    stored=0;
  523:    for (k=0;k<rowcont.length;k++) {
  524:       data4=rowcont[k].split(':');
  525:       rowcont[k]='';
  526:       for (k2=0;k2<data4.length;k2++) {
  527:          if (data4[k2]!=obj1) {
  528:             if ((rowcont[k]!='') && (typeof(rowcont[k])!="undefined")) { 
  529:                rowcont[k]+=':'; 
  530:             } 
  531:             rowcont[k]+=data4[k2]; 
  532:          }
  533:       }
  534:    }
  535:    obj[obj1]='';
  536: }
  537: 
  538: // --------------------------------------------------------- Garbage collection
  539: function cleanup () {
  540:    message("Garbage Collection");
  541:    var j,kj,i;
  542:    disrows=0;
  543:    discols=0;
  544:    var emptyspots=0;
  545: 
  546:    for (kj=0;kj<=maxcol;kj++) { data1[kj]=0; }
  547:    for (kj=0;kj<=maxrow;kj++) {
  548:      rowtype[kj]=0;
  549:      if ((rowcont[kj]!='') && (typeof(rowcont[kj])!="undefined")) {
  550:        data2=rowcont[kj].split(':');
  551:        for (j=0;j<data2.length;j++) {
  552:          if (obj[data2[j]].substring(0,2)=='e&') {
  553:             rowtype[kj]=2;
  554:             data1[(obj[data2[j]].split('&'))[1]]=2;
  555:          }
  556:        }
  557:        maprow(kj,-1,1);
  558:        for (j=0;j<=maxcol;j++) {
  559:            if (colmap[j]!=0) {
  560:               if (data1[j]==0) { data1[j]=1; }
  561:               if (rowtype[kj]==0) {
  562:                  if (obj[colmap[j]].substring(0,2)!='v&') { 
  563:                     rowtype[kj]=1; 
  564:                  }
  565:               }
  566:               if (obj[colmap[j]].substring(0,2)=='b&') { 
  567:                  data1[j]=2;
  568:                  if (colmap[maxcol]==0) { emptyspots++; }
  569:                  rowtype[kj]=2;
  570:               }  
  571:            }
  572:        }
  573:      }
  574:    }
  575:    for (j=0;j<=maxcol;j++) { 
  576:       coltype[j]=data1[col[j]];
  577:       if (coltype[j]!=0) { discols+=1; } 
  578:    }
  579:    for (j=0;j<=maxrow;j++) {
  580:        if (rowtype[j]==2) { disrows+=3; }
  581:        if (rowtype[j]==1) { disrows+=1; }
  582:    }
  583:    if (emptyspots==0) {
  584:       insertrow(maxrow);
  585:       insertcol(maxcol);
  586:       addobj(maxrow,'e&'+maxcol);
  587:       discols++;
  588:       disrows++;
  589:       rowtype[maxrow]=2;
  590:       coltype[maxcol]=2;
  591:    }
  592: }
  593: 
  594: // -------------------------------------------- Delete a condition from a block
  595: function delcond(obj1,colid) {
  596:    var k;
  597:    stored=0;
  598:    data3=obj[obj1].split('&');
  599:    obj[obj1]=data3[0]+'&'+data3[1];
  600:    for (k=2;k<data3.length;k++) {
  601:       data4=data3[k].split(':');
  602:       if (data4[0]==colid) { 
  603:          data4[3]=0; 
  604:          objlinks[data4[2]]=(objlinks[data4[2]].split(':'))[0]+':'+
  605:                             (objlinks[data4[2]].split(':'))[1]+':0';
  606:       }
  607:       if ((data4[1]!=0) || (data4[2]!=0) || (data3.length==3)) {
  608:          obj[obj1]+='&'+data4[0]+':'+data4[1]+':'+data4[2]+':'+data4[3];
  609:       }
  610:    }
  611: }
  612:     
  613: // ----------------------------------------- Creates a new condition in a block
  614: function crecond(obj1,colid,condtext,condtype) {
  615:    var k;
  616:    data3=obj[obj1].split('&');
  617:    obj[obj1]=data3[0]+'&'+data3[1];
  618:    for (k=2;k<data3.length;k++) {
  619:       data4=data3[k].split(':');
  620:       if (data4[0]==colid) { 
  621:          data4[3]=newcondition(condtext,condtype);
  622:          data2=objlinks[data4[2]].split(':');
  623:          objlinks[data4[2]]=data2[0]+':'+data2[1]+':'+data4[3];
  624:       }
  625:       if ((data4[1]!=0) || (data4[2]!=0) || (data3.length==3)) {
  626:          obj[obj1]+='&'+data4[0]+':'+data4[1]+':'+data4[2]+':'+data4[3];
  627:       }
  628:    }
  629: }
  630: 
  631: // ---------------------------------------- Delete the path between two objects
  632: // deletes the link linknr
  633: // h&rowID&incolID:outcolID&inObj:outObj&inupdown:outupdown
  634: // v&colID&inObj:outObj&updown
  635: function dellink (linknr) {
  636:   var k; var obj1; var obj2;
  637:   stored=0;
  638:   if ((objlinks[linknr]!='') && (typeof(objlinks[linknr])!="undefined")) {
  639:    data3=objlinks[linknr].split(':');
  640:    obj1=data3[0];
  641:    obj2=data3[1];
  642:    data3=obj[obj1].split('&');
  643:    obj[obj1]=data3[0]+'&'+data3[1];
  644:    for (k=2;k<data3.length;k++) {
  645:       data4=data3[k].split(':');
  646:       if (data4[2]==linknr) { data4[2]=0; data4[3]==0; }
  647:       if ((data4[1]!=0) || (data4[2]!=0) || (data3.length==3)) {
  648:          obj[obj1]+='&'+data4[0]+':'+data4[1]+':'+data4[2]+':'+data4[3];
  649:       }
  650:    }
  651:    data3=obj[obj2].split('&');
  652:    obj[obj2]=data3[0]+'&'+data3[1];
  653:    for (k=2;k<data3.length;k++) {
  654:       data4=data3[k].split(':');
  655:       if (data4[1]==linknr) { data4[1]=0; }
  656:       if ((data4[1]!=0) || (data4[2]!=0) || (data3.length==3)) {
  657:          obj[obj2]+='&'+data4[0]+':'+data4[1]+':'+data4[2]+':'+data4[3];
  658:       }
  659:    }
  660:    for (k=0;k<obj.length;k++) {
  661:      if ((obj[k]!='') && (typeof(obj[k])!="undefined")) {
  662:        data3=obj[k].split('&');
  663:        if (((data3[0]=='v') || (data3[0]=='h')) && 
  664:            (data3[data3.length-2]==linknr)) {
  665:              delobj(k);
  666:        }
  667:      }
  668:    }
  669:    objlinks[linknr]='';
  670:   }     
  671: }
  672: 
  673: // ----------------------------------------------------------- Join two objects
  674: // Links obj1 with obj2, creates new objlink, marks all elements with number
  675: function joinres (obj1,obj2,cond) {
  676:    stored=0;
  677:    var minexpense;
  678:    var best;
  679: 
  680:    expense=0;
  681:    tryjoin(obj1,obj2,cond,1,1);
  682:    minexpense=expense;
  683:    best=0;
  684:    finishload();
  685: 
  686:    expense=0;
  687:    tryjoin(obj1,obj2,cond,1,-1);
  688:    if (expense<minexpense) {
  689:       best=1;
  690:       minexpense=expense;
  691:    }
  692:    finishload();
  693: 
  694:    expense=0;
  695:    tryjoin(obj1,obj2,cond,-1,1);
  696:    if (expense<minexpense) {
  697:       best=2;
  698:       minexpense=expense;
  699:    }
  700:    finishload();
  701: 
  702:    expense=0;
  703:    tryjoin(obj1,obj2,cond,-1,-1);
  704:    if (expense<minexpense) {
  705:       best=3;
  706:       minexpense=expense;
  707:    }
  708: 
  709:    if (best==0) {
  710:       finishload();
  711:       tryjoin(obj1,obj2,cond,1,1);
  712:    }
  713:    if (best==1) {
  714:       finishload();
  715:       tryjoin(obj1,obj2,cond,1,-1);
  716:    }
  717:    if (best==2) {
  718:       finishload();
  719:       tryjoin(obj1,obj2,cond,-1,1);
  720:    }
  721: }
  722: 
  723: function tryjoin(obj1,obj2,cond,d1,d2) {
  724:    var k; var kr; var outcol; var incol; var d; var dest;
  725: 
  726:    dest=objlinks.length;
  727:    objlinks[dest]=obj1+':'+obj2+':'+cond;
  728: 
  729:    outcol=insertport(obj1,d1,2,dest);
  730:    insertcond(obj1,outcol,cond);
  731:    incol=insertport(obj2,d2,1,dest);
  732:    if (row[inrow]==(row[outrow]+1)) {
  733:       insertrow(row[outrow],-1,-1);
  734:    }
  735:    if (row[inrow]<row[outrow]) {
  736:       updown=1;
  737:       tcol=comingthru(inrow,incol,outcol);
  738:       horizontal(inrow,-1,tcol,incol,dest,'-1:-1');
  739:       addobj(inrow,'v&'+tcol+'&'+dest+'&1');
  740:       incol=tcol;
  741:       tcol=comingthru(outrow,outcol,incol);
  742:       horizontal(outrow,0,outcol,tcol,dest,'1:1');
  743:       addobj(outrow,'v&'+tcol+'&'+dest+'&1');
  744:       outcol=tcol;
  745:    } else {
  746:      updown=-1;
  747:    }
  748: 
  749:    if (inrow==outrow) {
  750:       tcol=comingthru(inrow,incol,outcol);
  751:       horizontal(inrow,-1,tcol,incol,dest,'-1:-1');
  752:       addobj(inrow,'v&'+tcol+'&'+dest+'&1');
  753:       horizontal(outrow,0,outcol,tcol,dest,'1:1');
  754:    } else {
  755: 
  756:       if (updown==-1) {
  757:          for (kr=row[outrow]+1;kr<row[inrow];kr++) {
  758:             rid=findrow(kr);
  759:             ncol=comingthru(rid,outcol,incol);
  760: 
  761:             if (ncol!=outcol) {
  762:                insertrow(kr-1,outcol,ncol);
  763:                kr++;
  764:                if (col[outcol]>col[ncol]) {
  765:                   addobj(maxrow,
  766:                             'h&'+maxrow+'&'+outcol+':'+ncol+'&'+dest+'&-1:1');
  767:                } else {
  768:                   addobj(maxrow,
  769:                             'h&'+maxrow+'&'+outcol+':'+ncol+'&'+dest+'&1:-1');
  770:                }
  771:             }
  772:             addobj(rid,'v&'+ncol+'&'+dest+'&-1');
  773:             outcol=ncol;
  774:          }
  775: 
  776:          if (incol!=outcol) {
  777:             insertrow(row[inrow]-1,outcol,incol);
  778:             if (col[outcol]>col[incol]) {
  779:                addobj(maxrow,
  780:                          'h&'+maxrow+'&'+outcol+':'+incol+'&'+dest+'&-1:1');
  781:             } else {
  782:                addobj(maxrow,
  783:                          'h&'+maxrow+'&'+outcol+':'+incol+'&'+dest+'&1:-1');
  784:             }
  785:          }
  786: 
  787:       } else {
  788:          for (kr=row[outrow]-1;kr>row[inrow];kr--) {
  789:             rid=findrow(kr);
  790:             ncol=comingthru(rid,outcol,incol);
  791:             if (ncol!=outcol) {
  792:                insertrow(kr,outcol,ncol);
  793:                if (col[outcol]>col[ncol]) {
  794:                   addobj(maxrow,
  795:                             'h&'+maxrow+'&'+outcol+':'+ncol+'&'+dest+'&1:-1');
  796:                } else {
  797:                   addobj(maxrow,
  798:                             'h&'+maxrow+'&'+outcol+':'+ncol+'&'+dest+'&-1:1');
  799:                }
  800:             }
  801:             addobj(rid,'v&'+ncol+'&'+dest+'&1');
  802:             outcol=ncol;
  803:          }
  804:          if (incol!=outcol) {
  805:             insertrow(row[inrow],outcol,incol);
  806:             if (col[outcol]>col[incol]) {
  807:                addobj(maxrow,
  808:                          'h&'+maxrow+'&'+outcol+':'+incol+'&'+dest+'&1:-1');
  809:             } else {
  810:                addobj(maxrow,
  811:                          'h&'+maxrow+'&'+outcol+':'+incol+'&'+dest+'&-1:1');
  812:             }
  813:          }
  814:       }
  815:    }  
  816: }
  817: 
  818: // ---------------------------------------------------------- Delete a resource
  819: // Deletes resource obj1
  820: // Reconnects resources going thru this one if recon=1
  821: function delres (obj1,recon) {
  822:    var infromobj=new Array();
  823:    var inwithcon=new Array();
  824:    var inwithlink=new Array();
  825:    var outtoobj=new Array();
  826:    var outwithcon=new Array();
  827:    var outwithlink=new Array();
  828:    var inobjs=new Array();
  829:    var inobjscond=new Array();
  830:    var outobjs=new Array();
  831:    var outobjscond=new Array();
  832: 
  833:    var k; var k1; var k2; var found;
  834: 
  835:    stored=0;
  836: 
  837:    data1=obj[obj1].split('&');
  838:    for (k=2;k<data1.length;k++) {
  839:       data2=data1[k].split(':');
  840:       if (data2[1]!=0) {
  841:          k2=inwithlink.length;
  842:          inwithlink[k2]=data2[1];
  843:          data3=objlinks[data2[1]].split(':');
  844:          infromobj[k2]=data3[0];
  845:          inwithcon[k2]=data3[2];
  846:       }
  847:       if (data2[2]!=0) {
  848:          k2=outwithlink.length;
  849:          outwithlink[k2]=data2[2];
  850:          data3=objlinks[data2[2]].split(':');
  851:          outtoobj[k2]=data3[1];
  852:          outwithcon[k2]=data3[2];
  853:       }
  854:    }
  855:    for (k=0;k<inwithlink.length;k++)  { dellink(inwithlink[k]); }
  856:    for (k=0;k<outwithlink.length;k++) { dellink(outwithlink[k]); }
  857:    delobj(obj1);
  858:    objcont[obj1]='';
  859:    if (recon==1) {
  860:      message("Reconnecting");
  861:       for (k=0;k<inwithlink.length;k++) {
  862:          if (infromobj[k]!=obj1) {
  863:             found=0;
  864:             for (k2=0;k2<inobjs.length;k2++) {
  865:                if (inobjs[k2]==infromobj[k]) {
  866:                   if (inwithcon[k]!=0) {
  867:                      if ((inobjscond[k2]!='') &&
  868:                          (typeof(inobjscond[k2])!="undefined")) { 
  869:                          inobjscond[k2]+='||'; 
  870:                      }
  871:                      inobjscond[k2]+=
  872:                       '('+(objcont[inwithcon[k]].split(':'))[0]+')';
  873:                    }
  874:                   found=1;
  875:                }
  876:             }
  877:             if (found==0) {
  878:                k2=inobjs.length;
  879:                inobjs[k2]=infromobj[k];
  880:                if (inwithcon[k]==0) {
  881:                   inobjscond[k2]='';
  882:                } else {
  883:                   inobjscond[k2]=
  884:                    '('+(objcont[inwithcon[k]].split(':'))[0]+')';
  885:                }
  886:             }
  887:          }
  888:       }  
  889: 
  890:       for (k=0;k<outwithlink.length;k++) {
  891:          if (outtoobj[k]!=obj1) {
  892:             found=0;
  893:             for (k2=0;k2<outobjs.length;k2++) {
  894:                if (outobjs[k2]==outtoobj[k]) {
  895:                  if (outwithcon[k]!=0) {
  896:                      if ((outobjscond[k2]!='') &&
  897:                          (typeof(outobjscond[k2])!="undefined")) { 
  898:                          outobjscond[k2]+='||'; 
  899:                      }
  900:                      outobjscond[k2]+=
  901:                       '('+(objcont[outwithcon[k]].split(':'))[0]+')';
  902:                   }
  903:                   found=1;
  904:                }
  905:             }
  906:             if (found==0) {
  907:                k2=outobjs.length;
  908:                outobjs[k2]=outtoobj[k];
  909:                if (outwithcon[k]==0) {
  910:                   outobjscond[k2]='';
  911:                } else {
  912:                   outobjscond[k2]=
  913:                    '('+(objcont[outwithcon[k]].split(':'))[0]+')';
  914:                }
  915:             }
  916:          }
  917:       }
  918: 
  919:       for (k=0;k<inobjs.length;k++) {
  920:           cond='';
  921:           if ((inobjscond[k]!='') && (typeof(inobjscond[k])!="undefined")) { 
  922:              cond='('+inobjscond[k]+')'; 
  923:           }
  924:           for (k2=0;k2<outobjs.length;k2++) {
  925:               thiscond=cond;
  926:               if ((outobjscond[k2]!='') && (typeof(outobjscond[k2])!="undefined")) {
  927:                  if ((thiscond!='') && (typeof(thiscond)!="undefined")) { 
  928:                     thiscond+='&&'; 
  929:                  }
  930:                  thiscond+='('+outobjscond[k2]+')';
  931:               }
  932:               condnr=0;
  933:               if ((thiscond!='') && (typeof(thiscond)!="undefined")) { 
  934:                  condnr=newcondition(thiscond,'normal'); 
  935:               }
  936:               save(); 
  937:               joinres(inobjs[k],outobjs[k2],condnr);
  938:           }
  939:       }
  940:    }
  941: }
  942: 
  943: // -------------------------------------------------------------- Draw an entry
  944: function drawcell (rtype,ctype,what,cm,obj1,ej,ek,ne) {
  945:  var bgcolor;
  946:  var url='';
  947:  var urlparts=new Array;
  948:  var mime;
  949:  var ext;
  950:  var objref;
  951:  var objnum;
  952: 
  953:  if ((what=='') && (ne==0)) { cm="#DDDDDD"; }
  954:  if (ctype!=0) {
  955:    parent.mapout.document.write('<td bgcolor='+cm+' width='+cw[ctype]+'>');
  956:    if ((what!='') && (typeof(what)!="undefined")) {
  957:      if ((obj1!='') && (typeof(obj1)!="undefined")) {
  958:        objref="'"+obj1+"'";
  959:        parent.mapout.document.write
  960:         ('<a href="javascript:parent.code.handler('+objref
  961:          +');" onMouseOver="parent.code.info('+objref+');">');
  962:      } 
  963:      if (what=='r:') {
  964:         mime='';
  965:         objnum=(obj1.split('&'))[1];
  966:         if (typeof(objcont[objnum])!="undefined") {
  967:             urlparts=objcont[objnum].split(':');
  968:             url=urlparts[1];
  969:             ext=urlparts[2];
  970:             urlparts=url.split('.');
  971:             mime=urlparts[urlparts.length-1];
  972:             if (typeof(mime)=="undefined") { mime=''; }
  973:             mime=mime.toLowerCase();
  974:         }
  975:         parent.mapout.document.write
  976:          ('<img border=0 width='+cw[ctype]+' height='+rh[1]
  977:           +' src="'+raticons+'resource.gif">');
  978:        if (zscale==3) {
  979:         if ((mime!='') && (ext!='true')) {
  980:            parent.mapout.document.write
  981:            ('<br><img border=0 src="'+raticons+'left.gif"></a><a target="preview" href="'+
  982:            url+'.meta"><img border=0 src="'+iconpath+
  983:            'meta.gif"><a target="preview" href="'+url+
  984:            '"><img border=0 src="'+iconpath+mime+'.gif">'+
  985:            '<img border=0 src="'+raticons+'right.gif">');
  986:         } else {
  987:            parent.mapout.document.write
  988:            ('<br><img border=0 src="'+raticons+'middle.gif">');
  989:         }
  990:         parent.mapout.document.write
  991:            ('<br><img border=0 src="'+raticons+'bottom.gif">');
  992:        } else {
  993:         parent.mapout.document.write
  994:            ('<br><img border=0  width='+cw[ctype]+' height='+rh[1]
  995:           +' src="'+raticons+'bottom.gif">');
  996:        }
  997:      } else {
  998:         if (what=='c:') {
  999:            parent.mapout.document.write
 1000:             ('<img border=0 width='+cw[ctype]+' height='+rh[rtype]
 1001:              +' src="'+raticons+'condition.gif">');          
 1002:         } else {
 1003:            if (what=='rs:') {
 1004:         mime='';
 1005:         objnum=(obj1.split('&'))[1];
 1006:         if (typeof(objcont[objnum])!="undefined") {
 1007:             urlparts=objcont[objnum].split(':');
 1008:             url=urlparts[1];
 1009:             ext=urlparts[2];
 1010:             urlparts=url.split('.');
 1011:             mime=urlparts[urlparts.length-1];
 1012:             if (typeof(mime)=="undefined") { mime=''; }
 1013:             mime=mime.toLowerCase();
 1014:         }
 1015:               parent.mapout.document.write
 1016:                ('<img border=0 width='+cw[ctype]+' height='+rh[1]
 1017:                +' src="'+raticons+'start.gif">');
 1018:        if (zscale==3) {
 1019:         if ((mime!='') && (ext!='true')) {
 1020:            parent.mapout.document.write
 1021:            ('<br><img border=0 src="'+raticons+'left.gif"></a><a target="preview" href="'+
 1022:            url+'.meta"><img border=0 src="'+iconpath+
 1023:            'meta.gif"><a target="preview" href="'+url+
 1024:            '"><img border=0 src="'+iconpath+mime+'.gif">'+
 1025:            '<img border=0 src="'+raticons+'right.gif">');
 1026:         } else {
 1027:            parent.mapout.document.write
 1028:            ('<br><img border=0 src="'+raticons+'middle.gif">');
 1029:         }
 1030:         parent.mapout.document.write
 1031:            ('<br><img border=0 src="'+raticons+'bottom.gif">');
 1032:        } else {
 1033:         parent.mapout.document.write
 1034:            ('<br><img border=0  width='+cw[ctype]+' height='+rh[1]
 1035:           +' src="'+raticons+'bottom.gif">');
 1036:        }
 1037: 
 1038:            } else {
 1039:              if (what=='rf:') {
 1040:         mime='';
 1041:         objnum=(obj1.split('&'))[1];
 1042:         if (typeof(objcont[objnum])!="undefined") {
 1043:             urlparts=objcont[objnum].split(':');
 1044:             url=urlparts[1];
 1045:             ext=urlparts[2];
 1046:             urlparts=url.split('.');
 1047:             mime=urlparts[urlparts.length-1];
 1048:             if (typeof(mime)=="undefined") { mime=''; }
 1049:             mime=mime.toLowerCase();
 1050:         }
 1051:                 parent.mapout.document.write
 1052:                 ('<img border=0 width='+cw[ctype]+' height='+rh[1]
 1053:                 +' src="'+raticons+'finish.gif">');
 1054:        if (zscale==3) {
 1055:         if ((mime!='') && (ext!='true')) {
 1056:            parent.mapout.document.write
 1057:            ('<br><img border=0 src="'+raticons+'left.gif"></a><a target="preview" href="'+
 1058:            url+'.meta"><img border=0 src="'+iconpath+
 1059:            'meta.gif"><a target="preview" href="'+url+
 1060:            '"><img border=0 src="'+iconpath+mime+'.gif">'+
 1061:            '<img border=0 src="'+raticons+'right.gif">');
 1062:         } else {
 1063:            parent.mapout.document.write
 1064:            ('<br><img border=0 src="'+raticons+'middle.gif">');
 1065:         }
 1066:         parent.mapout.document.write
 1067:            ('<br><img border=0 src="'+raticons+'bottom.gif">');
 1068:        } else {
 1069:         parent.mapout.document.write
 1070:            ('<br><img border=0  width='+cw[ctype]+' height='+rh[1]
 1071:           +' src="'+raticons+'bottom.gif">');
 1072:        }
 1073: 
 1074:              } else {
 1075:                 parent.mapout.document.write
 1076:                 ('<img border=0 width='+cw[ctype]+' height='+rh[rtype]
 1077:                 +' src="'+raticons+rtype+'.'+ctype+'.'+what+'.gif">');
 1078:              }
 1079:            }
 1080:         }
 1081:      }
 1082:      if ((obj1!='') && (typeof(obj1)!="undefined")) {
 1083:        parent.mapout.document.write('</a>');
 1084:      }
 1085:    } else {
 1086:       if (ne!=1) {
 1087:          parent.mapout.document.write
 1088:             ('<a href="javascript:parent.code.empty('+ej+','+ek+');" ');
 1089:       } else {
 1090:          parent.mapout.document.write
 1091:             ('<a href="javascript:parent.code.infoclear();" ');
 1092:       }
 1093:       parent.mapout.document.write
 1094:          ('onMouseOver="parent.code.infoclear();">');
 1095:       parent.mapout.document.write
 1096:          (
 1097:          '<img border=0 width='+cw[ctype]+' height='+rh[rtype]
 1098:         +' src="'+raticons+rtype+'.'+ctype+'.empty.gif"></a>');
 1099:    }
 1100:    parent.mapout.document.write('</td>');
 1101:  }
 1102: }
 1103: 
 1104: // --------------------------------------------------------- Color of resources
 1105: function rescolor (ext,typ) {
 1106:    var rc; var gc; var bc;
 1107:    if (ext=='true') { bc='55'; } else { bc='99'; }
 1108:    if (typ=='mandatory') { rc='FF'; } else { rc='BB'; }
 1109:    if (typ=='optional') { gc='BB'; } else { gc='FF'; }
 1110:    if ((typ=='start') || (typ=='finish')) { rc='AA'; gc='AA'; bc='FF'; }
 1111:    return '#'+rc+gc+bc;
 1112: }
 1113: 
 1114: // -------------------------------------------------------- Color of conditions
 1115: function condcolor(typ) {
 1116:    if (typ=='stop')  { return '#EEAAAA'; }
 1117:    if (typ=='force') { return '#AAAAEE'; }
 1118:    return '#EEEEAA';
 1119: }
 1120: 
 1121: // ----------------------------------------------------------------- Draw a row
 1122: function drawrow (jid) {
 1123: var j; var jk; var k;  var ck; var rtype;
 1124: var objd1=new Array();
 1125: var objd2=new Array();
 1126: var notempty=new Array();
 1127: var condtype;
 1128: if (rowtype[jid]!=0) {
 1129:  for (j=0;j<=maxcol;j++) { 
 1130:     colmap[j]=''; colmap2[j]=''; colmap3[j]=''; colmap4[j]=''; 
 1131:     colmap5[j]='#CCCCCC'; colmap6[j]='#CCCCCC';
 1132:     objd1[j]=''; objd2[j]=''; notempty[j]=0;
 1133:  }
 1134: 
 1135:  parent.mapout.document.writeln('<tr height='+rh[rowtype[jid]]+'>');
 1136:  if ((rowcont[jid]!='') && (typeof(rowcont[jid])!="undefined")) {
 1137:    data2=rowcont[jid].split(':');
 1138:    for (jk=0;jk<data2.length;jk++) {
 1139:       data3=obj[data2[jk]].split('&');
 1140:       if (data3[0]=='b') {
 1141:          data1=objcont[data2[jk]].split(':');
 1142:          rtype=data1[3];
 1143:          ck=rescolor(data1[2],data1[3]);
 1144:          left=maxcol;
 1145:          leftin=maxcol;
 1146:          leftout=maxcol;
 1147:          right=0;
 1148:          rightin=0;
 1149:          rightout=0;
 1150:          anyout=0;
 1151:          for (k=2;k<data3.length;k++) {
 1152:             data1=data3[k].split(':');
 1153:             thiscol=col[data1[0]];
 1154:             if (thiscol<left)  { left=thiscol;  }
 1155:             if (thiscol>right) { right=thiscol; }
 1156:             if (data1[1]!=0) {
 1157:                if (thiscol<leftin)  { leftin=thiscol;  }
 1158:                if (thiscol>rightin) { rightin=thiscol; }
 1159:                colmap4[thiscol]=data1[1];
 1160:             }
 1161:             if (data1[2]!=0) {
 1162:                if (thiscol<leftout)  { anyout=1; leftout=thiscol;  }
 1163:                if (thiscol>rightout) { anyout=1; rightout=thiscol; }
 1164:                if (data1[3]!=0) {
 1165:                   colmap3[thiscol]='c:';
 1166:                   condtype=(objcont[data1[3]].split(':'))[1];
 1167:                   colmap6[thiscol]=condcolor(condtype);
 1168:                   objd2[thiscol]='c&'
 1169:                        +data1[0]+'&'+data2[jk]+'&'+data1[2]+'&'+data1[3];
 1170:                } else {
 1171:                   colmap3[thiscol]='ctd';
 1172:                   colmap6[thiscol]=ck;
 1173:                   objd2[thiscol]='c&'
 1174:                        +data1[0]+'&'+data2[jk]+'&'+data1[2]+'&-';
 1175:                }       
 1176:             }
 1177:          }
 1178:          for (k=left;k<=right;k++) { notempty[k]=1; colmap5[k]=ck; }
 1179:          middle=Math.round((left+right)/2);
 1180:          if (rtype=='start') {
 1181:             colmap[middle]='rs:';
 1182:          } else {
 1183:             if (rtype=='finish') {
 1184:                colmap[middle]='rf:';
 1185:             } else {
 1186:                colmap[middle]='r:';
 1187:             }
 1188:          }
 1189:          objd1[middle]+='r&'+data2[jk];
 1190: 
 1191:          if (rightin>middle) {
 1192:             for (k=middle+1;k<rightin;k++) { 
 1193:                if ((colmap4[k]!='') && (typeof(colmap4[k])!="undefined")) {
 1194:                   colmap[k]='rlt'; 
 1195:                } else {
 1196:                   colmap[k]='rl';
 1197:                }
 1198:             }
 1199:             colmap[rightin]='tl'; 
 1200:          }
 1201:          if (leftin<middle) {
 1202:             for (k=middle-1;k>leftin;k--) { 
 1203:                if ((colmap4[k]!='') && (typeof(colmap4[k])!="undefined")) {
 1204:                   colmap[k]='lrt'; 
 1205:                } else {
 1206:                   colmap[k]='lr';
 1207:                }
 1208:             }
 1209:             colmap[leftin]='tr'; 
 1210:          }
 1211: 
 1212:          if ((leftout>middle) && (anyout)) {
 1213:             colmap2[middle]='tr'; 
 1214:          }
 1215:          if (leftout==middle) {
 1216:             if (rightout==middle) { colmap2[middle]='td'; }
 1217:             if (rightout>middle)  { colmap2[middle]='rtd'; }
 1218:          }
 1219:          if (leftout<middle) {
 1220:             if (rightout<middle)  { colmap2[middle]='tl'; }
 1221:             if (rightout==middle) { colmap2[middle]='tdl'; }
 1222:             if (rightout>middle)  { 
 1223:               if ((colmap3[middle]!='') && (typeof(colmap3[middle])!="undefined")) {
 1224:                  colmap2[middle]='rtdl'; 
 1225:               } else {
 1226:                  colmap2[middle]='rtl';
 1227:               }
 1228:             }
 1229:          }
 1230:          if (leftout<middle) {
 1231:             for (k=middle-1;k>leftout;k--) { 
 1232:                if ((colmap3[k]!='') && (typeof(colmap3[k])!="undefined")) {
 1233:                   colmap2[k]='rld'; 
 1234:                } else {
 1235:                   colmap2[k]='rl';
 1236:                }
 1237:             }
 1238:             colmap2[leftout]='rd'; 
 1239:          }
 1240:          if (rightout>middle) {
 1241:             for (k=middle+1;k<rightout;k++) { 
 1242:                if ((colmap3[k]!='') && (typeof(colmap3[k])!="undefined")) {
 1243:                   colmap2[k]='lrd'; 
 1244:                } else {
 1245:                   colmap2[k]='lr';
 1246:                }
 1247:             }
 1248:             colmap2[rightout]='ld'; 
 1249:          }        
 1250:       }
 1251:       if (data3[0]=='h') {
 1252:          data4=data3[2].split(':');
 1253:          if (col[data4[1]]>col[data4[0]]) {
 1254:             left=col[data4[0]];
 1255:             right=col[data4[1]];
 1256:             thisarrow='lr';
 1257:          } else {
 1258:             right=col[data4[0]];
 1259:             left=col[data4[1]];
 1260:             thisarrow='rl';
 1261:          }
 1262:          if (data3[4].split(':')[0]==1) {
 1263:             colmap[left]='tr';
 1264:          } else {
 1265:             colmap[left]='rd'; colmap2[left]='utd'; colmap3[left]='utd';   
 1266:          }
 1267:          notempty[left]=1;
 1268:          notempty[right]=1;
 1269:          for (k=left+1;k<right;k++) { 
 1270:             notempty[k]=1;
 1271:             if (colmap[k]=='') {
 1272:                colmap[k]=thisarrow; 
 1273:                objd1[k]=data2[jk];
 1274:             } else {
 1275:                colmap[k]='tdrl';
 1276:                objd1[k]='';
 1277:             }
 1278:          }
 1279:          if (data3[4].split(':')[1]==1) {
 1280:             colmap[right]='tl';
 1281:          } else {
 1282:             colmap[right]='ld'; colmap2[right]='utd'; colmap3[right]='utd';   
 1283:          }
 1284:          objd1[left]=data2[jk];
 1285:          objd1[right]=data2[jk];
 1286:       }
 1287:       if (data3[0]=='v') { 
 1288:          left=col[data3[1]];
 1289:          if (colmap[left]=='') {
 1290:             if (data3[3]==1) { colmap[left]='dt'; } else { colmap[left]='td'; }
 1291:             objd1[left]=data2[jk]+'&'+jid;
 1292:             objd2[left]=objd1[left];
 1293:          } else {
 1294:             colmap[left]='tdrl';
 1295:             objd1[left]='';
 1296:          }
 1297:          colmap2[left]='utd'; colmap3[left]='utd';
 1298:       }
 1299:    }
 1300:    rtype=rowtype[jid];
 1301:    for (k=0;k<=maxcol;k++) {
 1302:     drawcell(rtype,coltype[rcol[k]],colmap[k],colmap5[k],objd1[k],jid,k,
 1303:              notempty[k]);
 1304:    }
 1305:    if (rowtype[jid]==2) {
 1306:       parent.mapout.document.writeln('</tr>');
 1307:       parent.mapout.document.writeln('<tr height='+rh[1]+'>');
 1308:       for (k=0;k<=maxcol;k++) {
 1309:        drawcell(1,coltype[rcol[k]],colmap2[k],colmap5[k],objd2[k],jid,k,
 1310:                 notempty[k]);
 1311:       }
 1312:       parent.mapout.document.writeln('</tr>');
 1313:       parent.mapout.document.writeln('<tr height='+rh[1]+'>');
 1314:       for (k=0;k<=maxcol;k++) {
 1315:        drawcell(1,coltype[rcol[k]],colmap3[k],colmap6[k],objd2[k],jid,k,
 1316:                 notempty[k]);
 1317:       }
 1318:    }     
 1319:  }
 1320:  parent.mapout.document.writeln('</tr>');
 1321: }
 1322: }
 1323: 
 1324: // -------------------------------------------------------------- Print message
 1325: function message(txt) {
 1326:    parent.window.status=txt;
 1327: }
 1328: 
 1329: // ------------------------------------------------------------- Draw the table
 1330: function draw () {
 1331:    var k; var kr;
 1332: 
 1333:    cleanup();
 1334:    save();
 1335: 
 1336:    rh[0]=0;
 1337:    rh[1]=zscale*10;
 1338:    rh[2]=zscale*20;
 1339:    cw[0]=0;
 1340:    cw[1]=zscale*10;
 1341:    cw[2]=zscale*20;
 1342: 
 1343:    parent.mapout.document.open('text/html','replace');
 1344:    parent.mapout.document.writeln('<html><body bgcolor="#FFFFFF">');
 1345:    
 1346:    if (tablemode==0) {
 1347:       if (graphdef=='no') { graphopt(); cleanup(); }
 1348:       for (k=0;k<=maxrow;k++) { rrow[row[k]]=k; }
 1349:       for (k=0;k<=maxcol;k++) { rcol[col[k]]=k; }
 1350:       parent.mapout.document.writeln(
 1351:        '<table cellpadding=0 cellspacing=0 border=0 rows='
 1352:        +disrows+' cols='+discols+'>');
 1353:       for (kr=0;kr<=maxrow;kr++) {
 1354:         message("Generating Output Row "+kr); 
 1355:         drawrow(rrow[kr]); 
 1356:       }
 1357:    } else {
 1358:       message("Generating Table Output");
 1359:       for (k=0;k<=maxrow;k++) { rrow[row[k]]=k; }
 1360:       for (k=0;k<=maxcol;k++) { rcol[col[k]]=k; }
 1361: 
 1362:       parent.mapout.document.writeln( '<table>');
 1363:       if (tablemode==1) {
 1364:          tabledraw();
 1365:       } else {
 1366:          simpletabledraw();
 1367:       }
 1368:    } 
 1369: 
 1370:    parent.mapout.document.writeln('</table>');
 1371:    parent.mapout.document.writeln('</body></html>');
 1372:    parent.mapout.document.close();
 1373:    parent.focus();
 1374:    parent.mapout.focus();
 1375: }
 1376: 
 1377: // --------------------------------------------------------- Clears info window
 1378: function infoclear() {
 1379:  if (notclear!=1) {
 1380:   infcheck();
 1381:   inf.document.clear();
 1382:   inf.document.writeln
 1383:    ('<html><body bgcolor="#FFFFFF"><table><tr><td>'+
 1384:     '<img src="/adm/lonIcons/lonlogos.gif"></td>');
 1385:   if (linkmode!=0) {
 1386:    if (tablemode==0) {
 1387:      inf.document.writeln(
 1388:       '<td><b>Link Mode</b><hr>Click on a resource to link it with<br><b>'+
 1389:       (objcont[linkmode].split(':'))[0]+
 1390:       '</b><br>click anywhere else to cancel.</td>');
 1391:    } else {
 1392:      inf.document.writeln(
 1393: '<td><b>Link Mode</b><hr>Click on a resource number to link it with<br><b>'+
 1394:      (objcont[linkmode].split(':'))[0]+'</b><br>'+
 1395: '<a href="javascript:opener.linkmode=0;opener.notclear=0;opener.infoclear();">'
 1396:    +'Cancel</a></td>');
 1397:    }
 1398:   } else {
 1399:    if (tablemode==0) {
 1400:       inf.document.writeln(
 1401:         '<td><b>Click to Edit</b><hr>Click in a light gray area<br>'
 1402:        +'to insert resources, columns and rows</td>'
 1403:       );
 1404:    }
 1405:   }
 1406:   inf.document.writeln('</tr></table></body></html>');
 1407:   inf.document.close();
 1408:   if (srchflag==1) {
 1409:     srchclose();
 1410:   }
 1411:   if (idxflag==1) {
 1412:     idxclose();
 1413:   }
 1414:   if (parmflag==1) {
 1415:     parmclose();
 1416:   }
 1417:   parent.top.focus();
 1418:   parent.mapout.focus();
 1419:   notclear=1;
 1420:   lastinfo='';
 1421:  }
 1422: }
 1423: 
 1424: // ------------------------------------------------------------ Open inf window
 1425: function infopen() {
 1426:    var options="scrollbars=1,resizable=1,menubar=0,width=400,height=300";
 1427:    inf=open("","infout",options);
 1428: }
 1429: 
 1430: // -------------------------------------------------------- Do inf status check
 1431: function infcheck() {
 1432:    if (inf.closed) {
 1433:       infopen();
 1434:    }
 1435: }
 1436: 
 1437: // --------------------------------------------------- Prints out resource info
 1438: function info(infostr) {
 1439:  var mime='';
 1440:  var ext;
 1441:  var urlparts=new Array;
 1442:  var url='';
 1443:  if ((editmode!=1) && (infostr!=lastinfo)) {
 1444:   notclear=1;
 1445:   infcheck();
 1446:   inf.document.clear();
 1447:   inf.document.writeln(
 1448:    '<html><body bgcolor="#FFFFFF">'+
 1449:    '<table><tr><td width=32><img src="'+raticons+'info.gif"></td><td bgcolor="#AAFFAA">');
 1450:   data1=infostr.split('&');
 1451:   if (data1[0]=='c') {
 1452:      inf.document.write('<b>Condition (');
 1453:      data3=objlinks[data1[3]].split(':');
 1454:      if (data1[4]=='-') {
 1455:         inf.document.write('not set');
 1456:      } else {
 1457:         data2=objcont[data1[4]].split(':');
 1458:         if (data2[1]=='force') {
 1459:            inf.document.write('Blocking Other Links');
 1460:         } else {
 1461:            if (data2[1]=='stop') {
 1462:               inf.document.write('Blocking This Link');
 1463:            } else {
 1464:               inf.document.write('Recommendation');
 1465:            }
 1466:        }
 1467:      }   
 1468:      inf.document.writeln(')</b><hr>From <b>'+objcont[data3[0]].split(':')[0]+
 1469:                  '</b><br>to <b>'+objcont[data3[1]].split(':')[0]+'</b>');
 1470:   } else {
 1471:      if (data1[0]=='r') {
 1472:         data2=objcont[data1[1]].split(':');
 1473:         url=data2[1];
 1474:         ext=data2[2];
 1475:         urlparts=url.split('.');
 1476:         mime=urlparts[urlparts.length-1];
 1477:         if (typeof(mime)=="undefined") { mime=''; }
 1478:         if (ext=='true') { mime=''; }
 1479:         if (mime!='') {
 1480:            inf.document.write
 1481:            ('<br><a target="preview" align="right" href="'+url+
 1482:            '"><img border=0 src="'+iconpath+mime+'.gif"></a>&nbsp;&nbsp;');
 1483:         }
 1484:        inf.document.write('<b>');
 1485:         if (data2[2]=='true') { inf.document.write('External '); }
 1486:         if (data2[3]=='start') {
 1487:            inf.document.writeln('<b>Start</b>');
 1488:         } else {
 1489:            if (data2[3]=='finish') {
 1490:               inf.document.writeln('<b>Finish</b>');
 1491:            } else {
 1492:               inf.document.writeln('<b>Resource</b>');
 1493:            }
 1494:         }
 1495:         if (data2[3]=='mandatory') {
 1496:            inf.document.write(' (Mandatory)');
 1497:         }
 1498:         if (data2[3]=='optional') {
 1499:            inf.document.write(' (Optional)');
 1500:         }
 1501:         inf.document.writeln('</b><hr><b>'+data2[0]+'</b><br>');
 1502:         inf.document.writeln((data2[1].split('/')).join(' / '));
 1503:      } else {
 1504:         inf.document.writeln('<b>Link</b><hr>');
 1505:         data2=obj[data1[0]].split('&');
 1506:         data3=objlinks[data2[data2.length-2]].split(':');
 1507:         inf.document.writeln('From <b>'+objcont[data3[0]].split(':')[0]+
 1508:                  '</b><br>to <b>'+objcont[data3[1]].split(':')[0]+'</b>');
 1509:      }
 1510:   }
 1511:   if (linkmode==0) {
 1512:      inf.document.writeln('<p>(click to edit)');
 1513:   } else {
 1514:      if (data1[0]=='r') {
 1515:         inf.document.writeln('<p>(click to link)');
 1516:      } else {
 1517:         inf.document.writeln('<p>(click to cancel linking and edit)');
 1518:      }
 1519:   }
 1520:   inf.document.writeln('</td></tr></table></body></html>');
 1521:   inf.document.close();
 1522:   parent.top.focus();
 1523:   parent.mapout.focus();
 1524:   notclear=0;
 1525:   lastinfo=infostr;
 1526:  }
 1527: }
 1528: 
 1529: // ------------------------------------------------ "Escapes" out special chars
 1530: function escape(instring) {
 1531:    var outstring='';
 1532:    var thischar;
 1533:    var k;
 1534:    for (k=0;k<instring.length;k++) {
 1535:       thischar=instring.charAt(k);
 1536:       if (thischar==':') { thischar='&#58;'; }
 1537:       if (thischar=='"') { thischar='&#34;'; }// "
 1538:       if (thischar=="'") { thischar='&#39;'; }
 1539:       if (thischar==',') { thischar='&#44;'; }
 1540:       outstring+=thischar;
 1541:    }
 1542:    return outstring;
 1543: }
 1544: 
 1545: // -------------------------------------------------- Insert resource into link
 1546: function insertreslink(infostr) {
 1547:    var lnr;
 1548:    var fobj;
 1549:    var tobj;
 1550:    var nobj;
 1551:    var cobj;
 1552:    var cid;
 1553:    var rid;
 1554:    data1=infostr.split('&');
 1555:    data2=obj[data1[0]].split('&');
 1556:    lnr=data2[data2.length-2];
 1557:    data3=objlinks[lnr].split(':');
 1558:    fobj=data3[0];
 1559:    tobj=data3[1];
 1560:    cobj=data3[2];
 1561:    if (data2[0]=='v') {
 1562:       rid=data1[1];
 1563:       cid=data2[1];
 1564:    } else {
 1565:       rid=data2[1];
 1566:       cid=(data2[2].split(':'))[0];
 1567:    }
 1568:    dellink(lnr);
 1569:    newresource(rid,cid,'','','false','normal');
 1570:    nobj=obj.length-1;
 1571:    save();
 1572:    joinres(fobj,nobj,cobj);
 1573:    save();
 1574:    joinres(nobj,tobj,0);
 1575: }
 1576: 
 1577: // -------------------------------------------- Insert resource after condition
 1578: function insertcondlink(cid,lnr) {
 1579:    var fobj;
 1580:    var tobj;
 1581:    var nobj;
 1582:    var cobj;
 1583:    data3=objlinks[lnr].split(':');
 1584:    fobj=data3[0];
 1585:    tobj=data3[1];
 1586:    cobj=data3[2];
 1587:    rid=(obj[fobj].split('&'))[1];
 1588:    insertrow(row[rid]);
 1589:    dellink(lnr);
 1590:    newresource(maxrow,cid,'','','false','normal');
 1591:    nobj=obj.length-1;
 1592:    save();
 1593:    joinres(fobj,nobj,cobj);
 1594:    save();
 1595:    joinres(nobj,tobj,0);
 1596: }
 1597: 
 1598: // ------------------------------------------------------ Clears indexer window
 1599: function idxclear() {
 1600:   idx.document.clear();
 1601: }
 1602: 
 1603: // --------------------------------------------------------- Clears copy window
 1604: function copydxclear() {
 1605:   copydx.document.clear();
 1606: }
 1607: // ------------------------------------------------------- Clears search window
 1608: function srchclear() {
 1609:   srch.document.clear();
 1610: }
 1611: 
 1612: // --------------------------------------------------------- Clears parm window
 1613: function parmclear() {
 1614:   parm.document.clear();
 1615: }
 1616: 
 1617: // ------------------------------------------------------ Closes indexer window
 1618: function idxclose() {
 1619:   if (idx && !idx.closed) {
 1620:     idxflag=0;
 1621:     idx.close();
 1622:   }
 1623: }
 1624: 
 1625: // --------------------------------------------------------- Closes copy window
 1626: function copydxclose() {
 1627:   if (copydx && !copydx.closed) {
 1628:     copydxflag=0;
 1629:     copydx.close();
 1630:   }
 1631: }
 1632: 
 1633: // ------------------------------------------------------- Closes search window
 1634: function srchclose() {
 1635:   if (srch && !srch.closed) {
 1636:     srchflag=0;
 1637:     srch.close();
 1638:   }
 1639: }
 1640: 
 1641: // ------------------------------------------------------- Closes search window
 1642: function parmclose() {
 1643:   if (parm && !parm.closed) {
 1644:     parmflag=0;
 1645:     parm.close();
 1646:   }
 1647: }
 1648: 
 1649: // -------------------------------------------------------- Open indexer window
 1650: function idxopen(mode) {
 1651:    var options="scrollbars=1,resizable=1,menubar=0";
 1652:    idxmode=mode;
 1653:    idxflag=1;
 1654:    idx=open("/res/?launch=1&mode=rat&catalogmode="+mode,"idxout",options);
 1655:    idx.focus();
 1656: }
 1657: // ------------------------------------------------- Open browser to select map
 1658:     var editbrowser;
 1659:     function openbrowser(formname,elementname,only,omit) {
 1660:         var url = '/res/?';
 1661:         if (editbrowser == null) {
 1662:             url += 'launch=1&';
 1663:         }
 1664:         url += 'catalogmode=interactive&';
 1665:         url += 'mode=edit&';
 1666:         url += 'form=' + formname + '&';
 1667:         if (only != null) {
 1668:             url += 'only=' + only + '&';
 1669:         } 
 1670:         if (omit != null) {
 1671:             url += 'omit=' + omit + '&';
 1672:         }
 1673:         url += 'element=' + elementname + '';
 1674:         var title = 'Browser';
 1675:         var options = 'scrollbars=1,resizable=1,menubar=0';
 1676:         options += ',width=700,height=600';
 1677:         editbrowser = copydx.open(url,title,options,'1');
 1678:         editbrowser.focus();
 1679:     }
 1680: // ----------------------------------------------------------- Open copy window
 1681: function copydxopen(mode) {
 1682:    var options="scrollbars=1,resizable=1,menubar=0";
 1683:    copydxmode=mode;
 1684:    copydxflag=1;
 1685:    copydx=open("",'copydxout',options);
 1686:    copydx.document.clear('');
 1687:    copydx.document.writeln(
 1688:  '<html><body bgcolor="#FFFFFF"><h1>Copy from Map</h1>'+
 1689:  '<form name="mapload"><input type=text size=40 name=importmap>'+
 1690:  '<input type=button onClick="javascript:opener.openbrowser'+
 1691:  "('mapload','importmap','sequence,page','')"+
 1692:  '" value="Browse"><input type=button value="Load Map" '+
 1693:  'onClick="window.location=document.mapload.importmap.value+'+
 1694:  "'?launch=1&forceselect=1'"+'"></form>');
 1695: 
 1696:    copydx.document.writeln('</body></html>');
 1697:    copydx.focus();
 1698: }
 1699: 
 1700: // --------------------------------------------------------- Open search window
 1701: function srchopen(mode) {
 1702:    var options="scrollbars=1,resizable=1,menubar=0";
 1703:    srchmode=mode;
 1704:    srchflag=1;
 1705:    srch=open("/adm/searchcat?launch=1&mode=rat&catalogmode="+mode,"srchout",options);
 1706:    srch.focus();
 1707: }
 1708: 
 1709: // -------------------------------------------- Interface function to searching
 1710: function search() {
 1711:    alert("Searching not yet implemented");
 1712: }
 1713: 
 1714: // ------------------------------------------------------- Do srch status check
 1715: function srchcheck(mode) {
 1716:    if (!srch || srch.closed || srchmode!=mode) {
 1717:       srchopen(mode);
 1718:    }
 1719:    srch.focus();
 1720: }
 1721: 
 1722: // -------------------------------------------------------- Do idx status check
 1723: function idxcheck(mode) {
 1724:    if (!idx || idx.closed || idxmode!=mode) {
 1725:       idxopen(mode);
 1726:    }
 1727:    idx.focus();
 1728: }
 1729: 
 1730: // -------------------------------------------------------- Do idx status check
 1731: function copydxcheck(mode) {
 1732:    if (!copydx || copydx.closed || copydxmode!=mode) {
 1733:       copydxopen(mode);
 1734:    }
 1735:    copydx.focus();
 1736: }
 1737: 
 1738: // ---------------------------------------------------- Handles "click to edit"
 1739: function handler(infostr) {
 1740:   var k;
 1741:   editmode=1;
 1742:   notclear=1;
 1743:   infcheck();
 1744:   inf.document.clear();
 1745:   inf.document.writeln(
 1746:    '<html><body bgcolor="#FFFFFF">'+
 1747:    '<table><tr><td width=32><img src="'+raticons+'edit.gif"></td><td bgcolor="#AAFFAA">');
 1748:   data1=infostr.split('&');
 1749:   if (data1[0]=='c') {
 1750:      inf.document.writeln('<b>Condition</b><hr>');
 1751:      linkmode=0;
 1752:      if (data1[4]=='-') {
 1753:         data2[0]=''; data2[1]='normal';
 1754:      } else {
 1755:         data2=objcont[data1[4]].split(':');
 1756:      }
 1757:      inf.document.writeln(
 1758:          '<form name=condinfo><textarea name=c cols=30 rows=3>'
 1759:          +data2[0]+'</textarea><br><input type=radio name=s value=normal '+
 1760:     'onClick="self.document.forms.condinfo.elements.h.value='+"'normal'"+'"');
 1761:      if (data2[1]=='normal') { inf.document.write(' checked'); }
 1762:      inf.document.write(
 1763:       '> Recommendation if true<br><input type=radio name=s value=stop '+
 1764:       'onClick="self.document.forms.condinfo.elements.h.value='+"'stop'"+'"');
 1765:      if (data2[1]=='stop') { inf.document.write(' checked'); }
 1766:      inf.document.write(
 1767:       '> Blocking this link if false<br><input type=radio name=s value=force '+
 1768:       'onClick="self.document.forms.condinfo.elements.h.value='+"'force'"+'"');
 1769:      if (data2[1]=='force') { inf.document.write(' checked'); }
 1770:      inf.document.write(
 1771:    '> Blocking other links if true<br><a href="javascript:opener.editmode=0;'
 1772:       +'opener.notclear=0;');
 1773:      if (data1[4]=='-') {
 1774:         inf.document.write('opener.crecond('+data1[2]+','+data1[1]+','
 1775:       +'opener.escape(self.document.forms.condinfo.elements.c.value),'
 1776:       +'self.document.forms.condinfo.elements.h.value);');
 1777:      } else {
 1778:         inf.document.write('opener.objcont['+data1[4]+']='
 1779:       +'opener.escape(self.document.forms.condinfo.elements.c.value)+'+"':'"
 1780:       +'+self.document.forms.condinfo.elements.h.value+'+"':cond';");
 1781:      }
 1782:      inf.document.writeln(
 1783:       'opener.infoclear();opener.editmode=0;opener.draw('
 1784:       +');"><b>Save Changes</b></a>&nbsp;&nbsp;'
 1785:     +' <a href="javascript:self.document.forms.condinfo.reset()">Reset</a><br>'
 1786:       +'<input type=hidden name=h value='+data2[1]+'>');
 1787: 
 1788:         inf.document.writeln(
 1789:            '<a href="javascript:opener.notclear=0;opener.infoclear();'
 1790:    +'opener.delcond('+data1[2]+','+data1[1]+');opener.editmode=0;opener.draw('
 1791:          +');">Delete Condition</a><br>');
 1792:           inf.document.writeln(
 1793:            '<a href="javascript:opener.notclear=0;opener.infoclear();'
 1794:    +'opener.dellink('+data1[3]+');opener.editmode=0;opener.draw('
 1795:          +');">Delete Link</a>');
 1796: 
 1797:         inf.document.writeln('<br><a href="javascript:'+
 1798:          'opener.insertcondlink('+data1[1]+','+data1[3]+');'+
 1799:          'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
 1800:                               +');">Insert Resource Into Link</a>');
 1801: } else {
 1802:      if (data1[0]=='r') {
 1803:        if (linkmode!=0) {
 1804:         joinres(linkmode,data1[1],0);
 1805:         editmode=0;
 1806:         notclear=0;
 1807:         linkmode=0;
 1808:         inf.document.writeln('<b>Linked Resources</b>');
 1809:         draw();
 1810:        } else {
 1811:         data2=objcont[data1[1]].split(':');
 1812:         if (data2[3]=='start') {
 1813:            inf.document.writeln('<b>Start</b>');
 1814:         } else {
 1815:            if (data2[3]=='finish') {
 1816:               inf.document.writeln('<b>Finish</b>');
 1817:            } else {
 1818:               inf.document.writeln('<b>Resource</b>');
 1819:            }
 1820:         }
 1821:         inf.document.write(
 1822:          '<form name=resinfo><table><tr><td>Title:</td><td colspan=2>'
 1823:         +'<input type=text name=t size=30 value="'
 1824: +escape(data2[0])+'"><input type=hidden name=h value='+data2[3]+'></td></tr>');
 1825:            inf.document.write('<tr><td>URL:</td><td colspan=2>'
 1826:         +'<input type=text name=u size=30 value="'+data2[1]+'"></td></tr>'
 1827:         +'<tr><td>External:</td><td><input type=checkbox name=e');
 1828:         if (data2[2]=='true') { inf.document.write(' checked'); }
 1829:         inf.document.write('></td><td align=right>'
 1830:         +'<a href="javascript:opener.idxcheck(\'interactive\')">Browse</a> '
 1831:         +'<a href="javascript:opener'
 1832: 	+'.srchcheck(\'interactive\')">Search</a></td></tr>');
 1833:     if ((data2[3]!='start') && (data2[3]!='finish')) {
 1834:         inf.document.write('<tr><td colspan=3>'
 1835:         +'<input type=radio name=y value=normal '+
 1836:  'onClick="self.document.forms.resinfo.elements.h.value='+"'normal'"+'"');
 1837:      if (data2[3]=='normal') { inf.document.write(' checked'); }
 1838:      inf.document.write(
 1839:       '> Regular&nbsp;&nbsp;<input type=radio name=y value=mandatory '+
 1840:  'onClick="self.document.forms.resinfo.elements.h.value='+"'mandatory'"+'"');
 1841:      if (data2[3]=='mandatory') { inf.document.write(' checked'); }
 1842:      inf.document.write(
 1843:       '> Mandatory&nbsp;&nbsp;<input type=radio name=y value=optional '+
 1844:  'onClick="self.document.forms.resinfo.elements.h.value='+"'optional'"+'"');
 1845:      if (data2[3]=='optional') { inf.document.write(' checked'); }
 1846:      inf.document.write('> Optional</td></tr>');
 1847:     } 
 1848:         inf.document.writeln(
 1849:          '<tr><td colspan=3><a href="javascript:opener.editmode=0;'
 1850:         +'opener.notclear=0;opener.objcont['+data1[1]
 1851:         +']=opener.escape(self.document.forms.resinfo.elements.t.value)+'+"':'"
 1852:         +'+opener.escape(self.document.forms.resinfo.elements.u.value)+'+"':'"
 1853:         +'+self.document.forms.resinfo.elements.e.checked+'+"':'"
 1854:         +'+self.document.forms.resinfo.elements.h.value+'+"':res'"
 1855:         +';opener.infoclear();opener.editmode=0;opener.draw();">'
 1856:         +'<b>Save Changes</b></a>&nbsp;&nbsp;'
 1857:         +' <a href="javascript:self.document.forms.resinfo.reset()">Reset</a>'
 1858:         +'</td></tr></table>');
 1859:     if ((data2[3]!='start') && (data2[3]!='finish')) {
 1860:         inf.document.writeln(
 1861:            '<a href="javascript:opener.notclear=0;opener.infoclear();'
 1862:          +'opener.delres('+data1[1]+',0);opener.editmode=0;opener.draw('
 1863:          +');">Delete Resource (cutting links)</a>');
 1864:         inf.document.writeln(
 1865:           '<br><a href="javascript:opener.notclear=0;opener.infoclear();'
 1866:          +'opener.delres('+data1[1]+',1);opener.editmode=0;opener.draw('
 1867:          +');">Delete Resource (preserving links)</a>');
 1868:     }
 1869:     if (data2[3]!='finish') {
 1870:         inf.document.writeln(
 1871:           '<br><a href="javascript:opener.editmode=0;opener.notclear=0;'
 1872:          +'opener.linkmode='+data1[1]+';'
 1873:          +'opener.infoclear();">Link Resource</a>');
 1874:     }
 1875:         inf.document.writeln(
 1876:           '<br><a href="javascript:'
 1877:          +'opener.setparms('+data1[1]+');'
 1878:          +'opener.infoclear();">Set Parameters</a>');
 1879:     
 1880:       }
 1881:      } else {
 1882:         linkmode=0;
 1883:         inf.document.writeln('<b>Link</b><hr><form>');
 1884:         data2=obj[data1[0]].split('&');
 1885:         k=data2[data2.length-2];
 1886:         data3=objlinks[k].split(':');
 1887:         inf.document.writeln('From <b>'+objcont[data3[0]].split(':')[0]+
 1888:               '</b><br>to <b>'+objcont[data3[1]].split(':')[0]+'</b>');
 1889:         inf.document.writeln('<br><a href="javascript:opener.dellink('+
 1890:      k+');opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
 1891:                               +');">Delete Link</a>');
 1892:         inf.document.writeln('<br><a href="javascript:'+
 1893:          "opener.insertreslink('"+infostr+"');"+
 1894:          'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
 1895:                               +');">Insert Resource Into Link</a>');
 1896:      }
 1897:   }
 1898:   inf.document.writeln(
 1899:      '<br><a href="javascript:opener.editmode=0;opener.notclear=0;'
 1900:      +'opener.infoclear();">Cancel</a>');
 1901:   inf.document.writeln('</form></td></tr></table></body></html>');
 1902:   inf.document.close();
 1903:   inf.focus();
 1904: }
 1905: 
 1906: // ----------------------------------------------------- Clicks on empty fields
 1907: function empty(rid,k) {
 1908:   var cid=findcol(k);
 1909:   var lcol=k-1;
 1910:   trow=row[rid];
 1911:   lrow=trow-1;
 1912:   editmode=1;
 1913:   notclear=1;
 1914:   linkmode=0;
 1915:   infcheck();
 1916:   inf.document.clear();
 1917:   inf.document.writeln(
 1918:    '<html><body bgcolor="#FFFFFF">'+
 1919:    '<table><tr><td width=32><img src="'+raticons+'edit.gif"></td><td bgcolor="#AAFFAA">'+
 1920:    '<b>Empty Field</b><hr>');
 1921: 
 1922:         inf.document.writeln('<br><a href="javascript:opener.newresource('+
 1923:           rid+','+cid+",'','','false','normal');"+
 1924:          'opener.mostrecent=opener.obj.length-1;'+
 1925:          'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
 1926:           +');">Insert resource</a>');
 1927: 
 1928:   if ((mostrecent!=0) && (objcont[mostrecent]!='') && 
 1929:                          (typeof(objcont[mostrecent])!="undefined")) {
 1930: 
 1931:         inf.document.writeln('<br><a href="javascript:opener.newresource('+
 1932:           rid+','+cid+",'','','false','normal');"+
 1933:          'opener.mostrecent=opener.obj.length-1;'+
 1934:         'opener.joinres('+mostrecent+',opener.obj.length-1,0);'+
 1935:   'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
 1936:           +');">Insert resource linked to from most recent one</a>');
 1937: 
 1938:         inf.document.writeln('<br><a href="javascript:opener.newresource('+
 1939:           rid+','+cid+",'','','false','normal');"+
 1940:          'opener.mostrecent=opener.obj.length-1;'+
 1941:         'opener.joinres(opener.obj.length-1,'+mostrecent+',0);'+
 1942:   'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
 1943:           +');">Insert resource linking to most recent one</a>');
 1944:   }
 1945: 
 1946: 
 1947:   inf.document.writeln('<hr>Insert column:');
 1948:         inf.document.writeln('<a href="javascript:opener.insertcol('+
 1949:         lcol+');opener.addobj('+rid+",'e&'+opener.maxcol);"
 1950:        +'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
 1951:                               +');">left</a>');
 1952:         inf.document.writeln('<a href="javascript:opener.insertcol('+
 1953:         k+');opener.addobj('+rid+",'e&'+opener.maxcol);"
 1954:        +'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
 1955:                               +');">right</a> ');
 1956:    inf.document.writeln('<br>Insert row:');
 1957:         inf.document.writeln('<a href="javascript:opener.insertrow('+
 1958:         trow+');opener.addobj(opener.maxrow'+",'e&"+cid+"');"
 1959:        +'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
 1960:                               +');">below</a>');
 1961:         inf.document.writeln('<a href="javascript:opener.insertrow('+
 1962:         lrow+');opener.addobj(opener.maxrow'+",'e&"+cid+"');"
 1963:        +'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
 1964:                               +');">above</a> ');
 1965: 
 1966: 
 1967:   inf.document.writeln(
 1968:    '<br><a href="javascript:opener.editmode=0;opener.notclear=0;'
 1969:   +'opener.infoclear();">Cancel</a>');
 1970:   inf.document.writeln('</td></tr></table></body></html>');
 1971:   inf.document.close();
 1972:   inf.focus();
 1973: }
 1974: 
 1975: // ---------------------------------------------------- Save into hidden fields
 1976: function save() {
 1977:   var k;
 1978:   if (graphdef=='yes') {
 1979:    parent.server.document.forms.storage.output.value='graphdef<:>yes';
 1980:    for (k=1;k<obj.length;k++) {
 1981:          parent.server.document.forms.storage.output.value+=
 1982:           '<&>obj<:>'+k+'<:>'+obj[k];
 1983:    }
 1984:    for (k=0;k<row.length;k++) {
 1985:          parent.server.document.forms.storage.output.value+=
 1986:           '<&>row<:>'+k+'<:>'+row[k];
 1987:    }
 1988:    for (k=0;k<col.length;k++) {
 1989:          parent.server.document.forms.storage.output.value+=
 1990:           '<&>col<:>'+k+'<:>'+col[k];
 1991:    }
 1992:    for (k=0;k<rowcont.length;k++) {
 1993:       if (rowcont[k]) {
 1994:          parent.server.document.forms.storage.output.value+=
 1995:           '<&>rowcont<:>'+k+'<:>'+rowcont[k];
 1996:       }
 1997:    }
 1998:    parent.server.document.forms.storage.output.value+=
 1999:       '<&>maxcol<:>'+maxcol; 
 2000:    parent.server.document.forms.storage.output.value+=
 2001:       '<&>maxrow<:>'+maxrow;
 2002:     parent.server.document.forms.storage.output.value+=
 2003:       '<&>zscale<:>'+zscale;
 2004: } else {
 2005:    parent.server.document.forms.storage.output.value='graphdef<:>no';
 2006:  }
 2007:  parent.server.document.forms.storage.output.value+=
 2008:    '<&>tablemode<:>'+tablemode;
 2009:       
 2010:    for (k=0;k<objparms.length;k++) {
 2011:       if (objparms[k]) {
 2012:          parent.server.document.forms.storage.output.value+=
 2013:           '<&>objparms<:>'+k+'<:>'+objparms[k];
 2014:       }
 2015:    }  
 2016:    for (k=0;k<objcont.length;k++) {
 2017:       if (objcont[k]) {
 2018:          parent.server.document.forms.storage.output.value+=
 2019:           '<&>objcont<:>'+k+'<:>'+objcont[k];
 2020:       }
 2021:    }
 2022:    for (k=0;k<objlinks.length;k++) {
 2023:       if (objlinks[k]) {
 2024:          parent.server.document.forms.storage.output.value+=
 2025:           '<&>objlinks<:>'+k+'<:>'+objlinks[k];
 2026:       }
 2027:    }
 2028:    undopointer++;
 2029:    undostack[undopointer]=
 2030:     parent.server.document.forms.storage.output.value;
 2031: }
 2032: 
 2033: // ----------------------------------------------- Reset all layout information
 2034: function graphreset() {
 2035: 
 2036:    var k;
 2037: 
 2038:    for (k=0;k<obj.length;k++) { obj[k]=''; }
 2039:    obj.length=0;
 2040:    obj[0]='';
 2041: 
 2042:    rowcont.length=0;
 2043:    rowcont[0]='';
 2044: 
 2045:    row.length=0;
 2046:    row[0]=0;
 2047:    maxrow=0;
 2048: 
 2049:    col.length=0;
 2050:    colmap.length=0;
 2051:    maxcol=-1;
 2052:    insertcol(-1);
 2053: 
 2054:    objcont[0]='';
 2055:    objlinks[0]='';
 2056: 
 2057:    graphdef='no';
 2058: 
 2059: }
 2060: 
 2061: // --------------------- Compare two resources with each other for "straighten"
 2062: function rescompare(a,b) {
 2063:    data1=a.split(':');
 2064:    data2=b.split(':');
 2065:    var rvalue=0;
 2066:    var k;
 2067:    for (k=1;k<data1.length;k++) {
 2068:       if (data1[k]==data2[0]) { rvalue--; }
 2069:    }
 2070:    for (k=1;k<data2.length;k++) {
 2071:       if (data2[k]==data1[0]) { rvalue++; }
 2072:    }
 2073:    if (rvalue==0) { rvalue=data2.length-data1.length; }
 2074:    return rvalue;
 2075: }
 2076: 
 2077: // -------------------------------------------- Draw the table instead of graph
 2078: function tabledraw() {
 2079:   var objsorted=new Array();
 2080:   var robjs=new Array();
 2081:   var iobjs=new Array();
 2082:   var k;
 2083:   var i;
 2084:   var j;
 2085:   var nr;
 2086:   var ck;
 2087:   var cck;
 2088:   var condid;
 2089:   var url='';
 2090:   var mime='';
 2091:   var ext='';
 2092:   var urlparts=new Array;
 2093:   var sortstr=sortobjs();
 2094:  insrestab(1,-1,-1,'');
 2095:  if ((sortstr!='') && (typeof(sortstr)!="undefined")) {
 2096:   objsorted=sortstr.split('&');
 2097:   for (k=0;k<objsorted.length;k++) {
 2098:      i=(objsorted[k].split(':'))[0];
 2099:      iobjs[k]=i;
 2100:      robjs[i]=k;
 2101:   }
 2102:   for (k=0;k<iobjs.length;k++) {
 2103:        i=iobjs[k];
 2104:        if (k<objsorted.length-1) {
 2105:           nr=iobjs[k+1];
 2106:        } else {
 2107:           nr=-1;
 2108:        }
 2109:        data1=objcont[i].split(':');
 2110:        ck=rescolor(data1[2],data1[3]);
 2111:         parent.mapout.document.write('<tr><td bgcolor="'+ck+'">');
 2112:         url=data1[1];
 2113:         ext=data1[2];
 2114:         urlparts=url.split('.');
 2115:         mime=urlparts[urlparts.length-1];
 2116:         if (typeof(mime)=="undefined") { mime=''; }
 2117:         if ((mime!='') && (ext!='true')) {
 2118:            parent.mapout.document.write
 2119:            ('<a target="preview" align="right" href="'+url+'.meta'+
 2120:            '"><img src="'+iconpath+'meta.gif"></a><p>'+
 2121:            '<a target="preview" align="right"href="'+url+
 2122:            '"><img src="'+iconpath+mime+'.gif"></a><p>');
 2123:         }
 2124:          parent.mapout.document.write(
 2125:          '<b><a href="javascript:if (parent.code.linkmode!=0) { '
 2126:         +'parent.code.joinres(parent.code.linkmode,'+i+',0);'
 2127:         +'parent.code.linkmode=0;parent.code.editmode=0;'
 2128:         +'parent.code.notclear=0;parent.code.infoclear();'
 2129:         +'parent.code.draw(); }">'+k+'</a></b></td><td bgcolor="'+ck
 2130:         +'"><form name=r'+i+' method=post>');
 2131:       data2=obj[i].split('&');
 2132:       parent.mapout.document.write('<table bgcolor="#CCCCCC">');
 2133: 
 2134:       if (data1[3]=='start') { 
 2135:          parent.mapout.document.writeln('<tr><td><b>Start</b></td></tr>');
 2136:       }
 2137:       if (data1[3]=='finish') { 
 2138:          parent.mapout.document.writeln('<tr><td><b>Finish</b></td></tr>');
 2139:       }
 2140:       parent.mapout.document.write(
 2141:        '<tr><td>Title:</td><td><input type=text name=t size=50 value="'
 2142:             +data1[0]+'"><input type=hidden name=h value='+data1[3]
 2143:             +'></td></tr>');
 2144:       parent.mapout.document.write(
 2145:        '<tr><td>URL:</td><td><input type=text name=u size=50 value="'
 2146:                                   +data1[1]+'"></td></tr>'
 2147:           +'<tr><td>External:</td><td><input type=checkbox name=e');
 2148:         if (data1[2]=='true') { parent.mapout.document.write(' checked'); }
 2149:         parent.mapout.document.write('></td></tr>');
 2150:     if ((data1[3]!='start') && (data1[3]!='finish')) {
 2151:         parent.mapout.document.write(
 2152:         '<tr><td colspan=2><input type=radio name=y value=normal '+
 2153:  'onClick="parent.mapout.document.forms.r'+i+'.elements.h.value='+
 2154:      "'normal'"+'"');
 2155:      if (data1[3]=='normal') { parent.mapout.document.write(' checked'); }
 2156:      parent.mapout.document.write(
 2157:       '> Regular&nbsp;&nbsp;<input type=radio name=y value=mandatory '+
 2158:  'onClick="parent.mapout.document.forms.r'+i+'.elements.h.value='+
 2159:      "'mandatory'"+'"');
 2160:      if (data1[3]=='mandatory') { parent.mapout.document.write(' checked'); }
 2161:      parent.mapout.document.write(
 2162:       '> Mandatory&nbsp;&nbsp;<input type=radio name=y value=optional '+
 2163:  'onClick="parent.mapout.document.forms.r'+i+'.elements.h.value='+
 2164:      "'optional'"+'"');
 2165:      if (data1[3]=='optional') { parent.mapout.document.write(' checked'); }
 2166:      parent.mapout.document.write('> Optional</td></tr>');
 2167:     } 
 2168:      parent.mapout.document.write(
 2169:          '<tr><td colspan=2><a href="javascript:parent.code.objcont['+i        
 2170:         +']=parent.code.escape(parent.mapout.document.forms.r'+i
 2171:         +'.elements.t.value)+'+"':'"
 2172:         +'+parent.code.escape(parent.mapout.document.forms.r'+i
 2173:         +'.elements.u.value)+'+"':'"
 2174:         +'+parent.mapout.document.forms.r'+i+'.elements.e.checked+'+"':'"
 2175:         +'+parent.mapout.document.forms.r'+i+'.elements.h.value+'+"':res'"
 2176:         +';parent.code.draw();">'
 2177:         +'<b>Save Changes</b></a>&nbsp;&nbsp;'
 2178:         +' <a href="javascript:parent.mapout.document.forms.r'+i
 2179:         +'.reset()">Reset</a></td></tr><tr><td colspan=2>');
 2180:     if ((data1[3]!='start') && (data1[3]!='finish')) {
 2181:      parent.mapout.document.writeln(
 2182:  '<A href="javascript:parent.code.notclear=0;parent.code.infoclear();'
 2183: +'parent.code.delres('+i+',0);parent.code.editmode=0;parent.code.draw();">'
 2184: +'Delete Resource (cutting links)</A><br>'
 2185: +'<A href="javascript:parent.code.notclear=0;parent.code.infoclear();'
 2186: +'parent.code.delres('+i+',1);parent.code.editmode=0;parent.code.draw();">'
 2187: +'Delete Resource (preserving links)</A><br>');
 2188:     }
 2189:     if (data1[3]!='finish') {
 2190:        parent.mapout.document.writeln(
 2191:         '<a href="javascript:parent.code.linkmode='+i+
 2192:        ';parent.code.notclear=0;parent.code.infoclear();">'+
 2193:        'Link resource</a>');
 2194:     }
 2195:         parent.mapout.document.writeln(
 2196:           '<br><a href="javascript:'
 2197:          +'parent.code.setparms('+i+');">Set Parameters</a>');
 2198: 
 2199:       parent.mapout.document.writeln('</td></tr>');
 2200:        parent.mapout.document.writeln('<tr><td colspan=2><table><tr>');
 2201:        for (j=2;j<data2.length;j++) {
 2202:            data4=data2[j].split(':');
 2203:            data3=objlinks[data4[2]].split(':');
 2204:            if (data3.length>1) {
 2205:               if (data3[1]==nr) {
 2206:                  cck='#AAAAAA';
 2207:                  if (data3[2]!=0) { 
 2208:                    cck=condcolor((objcont[data3[2]].split(':'))[1]);
 2209:                    condid=data3[2];
 2210:                  } else {
 2211:                    condid='-';
 2212:                  }                 
 2213:                  parent.mapout.document.writeln(
 2214:                   '<td bgcolor='+cck+'>Next<br>');
 2215:                  parent.mapout.document.writeln(
 2216:                   '<a href="javascript:parent.code.handler('+
 2217:                   "'c&"+data4[0]+'&'+i+'&'+data4[2]+'&'+condid+"');"
 2218:                   +'">Edit</a>');
 2219:                  parent.mapout.document.writeln('</td>');
 2220:               }
 2221:            }
 2222:        }
 2223:        for (j=2;j<data2.length;j++) {
 2224:            data4=data2[j].split(':');
 2225:            data3=objlinks[data4[2]].split(':');
 2226:            if (data3.length>1) {
 2227:               if ((data3[1]!=nr) && (data3[1]!=0)) {
 2228:                  cck='#AAAAAA';
 2229:                  if (data3[2]!=0) { 
 2230:                    cck=condcolor((objcont[data3[2]].split(':'))[1]);
 2231:                    condid=data3[2];
 2232:                  } else {
 2233:                    condid='-';
 2234:                  }
 2235:                  parent.mapout.document.writeln(
 2236:                   '<td bgcolor='+cck+'>To: '+robjs[data3[1]]+'<br>');
 2237:                  parent.mapout.document.writeln(
 2238:                   '<a href="javascript:parent.code.handler('+
 2239:                   "'c&"+data4[0]+'&'+i+'&'+data4[2]+'&'+condid+"');"
 2240:                   +'">Edit</a>');
 2241:                  parent.mapout.document.writeln('</td>');
 2242:               }
 2243:            }
 2244:        }
 2245:        parent.mapout.document.writeln(
 2246:         '</tr></table></td></tr></table></form>');
 2247:        insrestab(rrow[data2[1]],i,nr,data1[3]);
 2248: 
 2249:    }
 2250:   }
 2251: }
 2252: 
 2253: // ----------------------------------------------------- Insert Resource Output
 2254: function insrestab(irow,be,af,typ) {
 2255:   parent.mapout.document.writeln('<tr><td colspan=2>'+
 2256:        '<table><tr><td><a href="javascript:parent.code.insertrow('
 2257:        +irow+');parent.code.newresource(parent.code.maxrow,'+rcol[1]
 2258:  +",'','','false','normal');parent.code.mostrecent=parent.code.obj.length-1;"
 2259:        +'parent.code.draw();">'
 2260:        +'Insert resource</a></td><td>');
 2261:   if ((be!=-1) && (typ!='finish')) {
 2262:    parent.mapout.document.writeln(
 2263:        '<a href="javascript:parent.code.insertrow('
 2264:        +irow+');parent.code.newresource(parent.code.maxrow,'+rcol[0]
 2265:  +",'','','false','normal');parent.code.mostrecent=parent.code.obj.length-1;"
 2266:        +"parent.code.save();"
 2267:        +'parent.code.joinres('+be+',parent.code.mostrecent,0);'
 2268:        +'parent.code.draw();">'
 2269:        +'Insert resource linked to from above</a><br>');
 2270:   }
 2271:   if ((be!=-1) && (af!=-1) && (typ!='finish')) {
 2272:      parent.mapout.document.writeln(
 2273:        '<a href="javascript:parent.code.insertrow('
 2274:        +irow+');parent.code.newresource(parent.code.maxrow,'+rcol[0]
 2275:  +",'','','false','normal');parent.code.mostrecent=parent.code.obj.length-1;"
 2276:        +"parent.code.save();"
 2277:        +'parent.code.joinres('+be+',parent.code.mostrecent,0);'
 2278:        +"parent.code.save();"
 2279:        +'parent.code.joinres(parent.code.mostrecent,'+af+',0);'
 2280:        +'parent.code.draw();">'
 2281:        +'Insert resource linked to from above and linking to below</a><br>');
 2282:   }
 2283:   if (af!=-1) {
 2284:      parent.mapout.document.writeln(
 2285:        '<a href="javascript:parent.code.insertrow('
 2286:        +irow+');parent.code.newresource(parent.code.maxrow,'+rcol[0]
 2287:  +",'','','false','normal');parent.code.mostrecent=parent.code.obj.length-1;"
 2288:        +"parent.code.save();"
 2289:        +'parent.code.joinres(parent.code.mostrecent,'+af+',0);'
 2290:        +'parent.code.draw();">'
 2291:        +'Insert resource linking to below</a><br>');
 2292:   }
 2293:   parent.mapout.document.writeln('</td></tr></table></tr>');
 2294: }
 2295: 
 2296: // ---------------------------------------- Draw simple table instead of graph
 2297: function simpletabledraw() {
 2298:   var objsorted=new Array();
 2299:   var robjs=new Array();
 2300:   var iobjs=new Array();
 2301:   var k;
 2302:   var i;
 2303:   var j;
 2304:   var nr;
 2305:   var ck;
 2306:   var cck;
 2307:   var mime;
 2308:   var ext;
 2309:   var url;
 2310:   var urlparts=new Array;
 2311:   var condid;
 2312:   var sortstr=sortobjs();
 2313:  if ((sortstr!='') && (typeof(sortstr)!="undefined")) {
 2314:   objsorted=sortstr.split('&');
 2315:   for (k=0;k<objsorted.length;k++) {
 2316:      i=(objsorted[k].split(':'))[0];
 2317:      iobjs[k]=i;
 2318:      robjs[i]=k;
 2319:   }
 2320:   for (k=0;k<iobjs.length;k++) {
 2321:        i=iobjs[k];
 2322:        if (k<objsorted.length-1) {
 2323:           nr=iobjs[k+1];
 2324:        } else {
 2325:           nr=-1;
 2326:        }
 2327:        data1=objcont[i].split(':');
 2328:        ck=rescolor(data1[2],data1[3]);
 2329:         parent.mapout.document.write('<tr><td bgcolor="'+ck+'">');
 2330:         url=data1[1];
 2331:         ext=data1[2];
 2332:         urlparts=url.split('.');
 2333:         mime=urlparts[urlparts.length-1];
 2334:         if (typeof(mime)=="undefined") { mime=''; }
 2335:         if ((mime!='') && (ext!='true')) {
 2336:            parent.mapout.document.write
 2337:            ('<a target="preview" align="right" href="'+url+'.meta'+
 2338:            '"><img src="'+iconpath+'meta.gif"></a><p>'+
 2339:            '<a target="preview" align="right"href="'+url+
 2340:            '"><img src="'+iconpath+mime+'.gif"></a><p>');
 2341:         }        
 2342:       parent.mapout.document.write('<b>'+k+'</b></td><td bgcolor="'+ck+'">');
 2343:       data2=obj[i].split('&');
 2344:       parent.mapout.document.write('<table>');
 2345: 
 2346:       if (data1[3]=='start') { 
 2347:          parent.mapout.document.writeln('<tr><td><b>Start</b></td></tr>');
 2348:       }
 2349:       if (data1[3]=='finish') { 
 2350:          parent.mapout.document.writeln('<tr><td><b>Finish</b></td></tr>');
 2351:       }
 2352:       parent.mapout.document.write(
 2353:        '<tr><td>Title:</td><td>'+data1[0]+'</td></tr>');
 2354:       parent.mapout.document.write(
 2355:        '<tr><td>URL:</td><td>'+data1[1]+'</td></tr>'
 2356:       +'<tr><td colspan=2><table><tr>');
 2357:        for (j=2;j<data2.length;j++) {
 2358:            data4=data2[j].split(':');
 2359:            data3=objlinks[data4[2]].split(':');
 2360:            if (data3.length>1) {
 2361:               if (data3[1]==nr) {
 2362:                  cck='#AAAAAA';
 2363:                  if (data3[2]!=0) { 
 2364:                    cck=condcolor((objcont[data3[2]].split(':'))[1]);
 2365:                    condid=data3[2];
 2366:                  } else {
 2367:                    condid='-';
 2368:                  }                 
 2369:                  parent.mapout.document.writeln(
 2370:                   '<td bgcolor='+cck+'>Next<br>');
 2371:                   parent.mapout.document.writeln('</td>');
 2372:               }
 2373:            }
 2374:        }
 2375:        for (j=2;j<data2.length;j++) {
 2376:            data4=data2[j].split(':');
 2377:            data3=objlinks[data4[2]].split(':');
 2378:            if (data3.length>1) {
 2379:               if ((data3[1]!=nr) && (data3[1]!=0)) {
 2380:                  cck='#AAAAAA';
 2381:                  if (data3[2]!=0) { 
 2382:                    cck=condcolor((objcont[data3[2]].split(':'))[1]);
 2383:                    condid=data3[2];
 2384:                  } else {
 2385:                    condid='-';
 2386:                  }
 2387:                  parent.mapout.document.writeln(
 2388:                   '<td bgcolor='+cck+'>To: '+robjs[data3[1]]+'<br>');
 2389:                  parent.mapout.document.writeln('</td>');
 2390:               }
 2391:            }
 2392:        }
 2393:        parent.mapout.document.writeln('</tr></table></td></tr></table></tr>');
 2394:    }
 2395:   } else {
 2396:     parent.mapout.document.writeln('<tr><td>No Resources</td></tr>');
 2397:   }
 2398: }
 2399: 
 2400: // ---------------------------------- Sort objects to straighten graph or table
 2401: function sortobjs() {
 2402:    message("Sorting Resources: "+funny);
 2403:    var k;
 2404:    var ij;
 2405:    var dol;
 2406:    var dtl;
 2407:    var kj;
 2408:    var sortthis=0;
 2409:    var objsort=new Array();
 2410:    for (k=1;k<objcont.length;k++) {
 2411:       if (objcont[k]) {
 2412:          data1=objcont[k].split(':');
 2413:          if (data1[data1.length-1]=='res') {
 2414:             objsort[objsort.length]=''+k;
 2415:          }
 2416:       }
 2417:    }
 2418:    if (objsort.length==0) { return ''; }
 2419:    for (k=1;k<objlinks.length;k++) {
 2420:      wheelswitch();
 2421:      message("Sorting Resources: "+funny);
 2422:      if ((typeof(objlinks[k])!="undefined") && (objlinks[k]!='')) {
 2423:       sortthis=1;
 2424:       data1=objlinks[k].split(':');
 2425:       kj=-1;
 2426:       for (j=0;j<objsort.length;j++) {
 2427:          if ((objsort[j].split(':'))[0]==data1[0]) {
 2428:             kj=j;
 2429:          }
 2430:       }
 2431:       if (kj!=-1) { objsort[kj]+=':'+data1[1]; }
 2432:      }
 2433:    }
 2434:    if (sortthis!=0) {
 2435:     for (k=0;k<objsort.length;k++) {
 2436:       wheelswitch();
 2437:       message("Sorting Resources: "+funny);
 2438:       for (j=0;j<objsort.length;j++) {
 2439:         if (k!=j) {
 2440:           data1=objsort[k].split(':');
 2441:           data2=objsort[j].split(':');
 2442:           dol=data1.length;
 2443:           dtl=data2.length;
 2444:           if (dol+dtl<200) {
 2445:            for (kj=1;kj<dol;kj++) {
 2446:              if (data1[kj]==data2[0]) {
 2447:                 for (ij=1;ij<dtl;ij++) {
 2448:                    data1[data1.length]=data2[ij];
 2449:                 }
 2450:              }
 2451:            }
 2452:            for (kj=1;kj<dtl;kj++) {
 2453:              if (data2[kj]==data1[0]) {
 2454:                  for (ij=1;ij<dol;ij++) {
 2455:                     data2[data2.length]=data1[ij];
 2456:                  }
 2457:              }
 2458:            }
 2459:            objsort[k]=data1.join(':');
 2460:            objsort[j]=data2.join(':');
 2461:           }
 2462:          }
 2463:       } 
 2464:    }
 2465:    message("Sorting Resources: finishing up.");
 2466:    return objsort.sort(rescompare).join('&');
 2467:   } else {
 2468:    return objsort.join('&');
 2469:   }
 2470: }
 2471: 
 2472: // ----------------------------------------------------------- Straighten graph
 2473: function graphopt() {
 2474:   var k;
 2475:   var kj;
 2476:   var ij;
 2477:   var objsorted=new Array();
 2478:   condense(); 
 2479:   graphreset();
 2480:   objsorted=(sortobjs()).split('&');
 2481:   if (objsorted.length==0) { return; }
 2482:    message("Creating Optimized Graph");
 2483:    var thisnewobj=''+(objsorted[0].split(':'))[0];
 2484:    rowcont[1]=thisnewobj;
 2485:    var thiscolmax=1;
 2486:    obj[thisnewobj]='b&1&'+thiscolmax+':0:0:0';   
 2487:    var allcolmax=0;
 2488:    for (k=1;k<objsorted.length;k++) {
 2489:       thisnewobj=(objsorted[k].split(':'))[0];
 2490:       if (rescompare(objsorted[k-1],objsorted[k])==0) {
 2491:          rowcont[rowcont.length-1]+=':'+thisnewobj;
 2492:          thiscolmax++;
 2493:       } else {
 2494:          rowcont[rowcont.length]=thisnewobj;
 2495:          thiscolmax=1;
 2496:       }
 2497:       kj=rowcont.length-1;
 2498:       obj[thisnewobj]='b&'+kj+'&'+thiscolmax+':0:0:0';
 2499:       if (thiscolmax>allcolmax) { allcolmax=thiscolmax; }
 2500:    }
 2501:    for (k=0;k<obj.length;k++) {
 2502:        if (!obj[k]) { obj[k]=''; }
 2503:    }
 2504:    for (k=0;k<=allcolmax;k++) { insertcol(0); }
 2505:    for (k=0;k<rowcont.length;k++) { 
 2506:       row[k]=k;
 2507:    }
 2508:    maxrow=rowcont.length-1;
 2509:    var oldlinks=new Array();
 2510:    for (k=0;k<objlinks.length;k++) { 
 2511:       oldlinks[k]=objlinks[k]; 
 2512:       objlinks[k]='';
 2513:    }
 2514:    objlinks.length=0;
 2515:    objlinks[0]='';
 2516:    graphdef='yes';
 2517:    save();
 2518: 
 2519:    for (k=0;k<objsorted.length;k++) {
 2520:      wheelswitch();
 2521:      message("Connecting Resources: "+funny);
 2522:      kj=(objsorted[k].split(':'))[0];
 2523:       for (ij=1;ij<oldlinks.length;ij++) {
 2524:         if (oldlinks[ij]) {
 2525:           data1=oldlinks[ij].split(':');
 2526:           if (data1[0]==kj) {
 2527:              joinres(data1[0],data1[1],data1[2]);
 2528:              save();
 2529:           }
 2530:          }
 2531:       }
 2532:    }
 2533: }
 2534: 
 2535: // ----------------------------------------------------------- Remove e-objects
 2536: function condense() {
 2537:    message("Condensing");
 2538:    var j;
 2539:    for (j=0;j<=maxrow;j++) {
 2540:      if ((rowcont[j]!='') && (typeof(rowcont[j])!="undefined")) {
 2541:       data1=rowcont[j].split(':');
 2542:       rowcont[j]='';
 2543:       for (k=0;k<data1.length;k++) {
 2544:          if (obj[data1[k]].substring(0,2)!='e&') {
 2545:             if ((rowcont[j]!='') && (typeof(rowcont[j])!="undefined")) { 
 2546:                rowcont[j]+=':'; 
 2547:             }
 2548:             rowcont[j]+=data1[k];
 2549:          }
 2550:       }
 2551:      }
 2552:    }
 2553: }
 2554: 
 2555: // ---------------------------------------------------- Load from hidden fields
 2556: function load() {
 2557:    message("Loading");
 2558:    schedule('load');
 2559: }
 2560: 
 2561: function finishload() {
 2562:    var k;
 2563:    for (k=0;k<objcont.length;k++) { objcont[k]=''; }
 2564:    objcont.length=0;
 2565:    for (k=0;k<objlinks.length;k++) { objlinks[k]=''; }
 2566:    objlinks.length=0;
 2567:    for (k=0;k<objparms.length;k++) { objparms[k]=''; }
 2568:    objparms.length=0;
 2569:    objlinks[0]='';
 2570:    objcont[0]='';
 2571:    editmode=0;
 2572:    notclear=0;
 2573:    lastinfo='';
 2574:    graphreset();
 2575:    var inputstr=parent.server.document.forms.storage.output.value;
 2576:    if ((inputstr!='') && (typeof(inputstr)!="undefined")) {
 2577:    data1=inputstr.split('<&>');
 2578:    var k;
 2579:    for (k=0;k<data1.length;k++) {
 2580:        data2=data1[k].split('&colon;').join('&#58;').split('<:>');
 2581:        if (data2[0]=='graphdef') { graphdef=data2[1]; }
 2582:        if (data2[0]=='maxcol') { maxcol=1*data2[1]; }
 2583:        if (data2[0]=='maxrow') { maxrow=1*data2[1]; }
 2584:        if (data2[0]=='obj') { obj[data2[1]]=data2[2]; }
 2585:        if (data2[0]=='objcont') { objcont[data2[1]]=data2[2]; }
 2586:        if (data2[0]=='objlinks') { objlinks[data2[1]]=data2[2]; }
 2587:        if (data2[0]=='objparms') {
 2588:           if (typeof(objparms[data2[1]])=="undefined") {
 2589:              objparms[data2[1]]=data2[2];
 2590:           } else {
 2591:              if (objparms[data2[2]]=='') {
 2592:                  objparms[data2[1]]=data2[2];
 2593:              } else {
 2594:                  objparms[data2[1]]+=':'+data2[2];
 2595:              }
 2596:           }
 2597:        }
 2598:        if (data2[0]=='rowcont') { rowcont[data2[1]]=data2[2]; }
 2599:        if (data2[0]=='row') { row[data2[1]]=1*data2[2]; }
 2600:        if (data2[0]=='col') { col[data2[1]]=1*data2[2]; }
 2601:        if (data2[0]=='mode') { mode=data2[1]; }
 2602:        if (data2[0]=='tablemode') { tablemode=1*data2[1]; }
 2603:        if (data2[0]=='zscale') { zscale=1*data2[1]; }
 2604:    }
 2605:   }
 2606:   if (graphdef=='yes') {
 2607:      for (k=1;k<=maxrow;k++) {
 2608:         if (typeof(rowcont[k])=="undefined") { rowcont[k]=''; }
 2609:      }
 2610:   } else {
 2611:    var hasstart=0;
 2612:    var hasfinish=0;
 2613:    for (k=0;k<objcont.length;k++) {
 2614:        if (typeof(objcont[k])!="undefined") {
 2615:           var objfunctype=(objcont[k].split(':'))[3];
 2616:           if (objfunctype=='start') { hasstart=1; }
 2617:           if (objfunctype=='finish') { hasfinish=1; }
 2618:        }       
 2619:    }
 2620:    if (!hasstart) {
 2621:       if ((typeof(objcont[1])=="undefined") || (objcont[1]=='')) {
 2622:          objcont[1]='Start::false:start:res';
 2623:       }
 2624:    } 
 2625:    if (!hasfinish) {
 2626:       if ((typeof(objcont[2])=="undefined") || (objcont[2]=='')) {
 2627:          objcont[2]='Finish::false:finish:res';
 2628:       }
 2629:    }
 2630:   }
 2631: }
 2632: 
 2633: // -------------------------------------------------------------- Parameter set
 2634: function setparms(resid) {
 2635:    var options="scrollbars=1,resizable=1,menubar=0";
 2636:    parmflag=1;
 2637:    data1=objcont[resid].split(':');
 2638:    parm=open("/adm/ratparms?url="+data1[1]+"&parms="+objparms[resid]+
 2639:              "&resid="+resid,"parmout",options);
 2640:    parm.focus();
 2641: }
 2642: 
 2643: // -------------------------------------------------------------- Undo function
 2644: function undo() {
 2645:    if (undopointer>1) {
 2646:       undopointer--;
 2647:       parent.server.document.forms.storage.output.value
 2648:        =undostack[undopointer];
 2649:       finishload();
 2650:       undopointer--;
 2651:       draw();
 2652:       stored=0;
 2653:    } else {
 2654:       alert("Cannot undo: reached beginning of edit session");
 2655:    }
 2656: }
 2657: 
 2658: // -------------------------------------------------------------- Redo function
 2659: function redo() {
 2660:    if (undopointer<undostack.length-1) {
 2661:       undopointer++;
 2662:       parent.server.document.forms.storage.output.value
 2663:        =undostack[undopointer];
 2664:       finishload();
 2665:       undopointer--;
 2666:       draw();
 2667:       stored=0;
 2668:    } else {
 2669:       alert("Cannot redo: reached end of edit session");
 2670:    }
 2671: }
 2672:  
 2673: // ------------------------------------------------------------ Revert function
 2674: function revert() {
 2675:    if (confirm("Revert to beginning of edit session?")) {
 2676:       undopointer=2;
 2677:       undo();
 2678:    }
 2679: }
 2680: 
 2681: // ---------------------------------------------------------------- Wheelswitch
 2682: function wheelswitch() {
 2683:    if (funny=='|') { 
 2684:       funny='/'; 
 2685:    } else {
 2686:       if (funny=='/') {
 2687:          funny='-';
 2688:       } else {
 2689:          if (funny=='-') { 
 2690:             funny='\\'; 
 2691:          } else {
 2692:             if (funny=='\\') { funny='|'; }
 2693:          }
 2694:       }
 2695:    } 
 2696: }
 2697: 
 2698: // --------------------------------------------- Checks if server frame defined
 2699: function checkdef() {
 2700:    if (parent.flag==1) {
 2701:      srvloaded();
 2702:    }
 2703:    if ((finishdone==0) && (tim==0)) { setTimeout('checkdef()',100); }
 2704: }
 2705: 
 2706: // ---------------------------------------------------------- The wait function
 2707: function wait() {
 2708:    if ((finishdone==1) || (tim==1)) {
 2709:       if (tim==0) {
 2710:          clearTimeout(canceltim);
 2711:          if (reqaction=='save') { finishsave(); }
 2712:          if (reqaction=='load') { finishload(); draw(); }
 2713:       } else {
 2714:          alert("Server Communication Timed Out.");
 2715:       }
 2716:    } else {
 2717:       wheelswitch();
 2718:       message('Waiting for server reply: '+funny);
 2719:       setTimeout('wait();',100);
 2720:    }
 2721: }
 2722: 
 2723: // ---------------------------------------------------------- Schedule function
 2724: function schedule(action) {
 2725:    reqaction=action;
 2726:    tim=0;
 2727:    finishdone=0;
 2728:    canceltim=setTimeout('tim=1;',20000);
 2729:    checkdef();
 2730:    wait();
 2731: }
 2732: 
 2733: // ----------------------------------------------------- launch indexer browser
 2734: function groupsearch() {
 2735:    srchcheck('groupsearch');
 2736: }
 2737: 
 2738: function groupimport() {
 2739:    idxcheck('groupimport');
 2740: }
 2741: 
 2742: function groupcopy() {
 2743:    copydxcheck('groupsec');
 2744: }
 2745: 
 2746: // -------------------------------------------------------------- Store changes
 2747: function storechange() {
 2748:    var k;
 2749:    parent.flag=0;
 2750:    parent.server.document.forms.storage.submit();
 2751:    schedule('save');
 2752: }
 2753: 
 2754: function finishsave() {
 2755:    finishload();
 2756:    draw();
 2757:    stored=1;
 2758: }
 2759: 
 2760: // --------------------------------------- Gets called when submission finished
 2761: function srvloaded() {
 2762:    finishdone=1;
 2763:    message("Server replied.");
 2764: }
 2765: 
 2766: // ---------------------------------------------------------------- Toggle Mode
 2767: function togglemode() {
 2768:    if (tablemode==0) { 
 2769:       tablemode=1; 
 2770:    } else {
 2771:       if (tablemode==1) { 
 2772:          tablemode=2; 
 2773:       } else {
 2774:          tablemode=0; 
 2775:       } 
 2776:    } 
 2777:    notclear=0;
 2778:    infoclear();
 2779:    draw();
 2780: }
 2781: 
 2782: // -------------------------------------------------------- Main program onLoad
 2783: function main() {
 2784:    if (mainrun==0) {
 2785:       infopen();
 2786:       infoclear();
 2787:       load();
 2788:       stored=1;
 2789:       mainrun=1;
 2790:    }
 2791: }
 2792: 
 2793: // ---------------------------------------------------------- Close the window?
 2794: function leave() {
 2795:    if (!inf.closed) {
 2796:       inf.close();
 2797:    }
 2798:    if (srch && !srch.closed) {
 2799:       srchclose();
 2800:    }
 2801:    if (idx && !idx.closed) {
 2802:       idxclose();
 2803:    }
 2804:    if (copydx && !copydx.closed) {
 2805:       copydxclose();
 2806:    }
 2807: }
 2808: 
 2809: </script>
 2810: </head>
 2811: 
 2812: <body bgcolor="#FFFFFF" onUnload="leave();">
 2813: <table border=0><tr><td bgcolor="#aaaaaa">
 2814: <table border=0><tr>
 2815: <td bgcolor="#ffffcc"><a href="javascript:togglemode();"><font size="-2">Toggle display</font></a></td>
 2816: <td bgcolor="#ffffcc"><a href="javascript:if (zscale>1) { zscale--; draw();}"><font size="-2">Zoom out</font></a></td>
 2817: <td bgcolor="#ffffcc"><a href="javascript:if (zscale<3) { zscale++; draw();}"><font size="-2">Zoom in</font></a></td>
 2818: <td bgcolor="#ffffcc"><a href="javascript:condense();draw();"><font size="-2">Condense</font></a></td>
 2819: <td bgcolor="#ffffcc"><a href="javascript:graphopt();draw();"><font size="-2">Straighten</font></a></td>
 2820: <td bgcolor="#ffffcc"><a href="javascript:revert();"><font size="-2">Revert</font></a></td>
 2821: <td bgcolor="#ffffcc"><a href="javascript:undo();"><font size="-2">Undo</font></a></td>
 2822: <td bgcolor="#ffffcc"><a href="javascript:redo();"><font size="-2">Redo</font></a></td>
 2823: <td bgcolor="#ffffcc"><a href="javascript:groupsearch();"><font size="-2">Search</font></a></td>
 2824: <td bgcolor="#ffffcc"><a href="javascript:groupimport();"><font size="-2">Import</font></a></td>
 2825: <td bgcolor="#ffffcc"><a href="javascript:groupcopy();"><font size="-2">Copy</font></a></td>
 2826: <td bgcolor="#ffffcc"><a href="javascript:graphdef='no';save();storechange();"><font size="-2">Save map</font></a></td>
 2827: <td bgcolor="#ccffcc"><a href="javascript:storechange();"><font size="-2">Save map and layout</font></a></td>
 2828: </tr></table>
 2829: </td></tr></table>
 2830: <script>
 2831: main();
 2832: </script>
 2833: </body>
 2834: </html>

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>