<html>
<!--
The LearningOnline Network
Resource Assembly Tool
7/23,7/24,7/26,
8/11,8/14,8/18,8/19,8/20,8/21,8/22,8/25,8/26,8/28,8/30,8/31,
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,
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/25,
6/7,6/8,6/9,6/10,6/12,6/15,7/4
Gerd Kortemeyer with Scott Harrison
-->
<head>
<script language="JavaScript">
var row=new Array();
var maxrow=-1;
var col=new Array();
var maxcol=-1;
var colmap=new Array();
var colmap2=new Array();
var colmap3=new Array();
var colmap4=new Array();
var colmap5=new Array();
var colmap6=new Array();
var obj=new Array();
var objcont=new Array();
var objlinks=new Array();
var rowcont=new Array();
var rowtype=new Array();
var coltype=new Array();
var rcol=new Array();
var rrow=new Array();
var cw=new Array();
var rh=new Array();
var undostack=new Array();
var undopointer=0;
var stored=0;
var editmode=0;
var notclear=0;
var linkmode=0;
var lastinfo='';
var graphdef='no';
var mode='';
var mainrun=0;
var tablemode=0;
var mostrecent=0;
var zscale=3;
var disrows=0;
var discols=0;
var data1=new Array(1024);
var data2=new Array(1024);
var data3=new Array(1024);
var data4=new Array(1024);
var data5=new Array(1024);
var inf;
// ------------------------------------------------ Insert a row into the table
function insertrow(j,ex1,ex2) {
var kj;
stored=0;
objects1='';
objects2='';
for (kj=0;kj<=maxrow;kj++) {
if ( row[kj]==j ) { objects1=rowcont[kj]; }
if ( row[kj]==j+1 ) { objects2=rowcont[kj]; }
if ( row[kj]>j ) { row[kj]++; }
}
maxrow++;
row[maxrow]=j+1;
rowcont[maxrow]=':';
colcover=':'+ex1+':'+ex2+':';
objects=objects1+':'+objects2;
data1=objects.split(':');
for (kj=0;kj<data1.length;kj++) {
if (data1[kj]!='') {
thisisobj=obj[data1[kj]];
thisobjtype=thisisobj.split('&')[0];
if (thisobjtype=='v') {
if (rowcont[maxrow].indexOf(':'+data1[kj]+':',0)==-1) {
thisobjcol=thisisobj.split('&')[1];
if (colcover.indexOf(':'+thisobjcol+':',0)==-1) {
colcover+=thisobjcol+':';
rowcont[maxrow]+=data1[kj]+':';
}
}
}
if (thisobjtype=='h') {
updown=thisisobj.split('&')[4];
leftupdown=updown.split(':')[0];
rightupdown=updown.split(':')[1];
thisobjdest=thisisobj.split('&')[3];
thisobjtofrom=thisisobj.split('&')[2];
thisobjfrom=thisobjtofrom.split(':')[0];
thisobjto=thisobjtofrom.split(':')[1];
thisobjdir=col[thisobjto]-col[thisobjfrom];
thisobjrow=row[thisisobj.split('&')[1]];
topbottom=thisobjrow-j-1;
newobj='';
if (leftupdown==-1) {
if (topbottom<0) {
if (thisobjdir<0) {
newobj='v&'+thisobjto+'&'+thisobjdest+'&-1';
} else {
newobj='v&'+thisobjfrom+'&'+thisobjdest+'&1';
}
}
} else {
if (topbottom>0) {
if (thisobjdir<0) {
newobj='v&'+thisobjto+'&'+thisobjdest+'&1';
} else {
newobj='v&'+thisobjfrom+'&'+thisobjdest+'&-1';
}
}
}
if (newobj!='') {
thisobjcol=newobj.split('&')[1];
if (colcover.indexOf(':'+thisobjcol+':',0)==-1) {
colcover+=thisobjcol+':';
rowcont[maxrow]+=obj.length+':';
obj[obj.length]=newobj;
}
}
newobj='';
if (rightupdown==-1) {
if (topbottom<0) {
if (thisobjdir<0) {
newobj='v&'+thisobjfrom+'&'+thisobjdest+'&1';
} else {
newobj='v&'+thisobjto+'&'+thisobjdest+'&-1';
}
}
} else {
if (topbottom>0) {
if (thisobjdir<0) {
newobj='v&'+thisobjfrom+'&'+thisobjdest+'&-1';
} else {
newobj='v&'+thisobjto+'&'+thisobjdest+'&1';
}
}
}
if (newobj!='') {
thisobjcol=newobj.split('&')[1];
if (colcover.indexOf(':'+thisobjcol+':',0)==-1) {
colcover+=thisobjcol+':';
rowcont[maxrow]+=obj.length+':';
obj[obj.length]=newobj;
}
}
}
}
}
if (rowcont[maxrow]!=':') {
rowcont[maxrow]=rowcont[maxrow].substring(1,rowcont[maxrow].length-1);
} else {
rowcont[maxrow]='';
}
}
// --------------------------------------------- Creates a new condition object
function newcondition(content,type) {
var ko;
stored=0;
ko=obj.length;
obj[ko]='c';
objcont[ko]=content+':'+type+':cond';
return ko;
}
// ---------------------------------------------- Creates a new resource object
function newresource(rid,cid,text,url,ext,type) {
stored=0;
objcont[addobj(rid,'b&'+rid+'&'+cid+':0:0:0')]=
text+':'+url+':'+ext+':'+type+':res';
}
// -------------------------------- Insert a condition into a port of an object
function insertcond(obj1,portnr,cond) {
var k;
stored=0;
data1=obj[obj1].split('&');
for (k=2;k<data1.length;k++) {
data2=data1[k].split(':');
if (data2[0]==portnr) {
data2[3]=cond;
data1[k]=data2.join(':');
}
}
obj[obj1]=data1.join('&');
}
// --------------------------------------------- Insert a column into the table
// Inserts a new table column after table column j
function insertcol(j) {
var kj;
stored=0;
for (kj=0;kj<=maxcol;kj++) {
if ( col[kj]>j ) { col[kj]++; }
}
maxcol++;
col[maxcol]=j+1;
}
// --------------------------------------------------------------- Find the row
function findrow(jid) {
var j;
for (j=0;j<=maxrow;j++) { if (row[j]==jid) { return j; } }
return -1;
}
// --------------------------------------------------------------- Find the col
function findcol(jid) {
var j;
for (j=0;j<=maxcol;j++) { if (col[j]==jid) { return j; } }
return -1;
}
// -------------------------------------------------------------- Map out a row
//
// b&rowID&colID:inObj:outObj:outCond&...
// h&rowID&incolID:outcolID&inObj:outObj&inupdown:outupdown
// v&colID&inObj:outObj&updown
//
// returns middle (col number of middle of obj1)
// sets colmap (map of cols with object numbers)
function maprow (jid,obj1,ign) {
var j; var k; var left; var right; var middle;
middle=-1;
for (j=0;j<=maxcol;j++) { colmap[j]=0; }
if (rowcont[jid]!='') {
data2=rowcont[jid].split(':');
for (j=0;j<data2.length;j++) {
data3=obj[data2[j]].split('&');
if (data3[0]=='b') {
left=maxcol;
right=0;
for (k=2;k<data3.length;k++) {
thiscol=col[data3[k].split(':')[0]];
if (thiscol<left) { left=thiscol; }
if (thiscol>right) { right=thiscol; }
}
}
if (data3[0]=='h') {
data4=data3[2].split(':');
if (col[data4[1]]>col[data4[0]]) {
left=col[data4[0]];
right=col[data4[1]];
} else {
right=col[data4[0]];
left=col[data4[1]];
}
}
if (data3[0]=='v') { left=col[data3[1]]; right=left; }
if (data2[j]==obj1) { middle=Math.round((left+right)/2); }
if ((data3[0]!='h') || (ign!=1)) {
for (k=left;k<=right;k++) { colmap[k]=data2[j]; }
} else {
colmap[left]=data2[j];
colmap[right]=data2[j];
}
}
}
return middle;
}
// --------------------------------------------------------- Find hole in a row
// jid: rowID
// kid: colID, find point close to this
// dkid: destination colID
// returns colID
function comingthru (jid,kid,dkid) {
var k;
maprow(jid,-1,1);
knum=col[kid];
if (colmap[knum]==0) { return kid; }
right=-1;
for (k=knum+1;(k<colmap.length) && (right==-1);k++) {
if ((right==-1) && (colmap[k]!=colmap[knum])) { right=k; }
}
left=-1;
for (k=knum-1;(k>=0) && (left==-1);k--) {
if ((left==-1) && (colmap[k]!=colmap[knum])) { left=k; }
}
kup=-1;
if ((left==-1) && (right==-1)) { right=colmap.length; }
dknum=col[dkid];
dleft=left-dknum;
dright=right-dknum;
if (dleft<0) { dleft=-dleft; }
if (dright<0) { dright=-dright; }
if ((dright<=dleft) && (right!=-1)) { kup=right; }
if ((dright>=dleft) && (left!=-1)) { kup=left; }
if (colmap[kup]==0) { return findcol(kup); }
if (kup==right) { kup--; }
if (kup<0) {
insertcol(-1);
insertcol(0);
} else {
insertcol(kup);
}
return maxcol;
}
// ----------------------------------------------------- Insert port into block
// obj1: object number
// d: direction from middle (>0: right, <0 left)
// inout: in or out port (1: in, 2: out)
// linkobj: object that the link goes to/comes from
// sets inrow or outrow
// return column
function insertport (obj1,d,inout,linkobj) {
var k; var port; var revport;
stored=0;
data1=obj[obj1].split('&');
middle=maprow(data1[1],obj1,0);
if (inout==1) {
inrow=data1[1];
} else {
outrow=data1[1];
}
if (d>0) {
for (k=middle;(colmap[k]==obj1) && (k<colmap.length);k++) { data3[k]=0; }
} else {
for (k=middle;(colmap[k]==obj1) && (k>=0);k--) { data3[k]=0; }
}
for (k=2;k<data1.length;k++) {
data2=data1[k].split(':');
data3[col[data2[0]]]=data2[inout];
}
port=-1;
if (d>0) {
for (k=middle;(colmap[k]==obj1) && (k<colmap.length);k++) {
if ((data3[k]==0) && (colmap[k]==obj1) && (port==-1)) { port=k; }
}
} else {
for (k=middle;(colmap[k]==obj1) && (k>=0);k--) {
if ((data3[k]==0) && (colmap[k]==obj1) && (port==-1)) { port=k; }
}
}
if (port==-1) {
if (colmap[k]==0) {
revport=findcol(k);
if (inout==1) {
data1[data1.length]=revport+":"+linkobj+":0:0";
} else {
data1[data1.length]=revport+":0:"+linkobj+":0";
}
} else {
if (d>0) {
insertcol(k-1);
} else {
insertcol(k);
}
revport=maxcol;
if (inout==1) {
data1[data1.length]=revport+":"+linkobj+":0:0";
} else {
data1[data1.length]=revport+":0:"+linkobj+":0";
}
}
} else {
portfound=-1;
for (k=2;k<data1.length;k++) {
data2=data1[k].split(':');
if (col[data2[0]]==port) {
data2[inout]=linkobj;
data1[k]=data2.join(':');
portfound=1;
}
}
revport=findcol(port);
if (portfound==-1) {
if (inout==1) {
data1[data1.length]=revport+":"+linkobj+":0:0";
} else {
data1[data1.length]=revport+":0:"+linkobj+":0";
}
}
}
obj[obj1]=data1.join('&');
return revport;
}
// ---------------------------- Make a new object and add it to the row content
// returns object number of generated object
function addobj(kjid,objs) {
stored=0;
if (rowcont[kjid]!='') { rowcont[kjid]+=':'; }
rowcont[kjid]+=obj.length;
obj[obj.length]=objs;
return obj.length-1;
}
// ---------------------------------------- Make horizontal connection for hrid
// hoffs=-1: this line goes on top of hrid
function horizontal(hrid,hoffs,hfcol,htcol,hdest,hends) {
hcrid=-1;
if (hoffs==-1) {
hbrid=findrow(row[hrid]-1);
} else {
hbrid=findrow(row[hrid]+1);
}
if (hbrid!=-1) {
maprow(hbrid,-1,0);
hcrid=hbrid;
if (col[hfcol]>col[htcol]) { left=col[htcol]; right=col[hfcol]; }
else { right=col[htcol]; left=col[hfcol]; }
if (colmap[left]!=0) {
hcrid=-1;
} else {
if (colmap[right]!=0) {
hcrid=-1;
} else {
for (kh=left+1;kh<right;kh++) {
if (colmap[kh]!=0) {
if (obj[colmap[kh]].split('&')[0]!='v') { hcrid=-1; }
}
}
}
}
}
if (hcrid==-1) {
insertrow(row[hrid]+hoffs,hfcol,htcol);
addobj(maxrow,'h&'+maxrow+'&'+hfcol+':'+htcol+'&'+hdest+'&'+hends);
} else {
addobj(hcrid,'h&'+hcrid+'&'+hfcol+':'+htcol+'&'+hdest+'&'+hends);
}
}
// --------------------------------------- Deletes all references to object obj
function delobj(obj1) {
var k;
stored=0;
for (k=0;k<rowcont.length;k++) {
data4=rowcont[k].split(':');
rowcont[k]='';
for (k2=0;k2<data4.length;k2++) {
if (data4[k2]!=obj1) {
if (rowcont[k]!='') { rowcont[k]+=':'; }
rowcont[k]+=data4[k2];
}
}
}
}
// --------------------------------------------------------- Garbage collection
function cleanup () {
message("Garbage Collection");
var j,kj,i;
disrows=0;
discols=0;
var emptyspots=0;
for (kj=0;kj<=maxcol;kj++) { data1[kj]=0; }
for (kj=0;kj<=maxrow;kj++) {
rowtype[kj]=0;
if (rowcont[kj]!='') {
data2=rowcont[kj].split(':');
for (j=0;j<data2.length;j++) {
if (obj[data2[j]].substring(0,2)=='e&') {
rowtype[kj]=2;
data1[(obj[data2[j]].split('&'))[1]]=2;
}
}
maprow(kj,-1,1);
for (j=0;j<=maxcol;j++) {
if (colmap[j]!=0) {
if (data1[j]==0) { data1[j]=1; }
if (rowtype[kj]==0) {
if (obj[colmap[j]].substring(0,2)!='v&') {
rowtype[kj]=1;
}
}
if (obj[colmap[j]].substring(0,2)=='b&') {
data1[j]=2;
if (colmap[maxcol]==0) { emptyspots++; }
rowtype[kj]=2;
}
}
}
}
}
for (j=0;j<=maxcol;j++) {
coltype[j]=data1[col[j]];
if (coltype[j]!=0) { discols+=1; }
}
for (j=0;j<=maxrow;j++) {
if (rowtype[j]==2) { disrows+=3; }
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
function delcond(obj1,colid) {
var k;
stored=0;
data3=obj[obj1].split('&');
obj[obj1]=data3[0]+'&'+data3[1];
for (k=2;k<data3.length;k++) {
data4=data3[k].split(':');
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)) {
obj[obj1]+='&'+data4[0]+':'+data4[1]+':'+data4[2]+':'+data4[3];
}
}
}
// ----------------------------------------- Creates a new condition in a block
function crecond(obj1,colid,condtext,condtype) {
var k;
data3=obj[obj1].split('&');
obj[obj1]=data3[0]+'&'+data3[1];
for (k=2;k<data3.length;k++) {
data4=data3[k].split(':');
if (data4[0]==colid) {
data4[3]=newcondition(condtext,condtype);
data2=objlinks[data4[2]].split(':');
objlinks[data4[2]]=data2[0]+':'+data2[1]+':'+data4[3];
}
if ((data4[1]!=0) || (data4[2]!=0) || (data3.length==3)) {
obj[obj1]+='&'+data4[0]+':'+data4[1]+':'+data4[2]+':'+data4[3];
}
}
}
// ---------------------------------------- Delete the path between two objects
// deletes the link linknr
// h&rowID&incolID:outcolID&inObj:outObj&inupdown:outupdown
// v&colID&inObj:outObj&updown
function dellink (linknr) {
var k; var obj1; var obj2;
stored=0;
if (objlinks[linknr]!='') {
data3=objlinks[linknr].split(':');
obj1=data3[0];
obj2=data3[1];
data3=obj[obj1].split('&');
obj[obj1]=data3[0]+'&'+data3[1];
for (k=2;k<data3.length;k++) {
data4=data3[k].split(':');
if (data4[2]==linknr) { data4[2]=0; data4[3]==0; }
if ((data4[1]!=0) || (data4[2]!=0) || (data3.length==3)) {
obj[obj1]+='&'+data4[0]+':'+data4[1]+':'+data4[2]+':'+data4[3];
}
}
data3=obj[obj2].split('&');
obj[obj2]=data3[0]+'&'+data3[1];
for (k=2;k<data3.length;k++) {
data4=data3[k].split(':');
if (data4[1]==linknr) { data4[1]=0; }
if ((data4[1]!=0) || (data4[2]!=0) || (data3.length==3)) {
obj[obj2]+='&'+data4[0]+':'+data4[1]+':'+data4[2]+':'+data4[3];
}
}
for (k=0;k<obj.length;k++) {
if (obj[k]!='') {
data3=obj[k].split('&');
if (((data3[0]=='v') || (data3[0]=='h')) &&
(data3[data3.length-2]==linknr)) {
delobj(k);
}
}
}
objlinks[linknr]='';
}
}
// ----------------------------------------------------------- Join two objects
// Links obj1 with obj2, creates new objlink, marks all elements with number
function joinres (obj1,obj2,cond) {
var k; var kr; var outcol; var incol; var d;
stored=0;
dest=objlinks.length;
objlinks[dest]=obj1+':'+obj2+':'+cond;
data3=obj[obj1].split('&');
sum=0;
for (k=2;k<data3.length;k++) { sum+=col[data3[k].split(':')[0]]; }
outmiddle=sum/(data3.length-2);
data3=obj[obj2].split('&');
sum=0;
for (k=2;k<data3.length;k++) { sum+=col[data3[k].split(':')[0]]; }
inmiddle=sum/(data3.length-2);
d=inmiddle-outmiddle;
outcol=insertport(obj1,d,2,dest);
insertcond(obj1,outcol,cond);
incol=insertport(obj2,-d,1,dest);
if (row[inrow]==(row[outrow]+1)) {
insertrow(row[outrow],-1,-1);
}
if (row[inrow]<row[outrow]) {
updown=1;
tcol=comingthru(inrow,incol,outcol);
horizontal(inrow,-1,tcol,incol,dest,'-1:-1');
addobj(inrow,'v&'+tcol+'&'+dest+'&1');
incol=tcol;
tcol=comingthru(outrow,outcol,incol);
horizontal(outrow,0,outcol,tcol,dest,'1:1');
addobj(outrow,'v&'+tcol+'&'+dest+'&1');
outcol=tcol;
} else {
updown=-1;
}
if (inrow==outrow) {
tcol=comingthru(inrow,incol,outcol);
horizontal(inrow,-1,tcol,incol,dest,'-1:-1');
addobj(inrow,'v&'+tcol+'&'+dest+'&1');
horizontal(outrow,0,outcol,tcol,dest,'1:1');
} else {
if (updown==-1) {
for (kr=row[outrow]+1;kr<row[inrow];kr++) {
rid=findrow(kr);
ncol=comingthru(rid,outcol,incol);
if (ncol!=outcol) {
insertrow(kr-1,outcol,ncol);
kr++;
if (col[outcol]>col[ncol]) {
addobj(maxrow,
'h&'+maxrow+'&'+outcol+':'+ncol+'&'+dest+'&-1:1');
} else {
addobj(maxrow,
'h&'+maxrow+'&'+outcol+':'+ncol+'&'+dest+'&1:-1');
}
}
addobj(rid,'v&'+ncol+'&'+dest+'&-1');
outcol=ncol;
}
if (incol!=outcol) {
insertrow(row[inrow]-1,outcol,incol);
if (col[outcol]>col[incol]) {
addobj(maxrow,
'h&'+maxrow+'&'+outcol+':'+incol+'&'+dest+'&-1:1');
} else {
addobj(maxrow,
'h&'+maxrow+'&'+outcol+':'+incol+'&'+dest+'&1:-1');
}
}
} else {
for (kr=row[outrow]-1;kr>row[inrow];kr--) {
rid=findrow(kr);
ncol=comingthru(rid,outcol,incol);
if (ncol!=outcol) {
insertrow(kr,outcol,ncol);
if (col[outcol]>col[ncol]) {
addobj(maxrow,
'h&'+maxrow+'&'+outcol+':'+ncol+'&'+dest+'&1:-1');
} else {
addobj(maxrow,
'h&'+maxrow+'&'+outcol+':'+ncol+'&'+dest+'&-1:1');
}
}
addobj(rid,'v&'+ncol+'&'+dest+'&1');
outcol=ncol;
}
if (incol!=outcol) {
insertrow(row[inrow],outcol,incol);
if (col[outcol]>col[incol]) {
addobj(maxrow,
'h&'+maxrow+'&'+outcol+':'+incol+'&'+dest+'&1:-1');
} else {
addobj(maxrow,
'h&'+maxrow+'&'+outcol+':'+incol+'&'+dest+'&-1:1');
}
}
}
}
}
// ---------------------------------------------------------- Delete a resource
// Deletes resource obj1
// Reconnects resources going thru this one if recon=1
function delres (obj1,recon) {
var infromobj=new Array();
var inwithcon=new Array();
var inwithlink=new Array();
var outtoobj=new Array();
var outwithcon=new Array();
var outwithlink=new Array();
var inobjs=new Array();
var inobjscond=new Array();
var outobjs=new Array();
var outobjscond=new Array();
var k; var k1; var k2; var found;
stored=0;
data1=obj[obj1].split('&');
for (k=2;k<data1.length;k++) {
data2=data1[k].split(':');
if (data2[1]!=0) {
k2=inwithlink.length;
inwithlink[k2]=data2[1];
data3=objlinks[data2[1]].split(':');
infromobj[k2]=data3[0];
inwithcon[k2]=data3[2];
}
if (data2[2]!=0) {
k2=outwithlink.length;
outwithlink[k2]=data2[2];
data3=objlinks[data2[2]].split(':');
outtoobj[k2]=data3[1];
outwithcon[k2]=data3[2];
}
}
for (k=0;k<inwithlink.length;k++) { dellink(inwithlink[k]); }
for (k=0;k<outwithlink.length;k++) { dellink(outwithlink[k]); }
delobj(obj1);
objcont[obj1]='';
if (recon==1) {
message("Reconnecting");
for (k=0;k<inwithlink.length;k++) {
if (infromobj[k]!=obj1) {
found=0;
for (k2=0;k2<inobjs.length;k2++) {
if (inobjs[k2]==infromobj[k]) {
if (inwithcon[k]!=0) {
if (inobjscond[k2]!='') { inobjscond[k2]+='||'; }
inobjscond[k2]+=
'('+(objcont[inwithcon[k]].split(':'))[0]+')';
}
found=1;
}
}
if (found==0) {
k2=inobjs.length;
inobjs[k2]=infromobj[k];
if (inwithcon[k]==0) {
inobjscond[k2]='';
} else {
inobjscond[k2]=
'('+(objcont[inwithcon[k]].split(':'))[0]+')';
}
}
}
}
for (k=0;k<outwithlink.length;k++) {
if (outtoobj[k]!=obj1) {
found=0;
for (k2=0;k2<outobjs.length;k2++) {
if (outobjs[k2]==outtoobj[k]) {
if (outwithcon[k]!=0) {
if (outobjscond[k2]!='') { outobjscond[k2]+='||'; }
outobjscond[k2]+=
'('+(objcont[outwithcon[k]].split(':'))[0]+')';
}
found=1;
}
}
if (found==0) {
k2=outobjs.length;
outobjs[k2]=outtoobj[k];
if (outwithcon[k]==0) {
outobjscond[k2]='';
} else {
outobjscond[k2]=
'('+(objcont[outwithcon[k]].split(':'))[0]+')';
}
}
}
}
for (k=0;k<inobjs.length;k++) {
cond='';
if (inobjscond[k]!='') { cond='('+inobjscond[k]+')'; }
for (k2=0;k2<outobjs.length;k2++) {
thiscond=cond;
if (outobjscond[k2]!='') {
if (thiscond!='') { thiscond+='&&'; }
thiscond+='('+outobjscond[k2]+')';
}
condnr=0;
if (thiscond!='') { condnr=newcondition(thiscond,'normal'); }
joinres(inobjs[k],outobjs[k2],condnr);
}
}
}
}
// -------------------------------------------------------------- Draw an entry
function drawcell (rtype,ctype,what,cm,obj1,ej,ek,ne) {
var bgcolor;
if ((what=='') && (ne==0)) { cm="#DDDDDD"; }
if (ctype!=0) {
parent.mapout.document.write('<td bgcolor='+cm+' width='+cw[ctype]+'>');
if (what!='') {
if (obj1!='') {
obj1="'"+obj1+"'";
parent.mapout.document.write
('<a href="javascript:parent.code.handler('+obj1
+');" onMouseOver="parent.code.info('+obj1+');">');
}
if (what=='r:') {
parent.mapout.document.write
('<img border=0 width='+cw[ctype]+' height='+rh[rtype]
+' src="resource.gif">');
} else {
if (what=='c:') {
parent.mapout.document.write
('<img border=0 width='+cw[ctype]+' height='+rh[rtype]
+' src="condition.gif">');
} else {
if (what=='rs:') {
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!='') {
parent.mapout.document.write('</a>');
}
} else {
if (ne!=1) {
parent.mapout.document.write
('<a href="javascript:parent.code.empty('+ej+','+ek+');" ');
} else {
parent.mapout.document.write
('<a href="javascript:parent.code.infoclear();" ');
}
parent.mapout.document.write
('onMouseOver="parent.code.infoclear();">');
parent.mapout.document.write
(
'<img border=0 width='+cw[ctype]+' height='+rh[rtype]
+' src="'+rtype+'.'+ctype+'.empty.gif"></a>');
}
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
function drawrow (jid) {
var j; var jk; var k; var ck; var rtype;
var objd1=new Array();
var objd2=new Array();
var notempty=new Array();
var condtype;
if (rowtype[jid]!=0) {
for (j=0;j<=maxcol;j++) {
colmap[j]=''; colmap2[j]=''; colmap3[j]=''; colmap4[j]='';
colmap5[j]='#CCCCCC'; colmap6[j]='#CCCCCC';
objd1[j]=''; objd2[j]=''; notempty[j]=0;
}
parent.mapout.document.writeln('<tr height='+rh[rowtype[jid]]+'>');
if (rowcont[jid]!='') {
data2=rowcont[jid].split(':');
for (jk=0;jk<data2.length;jk++) {
data3=obj[data2[jk]].split('&');
if (data3[0]=='b') {
data1=objcont[data2[jk]].split(':');
rtype=data1[3];
ck=rescolor(data1[2],data1[3]);
left=maxcol;
leftin=maxcol;
leftout=maxcol;
right=0;
rightin=0;
rightout=0;
anyout=0;
for (k=2;k<data3.length;k++) {
data1=data3[k].split(':');
thiscol=col[data1[0]];
if (thiscol<left) { left=thiscol; }
if (thiscol>right) { right=thiscol; }
if (data1[1]!=0) {
if (thiscol<leftin) { leftin=thiscol; }
if (thiscol>rightin) { rightin=thiscol; }
colmap4[thiscol]=data1[1];
}
if (data1[2]!=0) {
if (thiscol<leftout) { anyout=1; leftout=thiscol; }
if (thiscol>rightout) { anyout=1; rightout=thiscol; }
if (data1[3]!=0) {
colmap3[thiscol]='c:';
condtype=(objcont[data1[3]].split(':'))[1];
colmap6[thiscol]=condcolor(condtype);
objd2[thiscol]='c&'
+data1[0]+'&'+data2[jk]+'&'+data1[2]+'&'+data1[3];
} else {
colmap3[thiscol]='ctd';
colmap6[thiscol]=ck;
objd2[thiscol]='c&'
+data1[0]+'&'+data2[jk]+'&'+data1[2]+'&-';
}
}
}
for (k=left;k<=right;k++) { notempty[k]=1; colmap5[k]=ck; }
middle=Math.round((left+right)/2);
if (rtype=='start') {
colmap[middle]='rs:';
} else {
if (rtype=='finish') {
colmap[middle]='rf:';
} else {
colmap[middle]='r:';
}
}
objd1[middle]+='r&'+data2[jk];
if (rightin>middle) {
for (k=middle+1;k<rightin;k++) {
if (colmap4[k]!='') {
colmap[k]='rlt';
} else {
colmap[k]='rl';
}
}
colmap[rightin]='tl';
}
if (leftin<middle) {
for (k=middle-1;k>leftin;k--) {
if (colmap4[k]!='') {
colmap[k]='lrt';
} else {
colmap[k]='lr';
}
}
colmap[leftin]='tr';
}
if ((leftout>middle) && (anyout)) {
colmap2[middle]='tr';
}
if (leftout==middle) {
if (rightout==middle) { colmap2[middle]='td'; }
if (rightout>middle) { colmap2[middle]='rtd'; }
}
if (leftout<middle) {
if (rightout<middle) { colmap2[middle]='tl'; }
if (rightout==middle) { colmap2[middle]='tdl'; }
if (rightout>middle) {
if (colmap3[middle]!='') {
colmap2[middle]='rtdl';
} else {
colmap2[middle]='rtl';
}
}
}
if (leftout<middle) {
for (k=middle-1;k>leftout;k--) {
if (colmap3[k]!='') {
colmap2[k]='rld';
} else {
colmap2[k]='rl';
}
}
colmap2[leftout]='rd';
}
if (rightout>middle) {
for (k=middle+1;k<rightout;k++) {
if (colmap3[k]!='') {
colmap2[k]='lrd';
} else {
colmap2[k]='lr';
}
}
colmap2[rightout]='ld';
}
}
if (data3[0]=='h') {
data4=data3[2].split(':');
if (col[data4[1]]>col[data4[0]]) {
left=col[data4[0]];
right=col[data4[1]];
thisarrow='lr';
} else {
right=col[data4[0]];
left=col[data4[1]];
thisarrow='rl';
}
if (data3[4].split(':')[0]==1) {
colmap[left]='tr';
} else {
colmap[left]='rd'; colmap2[left]='utd'; colmap3[left]='utd';
}
notempty[left]=1;
notempty[right]=1;
for (k=left+1;k<right;k++) {
notempty[k]=1;
if (colmap[k]=='') {
colmap[k]=thisarrow;
objd1[k]=data2[jk];
} else {
colmap[k]='tdrl';
objd1[k]='';
}
}
if (data3[4].split(':')[1]==1) {
colmap[right]='tl';
} else {
colmap[right]='ld'; colmap2[right]='utd'; colmap3[right]='utd';
}
objd1[left]=data2[jk];
objd1[right]=data2[jk];
}
if (data3[0]=='v') {
left=col[data3[1]];
if (colmap[left]=='') {
if (data3[3]==1) { colmap[left]='dt'; } else { colmap[left]='td'; }
objd1[left]=data2[jk]+'&'+jid;
objd2[left]=objd1[left];
} else {
colmap[left]='tdrl';
objd1[left]='';
}
colmap2[left]='utd'; colmap3[left]='utd';
}
}
rtype=rowtype[jid];
for (k=0;k<=maxcol;k++) {
drawcell(rtype,coltype[rcol[k]],colmap[k],colmap5[k],objd1[k],jid,k,
notempty[k]);
}
if (rowtype[jid]==2) {
parent.mapout.document.writeln('</tr>');
parent.mapout.document.writeln('<tr height='+rh[1]+'>');
for (k=0;k<=maxcol;k++) {
drawcell(1,coltype[rcol[k]],colmap2[k],colmap5[k],objd2[k],jid,k,
notempty[k]);
}
parent.mapout.document.writeln('</tr>');
parent.mapout.document.writeln('<tr height='+rh[1]+'>');
for (k=0;k<=maxcol;k++) {
drawcell(1,coltype[rcol[k]],colmap3[k],colmap6[k],objd2[k],jid,k,
notempty[k]);
}
}
}
parent.mapout.document.writeln('</tr>');
}
}
// -------------------------------------------------------------- Print message
function message(txt) {
parent.window.status=txt;
}
// ------------------------------------------------------------- Draw the table
function draw () {
var k; var kr;
cleanup();
save();
rh[0]=0;
rh[1]=zscale*10;
rh[2]=zscale*20;
cw[0]=0;
cw[1]=zscale*10;
cw[2]=zscale*20;
parent.mapout.document.open('text/html','replace');
parent.mapout.document.writeln('<html><body bgcolor="#FFFFFF">');
if (tablemode==0) {
if (graphdef=='no') { graphopt(); cleanup(); }
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 cellpadding=0 cellspacing=0 border=0 rows='
+disrows+' cols='+discols+'>');
for (kr=0;kr<=maxrow;kr++) {
message("Generating Output Row "+kr);
drawrow(rrow[kr]);
}
} else {
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>');
if (tablemode==1) {
tabledraw();
} else {
simpletabledraw();
}
}
parent.mapout.document.writeln('</table>');
parent.mapout.document.writeln('</body></html>');
parent.mapout.document.close();
parent.focus();
parent.mapout.focus();
}
// --------------------------------------------------------- Clears info window
function infoclear() {
if (notclear!=1) {
infcheck();
inf.document.clear();
inf.document.writeln
('<html><body bgcolor="#FFFFFF"><table><tr><td>'+
'<img src="/adm/lonIcons/lonlogos.gif"></td>');
if (linkmode!=0) {
if (tablemode==0) {
inf.document.writeln(
'<td><b>Link Mode</b><hr>Click on a resource to link it with<br><b>'+
(objcont[linkmode].split(':'))[0]+
'</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 {
if (tablemode==0) {
inf.document.writeln(
'<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.close();
parent.focus();
parent.mapout.focus();
notclear=1;
lastinfo='';
}
}
// ------------------------------------------------------------ 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
function info(infostr) {
if ((editmode!=1) && (infostr!=lastinfo)) {
notclear=1;
infcheck();
inf.document.clear();
inf.document.writeln(
'<html><body bgcolor="#FFFFFF">'+
'<table><tr><td width=32><img src="info.gif"></td><td bgcolor="#AAFFAA">');
data1=infostr.split('&');
if (data1[0]=='c') {
inf.document.write('<b>Condition (');
data3=objlinks[data1[3]].split(':');
if (data1[4]=='-') {
inf.document.write('not set');
} else {
data2=objcont[data1[4]].split(':');
if (data2[1]=='force') {
inf.document.write('Blocking Other Links');
} else {
if (data2[1]=='stop') {
inf.document.write('Blocking This Link');
} else {
inf.document.write('Recommendation');
}
}
}
inf.document.writeln(')</b><hr>From <b>'+objcont[data3[0]].split(':')[0]+
'</b><br>to <b>'+objcont[data3[1]].split(':')[0]+'</b>');
} else {
if (data1[0]=='r') {
data2=objcont[data1[1]].split(':');
inf.document.write('<b>');
if (data2[2]=='true') { inf.document.write('External '); }
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') {
inf.document.write(' (Mandatory)');
}
if (data2[3]=='optional') {
inf.document.write(' (Optional)');
}
inf.document.writeln('</b><hr><b>'+data2[0]+'</b><br>');
inf.document.writeln((data2[1].split('/')).join(' / '));
} else {
inf.document.writeln('<b>Link</b><hr>');
data2=obj[data1[0]].split('&');
data3=objlinks[data2[data2.length-2]].split(':');
inf.document.writeln('From <b>'+objcont[data3[0]].split(':')[0]+
'</b><br>to <b>'+objcont[data3[1]].split(':')[0]+'</b>');
}
}
if (linkmode==0) {
inf.document.writeln('<p>(click to edit)');
} else {
if (data1[0]=='r') {
inf.document.writeln('<p>(click to link)');
} else {
inf.document.writeln('<p>(click to cancel linking and edit)');
}
}
inf.document.writeln('</td></tr></table></body></html>');
inf.document.close();
parent.focus();
parent.mapout.focus();
notclear=0;
lastinfo=infostr;
}
}
// ------------------------------------------------ "Escapes" out special chars
function escape(instring) {
var outstring='';
var thischar;
var k;
for (k=0;k<instring.length;k++) {
thischar=instring.charAt(k);
if (thischar==':') { thischar=':'; }
if (thischar=='"') { thischar='"'; }
if (thischar=="'") { thischar='''; }
if (thischar==',') { thischar=','; }
outstring+=thischar;
}
return outstring;
}
// -------------------------------------------------- Insert resource into link
function insertreslink(infostr) {
var lnr;
var fobj;
var tobj;
var nobj;
var cobj;
var cid;
var rid;
data1=infostr.split('&');
data2=obj[data1[0]].split('&');
lnr=data2[data2.length-2];
data3=objlinks[lnr].split(':');
fobj=data3[0];
tobj=data3[1];
cobj=data3[2];
if (data2[0]=='v') {
rid=data1[1];
cid=data2[1];
} else {
rid=data2[1];
cid=(data2[2].split(':'))[0];
}
dellink(lnr);
newresource(rid,cid,'','','false','normal');
nobj=obj.length-1;
joinres(fobj,nobj,cobj);
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"
function handler(infostr) {
var k;
editmode=1;
notclear=1;
infcheck();
inf.document.clear();
inf.document.writeln(
'<html><body bgcolor="#FFFFFF">'+
'<table><tr><td width=32><img src="edit.gif"></td><td bgcolor="#AAFFAA">');
data1=infostr.split('&');
if (data1[0]=='c') {
inf.document.writeln('<b>Condition</b><hr>');
linkmode=0;
if (data1[4]=='-') {
data2[0]=''; data2[1]='normal';
} else {
data2=objcont[data1[4]].split(':');
}
inf.document.writeln(
'<form name=condinfo><textarea name=c cols=30 rows=3>'
+data2[0]+'</textarea><br><input type=radio name=s value=normal '+
'onClick="self.document.forms.condinfo.elements.h.value='+"'normal'"+'"');
if (data2[1]=='normal') { inf.document.write(' checked'); }
inf.document.write(
'> Recommendation if true<br><input type=radio name=s value=stop '+
'onClick="self.document.forms.condinfo.elements.h.value='+"'stop'"+'"');
if (data2[1]=='stop') { inf.document.write(' checked'); }
inf.document.write(
'> Blocking this link if false<br><input type=radio name=s value=force '+
'onClick="self.document.forms.condinfo.elements.h.value='+"'force'"+'"');
if (data2[1]=='force') { inf.document.write(' checked'); }
inf.document.write(
'> Blocking other links if true<br><a href="javascript:opener.editmode=0;'
+'opener.notclear=0;');
if (data1[4]=='-') {
inf.document.write('opener.crecond('+data1[2]+','+data1[1]+','
+'opener.escape(self.document.forms.condinfo.elements.c.value),'
+'self.document.forms.condinfo.elements.h.value);');
} else {
inf.document.write('opener.objcont['+data1[4]+']='
+'opener.escape(self.document.forms.condinfo.elements.c.value)+'+"':'"
+'+self.document.forms.condinfo.elements.h.value+'+"':cond';");
}
inf.document.writeln(
'opener.infoclear();opener.editmode=0;opener.draw('
+');"><b>Change to above values</b></a> '
+' <a href="javascript:self.document.forms.condinfo.reset()">Reset</a><br>'
+'<input type=hidden name=h value='+data2[1]+'>');
inf.document.writeln(
'<a href="javascript:opener.notclear=0;opener.infoclear();'
+'opener.delcond('+data1[2]+','+data1[1]+');opener.editmode=0;opener.draw('
+');">Delete Condition</a><br>');
inf.document.writeln(
'<a href="javascript:opener.notclear=0;opener.infoclear();'
+'opener.dellink('+data1[3]+');opener.editmode=0;opener.draw('
+');">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 {
if (data1[0]=='r') {
if (linkmode!=0) {
joinres(linkmode,data1[1],0);
editmode=0;
notclear=0;
linkmode=0;
inf.document.writeln('<b>Linked Resources</b>');
draw();
} else {
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(
'<form name=resinfo><table><tr><td>Title:</td><td>'
+'<input type=text name=t size=30 value="'
+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>'
+'<tr><td>External:</td><td><input type=checkbox name=e');
if (data2[2]=='true') { inf.document.write(' checked'); }
inf.document.write('></td></tr>'
+'<tr><td colspan=2>'
+'<input type=radio name=y value=normal '+
'onClick="self.document.forms.resinfo.elements.h.value='+"'normal'"+'"');
if (data2[3]=='normal') { inf.document.write(' checked'); }
inf.document.write(
'> Regular <input type=radio name=y value=mandatory '+
'onClick="self.document.forms.resinfo.elements.h.value='+"'mandatory'"+'"');
if (data2[3]=='mandatory') { inf.document.write(' checked'); }
inf.document.write(
'> Mandatory <input type=radio name=y value=optional '+
'onClick="self.document.forms.resinfo.elements.h.value='+"'optional'"+'"');
if (data2[3]=='optional') { inf.document.write(' checked'); }
inf.document.write('> Optional</td></tr>');
} 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.escape(self.document.forms.resinfo.elements.t.value)+'+"':'"
+'+opener.escape(self.document.forms.resinfo.elements.u.value)+'+"':'"
+'+self.document.forms.resinfo.elements.e.checked+'+"':'"
+'+self.document.forms.resinfo.elements.h.value+'+"':res'"
+';opener.infoclear();opener.editmode=0;opener.draw();">'
+'<b>Change to above values</b></a> '
+' <a href="javascript:self.document.forms.resinfo.reset()">Reset</a>'
+'</td></tr></table>');
if ((data2[3]!='start') && (data2[3]!='finish')) {
inf.document.writeln(
'<a href="javascript:opener.notclear=0;opener.infoclear();'
+'opener.delres('+data1[1]+',0);opener.editmode=0;opener.draw('
+');">Delete Resource (cutting links)</a>');
inf.document.writeln(
'<br><a href="javascript:opener.notclear=0;opener.infoclear();'
+'opener.delres('+data1[1]+',1);opener.editmode=0;opener.draw('
+');">Delete Resource (preserving links)</a>');
}
if (data2[3]!='finish') {
inf.document.writeln(
'<br><a href="javascript:opener.editmode=0;opener.notclear=0;'
+'opener.linkmode='+data1[1]+';'
+'opener.infoclear();">Link Resource</a>');
}
}
} else {
linkmode=0;
inf.document.writeln('<b>Link</b><hr><form>');
data2=obj[data1[0]].split('&');
k=data2[data2.length-2];
data3=objlinks[k].split(':');
inf.document.writeln('From <b>'+objcont[data3[0]].split(':')[0]+
'</b><br>to <b>'+objcont[data3[1]].split(':')[0]+'</b>');
inf.document.writeln('<br><a href="javascript:opener.dellink('+
k+');opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
+');">Delete Link</a>');
inf.document.writeln('<br><a href="javascript:'+
"opener.insertreslink('"+infostr+"');"+
'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
+');">Insert Resource Into Link</a>');
}
}
inf.document.writeln(
'<br><a href="javascript:opener.editmode=0;opener.notclear=0;'
+'opener.infoclear();">Done</a>');
inf.document.writeln('</form></td></tr></table></body></html>');
inf.document.close();
inf.focus();
}
// ----------------------------------------------------- Clicks on empty fields
function empty(rid,k) {
var cid=findcol(k);
var lcol=k-1;
trow=row[rid];
lrow=trow-1;
editmode=1;
notclear=1;
linkmode=0;
infcheck();
inf.document.clear();
inf.document.writeln(
'<html><body bgcolor="#FFFFFF">'+
'<table><tr><td width=32><img src="edit.gif"></td><td bgcolor="#AAFFAA">'+
'<b>Empty Field</b><hr>');
inf.document.writeln('<br><a href="javascript:opener.newresource('+
rid+','+cid+",'','','false','normal');"+
'opener.mostrecent=opener.obj.length-1;'+
'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
+');">Insert resource</a>');
if ((mostrecent!=0) && (objcont[mostrecent]!='')) {
inf.document.writeln('<br><a href="javascript:opener.newresource('+
rid+','+cid+",'','','false','normal');"+
'opener.mostrecent=opener.obj.length-1;'+
'opener.joinres('+mostrecent+',opener.obj.length-1,0);'+
'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
+');">Insert resource linked to from most recent one</a>');
inf.document.writeln('<br><a href="javascript:opener.newresource('+
rid+','+cid+",'','','false','normal');"+
'opener.mostrecent=opener.obj.length-1;'+
'opener.joinres(opener.obj.length-1,'+mostrecent+',0);'+
'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
+');">Insert resource linking to most recent one</a>');
}
inf.document.writeln('<hr>Insert column:');
inf.document.writeln('<a href="javascript:opener.insertcol('+
lcol+');opener.addobj('+rid+",'e&'+opener.maxcol);"
+'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
+');">left</a>');
inf.document.writeln('<a href="javascript:opener.insertcol('+
k+');opener.addobj('+rid+",'e&'+opener.maxcol);"
+'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
+');">right</a> ');
inf.document.writeln('<br>Insert row:');
inf.document.writeln('<a href="javascript:opener.insertrow('+
trow+');opener.addobj(opener.maxrow'+",'e&"+cid+"');"
+'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
+');">below</a>');
inf.document.writeln('<a href="javascript:opener.insertrow('+
lrow+');opener.addobj(opener.maxrow'+",'e&"+cid+"');"
+'opener.editmode=0;opener.notclear=0;opener.infoclear();opener.draw('
+');">above</a> ');
inf.document.writeln(
'<br><a href="javascript:opener.editmode=0;opener.notclear=0;'
+'opener.infoclear();">Done</a>');
inf.document.writeln('</td></tr></table></body></html>');
inf.document.close();
inf.focus();
}
// ---------------------------------------------------- Save into hidden fields
function save() {
var k;
if (graphdef=='yes') {
parent.server.document.forms.storage.output.value='graphdef<:>yes';
for (k=1;k<obj.length;k++) {
parent.server.document.forms.storage.output.value+=
'<&>obj<:>'+k+'<:>'+obj[k];
}
for (k=0;k<row.length;k++) {
parent.server.document.forms.storage.output.value+=
'<&>row<:>'+k+'<:>'+row[k];
}
for (k=0;k<col.length;k++) {
parent.server.document.forms.storage.output.value+=
'<&>col<:>'+k+'<:>'+col[k];
}
for (k=0;k<rowcont.length;k++) {
if (rowcont[k]) {
parent.server.document.forms.storage.output.value+=
'<&>rowcont<:>'+k+'<:>'+rowcont[k];
}
}
parent.server.document.forms.storage.output.value+=
'<&>maxcol<:>'+maxcol;
parent.server.document.forms.storage.output.value+=
'<&>maxrow<:>'+maxrow;
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+=
'<&>tablemode<:>'+tablemode;
for (k=0;k<objcont.length;k++) {
if (objcont[k]) {
parent.server.document.forms.storage.output.value+=
'<&>objcont<:>'+k+'<:>'+objcont[k];
}
}
for (k=0;k<objlinks.length;k++) {
if (objlinks[k]) {
parent.server.document.forms.storage.output.value+=
'<&>objlinks<:>'+k+'<:>'+objlinks[k];
}
}
undopointer++;
undostack[undopointer]=
parent.server.document.forms.storage.output.value;
}
// ----------------------------------------------- Reset all layout information
function graphreset() {
var k;
for (k=0;k<obj.length;k++) { obj[k]=''; }
obj.length=0;
obj[0]='';
rowcont.length=0;
rowcont[0]='';
row.length=0;
row[0]=0;
maxrow=0;
col.length=0;
colmap.length=0;
maxcol=-1;
insertcol(-1);
objcont[0]='';
objcont[1]='Start::false:start:res'
objcont[2]='Finish::false:finish:res';
objlinks[0]='';
objlinks[1]='1:2:0';
graphdef='no';
}
// --------------------- Compare two resources with each other for "straighten"
function rescompare(a,b) {
data1=a.split(':');
data2=b.split(':');
var rvalue=0;
var k;
for (k=1;k<data1.length;k++) {
if (data1[k]==data2[0]) { rvalue--; }
}
for (k=1;k<data3.length;k++) {
if (data2[k]==data1[0]) { rvalue++; }
}
if (rvalue==0) { rvalue=data2.length-data1.length; }
return rvalue;
}
// -------------------------------------------- Draw the table instead of graph
function tabledraw() {
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();
insrestab(1,-1,-1,'');
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><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>');
data2=obj[i].split('&');
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(
'<tr><td>Title:</td><td><input type=text name=t size=50 value="'
+data1[0]+'"><input type=hidden name=h value='+data1[3]
+'></td></tr>');
if ((data1[3]!='start') && (data1[3]!='finish')) {
parent.mapout.document.write(
'<tr><td>URL:</td><td><input type=text name=u size=50 value="'
+data1[1]+'"></td></tr>'
+'<tr><td>External:</td><td><input type=checkbox name=e');
if (data1[2]=='true') { parent.mapout.document.write(' checked'); }
parent.mapout.document.write('></td></tr>'
+'<tr><td colspan=2><input type=radio name=y value=normal '+
'onClick="parent.mapout.document.forms.r'+i+'.elements.h.value='+
"'normal'"+'"');
if (data1[3]=='normal') { parent.mapout.document.write(' checked'); }
parent.mapout.document.write(
'> Regular <input type=radio name=y value=mandatory '+
'onClick="parent.mapout.document.forms.r'+i+'.elements.h.value='+
"'mandatory'"+'"');
if (data1[3]=='mandatory') { parent.mapout.document.write(' checked'); }
parent.mapout.document.write(
'> Mandatory <input type=radio name=y value=optional '+
'onClick="parent.mapout.document.forms.r'+i+'.elements.h.value='+
"'optional'"+'"');
if (data1[3]=='optional') { parent.mapout.document.write(' checked'); }
parent.mapout.document.write('> Optional</td></tr>');
} 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
+'.elements.t.value)+'+"':'"
+'+parent.code.escape(parent.mapout.document.forms.r'+i
+'.elements.u.value)+'+"':'"
+'+parent.mapout.document.forms.r'+i+'.elements.e.checked+'+"':'"
+'+parent.mapout.document.forms.r'+i+'.elements.h.value+'+"':res'"
+';parent.code.draw();">'
+'<b>Change to above values</b></a> '
+' <a href="javascript:parent.mapout.document.forms.r'+i
+'.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++) {
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(
'<a href="javascript:parent.code.handler('+
"'c&"+data4[0]+'&'+i+'&'+data4[2]+'&'+condid+"');"
+'">Edit</a>');
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(
'<a href="javascript:parent.code.handler('+
"'c&"+data4[0]+'&'+i+'&'+data4[2]+'&'+condid+"');"
+'">Edit</a>');
parent.mapout.document.writeln('</td>');
}
}
}
parent.mapout.document.writeln(
'</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
function sortobjs() {
message("Sorting Resources");
var k;
var ij;
var dol;
var dtl;
var kj;
var sortthis=0;
var objsort=new Array();
for (k=1;k<objcont.length;k++) {
if (objcont[k]) {
data1=objcont[k].split(':');
if (data1[data1.length-1]=='res') {
objsort[objsort.length]=''+k;
}
}
}
if (objsort.length==0) { return ''; }
for (k=1;k<objlinks.length;k++) {
if (objlinks[k]!='') {
sortthis=1;
data1=objlinks[k].split(':');
kj=-1;
for (j=0;j<objsort.length;j++) {
if ((objsort[j].split(':'))[0]==data1[0]) {
kj=j;
}
}
objsort[kj]+=':'+data1[1];
}
}
if (sortthis!=0) {
for (k=0;k<objsort.length;k++) {
for (j=0;j<objsort.length;j++) {
if (k!=j) {
data1=objsort[k].split(':');
data2=objsort[j].split(':');
dol=data1.length;
dtl=data2.length;
for (kj=1;kj<dol;kj++) {
if (data1[kj]==data2[0]) {
for (ij=1;ij<dtl;ij++) {
data1[data1.length]=data2[ij];
}
}
}
for (kj=1;kj<dtl;kj++) {
if (data2[kj]==data1[0]) {
for (ij=1;ij<dol;ij++) {
data2[data2.length]=data1[ij];
}
}
}
objsort[k]=data1.join(':');
objsort[j]=data2.join(':');
}
}
}
return objsort.sort(rescompare).join('&');
} else {
return objsort.join('&');
}
}
// ----------------------------------------------------------- Straighten graph
function graphopt() {
var k;
var kj;
var ij;
var objsorted=new Array();
condense();
graphreset();
objsorted=(sortobjs()).split('&');
if (objsorted.length==0) { return; }
message("Creating Optimized Graph");
var thisnewobj=''+(objsorted[0].split(':'))[0];
rowcont[1]=thisnewobj;
var thiscolmax=1;
obj[thisnewobj]='b&1&'+thiscolmax+':0:0:0';
var allcolmax=0;
for (k=1;k<objsorted.length;k++) {
thisnewobj=(objsorted[k].split(':'))[0];
if (rescompare(objsorted[k-1],objsorted[k])==0) {
rowcont[rowcont.length-1]+=':'+thisnewobj;
thiscolmax++;
} else {
rowcont[rowcont.length]=thisnewobj;
thiscolmax=1;
}
kj=rowcont.length-1;
obj[thisnewobj]='b&'+kj+'&'+thiscolmax+':0:0:0';
if (thiscolmax>allcolmax) { allcolmax=thiscolmax; }
}
for (k=0;k<obj.length;k++) {
if (!obj[k]) { obj[k]=''; }
}
for (k=0;k<=allcolmax;k++) { insertcol(0); }
for (k=0;k<rowcont.length;k++) {
row[k]=k;
}
maxrow=rowcont.length-1;
var oldlinks=new Array();
for (k=0;k<objlinks.length;k++) { oldlinks[k]=objlinks[k]; }
objlinks.length=0;
objlinks[0]='';
for (k=0;k<objsorted.length;k++) {
kj=(objsorted[k].split(':'))[0];
for (ij=1;ij<oldlinks.length;ij++) {
if (oldlinks[ij]) {
data1=oldlinks[ij].split(':');
if (data1[0]==kj) {
joinres(data1[0],data1[1],data1[2]);
}
}
}
}
graphdef='yes';
}
// ----------------------------------------------------------- Remove e-objects
function condense() {
message("Condensing");
var j;
for (j=0;j<=maxrow;j++) {
if (rowcont[j]!='') {
data1=rowcont[j].split(':');
rowcont[j]='';
for (k=0;k<data1.length;k++) {
if (obj[data1[k]].substring(0,2)!='e&') {
if (rowcont[j]!='') { rowcont[j]+=':'; }
rowcont[j]+=data1[k];
}
}
}
}
}
// ---------------------------------------------------- Load from hidden fields
function load() {
message("Loading");
var k;
for (k=0;k<objcont.length;k++) { objcont[k]=''; }
objcont.length=0;
for (k=0;k<objlinks.length;k++) { objlinks[k]=''; }
objlinks.length=0;
objlinks[0]='';
objcont[0]='';
editmode=0;
notclear=0;
lastinfo='';
graphreset();
var inputstr=parent.server.document.forms.storage.output.value;
if (inputstr!='') {
data1=inputstr.split('<&>');
var k;
for (k=0;k<data1.length;k++) {
data2=data1[k].split('<:>');
if (data2[0]=='graphdef') { graphdef=data2[1]; }
if (data2[0]=='maxcol') { maxcol=1*data2[1]; }
if (data2[0]=='maxrow') { maxrow=1*data2[1]; }
if (data2[0]=='obj') { obj[data2[1]]=data2[2]; }
if (data2[0]=='objcont') { objcont[data2[1]]=data2[2]; }
if (data2[0]=='objlinks') { objlinks[data2[1]]=data2[2]; }
if (data2[0]=='rowcont') { rowcont[data2[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]=='mode') { mode=data2[1]; }
if (data2[0]=='tablemode') { tablemode=1*data2[1]; }
if (data2[0]=='zscale') { zscale=1*data2[1]; }
}
}
}
// -------------------------------------------------------------- Undo function
function undo() {
if (undopointer>1) {
undopointer--;
parent.server.document.forms.storage.output.value
=undostack[undopointer];
load();
undopointer--;
draw();
stored=0;
} else {
alert("Cannot undo: reached beginning of edit session");
}
}
// -------------------------------------------------------------- Redo function
function redo() {
if (undopointer<undostack.length-1) {
undopointer++;
parent.server.document.forms.storage.output.value
=undostack[undopointer];
load();
undopointer--;
draw();
stored=0;
} else {
alert("Cannot redo: reached end of edit session");
}
}
// ------------------------------------------------------------ Revert function
function revert() {
if (confirm("Revert to beginning of edit session?")) {
undopointer=2;
undo();
}
}
// -------------------------------------------------------------- Store changes
function storechange() {
parent.server.document.forms.storage.submit();
load();
draw();
stored=1;
}
// ---------------------------------------------------------------- Toggle Mode
function togglemode() {
if (tablemode==0) {
tablemode=1;
} else {
if (tablemode==1) {
tablemode=2;
} else {
tablemode=0;
}
}
notclear=0;
infoclear();
draw();
}
// -------------------------------------------------------- Main program onLoad
function main() {
if (mainrun==0) {
infopen();
infoclear();
load();
draw();
stored=1;
mainrun=1;
}
}
// ------------------------------------------------------------- Save on leave?
function leave() {
if (!inf.closed) {
inf.close();
}
if (stored==0) {
if (confirm('Store changes?')) {
storechange();
}
}
}
</script>
</head>
<body bgcolor="#FFFFFF" onLoad="main();" onUnload="leave();">
<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:graphopt();draw();">Straighten</a>
<a href="javascript:revert();">Revert</a>
<a href="javascript:undo();">Undo</a>
<a href="javascript:redo();">Redo</a>
<a href="javascript:storechange();">Store</a>
</body>
</html>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>