Diff for /rat/client/Attic/code.html between versions 1.3 and 1.5

version 1.3, 2000/05/25 12:14:01 version 1.5, 2000/06/28 03:41:48
Line 8  Resource Assembly Tool Line 8  Resource Assembly Tool
 9/1,9/2,9/4,9/5,9/6,  9/1,9/2,9/4,9/5,9/6,
 1/7,1/8,1/10,1/14,1/15,1/16,1/21,1/22,1/29,1/30,1/31,  1/7,1/8,1/10,1/14,1/15,1/16,1/21,1/22,1/29,1/30,1/31,
 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,  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,
 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/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,
   6/7,6/8,6/9,6/10,6/12,6/15
 Gerd Kortemeyer with Scott Harrison  Gerd Kortemeyer with Scott Harrison
 -->  -->
   
Line 20  var row=new Array(); Line 21  var row=new Array();
 var maxrow=-1;  var maxrow=-1;
 var col=new Array();  var col=new Array();
 var maxcol=-1;  var maxcol=-1;
 var lastempty=-2;  
 var colmap=new Array();  var colmap=new Array();
 var colmap2=new Array();  var colmap2=new Array();
 var colmap3=new Array();  var colmap3=new Array();
Line 49  var graphdef='no'; Line 50  var graphdef='no';
 var mainrun=0;  var mainrun=0;
 var tablemode=0;  var tablemode=0;
 var mostrecent=0;  var mostrecent=0;
   var zscale=3;
   
 var disrows=0;  var disrows=0;
 var discols=0;  var discols=0;
Line 59  var data3=new Array(1024); Line 61  var data3=new Array(1024);
 var data4=new Array(1024);  var data4=new Array(1024);
 var data5=new Array(1024);  var data5=new Array(1024);
   
   var inf;
   
 // ------------------------------------------------ Insert a row into the table  // ------------------------------------------------ Insert a row into the table
   
Line 480  function cleanup () { Line 483  function cleanup () {
    var j,kj,i;     var j,kj,i;
    disrows=0;     disrows=0;
    discols=0;     discols=0;
      var emptyspots=0;
    if (lastempty!=obj.length) {  
       insertrow(maxrow);  
       insertcol(maxcol);  
       addobj(maxrow,'e&'+maxcol);  
       lastempty=obj.length;  
    }  
   
    for (kj=0;kj<=maxcol;kj++) { data1[kj]=0; }     for (kj=0;kj<=maxcol;kj++) { data1[kj]=0; }
    for (kj=0;kj<=maxrow;kj++) {     for (kj=0;kj<=maxrow;kj++) {
Line 510  function cleanup () { Line 507  function cleanup () {
               }                }
               if (obj[colmap[j]].substring(0,2)=='b&') {                 if (obj[colmap[j]].substring(0,2)=='b&') { 
                  data1[j]=2;                   data1[j]=2;
                    if (colmap[maxcol]==0) { emptyspots++; }
                  rowtype[kj]=2;                   rowtype[kj]=2;
               }                  }  
            }             }
Line 524  function cleanup () { Line 522  function cleanup () {
        if (rowtype[j]==2) { disrows+=3; }         if (rowtype[j]==2) { disrows+=3; }
        if (rowtype[j]==1) { disrows+=1; }         if (rowtype[j]==1) { disrows+=1; }
    }     }
      if (emptyspots==0) {
         insertrow(maxrow);
         insertcol(maxcol);
         addobj(maxrow,'e&'+maxcol);
         discols++;
         disrows++;
         rowtype[maxrow]=2;
         coltype[maxcol]=2;
      }
   
 }  }
   
 // -------------------------------------------- Delete a condition from a block  // -------------------------------------------- Delete a condition from a block
Line 535  function delcond(obj1,colid) { Line 543  function delcond(obj1,colid) {
    obj[obj1]=data3[0]+'&'+data3[1];     obj[obj1]=data3[0]+'&'+data3[1];
    for (k=2;k<data3.length;k++) {     for (k=2;k<data3.length;k++) {
       data4=data3[k].split(':');        data4=data3[k].split(':');
       if (data4[0]==colid) { data4[3]=0; }        if (data4[0]==colid) { 
            data4[3]=0; 
            objlinks[data4[2]]=(objlinks[data4[2]].split(':'))[0]+':'+
                               (objlinks[data4[2]].split(':'))[1]+':0';
         }
       if ((data4[1]!=0) || (data4[2]!=0) || (data3.length==3)) {        if ((data4[1]!=0) || (data4[2]!=0) || (data3.length==3)) {
          obj[obj1]+='&'+data4[0]+':'+data4[1]+':'+data4[2]+':'+data4[3];           obj[obj1]+='&'+data4[0]+':'+data4[1]+':'+data4[2]+':'+data4[3];
       }        }
Line 827  function delres (obj1,recon) { Line 839  function delres (obj1,recon) {
   
 function drawcell (rtype,ctype,what,cm,obj1,ej,ek,ne) {  function drawcell (rtype,ctype,what,cm,obj1,ej,ek,ne) {
  var bgcolor;   var bgcolor;
    if ((what=='') && (ne==0)) { cm="#DDDDDD"; }
  if (ctype!=0) {   if (ctype!=0) {
    parent.mapout.document.write('<td bgcolor='+cm+' width='+cw[ctype]+'>');     parent.mapout.document.write('<td bgcolor='+cm+' width='+cw[ctype]+'>');
    if (what!='') {     if (what!='') {
Line 838  function drawcell (rtype,ctype,what,cm,o Line 851  function drawcell (rtype,ctype,what,cm,o
      }        } 
      if (what=='r:') {       if (what=='r:') {
         parent.mapout.document.write          parent.mapout.document.write
          ('<img border=0 src="resource.gif">');           ('<img border=0 width='+cw[ctype]+' height='+rh[rtype]
             +' src="resource.gif">');
      } else {       } else {
         if (what=='c:') {          if (what=='c:') {
            parent.mapout.document.write             parent.mapout.document.write
             ('<img border=0 src="condition.gif">');                        ('<img border=0 width='+cw[ctype]+' height='+rh[rtype]
                +' src="condition.gif">');          
         } else {          } else {
            parent.mapout.document.write             if (what=='rs:') {
             ('<img border=0 src="'+rtype+'.'+ctype+'.'+what+'.gif">');                parent.mapout.document.write
                  ('<img border=0 width='+cw[ctype]+' height='+rh[rtype]
                  +' src="start.gif">');
              } else {
                if (what=='rf:') {
                   parent.mapout.document.write
                   ('<img border=0 width='+cw[ctype]+' height='+rh[rtype]
                   +' src="finish.gif">');
                } else {
                   parent.mapout.document.write
                   ('<img border=0 width='+cw[ctype]+' height='+rh[rtype]
                   +' src="'+rtype+'.'+ctype+'.'+what+'.gif">');
                }
              }
         }          }
      }       }
      if (obj1!='') {       if (obj1!='') {
Line 862  function drawcell (rtype,ctype,what,cm,o Line 890  function drawcell (rtype,ctype,what,cm,o
       parent.mapout.document.write        parent.mapout.document.write
          ('onMouseOver="parent.code.infoclear();">');           ('onMouseOver="parent.code.infoclear();">');
       parent.mapout.document.write        parent.mapout.document.write
          ('<img border=0 src="'+rtype+'.'+ctype+'.empty.gif"></a>');           (
            '<img border=0 width='+cw[ctype]+' height='+rh[rtype]
           +' src="'+rtype+'.'+ctype+'.empty.gif"></a>');
    }     }
    parent.mapout.document.write('</td>');     parent.mapout.document.write('</td>');
  }   }
 }  }
   
   // --------------------------------------------------------- Color of resources
   
   function rescolor (ext,typ) {
      var rc; var gc; var bc;
      if (ext=='true') { bc='55'; } else { bc='99'; }
      if (typ=='mandatory') { rc='FF'; } else { rc='BB'; }
      if (typ=='optional') { gc='BB'; } else { gc='FF'; }
      if ((typ=='start') || (typ=='finish')) { rc='AA'; gc='AA'; bc='FF'; }
      return '#'+rc+gc+bc;
   }
   
   // -------------------------------------------------------- Color of conditions
   
   function condcolor(typ) {
      if (typ=='stop')  { return '#EEAAAA'; }
      if (typ=='force') { return '#AAAAEE'; }
      return '#EEEEAA';
   }
   
 // ----------------------------------------------------------------- Draw a row  // ----------------------------------------------------------------- Draw a row
   
 function drawrow (jid) {  function drawrow (jid) {
 var j; var jk; var k; var rc; var gc; var bc; var ck;  var j; var jk; var k;  var ck; var rtype;
 var objd1=new Array();  var objd1=new Array();
 var objd2=new Array();  var objd2=new Array();
 var notempty=new Array();  var notempty=new Array();
Line 890  if (rowtype[jid]!=0) { Line 939  if (rowtype[jid]!=0) {
       data3=obj[data2[jk]].split('&');        data3=obj[data2[jk]].split('&');
       if (data3[0]=='b') {        if (data3[0]=='b') {
          data1=objcont[data2[jk]].split(':');           data1=objcont[data2[jk]].split(':');
          if (data1[2]=='true') { bc='55'; } else { bc='11'; }           rtype=data1[3];
          if (data1[3]=='mandatory') { rc='BB'; } else { rc='55'; }           ck=rescolor(data1[2],data1[3]);
          if (data1[3]=='optional') { gc='66'; } else { gc='AA'; }  
          ck='#'+rc+gc+bc;  
          left=maxcol;           left=maxcol;
          leftin=maxcol;           leftin=maxcol;
          leftout=maxcol;           leftout=maxcol;
Line 917  if (rowtype[jid]!=0) { Line 964  if (rowtype[jid]!=0) {
                if (data1[3]!=0) {                 if (data1[3]!=0) {
                   colmap3[thiscol]='c:';                    colmap3[thiscol]='c:';
                   condtype=(objcont[data1[3]].split(':'))[1];                    condtype=(objcont[data1[3]].split(':'))[1];
                   colmap6[thiscol]='#FFFFAA';                    colmap6[thiscol]=condcolor(condtype);
                   if (condtype=='stop')  { colmap6[thiscol]='#FFAAAA'; }  
                   if (condtype=='force') { colmap6[thiscol]='#AAAAFF'; }  
                   objd2[thiscol]='c&'                    objd2[thiscol]='c&'
                        +data1[0]+'&'+data2[jk]+'&'+data1[2]+'&'+data1[3];                         +data1[0]+'&'+data2[jk]+'&'+data1[2]+'&'+data1[3];
                } else {                 } else {
Line 932  if (rowtype[jid]!=0) { Line 977  if (rowtype[jid]!=0) {
          }           }
          for (k=left;k<=right;k++) { notempty[k]=1; colmap5[k]=ck; }           for (k=left;k<=right;k++) { notempty[k]=1; colmap5[k]=ck; }
          middle=Math.round((left+right)/2);           middle=Math.round((left+right)/2);
          colmap[middle]='r:';           if (rtype=='start') {
               colmap[middle]='rs:';
            } else {
               if (rtype=='finish') {
                  colmap[middle]='rf:';
               } else {
                  colmap[middle]='r:';
               }
            }
          objd1[middle]+='r&'+data2[jk];           objd1[middle]+='r&'+data2[jk];
   
          if (rightin>middle) {           if (rightin>middle) {
Line 1011  if (rowtype[jid]!=0) { Line 1064  if (rowtype[jid]!=0) {
          } else {           } else {
             colmap[left]='rd'; colmap2[left]='utd'; colmap3[left]='utd';                 colmap[left]='rd'; colmap2[left]='utd'; colmap3[left]='utd';   
          }           }
            notempty[left]=1;
            notempty[right]=1;
          for (k=left+1;k<right;k++) {            for (k=left+1;k<right;k++) { 
               notempty[k]=1;
             if (colmap[k]=='') {              if (colmap[k]=='') {
                colmap[k]=thisarrow;                  colmap[k]=thisarrow; 
                objd1[k]=data2[jk];                 objd1[k]=data2[jk];
Line 1048  if (rowtype[jid]!=0) { Line 1104  if (rowtype[jid]!=0) {
    }     }
    if (rowtype[jid]==2) {     if (rowtype[jid]==2) {
       parent.mapout.document.writeln('</tr>');        parent.mapout.document.writeln('</tr>');
       parent.mapout.document.writeln('<tr height=30>');        parent.mapout.document.writeln('<tr height='+rh[1]+'>');
       for (k=0;k<=maxcol;k++) {        for (k=0;k<=maxcol;k++) {
        drawcell(1,coltype[rcol[k]],colmap2[k],colmap5[k],objd2[k],jid,k,         drawcell(1,coltype[rcol[k]],colmap2[k],colmap5[k],objd2[k],jid,k,
                 notempty[k]);                  notempty[k]);
       }        }
       parent.mapout.document.writeln('</tr>');        parent.mapout.document.writeln('</tr>');
       parent.mapout.document.writeln('<tr height=30>');        parent.mapout.document.writeln('<tr height='+rh[1]+'>');
       for (k=0;k<=maxcol;k++) {        for (k=0;k<=maxcol;k++) {
        drawcell(1,coltype[rcol[k]],colmap3[k],colmap6[k],objd2[k],jid,k,         drawcell(1,coltype[rcol[k]],colmap3[k],colmap6[k],objd2[k],jid,k,
                 notempty[k]);                  notempty[k]);
Line 1080  function draw () { Line 1136  function draw () {
    save();     save();
   
    rh[0]=0;     rh[0]=0;
    rh[1]=30;     rh[1]=zscale*10;
    rh[2]=60;     rh[2]=zscale*20;
    cw[0]=0;     cw[0]=0;
    cw[1]=30;     cw[1]=zscale*10;
    cw[2]=60;     cw[2]=zscale*20;
    parent.mapout.document.clear();  
    parent.mapout.document.open('text/html','replace');     parent.mapout.document.open('text/html','replace');
    parent.mapout.document.writeln('<html><body bgcolor="#FFFFFF">');     parent.mapout.document.writeln('<html><body bgcolor="#FFFFFF">');
         
Line 1093  function draw () { Line 1149  function draw () {
       if (graphdef=='no') { graphopt(); cleanup(); }        if (graphdef=='no') { graphopt(); cleanup(); }
       for (k=0;k<=maxrow;k++) { rrow[row[k]]=k; }        for (k=0;k<=maxrow;k++) { rrow[row[k]]=k; }
       for (k=0;k<=maxcol;k++) { rcol[col[k]]=k; }        for (k=0;k<=maxcol;k++) { rcol[col[k]]=k; }
      parent.mapout.document.writeln(        parent.mapout.document.writeln(
        '<table cellpadding=0 cellspacing=0 border=0 rows='         '<table cellpadding=0 cellspacing=0 border=0 rows='
        +disrows+' cols='+discols+'>');         +disrows+' cols='+discols+'>');
      for (kr=0;kr<=maxrow;kr++) {         for (kr=0;kr<=maxrow;kr++) { 
        message("Generating Output Row "+kr);           message("Generating Output Row "+kr); 
        drawrow(rrow[kr]);           drawrow(rrow[kr]); 
      }        }
    } else {     } else {
       message("Generating Table Output");        message("Generating Table Output");
         for (k=0;k<=maxrow;k++) { rrow[row[k]]=k; }
         for (k=0;k<=maxcol;k++) { rcol[col[k]]=k; }
   
       parent.mapout.document.writeln( '<table>');        parent.mapout.document.writeln( '<table>');
        tabledraw();        if (tablemode==1) {
            tabledraw();
         } else {
            simpletabledraw();
         }
    }      } 
   
    parent.mapout.document.writeln('</table>');     parent.mapout.document.writeln('</table>');
Line 1117  function draw () { Line 1180  function draw () {
   
 function infoclear() {  function infoclear() {
  if (notclear!=1) {   if (notclear!=1) {
   var options="scrollbars=1,resizable=1,menubar=0,width=400,height=300";    infcheck();
   var inf=open("","infout",options);  
   inf.document.clear();    inf.document.clear();
   inf.document.writeln    inf.document.writeln
    ('<html><body bgcolor="#FFFFFF"><table><tr><td>'+     ('<html><body bgcolor="#FFFFFF"><table><tr><td>'+
     '<img src="/adm/lonIcons/lonlogos.gif"></td>');      '<img src="/adm/lonIcons/lonlogos.gif"></td>');
   if (linkmode!=0) {    if (linkmode!=0) {
      if (tablemode==0) {
      inf.document.writeln(       inf.document.writeln(
       '<td><b>Link Mode</b><hr>Click on a resource to link it with<br><b>'+        '<td><b>Link Mode</b><hr>Click on a resource to link it with<br><b>'+
       (objcont[linkmode].split(':'))[0]+        (objcont[linkmode].split(':'))[0]+
       '</b><br>click anywhere else to cancel.</td>');        '</b><br>click anywhere else to cancel.</td>');
      } else {
        inf.document.writeln(
   '<td><b>Link Mode</b><hr>Click on a resource number to link it with<br><b>'+
        (objcont[linkmode].split(':'))[0]+'</b><br>'+
   '<a href="javascript:opener.linkmode=0;opener.notclear=0;opener.infoclear();">'
      +'Cancel</a></td>');
      }
   } else {    } else {
      if (tablemode==0) {
       inf.document.writeln(        inf.document.writeln(
 '<td><b>Click to Edit</b><hr>Click to insert resources, columns and rows</td>'          '<td><b>Click to Edit</b><hr>Click in a light gray area<br>'
          +'to insert resources, columns and rows</td>'
       );        );
      }
   }    }
   inf.document.writeln('</tr></table></body></html>');    inf.document.writeln('</tr></table></body></html>');
   inf.document.close();    inf.document.close();
Line 1142  function infoclear() { Line 1215  function infoclear() {
  }   }
 }  }
   
   // ------------------------------------------------------------ Open inf window
   
   function infopen() {
      var options="scrollbars=1,resizable=1,menubar=0,width=400,height=300";
      inf=open("","infout",options);
   }
   
   // -------------------------------------------------------- Do inf status check
   
   function infcheck() {
      if (inf.closed) {
         infopen();
      }
   }
   
 // --------------------------------------------------- Prints out resource info  // --------------------------------------------------- Prints out resource info
   
 function info(infostr) {  function info(infostr) {
  if ((editmode!=1) && (infostr!=lastinfo)) {   if ((editmode!=1) && (infostr!=lastinfo)) {
   notclear=1;    notclear=1;
   var options="scrollbars=1,resizable=1,menubar=0,width=400,height=300";    infcheck();
   var inf=open("","infout",options);  
   inf.document.clear();    inf.document.clear();
   inf.document.writeln(    inf.document.writeln(
    '<html><body bgcolor="#FFFFFF">'+     '<html><body bgcolor="#FFFFFF">'+
Line 1178  function info(infostr) { Line 1265  function info(infostr) {
         data2=objcont[data1[1]].split(':');          data2=objcont[data1[1]].split(':');
         inf.document.write('<b>');          inf.document.write('<b>');
         if (data2[2]=='true') { inf.document.write('External '); }          if (data2[2]=='true') { inf.document.write('External '); }
         inf.document.write('Resource');          if (data2[3]=='start') {
              inf.document.writeln('<b>Start</b>');
           } else {
              if (data2[3]=='finish') {
                 inf.document.writeln('<b>Finish</b>');
              } else {
                 inf.document.writeln('<b>Resource</b>');
              }
           }
         if (data2[3]=='mandatory') {          if (data2[3]=='mandatory') {
            inf.document.write(' (Mandatory)');             inf.document.write(' (Mandatory)');
         }          }
Line 1238  function insertreslink(infostr) { Line 1333  function insertreslink(infostr) {
    var tobj;     var tobj;
    var nobj;     var nobj;
    var cobj;     var cobj;
      var cid;
      var rid;
    data1=infostr.split('&');     data1=infostr.split('&');
    data2=obj[data1[0]].split('&');     data2=obj[data1[0]].split('&');
    lnr=data2[data2.length-2];     lnr=data2[data2.length-2];
Line 1259  function insertreslink(infostr) { Line 1356  function insertreslink(infostr) {
    joinres(nobj,tobj,0);     joinres(nobj,tobj,0);
 }  }
   
   // -------------------------------------------- Insert resource after condition
   
   function insertcondlink(cid,lnr) {
      var fobj;
      var tobj;
      var nobj;
      var cobj;
      data3=objlinks[lnr].split(':');
      fobj=data3[0];
      tobj=data3[1];
      cobj=data3[2];
      rid=(obj[fobj].split('&'))[1];
      insertrow(row[rid]);
      dellink(lnr);
      newresource(maxrow,cid,'','','false','normal');
      nobj=obj.length-1;
      joinres(fobj,nobj,cobj);
      joinres(nobj,tobj,0);
   }
   
 // ---------------------------------------------------- Handles "click to edit"  // ---------------------------------------------------- Handles "click to edit"
   
 function handler(infostr) {  function handler(infostr) {
   var k;    var k;
   editmode=1;    editmode=1;
   notclear=1;    notclear=1;
   var options="scrollbars=1,resizable=1,menubar=0,width=400,height=300";    infcheck();
   var inf=open("","infout",options);  
   inf.document.clear();    inf.document.clear();
   inf.document.writeln(    inf.document.writeln(
    '<html><body bgcolor="#FFFFFF">'+     '<html><body bgcolor="#FFFFFF">'+
Line 1319  function handler(infostr) { Line 1435  function handler(infostr) {
            '<a href="javascript:opener.notclear=0;opener.infoclear();'             '<a href="javascript:opener.notclear=0;opener.infoclear();'
    +'opener.dellink('+data1[3]+');opener.editmode=0;opener.draw('     +'opener.dellink('+data1[3]+');opener.editmode=0;opener.draw('
          +');">Delete Link</a>');           +');">Delete Link</a>');
   
           inf.document.writeln('<br><a href="javascript:'+
            'opener.insertcondlink('+data1[1]+','+data1[3]+');'+
            'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
                                 +');">Insert Resource Into Link</a>');
   
   
 } else {  } else {
      if (data1[0]=='r') {       if (data1[0]=='r') {
        if (linkmode!=0) {         if (linkmode!=0) {
Line 1329  function handler(infostr) { Line 1452  function handler(infostr) {
         inf.document.writeln('<b>Linked Resources</b>');          inf.document.writeln('<b>Linked Resources</b>');
         draw();          draw();
        } else {         } else {
         inf.document.writeln('<b>Resource</b>');  
         data2=objcont[data1[1]].split(':');          data2=objcont[data1[1]].split(':');
           if (data2[3]=='start') {
              inf.document.writeln('<b>Start</b>');
           } else {
              if (data2[3]=='finish') {
                 inf.document.writeln('<b>Finish</b>');
              } else {
                 inf.document.writeln('<b>Resource</b>');
              }
           }
         inf.document.write(          inf.document.write(
          '<form name=resinfo><table><tr><td>Title:</td><td>'           '<form name=resinfo><table><tr><td>Title:</td><td>'
         +'<input type=text name=t size=30 value="'          +'<input type=text name=t size=30 value="'
         +data2[0]+'"></td></tr><tr><td>URL:</td><td>'          +data2[0]+'"><input type=hidden name=h value='+data2[3]+'></td></tr>');
       if ((data2[3]!='start') && (data2[3]!='finish')) {
              inf.document.write('<tr><td>URL:</td><td>'
         +'<input type=text name=u size=30 value="'+data2[1]+'"></td></tr>'          +'<input type=text name=u size=30 value="'+data2[1]+'"></td></tr>'
         +'<tr><td>External:</td><td><input type=checkbox name=e');          +'<tr><td>External:</td><td><input type=checkbox name=e');
         if (data2[2]=='true') { inf.document.write(' checked'); }          if (data2[2]=='true') { inf.document.write(' checked'); }
         inf.document.write('></td></tr>'          inf.document.write('></td></tr>'
         +'<tr><td colspan=2><input type=hidden name=h value='+data2[3]          +'<tr><td colspan=2>'
         +'><input type=radio name=y value=normal '+          +'<input type=radio name=y value=normal '+
  'onClick="self.document.forms.resinfo.elements.h.value='+"'normal'"+'"');   'onClick="self.document.forms.resinfo.elements.h.value='+"'normal'"+'"');
      if (data2[3]=='normal') { inf.document.write(' checked'); }       if (data2[3]=='normal') { inf.document.write(' checked'); }
      inf.document.write(       inf.document.write(
Line 1351  function handler(infostr) { Line 1484  function handler(infostr) {
       '> Mandatory&nbsp;&nbsp;<input type=radio name=y value=optional '+        '> Mandatory&nbsp;&nbsp;<input type=radio name=y value=optional '+
  'onClick="self.document.forms.resinfo.elements.h.value='+"'optional'"+'"');   'onClick="self.document.forms.resinfo.elements.h.value='+"'optional'"+'"');
      if (data2[3]=='optional') { inf.document.write(' checked'); }       if (data2[3]=='optional') { inf.document.write(' checked'); }
      inf.document.write('> Optional</td></tr>'       inf.document.write('> Optional</td></tr>');
         +'<tr><td colspan=2><a href="javascript:opener.editmode=0;'      } else {
        inf.document.write(
           '<tr><td><input type=hidden name=e value=false>'
                  +'<input type=hidden name=u value=""></td></tr>');
       }
           inf.document.writeln(
            '<tr><td colspan=2><a href="javascript:opener.editmode=0;'
         +'opener.notclear=0;opener.objcont['+data1[1]          +'opener.notclear=0;opener.objcont['+data1[1]
         +']=opener.escape(self.document.forms.resinfo.elements.t.value)+'+"':'"          +']=opener.escape(self.document.forms.resinfo.elements.t.value)+'+"':'"
         +'+opener.escape(self.document.forms.resinfo.elements.u.value)+'+"':'"          +'+opener.escape(self.document.forms.resinfo.elements.u.value)+'+"':'"
Line 1362  function handler(infostr) { Line 1501  function handler(infostr) {
         +'<b>Change to above values</b></a>&nbsp;&nbsp;'          +'<b>Change to above values</b></a>&nbsp;&nbsp;'
         +' <a href="javascript:self.document.forms.resinfo.reset()">Reset</a>'          +' <a href="javascript:self.document.forms.resinfo.reset()">Reset</a>'
         +'</td></tr></table>');          +'</td></tr></table>');
       if ((data2[3]!='start') && (data2[3]!='finish')) {
         inf.document.writeln(          inf.document.writeln(
            '<a href="javascript:opener.notclear=0;opener.infoclear();'             '<a href="javascript:opener.notclear=0;opener.infoclear();'
          +'opener.delres('+data1[1]+',0);opener.editmode=0;opener.draw('           +'opener.delres('+data1[1]+',0);opener.editmode=0;opener.draw('
Line 1370  function handler(infostr) { Line 1510  function handler(infostr) {
           '<br><a href="javascript:opener.notclear=0;opener.infoclear();'            '<br><a href="javascript:opener.notclear=0;opener.infoclear();'
          +'opener.delres('+data1[1]+',1);opener.editmode=0;opener.draw('           +'opener.delres('+data1[1]+',1);opener.editmode=0;opener.draw('
          +');">Delete Resource (preserving links)</a>');           +');">Delete Resource (preserving links)</a>');
       }
       if (data2[3]!='finish') {
         inf.document.writeln(          inf.document.writeln(
           '<br><a href="javascript:opener.editmode=0;opener.notclear=0;'            '<br><a href="javascript:opener.editmode=0;opener.notclear=0;'
          +'opener.linkmode='+data1[1]+';'           +'opener.linkmode='+data1[1]+';'
          +'opener.infoclear();">Link Resource</a>');           +'opener.infoclear();">Link Resource</a>');
       }
       }        }
      } else {       } else {
         linkmode=0;          linkmode=0;
Line 1410  function empty(rid,k) { Line 1553  function empty(rid,k) {
   editmode=1;    editmode=1;
   notclear=1;    notclear=1;
   linkmode=0;    linkmode=0;
   var options="scrollbars=1,resizable=1,menubar=0,width=400,height=300";    infcheck();
   var inf=open("","infout",options);  
   inf.document.clear();    inf.document.clear();
   inf.document.writeln(    inf.document.writeln(
    '<html><body bgcolor="#FFFFFF">'+     '<html><body bgcolor="#FFFFFF">'+
Line 1498  function save() { Line 1640  function save() {
       '<&>maxcol<:>'+maxcol;         '<&>maxcol<:>'+maxcol; 
    parent.server.document.forms.storage.output.value+=     parent.server.document.forms.storage.output.value+=
       '<&>maxrow<:>'+maxrow;        '<&>maxrow<:>'+maxrow;
  } else {      parent.server.document.forms.storage.output.value+=
         '<&>zscale<:>'+zscale;
   } else {
    parent.server.document.forms.storage.output.value='graphdef<:>no';     parent.server.document.forms.storage.output.value='graphdef<:>no';
  }   }
  parent.server.document.forms.storage.output.value+=   parent.server.document.forms.storage.output.value+=
Line 1525  function save() { Line 1669  function save() {
   
 function graphreset() {  function graphreset() {
   
      var k;
   
      for (k=0;k<obj.length;k++) { obj[k]=''; }
    obj.length=0;     obj.length=0;
    obj[0]='';     obj[0]='';
    obj[1]='e&1';  
   
    rowcont.length=0;     rowcont.length=0;
    rowcont[0]='';     rowcont[0]='';
    rowcont[1]='1';  
    row.length=0;     row.length=0;
    row[0]=0;     row[0]=0;
    row[1]=1;     maxrow=0;
    maxrow=1;  
   
    col.length=0;     col.length=0;
    colmap.length=0;     colmap.length=0;
    maxcol=-1;     maxcol=-1;
    insertcol(-1);     insertcol(-1);
    insertcol(0);  
      objcont[0]='';
      objcont[1]='Start::false:start:res'
      objcont[2]='Finish::false:finish:res';
      objlinks[0]='';
      objlinks[1]='1:2:0';
   
    graphdef='no';     graphdef='no';
   
Line 1569  function rescompare(a,b) { Line 1719  function rescompare(a,b) {
 function tabledraw() {  function tabledraw() {
   var objsorted=new Array();    var objsorted=new Array();
   var robjs=new Array();    var robjs=new Array();
     var iobjs=new Array();
   var k;    var k;
   var i;    var i;
   var j;    var j;
   var nr;    var nr;
   var bc; var rc; var gc; var ck;    var ck;
     var cck;
     var condid;
   var sortstr=sortobjs();    var sortstr=sortobjs();
    insrestab(1,-1,-1,'');
  if (sortstr!='') {   if (sortstr!='') {
   objsorted=sortstr.split('&');    objsorted=sortstr.split('&');
   for (k=0;k<objsorted.length;k++) {    for (k=0;k<objsorted.length;k++) {
      robjs[objsorted[k]]=k;       i=(objsorted[k].split(':'))[0];
        iobjs[k]=i;
        robjs[i]=k;
   }    }
   for (k=0;k<objsorted.length;k++) {    for (k=0;k<iobjs.length;k++) {
        i=(objsorted[k].split(':'))[0];         i=iobjs[k];
        if (k<objsorted.length-1) {         if (k<objsorted.length-1) {
           nr=(objsorted[k+1].split(':'))[0];            nr=iobjs[k+1];
        } else {         } else {
           nr=-1;            nr=-1;
        }         }
        data1=objcont[i].split(':');         data1=objcont[i].split(':');
          if (data1[2]=='true') { bc='55'; } else { bc='11'; }         ck=rescolor(data1[2],data1[3]);
          if (data1[3]=='mandatory') { rc='BB'; } else { rc='55'; }  
          if (data1[3]=='optional') { gc='66'; } else { gc='AA'; }  
         ck='#'+rc+gc+bc;  
         parent.mapout.document.write('<tr><td bgcolor="'+ck          parent.mapout.document.write('<tr><td bgcolor="'+ck
         +'"><b>'+k+'</td><td bgcolor="'+ck          +'"><b><a href="javascript:if (parent.code.linkmode!=0) { '
           +'parent.code.joinres(parent.code.linkmode,'+i+',0);'
           +'parent.code.linkmode=0;parent.code.editmode=0;'
           +'parent.code.notclear=0;parent.code.infoclear();'
           +'parent.code.draw(); }">'+k+'</a></b></td><td bgcolor="'+ck
         +'"><form name=r'+i+' method=post>');          +'"><form name=r'+i+' method=post>');
       data2=obj[i].split('&');        data2=obj[i].split('&');
       parent.mapout.document.write('<table bgcolor="#CCCCCC">');        parent.mapout.document.write('<table bgcolor="#CCCCCC">');
         if (data1[3]=='start') { 
            parent.mapout.document.writeln('<tr><td><b>Start</b></td></tr>');
         }
         if (data1[3]=='finish') { 
            parent.mapout.document.writeln('<tr><td><b>Finish</b></td></tr>');
         }
       parent.mapout.document.write(        parent.mapout.document.write(
        '<tr><td>Title:</td><td><input type=text name=t size=30 value="'         '<tr><td>Title:</td><td><input type=text name=t size=50 value="'
                                    +data1[0]+'"></td></tr>');              +data1[0]+'"><input type=hidden name=h value='+data1[3]
               +'></td></tr>');
       if ((data1[3]!='start') && (data1[3]!='finish')) {
       parent.mapout.document.write(        parent.mapout.document.write(
        '<tr><td>URL:</td><td><input type=text name=u size=30 value="'         '<tr><td>URL:</td><td><input type=text name=u size=50 value="'
                                   +data1[1]+'"></td></tr>'                                    +data1[1]+'"></td></tr>'
           +'<tr><td>External:</td><td><input type=checkbox name=e');            +'<tr><td>External:</td><td><input type=checkbox name=e');
         if (data1[2]=='true') { parent.mapout.document.write(' checked'); }          if (data1[2]=='true') { parent.mapout.document.write(' checked'); }
         parent.mapout.document.write('></td></tr>'          parent.mapout.document.write('></td></tr>'
         +'<tr><td colspan=2><input type=hidden name=h value='+data1[3]          +'<tr><td colspan=2><input type=radio name=y value=normal '+
         +'><input type=radio name=y value=normal '+  
  'onClick="parent.mapout.document.forms.r'+i+'.elements.h.value='+   'onClick="parent.mapout.document.forms.r'+i+'.elements.h.value='+
      "'normal'"+'"');       "'normal'"+'"');
      if (data1[3]=='normal') { parent.mapout.document.write(' checked'); }       if (data1[3]=='normal') { parent.mapout.document.write(' checked'); }
Line 1621  function tabledraw() { Line 1785  function tabledraw() {
  'onClick="parent.mapout.document.forms.r'+i+'.elements.h.value='+   'onClick="parent.mapout.document.forms.r'+i+'.elements.h.value='+
      "'optional'"+'"');       "'optional'"+'"');
      if (data1[3]=='optional') { parent.mapout.document.write(' checked'); }       if (data1[3]=='optional') { parent.mapout.document.write(' checked'); }
      parent.mapout.document.write('> Optional</td></tr>'       parent.mapout.document.write('> Optional</td></tr>');
         +'<tr><td colspan=2><a href="javascript:parent.code.objcont['+i              } else {
        parent.mapout.document.write(
          '<tr><td><input type=hidden name=u value="">'
                 +'<input type=hidden name=e value=false></td></tr>');
       }
        parent.mapout.document.write(
            '<tr><td colspan=2><a href="javascript:parent.code.objcont['+i        
         +']=parent.code.escape(parent.mapout.document.forms.r'+i          +']=parent.code.escape(parent.mapout.document.forms.r'+i
         +'.elements.t.value)+'+"':'"          +'.elements.t.value)+'+"':'"
         +'+parent.code.escape(parent.mapout.document.forms.r'+i          +'+parent.code.escape(parent.mapout.document.forms.r'+i
Line 1632  function tabledraw() { Line 1802  function tabledraw() {
         +';parent.code.draw();">'          +';parent.code.draw();">'
         +'<b>Change to above values</b></a>&nbsp;&nbsp;'          +'<b>Change to above values</b></a>&nbsp;&nbsp;'
         +' <a href="javascript:parent.mapout.document.forms.r'+i          +' <a href="javascript:parent.mapout.document.forms.r'+i
         +'.reset()">Reset</a><br><table><tr>');          +'.reset()">Reset</a></td></tr><tr><td colspan=2>');
       if ((data1[3]!='start') && (data1[3]!='finish')) {
        parent.mapout.document.writeln(
    '<A href="javascript:parent.code.notclear=0;parent.code.infoclear();'
   +'parent.code.delres('+i+',0);parent.code.editmode=0;parent.code.draw();">'
   +'Delete Resource (cutting links)</A><br>'
   +'<A href="javascript:parent.code.notclear=0;parent.code.infoclear();'
   +'parent.code.delres('+i+',1);parent.code.editmode=0;parent.code.draw();">'
   +'Delete Resource (preserving links)</A><br>');
       }
       if (data1[3]!='finish') {
          parent.mapout.document.writeln(
           '<a href="javascript:parent.code.linkmode='+i+
          ';parent.code.notclear=0;parent.code.infoclear();">'+
          'Link resource</a></td></tr>');
       }
          parent.mapout.document.writeln('<tr><td colspan=2><table><tr>');
        for (j=2;j<data2.length;j++) {         for (j=2;j<data2.length;j++) {
            data3=objlinks[(data2[j].split(':'))[2]].split(':');             data4=data2[j].split(':');
              data3=objlinks[data4[2]].split(':');
            if (data3.length>1) {             if (data3.length>1) {
               if (data3[1]==nr) {                if (data3[1]==nr) {
                  parent.mapout.document.writeln('<td>Next<br>'+data3);                   cck='#AAAAAA';
                    if (data3[2]!=0) { 
                      cck=condcolor((objcont[data3[2]].split(':'))[1]);
                      condid=data3[2];
                    } else {
                      condid='-';
                    }                 
                    parent.mapout.document.writeln(
                     '<td bgcolor='+cck+'>Next<br>');
                    parent.mapout.document.writeln(
                     '<a href="javascript:parent.code.handler('+
                     "'c&"+data4[0]+'&'+i+'&'+data4[2]+'&'+condid+"');"
                     +'">Edit</a>');
                  parent.mapout.document.writeln('</td>');                   parent.mapout.document.writeln('</td>');
               }                }
            }             }
        }         }
        for (j=2;j<data2.length;j++) {         for (j=2;j<data2.length;j++) {
            data3=objlinks[(data2[j].split(':'))[2]].split(':');             data4=data2[j].split(':');
              data3=objlinks[data4[2]].split(':');
            if (data3.length>1) {             if (data3.length>1) {
               if ((data3[1]!=nr) && (data3[1]!=0)) {                if ((data3[1]!=nr) && (data3[1]!=0)) {
                    cck='#AAAAAA';
                    if (data3[2]!=0) { 
                      cck=condcolor((objcont[data3[2]].split(':'))[1]);
                      condid=data3[2];
                    } else {
                      condid='-';
                    }
                    parent.mapout.document.writeln(
                     '<td bgcolor='+cck+'>To: '+robjs[data3[1]]+'<br>');
                  parent.mapout.document.writeln(                   parent.mapout.document.writeln(
                   '<td>To: '+robjs[data3[1]]+'<br>');                    '<a href="javascript:parent.code.handler('+
                     "'c&"+data4[0]+'&'+i+'&'+data4[2]+'&'+condid+"');"
                     +'">Edit</a>');
                  parent.mapout.document.writeln('</td>');                   parent.mapout.document.writeln('</td>');
               }                }
            }             }
        }         }
        parent.mapout.document.writeln(         parent.mapout.document.writeln(
         '</tr></table></td></tr></table></form></td></tr>');          '</tr></table></td></tr></table></form>');
          insrestab(rrow[data2[1]],i,nr,data1[3]);
   
    }     }
   }    }
 }  }
   
   // ----------------------------------------------------- Insert Resource Output
   
   function insrestab(irow,be,af,typ) {
     parent.mapout.document.writeln('<tr><td colspan=2>'+
          '<table><tr><td><a href="javascript:parent.code.insertrow('
          +irow+');parent.code.newresource(parent.code.maxrow,'+rcol[1]
    +",'','','false','normal');parent.code.mostrecent=parent.code.obj.length-1;"
          +'parent.code.draw();">'
          +'Insert resource</a></td><td>');
     if ((be!=-1) && (typ!='finish')) {
      parent.mapout.document.writeln(
          '<a href="javascript:parent.code.insertrow('
          +irow+');parent.code.newresource(parent.code.maxrow,'+rcol[0]
    +",'','','false','normal');parent.code.mostrecent=parent.code.obj.length-1;"
          +'parent.code.joinres('+be+',parent.code.mostrecent,0);'
          +'parent.code.draw();">'
          +'Insert resource linked to from above</a><br>');
     }
     if ((be!=-1) && (af!=-1) && (typ!='finish')) {
        parent.mapout.document.writeln(
          '<a href="javascript:parent.code.insertrow('
          +irow+');parent.code.newresource(parent.code.maxrow,'+rcol[0]
    +",'','','false','normal');parent.code.mostrecent=parent.code.obj.length-1;"
          +'parent.code.joinres('+be+',parent.code.mostrecent,0);'
          +'parent.code.joinres(parent.code.mostrecent,'+af+',0);'
          +'parent.code.draw();">'
          +'Insert resource linked to from above and linking to below</a><br>');
     }
     if (af!=-1) {
        parent.mapout.document.writeln(
          '<a href="javascript:parent.code.insertrow('
          +irow+');parent.code.newresource(parent.code.maxrow,'+rcol[0]
    +",'','','false','normal');parent.code.mostrecent=parent.code.obj.length-1;"
          +'parent.code.joinres(parent.code.mostrecent,'+af+',0);'
          +'parent.code.draw();">'
          +'Insert resource linking to below</a><br>');
     }
     parent.mapout.document.writeln('</td></tr></table></tr>');
   }
   // ---------------------------------------- Draw simple table instead of graph
   
   function simpletabledraw() {
     var objsorted=new Array();
     var robjs=new Array();
     var iobjs=new Array();
     var k;
     var i;
     var j;
     var nr;
     var ck;
     var cck;
     var condid;
     var sortstr=sortobjs();
    if (sortstr!='') {
     objsorted=sortstr.split('&');
     for (k=0;k<objsorted.length;k++) {
        i=(objsorted[k].split(':'))[0];
        iobjs[k]=i;
        robjs[i]=k;
     }
     for (k=0;k<iobjs.length;k++) {
          i=iobjs[k];
          if (k<objsorted.length-1) {
             nr=iobjs[k+1];
          } else {
             nr=-1;
          }
          data1=objcont[i].split(':');
          ck=rescolor(data1[2],data1[3]);
           parent.mapout.document.write('<tr><td bgcolor="'+ck
           +'"><b>'+k+'</b></td><td bgcolor="'+ck
           +'">');
         data2=obj[i].split('&');
         parent.mapout.document.write('<table>');
         if (data1[3]=='start') { 
            parent.mapout.document.writeln('<tr><td><b>Start</b></td></tr>');
         }
         if (data1[3]=='finish') { 
            parent.mapout.document.writeln('<tr><td><b>Finish</b></td></tr>');
         }
         parent.mapout.document.write(
          '<tr><td>Title:</td><td>'+data1[0]+'</td></tr>');
         parent.mapout.document.write(
          '<tr><td>URL:</td><td>'+data1[1]+'</td></tr>'
         +'<tr><td colspan=2><table><tr>');
          for (j=2;j<data2.length;j++) {
              data4=data2[j].split(':');
              data3=objlinks[data4[2]].split(':');
              if (data3.length>1) {
                 if (data3[1]==nr) {
                    cck='#AAAAAA';
                    if (data3[2]!=0) { 
                      cck=condcolor((objcont[data3[2]].split(':'))[1]);
                      condid=data3[2];
                    } else {
                      condid='-';
                    }                 
                    parent.mapout.document.writeln(
                     '<td bgcolor='+cck+'>Next<br>');
                     parent.mapout.document.writeln('</td>');
                 }
              }
          }
          for (j=2;j<data2.length;j++) {
              data4=data2[j].split(':');
              data3=objlinks[data4[2]].split(':');
              if (data3.length>1) {
                 if ((data3[1]!=nr) && (data3[1]!=0)) {
                    cck='#AAAAAA';
                    if (data3[2]!=0) { 
                      cck=condcolor((objcont[data3[2]].split(':'))[1]);
                      condid=data3[2];
                    } else {
                      condid='-';
                    }
                    parent.mapout.document.writeln(
                     '<td bgcolor='+cck+'>To: '+robjs[data3[1]]+'<br>');
                    parent.mapout.document.writeln('</td>');
                 }
              }
          }
          parent.mapout.document.writeln('</tr></table></td></tr></table></tr>');
      }
     } else {
       parent.mapout.document.writeln('<tr><td>No Resources</td></tr>');
     }
   }
   
 // ---------------------------------- Sort objects to straighten graph or table  // ---------------------------------- Sort objects to straighten graph or table
   
 function sortobjs() {  function sortobjs() {
Line 1749  function graphopt() { Line 2090  function graphopt() {
          thiscolmax++;           thiscolmax++;
       } else {        } else {
          rowcont[rowcont.length]=thisnewobj;           rowcont[rowcont.length]=thisnewobj;
          if (thiscolmax>allcolmax) { allcolmax=thiscolmax; }  
          thiscolmax=1;           thiscolmax=1;
       }        }
       kj=rowcont.length-1;        kj=rowcont.length-1;
       obj[thisnewobj]='b&'+kj+'&'+thiscolmax+':0:0:0';           obj[thisnewobj]='b&'+kj+'&'+thiscolmax+':0:0:0';
         if (thiscolmax>allcolmax) { allcolmax=thiscolmax; }
    }     }
    for (k=0;k<obj.length;k++) {     for (k=0;k<obj.length;k++) {
        if (!obj[k]) { obj[k]=''; }         if (!obj[k]) { obj[k]=''; }
Line 1799  function condense() { Line 2140  function condense() {
       }        }
      }       }
    }     }
    lastempty=-2;  
 }  }
   
 // ---------------------------------------------------- Load from hidden fields  // ---------------------------------------------------- Load from hidden fields
   
 function load() {  function load() {
      message("Loading");
      var k;
      for (k=0;k<objcont.length;k++) { objcont[k]=''; }
    objcont.length=0;     objcont.length=0;
      for (k=0;k<objlinks.length;k++) { objlinks[k]=''; }
    objlinks.length=0;     objlinks.length=0;
    objlinks[0]='';     objlinks[0]='';
    objcont[0]='';     objcont[0]='';
Line 1829  function load() { Line 2173  function load() {
        if (data2[0]=='row') { row[data2[1]]=1*data2[2]; }         if (data2[0]=='row') { row[data2[1]]=1*data2[2]; }
        if (data2[0]=='col') { col[data2[1]]=1*data2[2]; }         if (data2[0]=='col') { col[data2[1]]=1*data2[2]; }
        if (data2[0]=='tablemode') { tablemode=1*data2[1]; }         if (data2[0]=='tablemode') { tablemode=1*data2[1]; }
          if (data2[0]=='zscale') { zscale=1*data2[1]; }
    }     }
   }    }
 }  }
Line 1885  function storechange() { Line 2230  function storechange() {
 // ---------------------------------------------------------------- Toggle Mode  // ---------------------------------------------------------------- Toggle Mode
   
 function togglemode() {  function togglemode() {
    if (tablemode==0) { tablemode=1; } else { tablemode=0; }     if (tablemode==0) { 
         tablemode=1; 
      } else {
         if (tablemode==1) { 
            tablemode=2; 
         } else {
            tablemode=0; 
         } 
      } 
      notclear=0;
      infoclear();
    draw();     draw();
 }  }
   
Line 1894  function togglemode() { Line 2249  function togglemode() {
 function main() {  function main() {
   
    if (mainrun==0) {     if (mainrun==0) {
         infopen();
         infoclear();
       load();        load();
       draw();        draw();
       stored=1;        stored=1;
Line 1905  function main() { Line 2262  function main() {
 // ------------------------------------------------------------- Save on leave?  // ------------------------------------------------------------- Save on leave?
   
 function leave() {  function leave() {
      if (!inf.closed) {
         inf.close();
      }
    if (stored==0) {     if (stored==0) {
       if (confirm('Store changes?')) {        if (confirm('Store changes?')) {
          storechange();              storechange();   
Line 1917  function leave() { Line 2277  function leave() {
   
 <body bgcolor="#FFFFFF" onLoad="main();" onUnload="leave();">  <body bgcolor="#FFFFFF" onLoad="main();" onUnload="leave();">
 <a href="javascript:togglemode();">Toggle Display Mode</a>  <a href="javascript:togglemode();">Toggle Display Mode</a>
   <a href="javascript:if (zscale>1) { zscale--; draw();}">Zoom Out</a>
   <a href="javascript:if (zscale<3) { zscale++; draw();}">Zoom In</a>
 <a href="javascript:condense();draw();">Condense</a>  <a href="javascript:condense();draw();">Condense</a>
 <a href="javascript:graphopt();draw();">Straighten</a>  <a href="javascript:graphopt();draw();">Straighten</a>
 <a href="javascript:revert();">Revert</a>  <a href="javascript:revert();">Revert</a>

Removed from v.1.3  
changed lines
  Added in v.1.5


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