//menueditextra.js
//---------- EXTRA STUFF NOT IN MENUCODE.JS-------------

var COMMA = ",";

var OP,MS;
var designated;//node indicated
var floating;//detached dynasty
var disbox;
var urlbox;
var IBOX;
var insetFactor = 0;
var menuChanged = false;



function NF(number, fieldsize, decimals)
{
var t;
if (!isNaN(number)) t = number.toFixed(decimals); else t = "-";
var L = fieldsize - t.length;
while (L-- > 0) t = ' ' + t;
return t;
}

function spaceStr(k)
{
var s = "";
while (k-- > 0) s += " ";
return s;
}

//spaces proportional to depth of item k into tree
function inset(k)
{
if (insetFactor == 0) return "";
return spaceStr(insetFactor*nDepth(k));
}


function keyhandler(e)
{
var keynum=0;

if (window.event) {keynum = e.keyCode;}
else if(e.which) {keynum = e.which;}

if (keynum==13) {return false;}
return true;
}

//sibling one position older, or -1 if none
function elderSib(k)
{
if (k < 0) return -1;
var par = mPar[k];
var c = mChi[par];
if (c == k) return -2;
while (mSib[c] != k) c = mSib[c];
return c;
}


function nodeStr(k)
{
var s = "";
var wid=18;
s += LJ("Display text",wid) + mTxt[k] + CRLF;
if (mJmp[k] != "") s += LJ("Linking to",wid) + mJmp[k] + CRLF;
s += LJ("Parent",wid) + mTxt[mPar[k]] + CRLF;
if (mChi[k] >=0) s += LJ("First child",wid) + mTxt[mChi[k]] + CRLF;
if (elderSib(k) >= 0) s += LJ("Earlier sibling",wid) + mTxt[elderSib(k)] + CRLF;
if (mSib[k] >= 0) s += LJ("Later sibling",wid) + mTxt[mSib[k]] + CRLF;
return s;
}

function writemsg(txt)
{
MS.innerHTML = "<h3>Designated Item</h3><pre style='color:#000080'>" + txt + "</pre>";
}

function leaffunc(k)
{
designated = k;
writemsg(nodeStr(k));
var s = "leaffunc(" + k + ") = " + mTxt[k];
disbox.value=mTxt[k];
urlbox.value=mJmp[k];
}

function branchfunc(k)
{
designated = k;
writemsg(nodeStr(k));
disbox.value=mTxt[k];
urlbox.value=mJmp[k];
}



/*terminate at node designated
Before cut where d = designated
A---B--C
    |
    D--E--F
    |  |
    G

After cut
A---B--C
    |
    G

floating =  D--E--F
               |
*/
function prune()
{
if (designated < 0) {alert("Nothing is designated");return;}

//cut out designated from list of siblings
if (elderSib(designated) >=0) mSib[elderSib(designated)] = mSib[designated];

//reset first child of parent of designated
if (mChi[mPar[designated]] == designated) mChi[mPar[designated]] = mSib[designated];

//orphan designated
mPar[designated] = -1;

//clear its siblings
mSib[designated] = -1;

//designated is now floating
floating = designated;

designated = -1;

writeMenu(0);
}

//attach floating as first child of designated
function graft(toRoot)
{
if (toRoot && (floating > 0)) designated = 0;
if (designated < 0) {alert("Nothing is designated");return;}
if (floating < 0) {alert("There is nothing to graft");return;}
var oldChi = mChi[designated];
mChi[designated] = floating;
mSib[floating] = oldChi;
mPar[floating] = designated;
floating = -1;
designated = -1;
menuChanged = true;
writeMenu(0);
}



//move(1) move up
//move(-1) move down
function move(delta)
{
if (designated < 0) {alert("Nothing is designated");return;}
if ((delta != -1) && (delta != 1)) return;

var list = new Array(MAXM);

//make a list of all siblings
var nSibs=0;
var dPos=-1;
var c = mChi[mPar[designated]];
while (c>=0)
  {
  if (c == designated) dPos = nSibs;
  list[nSibs]=c;
  c=mSib[c];
  nSibs++;
  }
list[nSibs] = -1;

//if moving down check it's not at the bottom
if ((delta < 0) && (dPos == (nSibs-1))) {alert("Can't move it down");return;}
//if moving up check it's not at the top
if ((delta > 0) && (dPos < 1)) {alert("Can't move it up");return;}

//swap designated with list[dPos-delta]
list[dPos] = list[dPos-delta]; list[dPos-delta] = designated;

//rewrite list of siblings
mChi[mPar[designated]] = list[0];
j=0;
while (j < nSibs) {mSib[list[j]] = list[j+1]; j++;}

//designated = -1;
menuChanged = true;
writeMenu(0);
}

function makenew()
{
floating = mItems;
mItems++;
mTxt[floating] = disbox.value;
mJmp[floating] = urlbox.value;
}


function startOver()
{
MAXM=2000;

mPar = new Array(MAXM);  //parent, -1 if none
mSib = new Array(MAXM);  //next sibling, -1 if no more
mChi = new Array(MAXM);  //first child, -1 if none or a leaf
mTxt = new Array(MAXM);  //text to show
mJmp = new Array(MAXM);  //url

var nxt,j,par,chi;
writing=false;
writtenMenuIndex=-2;
//zeroize tree components
for (j=0;j<MAXM;j++)
  {
  mPar[j] = mSib[j] = mChi[j] = -1; //no parents, siblings, children
  mJmp[j] = mTxt[j] = "";  //no text or jumps
  }
nBranch=nLeaf=0;

j=0
mTxt[0] = "root";  //this node is not allowed a sibling or a parent
mJmp[0] = "jmp0";
mChi[0] = 1;
mPar[1] = 0;

mTxt[1] = "new menu";
nxt = 2;
par = 0;  //we are about to fill in the details of a child of this node

mItems = nxt;

designated = floating = -1;
menuChanged = true;

writeMenu(0);
}




//string describing tree suitable for menu.js
//the principal output of this program
function treeStr()
{
var s="var menu1 = new Array(" + CRLF;
var k = mChi[0];
var i;
var first=true;

while (k > 0)
  {
  s += inset(k);
  if (mChi[k] >= 0)//branch
    {
    s += QUOTE + ">" + mTxt[k] + UNQUOTE;
    }
  else//leaf
    {
    if (mJmp[k] == "") s += QUOTE + mTxt[k] + UNQUOTE;
    else s += QUOTE + mTxt[k] + "|" + mJmp[k] + UNQUOTE;
    }

  if (mChi[k] >= 0) k = mChi[k];    //if possible go to child
  else if (mSib[k] >= 0) k = mSib[k]; //if not try sibling
  else //otherwise back up
    {
    var OK=false;
    while (!OK && (k>0))
      {
      k = mPar[k];
      s += COMMA + CRLF + inset(k) + QUOTE + "<" + UNQUOTE;
      if (k>0)
      if (mSib[k] >=0)
        {
        k = mSib[k];
        OK=true;
        }
      }//while (!OK && (k>0))
    }
  if (k>0) s += COMMA + CRLF;
  }//while (k > 0)
s += CRLF + ");" + CRLF;
return s;
}

function editTxt()
{
mTxt[designated] = disbox.value;
if (mChi[designated] < 0) mJmp[designated] = urlbox.value;
menuChanged = true;
writeMenu(0);
}


function makemenu()
{
if (IBOX.checked) insetFactor=3; else insetFactor=0;
showOutput(treeStr());
}

function inittreeedit()
{
MS = document.getElementById("msg");
designated = -1;
floating = -1;
disbox=document.form1.displaytxt;
urlbox=document.form1.urltxt;
disbox.value="";
urlbox.value="";
menuChanged = false;
IBOX = document.form1.indentbox;
IBOX.checked = false;
}

function LJ(txt,n)
{
var t = txt;
var L = n - txt.length;
while (L-- > 0) t = t + ' ';
return t;
}



function sStr(k,sk)
{
var s = " " + NF(k,2,0) + " ";
if ((k < 0) || (sk == "")) s += spaceStr(20); else s += LJ(sk,20);
return s;
}

function menuDiagStr()
{
var n=0;
var s="  n txt                     parent                  sibling                 child" + CRLF;
while (n < mItems)
  {
  s += sStr(n,mTxt[n]);
  s += sStr(mPar[n],mTxt[mPar[n]]);
  s += sStr(mSib[n],mTxt[mSib[n]]);
  s += sStr(mChi[n],mTxt[mChi[n]]);
  s += CRLF;
  n++;
  }
return s;
}



function showOutput(txt)
{
var w = 600;
var h = 400;
var tp = (screen.height - h)/2;
var lf = (screen.width - w)/2;
var format="top=" + tp + ",left=" + lf + ",width=" + w + ",height=" + h + ", resizable=1, scrollbars=1, menubar=1, toolbar=1";
var win2 = window.open("","",format);
if (win2 == null) alert("cannot open new window");
var T = "<html><head>"
 + "\n<body>\n"
 + "<pre style='font-size:12px;color:#000000;'>" + txt + "</pre>"
 + "\n<script>self.focus();<\/script>"
 + "\n<\/body><\/html>";
win2.document.write(T);
win2.document.close();
}//showOutput



function makePageEdit()
{
document.getElementById("bannerid").innerHTML= '<img src= "' + BANNERPIC + '">';
window.setTimeout('initMenu()',5);
setTimeout("inittreeedit()",2000);
}

function warnEdit1()
{
var s = "Warning"
+ "\n\nRead HELP before attempting to edit a menu."
+ "\n\nThe pink menu on the left is being edited and will not respond normally."
+ "\n\nClicking on items on the pink menu does not redirect you to another page,"
+ "\ninstead it designates that item for modification by the editor."
+ "\n - it's all explained in HELP."
+ "\n\nTo return to the home page click HOME**"
+ "\nbecause clicking on HOME PAGE in the pink menu on the left won't get you there!"
alert(s);
}

function warnEdit()
{
window.setTimeout("warnEdit1()",100);
}
