/*
 * engine.js
 *
 * 
 *
 *
 *
 * author: James Little
 */
 
// this allows us to implement many windows, and always be able
// to bring them to the front. Though currently it is only possible to 
// have 3 windows open.
var largestZ = 0;
// Do not allow the user to fire a keydown event on tab, until they fire
// a key up event. May save the user a few cpu cycles.
var tabCaptured = 0;
// This limits the number of chars on a line.
var CHAR_LIMIT = 60;
// This limits the number of lines in the terminal.
var LINES_LIMIT = 22;
// allow the user to define opacity dynamically
var clientOpacity = 80;

// for nautilus (*) to work, we need to give the location and the displacement
// as all directory views are from the root.
var clientFileViewer = null;
// perhaps we don't want content?
var drawContents = false;

// this appears to have a need... at runtime
var relativePath = "";

function setDrawContents(drawIt){
  drawContents = drawIt;
}

function setClientFileViewer(file){
  clientFileViewer = file;
}

function drawVersionString(){
  document.writeln("<div class=version>" +
		   versionString + "</div>");
}

function getWarning(){
  return "\nUnfortunately this website is not 'currently' very accomodating" +
    " for browsers of your kind. This isn't personal, it's just that you are" +
    " using either Internet Explorer, or you are telling me you are." +
    " The website is designed to treat all browsers equally, but not " +
    " everything currently works in IE. Sorry. Try Firefox. =]\n";
}

function replaceAll(value, find, replace ){
  var sb = "";
  var lastIndex=0, i;
  for(i=0; i<value.length; i++){
   if(value.charAt(i) == find){
     sb += value.substring(lastIndex, i);
      sb += replace;
      lastIndex = i+1;
    }
  }
  // take care of case where no strings added
  // and also where final character not a \"
  if(lastIndex != i) sb += value.substring(lastIndex, value.length);
  return sb;
}
function aDelim(c, delims){
  var i=0;
  while(i < delims.length){
    if(c == delims.charAt(i))
      return true;
    i++;
  }
  return false;
}
/* 
 * creates an array of strings
 * s is the string to be broken, delims are delims.
 */
function tokenizer(s, delims){
  var result = new Array();
  var i=0, lastGood=0, count=0;
  while(i<s.length){
    if(aDelim(s.charAt(i), delims)){
      if(i != lastGood){
	result[count++] = s.substring(lastGood, i);
      }
      i++;
      lastGood = i;
    } else i++;
  }
  if(i != lastGood){
    result[result.length] = s.substring(lastGood, i);
  }
  return result;
}
/*
document.onmousedown = function(e) {
  if (!e) e = window.event;
  // left button click:
  // ns4: e.which=1; ie: e.button=1; moz/ns6.1+: e.button=0; op7: 
  //e.button=1; ns6.0: e.button=1; 
  // right button click:
  // ns4: e.which=3; ie: e.button=2; moz/ns6.1+: e.button=2; op7: 
  // e.button=2; ns6.0: e.button=1; 
  if(e.button == 2){
    // want to draw menu here
    alert("right button down");
    return true;
  }
}
*/
function bringForward(objID){
  var obj = document.getElementById(objID);
  if (obj){
    obj.style.zIndex=++largestZ;
  }
}
function alterOpacity(newOpacity){
  /* for all objects... set opacity to new value */
  ;
}
function makeArrayOfStrings(stringA){
  if(!stringA) //browser == internetExplorer)
    return;
  var strings = Array();
  var i = 0;
  var count = 0;
  var lastI = 0;
  while(i < stringA.length){ 
    if(stringA.charAt(i) == '\n'){
      //alert("newline");
      if(lastI < i)
	strings[count++] = stringA.substring(lastI, i);
      lastI = ++i;
    } else
      i++;
  }
  return strings;
}
function makeStringOfArray(arrayA, number){
  var i=number < arrayA.length-1 ? arrayA.length-1-number: 0;
  var resultantString = "";
  while(i < arrayA.length ){
    resultantString += arrayA[i];
    if(i++ < arrayA.length-1)
      resultantString += "\n";
  }
  return resultantString;
}
function printArray(a){
  var result = "";
  var i=0;
  while(i<a.length){
    result+= a[i++] + "\n";
  }
  alert(result);
}
/*
 * Open link instance
 */
function openwindow(url){
  window.open(url);
}
function setHotTrue() { hot = true; }
function setHotFalse(val) { 
  if(val || internetExplorer == browser)
  hot = false; 
}
/*
 * Warn plebs of dangers of IE.
 */
function helpMSG(a){
  var result = "";
  if(a){
  } else { 
    if(browser == internetExplorer){
      result += "You are using internet explorer.\r\n" +
	"I would prefer you didn't, it is bad for the ozone.\r\n \r\n"+
	"Mozilla-Firefox is a free lightweight browser with\r\n"+
	"features more useful than internet explorer. And \r\n"+
	"its better for the ozone, get it at:\r\n"+
	"http://www.mozilla.org/products/\r\n"+
	"To go there now type: mozilla\r\n \r\n";
    }
    result += "This website is designed to be similar to a linux\n" +
      "operating system. You use the terminal to find files, \n" +
      "and to move around directories.\r\n \r\n";
    result += "To view the full help file: emacs README\r\n";
    result += "THIS SITE IS STILL IN DEVELOPMENT\r\n";
  }
  return result;
}
function drawLinuxInteractive(relative){
  detectBrowser();
  relativePath = relative;
  drawVersionString();
  //document.writeln('<form name="onlyform" id="onlyform">');
  /*
  if(drawContents){
  createNamedDragableLayer
    ("emacs_content",
     "<table width=100% height=100% cellspacing=0 "+
     "cellpadding=0 border=0>"+
       "<tr><td height=15px><span "+
       " onMouseDown=bringForward('emacs_content');setHotTrue(); >" +
       "<table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/tool_bg.png'><tr><td align=left><a href=# "+
       " onMouseDown=hideLayer('emacs_content');><img src='"+relative+
       "imgs/tool_close.png' border=0></a>"+
       " </td><td align=right valign=top><img src='"+relative+
       "imgs/emacs_end.png'"+
       " border=0></td></tr></table></span></td></tr>"+
       "<tr><td height=100%><textarea name='page_content'"+
       " id='page_content' onclick='focus();' "+
       " onMouseDown=bringForward('emacs_content'); "+
       " onmouseover=setHotFalse(true); "+
       "style='width:100%; height:100%;' class='content'></textarea>"+
       "</td></tr>"+
       "<tr><td height=6px><table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/bottom_bg.png'><tr><td align=left><img src='"+relative+
       "imgs/bottom_left.png'>"+
       "</td><td align=right><img src='"+relative+
       "imgs/bottom_right.png'>"+
       "</td></tr></table></td></tr></table>",
       30, 30, 498, 498, null);
       }*/
  //createNamedDragableLayer
  createHiddenDragableLayer
    ("firefox",
     "<table width=100% height=100% cellspacing=0 "+
     "cellpadding=0 border=0>"+
       "<tr><td height=15px><span "+
       " onMouseDown=bringForward('firefox');setHotTrue(); >" +
       "<table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/tool_bg.png'><tr><td align=left><a href=# "+
       " onMouseDown=hideLayer('firefox');><img src='"+relative+
       "imgs/tool_close.png' border=0></a>"+
       " </td><td align=right valign=top><img src='"+relative+
       "imgs/firefox_end.png'"+
       " border=0></td></tr></table></span></td></tr>"+
       "<tr><td height=100% bgcolor=white valign=top>"+
       "<div id='firefox_content'>"+
     
       "</div></td></tr>"+
       "<tr><td height=6px><table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/bottom_bg.png'><tr><td align=left><img src='"+relative+
       "imgs/bottom_left.png'>"+
       "</td><td align=right><img src='"+relative+
       "imgs/bottom_right.png'>"+
       "</td></tr></table></td></tr></table>",
       30, 50, 498, 498, null);

  createNamedDragableLayer
    ("nautilus",
     "<table width=100% height=100% cellspacing=0 "+
     "cellpadding=0 border=0>"+
       "<tr><td height=15px><span "+
       " onMouseDown=bringForward('nautilus');setHotTrue(); >" +
       "<table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/tool_bg.png'><tr><td align=left><a href=# "+
       " onMouseDown=hideLayer('nautilus');><img src='"+relative+
       "imgs/tool_close.png' border=0></a>"+
       " </td><td align=right valign=top><img src='"+relative+
       "imgs/nautilus_end.png'"+
       " border=0></td></tr></table></span></td></tr>"+
       "<tr><td height=100% class='nautilus_w'>"+
       
     NAUTILUS(relative /*/imgs" /*relative*/) +
     
       "</td></tr>"+
       "<tr><td height=6px><table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/bottom_bg.png'><tr><td align=left><img src='"+relative+
       "imgs/bottom_left.png'>"+
       "</td><td align=right><img src='"+relative+
       "imgs/bottom_right.png'>"+
       "</td></tr></table></td></tr></table>",
       70, 70, 498, 498, null);


    createHiddenDragableLayer
      ("gimp",
       "<table width=100% height=100% cellspacing=0 "+
       "cellpadding=0 border=0>"+
       "<tr><td><span "+
       " onMouseDown=bringForward('gimp');"+
       " onMouseover='setHotTrue();'>" +
       "<table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/tool_bg.png'><tr><td align=left><a href=#"+
       " onMouseDown=hideLayer('gimp');><img src='"+relative+
       "imgs/tool_close.png' border=0></a>"+
       " </td><td align=right valign=top><img src='"+relative+
       "imgs/gimp_end.png'"+
       " border=0></td></tr></table></span></td></tr>"+
       "<tr><td height=100%><img"+
       " name='gimp_images' src='http://homepages.ihug.co.nz/~jlittle/imgs/loading.png'"+
       " border=0>"+
       "</td></tr>"+
       "<tr><td height=6px><table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/bottom_bg.png'><tr><td align=left><img src='"+relative+
       "imgs/bottom_left.png'>"+
       "</td><td align=right><img src='"+relative+
       "imgs/bottom_right.png'>"+
       "</td></tr></table></td></tr></table>",
       30, 20, 100, 100, null);

    createHiddenDragableLayer
      ("emacs",
       "<table width=100% height=100% cellspacing=0 "+
       "cellpadding=0 border=0>"+
       "<tr><td height=15px><span "+
       " onMouseDown=bringForward('emacs');setHotTrue(); >" +
       "<table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/tool_bg.png'><tr><td align=left><a href=# "+
       " onMouseDown=hideLayer('emacs');><img src='"+relative+
       "imgs/tool_close.png' border=0></a>"+
       " </td><td align=right valign=top><img src='"+relative+
       "imgs/emacs_end.png'"+
       " border=0></td></tr></table></span></td></tr>"+
       "<tr><td height=100%><textarea name='emacs_files'"+
       " id='emacs_files' onclick='focus();' "+
       " onMouseDown=bringForward('emacs'); "+
       " onmouseover=setHotFalse(true); "+
       "style='width:100%; height:100%;' class='content'></textarea>"+
       "</td></tr>"+
       "<tr><td height=6px><table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/bottom_bg.png'><tr><td align=left><img src='"+relative+
       "imgs/bottom_left.png'>"+
       "</td><td align=right><img src='"+relative+
       "imgs/bottom_right.png'>"+
       "</td></tr></table></td></tr></table>",
       30, 160, 500, 498, null);
  createNamedDragableLayer
      ("terminal",
       "<table width=100% height=100% cellspacing=0 "+
       "cellpadding=0 border=0>"+
       "<tr><td height=16px><span "+
       " onMouseDown=bringForward('terminal');"+
       " onMouseover='setHotTrue();'"+
       " onMouseout='setHotFalse();'>" +
       "<table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/tool_bg.png'><tr><td align=left><a href=# "+
       " onMouseDown=hideLayer('terminal');><img src='"+relative+
       "imgs/tool_close.png' border=0></a>"+
       " </td><td align=right valign=top><img src='"+relative+
       "imgs/aterm_end.png'"+
       " border=0></td></tr></table></span></td></tr>"+
       "<tr><td height=100%><span "+
       " onMouseDown=bringForward('terminal');"+
       " onMouseover='setHotFalse(true);'>" +
       "<textarea style='width:100%; "+
       "height:100%; scroll:no' " +
       "name='test' onclick='focus();' id='test'>"+
       "</textarea></span></td></tr>"+
       "<tr><td height=6px><table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/bottom_bg.png'><tr><td align=left><img src='"+relative+
       "imgs/bottom_left.png'>"+
       "</td><td align=right><img src='"+relative+
       "imgs/bottom_right.png'>"+
       "</td></tr></table</td></tr></table>",
       350, 120,488,422,null);
  /*
  createNamedDragableLayer
      ("terminal_div",
       "<table width=100% height=100% cellspacing=0 "+
       "cellpadding=0 border=0>"+
       "<tr><td height=16px><span "+
       " onMouseDown=bringForward('terminal_div');"+
       " onMouseover='setHotTrue();'"+
       " onMouseout='setHotFalse();'>" +
       "<img src='"+relative+
       "imgs/aterm.png'"+
       " border=0></span></td></tr>"+
       "<tr><td height=100%><span "+
       " onMouseDown=bringForward('terminal_div');"+
       " onMouseover='setHotFalse(true);'>" +
       "<textarea style='width:100%; "+
       "height:100%; scroll:no' " +
       "name='test' onclick='focus();' id='test'>"+
       "</textarea></span></td></tr>"+
       "<tr><td height=6px><table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/bottom_bg.png'><tr><td align=left><img src='"+relative+
       "imgs/bottom_left.png'>"+
       "</td><td align=right><img src='"+relative+
       "imgs/bottom_right.png'>"+
       "</td></tr></table</td></tr></table>",
       350, 120,488,422,null);
  */
    //document.writeln('</form>');
    /*
    document.writeln('<!-- menu items -->');
    document.writeln('<div id="ie5menu" class="skin0" '+
		     'onMouseover="highlightie5(event)" '+
		     'onMouseout="lowlightie5(event)" '+
		     'onClick="jumptoie5(event)" display:none>');
    document.writeln('<div class="menuitems" url="'+
		     relative+'index.html">home</div>');
    document.writeln('<div class="menuitems" url="'+
		     relative+'how.html">about</div>');
    document.writeln('<div class="menuitems" url="'+
		     relative+'imgs/images.html">images</div>');
    document.writeln('<div class="menuitems" url="'+
		     relative+'cv/cv.html">cv</div>');
    document.writeln('<div class="menuitems" url="'+
		     relative+'row/rowing.html">rowing</div>');
    document.writeln('<div class="menuitems" url="'+
		     relative+'programming/prog.html">programming</div>');
    document.writeln('<div class="menuitems" url="'+
		     relative+'misc/misc.html">random</div>');
    document.writeln('<div class="menuitems" url="'+
		     relative+'programming/code.html">get site code</div>');
    document.writeln('<div class="menuitems" url="'+
		     relative+'misc/cred.html">credits</div>');
    //document.writeln('<hr>');
    document.writeln('<div class="menuitems" '+
		     'url="mailto:alpha_foobar@yahoo.com">e-mail</div>');
    document.writeln('</div>');
    */
    // Page contents is a function in a source file that is dynamically loaded
    
    if(drawContents && getPageContentEmacs() != null)
	document.onlyform.page_content.value = getPageContentEmacs();
    else
    	hideLayer('emacs_content'); 
}
function createTerminal(relative){
  detectBrowser();
  relativePath = relative;
  drawVersionString();
  createHiddenDragableLayer
    ("firefox",
     "<table width=100% height=100% cellspacing=0 "+
     "cellpadding=0 border=0>"+
       "<tr><td height=15px><span "+
       " onMouseDown=bringForward('firefox');setHotTrue(); >" +
       "<table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/tool_bg.png'><tr><td align=left><a href=# "+
       " onMouseDown=hideLayer('firefox');><img src='"+relative+
       "imgs/tool_close.png' border=0></a>"+
       " </td><td align=right valign=top><img src='"+relative+
       "imgs/firefox_end.png'"+
       " border=0></td></tr></table></span></td></tr>"+
       "<tr><td height=100% bgcolor=white valign=top>"+
       "<div id='firefox_content'>"+
     
       "</div></td></tr>"+
       "<tr><td height=6px><table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/bottom_bg.png'><tr><td align=left><img src='"+relative+
       "imgs/bottom_left.png'>"+
       "</td><td align=right><img src='"+relative+
       "imgs/bottom_right.png'>"+
       "</td></tr></table></td></tr></table>",
       30, 50, 498, 498, null);
   createHiddenDragableLayer
    ("nautilus",
     "<table width=100% height=100% cellspacing=0 "+
     "cellpadding=0 border=0>"+
       "<tr><td height=15px><span "+
       " onMouseDown=bringForward('nautilus');setHotTrue(); >" +
       "<table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/tool_bg.png'><tr><td align=left><a href=# "+
       " onMouseDown=hideLayer('nautilus');><img src='"+relative+
       "imgs/tool_close.png' border=0></a>"+
       " </td><td align=right valign=top><img src='"+relative+
       "imgs/nautilus_end.png'"+
       " border=0></td></tr></table></span></td></tr>"+
       "<tr><td height=100% class='nautilus_w'>"+
       
     NAUTILUS(relative /*/imgs" /*relative*/) +
     
       "</td></tr>"+
       "<tr><td height=6px><table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/bottom_bg.png'><tr><td align=left><img src='"+relative+
       "imgs/bottom_left.png'>"+
       "</td><td align=right><img src='"+relative+
       "imgs/bottom_right.png'>"+
       "</td></tr></table></td></tr></table>",
       30, 50, 498, 498, null);
   createHiddenDragableLayer
      ("emacs",
       "<table width=100% height=100% cellspacing=0 "+
       "cellpadding=0 border=0>"+
       "<tr><td height=15px><span "+
       " onMouseDown=bringForward('emacs');setHotTrue(); >" +
       "<table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/tool_bg.png'><tr><td align=left><a href=# "+
       " onMouseDown=hideLayer('emacs');><img src='"+relative+
       "imgs/tool_close.png' border=0></a>"+
       " </td><td align=right valign=top><img src='"+relative+
       "imgs/emacs_end.png'"+
       " border=0></td></tr></table></span></td></tr>"+
       "<tr><td height=100%><textarea name='emacs_files'"+
       " id='emacs_files' onclick='focus();' "+
       " onMouseDown=bringForward('emacs'); "+
       " onmouseover=setHotFalse(true); "+
       "style='width:100%; height:100%;' class='content'></textarea>"+
       "</td></tr>"+
       "<tr><td height=6px><table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/bottom_bg.png'><tr><td align=left><img src='"+relative+
       "imgs/bottom_left.png'>"+
       "</td><td align=right><img src='"+relative+
       "imgs/bottom_right.png'>"+
       "</td></tr></table></td></tr></table>",
       30, 160, 500, 498, null);
  createNamedDragableLayer
      ("terminal",
       "<table width=100% height=100% cellspacing=0 "+
       "cellpadding=0 border=0>"+
       "<tr><td height=16px><span "+
       " onMouseDown=bringForward('terminal');"+
       " onMouseover='setHotTrue();'"+
       " onMouseout='setHotFalse();'>" +
       "<table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/tool_bg.png'><tr><td align=left><a href=# "+
       " onMouseDown=hideLayer('terminal');><img src='"+relative+
       "imgs/tool_close.png' border=0></a>"+
       " </td><td align=right valign=top><img src='"+relative+
       "imgs/aterm_end.png'"+
       " border=0></td></tr></table></span></td></tr>"+
       "<tr><td height=100%><span "+
       " onMouseDown=bringForward('terminal');"+
       " onMouseover='setHotFalse(true);'>" +
       "<textarea style='width:100%; "+
       "height:100%; scroll:no' " +
       "name='test' onclick='focus();' id='test'>"+
       "</textarea></span></td></tr>"+
       "<tr><td height=6px><table width=100% cellspacing=0 "+
       "cellpadding=0 border=0  background='"+relative+
       "imgs/bottom_bg.png'><tr><td align=left><img src='"+relative+
       "imgs/bottom_left.png'>"+
       "</td><td align=right><img src='"+relative+
       "imgs/bottom_right.png'>"+
       "</td></tr></table</td></tr></table>",
       350, 120,488,422,null);
}
function getLastCommand(s){
  var command = tokenizer(s.substring(prompt.length, s.length),
			  " \r\n");
  // alert (command);
  //printArray(command);
  if(command.length == 0 || s.indexOf(prompt) < 0) return "";
  // anything entered.. save it...
  // probably will need to delimit this eventually.
  // if ie.. trim the string a little...
  var trim = (browser == internetExplorer)? 1 : 0;
  commandList[commandList.length] = s.substring(prompt.length, 
						s.length - trim);
						
  if(command[0] == "help"){
    return helpMSG(command[1]);
  } else if(command[0] == "ls"){
    return LS(command);
    // return "about\nprogramming\ncv\n";
  } else if(command[0] == "cd"){
    return CD(command);
  } else if(command[0] =="set"){
    //this is for testing...
    return "CURRENT_DIR="+currentDir+
      "\nHOME_DIR="+homeDir+"\nPROMPT="+prompt+"\n";
  } else if(command[0] =="kill"){
    if(command[1])
      return hideLayer(command[1]);
    else
      return command + ": No such process.\n";
    return "";
  } else if(command[0] == "nautilus"){
    showLayer("nautilus");
  } else if(command[0] == "firefox"){
    return FIREFOX(command[1]);
  }else if(command[0] =="mozilla"){
    if(command[1])
      openwindow(command[1]);
    else
    	// just go to products. since they have already changed their
    	// name during the development of this website.
      	openwindow("http://www.mozilla.org/products/");
  } else if(command[0] =="gimp"){
    if(command[1])
      return GIMP(command[1]);
    else
      return command[0] + ": No such file.\n";
    // return "";
  } else if(command[0] =="emacs"){
    if(command[1])
      return EMACS(command[1]);
    else
      return command[0] + ": No such file.\n";
    // return "";
  } else if (command[0].indexOf(".html") == 
	     command[0].length - 5) {
    
    var fileName = insertFile(currentDir,command[0]);
    // is the arg a valid graphics file?
    if(isFile(fileName)){
      var temp = fileName.substring(homeDir.length, fileName.length);
      var locationString = document.location.href;
      var fIndex = locationString.indexOf("~jlittle");
      if(fIndex > -1)
	fIndex += 8;
      else
	fIndex = locationString.lastIndexOf("/")+1;
      
      // alert("loc: " +locationString.substring(0,fIndex));
      temp
	= appendPaths(locationString.substring(0,fIndex)
		      , fileName.substring(homeDir.length, fileName.length));
      //alert(temp);
    document.location.href =temp;
      return command[0] + ": Opening href, please wait.\n";
    }
    return  command[0] + ": No such file.\n";
  } else{
    // a little fun...
 // eval(s.substring(prompt.length, s.length));
    return command[0] + ": Command not found.\n";
  }
}
function addAllAsArray(ofStrings, stringS){
  var strings =  makeArrayOfStrings(stringS);
  var i=0;
  while(i < strings.length){
    ofStrings[ofStrings.length] = strings[i++];
  }
}
function textLimit(field, maxlen) {
  var resultant = field.value;
  var ofStrings = makeArrayOfStrings(resultant);
  
  if(ofStrings.length > 0){
    var lastString = ofStrings[ofStrings.length-1];
    if(lastString.length > maxlen)
      ofStrings[ofStrings.length-1] 
	= ofStrings[ofStrings.length-1].substring(0,maxlen);
    var lastResult = getLastCommand(lastString);
    if(lastResult){
      addAllAsArray(ofStrings, lastResult);
    }
    ofStrings[ofStrings.length] = prompt;
    field.value = makeStringOfArray(ofStrings, LINES_LIMIT);
  } else
    field.value = prompt;
  // insertAtCaret(field.value, ":)");
}
function showLayer(layerName) {
  if(document.getElementById(layerName)){
    // alert("trying to show layer: " + layerName);
    document.getElementById(layerName).style.visibility="visible";
    bringForward(layerName);
  }
}
function hideLayer(layerName) {
  if(document.getElementById(layerName)){
    document.getElementById(layerName).style.visibility="hidden";
    return "";
  } else {
    return layerName + ": No such process.\n";
  }
}
function getImports(pageName, rel){
  // the standard for page conent scripts.
  var result = replaceAll(pageName, '.', "_");
  result = "<script language='JavaScript1.2' src='"+result+".js'></script>\n";
  result+="<script language='JavaScript1.2' src='"+
    rel +"nautilus.js'></script>\n";
  result+="<script language='JavaScript1.2' src='"+
    rel +"firefox.js'></script>\n";
  result+="<script language='JavaScript1.2' src='"+
    rel +"nautilus_viewer.js'></script>\n";
  result+="<script language='JavaScript1.2' src='"+
    rel +"menu.js'></script>\n";
  result+="<script language='JavaScript1.2' src='"+
    rel +"cursors.js'></script>\n";
  result+="<script language='JavaScript1.2' src='"+
    rel +"emacs.js'></script>\n";
  result+="<script language='JavaScript1.2' "+
    "src='"+
    rel +"fileserver.js'></script>\n";
  result+="<script language='JavaScript1.2' src='"+
    rel +"draglayer.js'></script>\n";
  result+="<script language='JavaScript1.2' src='"+
    rel +"browser.js'></script>\n";
  result+="<script language='JavaScript1.2' src='"+
    rel +"gimp.js'></script>\n";
  //result+="<script language='JavaScript1.2' src='"+
  //  rel +"clock.js'></script>\n";
  result+="<script language='JavaScript1.2' src='"+
    rel +"ls.js'></script>\n";
  result+="<script language='JavaScript1.2' src='"+
    rel +"cd.js'></script>\n";
  result+="<script language='JavaScript1.2' src='"+
    rel +"globals.js'></script>\n";
  return result;
}
function getPageContentScript(pageName){
  // the standard for page conent scripts.
  var result = replaceAll(pageName, '.', "_");
  return "<script language='JavaScript1.2' src='"+result+".js'></script>\n";
}
function initEventListeners(index){
  //if (document.layers) { 
  //alert("layers?");
  //}
  //window.onkeyup = keyHandler;
  // setUpMenus();
  
  // here we want to capture key presses.
  // for example, i want to auto-complete on tab.
  // however tab has other uses in a web browser.
  // sorry about that.
  //if(browser == internetExplorer)
  //  document.onlyform.onkeydown = ieKeyHandler; 
  //else
  document.onlyform.onkeydown = keyDownHandler;
  document.onlyform.onkeyup = keyHandler;
  
  document.onlyform.test.focus();
  
  
  var rightNow = new Date().toString();
  // just take system standard date...
  var n = rightNow.indexOf("(");
  if(n > -1)
    rightNow = rightNow.substring(0, n-1);
  // I don't even recall what the index variable is for....
  document.onlyform.test.value = browser + " " +
    version + " " + OS + "\n" + (index && browser == internetExplorer ? 
				 getWarning() + "\n" : "") +
    rightNow + "\n" + prompt;
  /*
    if(/*not internet explorer* / true)
    document.addEventListener('keyup', keyHandler, true); 
  */
  //window.captureEvents(Event.KEYPRESS); 
}
//function ieKeyDownHandler() {
//  var key = (event.charCode ||  event.which || event.keyCode);
//  generalKeyHandler(key);
//}
function keyDownHandler (evt) {
  var key;
  if(evt){ // non IE
	key  = (evt.which || evt.charCode || evt.keyCode);
  } else { // IE.
  	key = (event.charCode ||  event.which || event.keyCode);
  }
  switch(key){
  case 13:
    //textLimit(document.onlyform.test, LINES_LIMIT);
    //setCursorIndex();
    break;
  case 38:
    // wanted to revolve commands
    // alert("up?");
    //document.onlyform.test.value = UPCursor();
    break;
  case 40:
    // wanted to revolve commands
    // alert("down?");
    //document.onlyform.test.value =  DOWNCursor();
    break;
  case 9:
    // the tab.
    //document.onlyform.test.value +=  'shit';
    //document.onlyform.test.focus();
    break;
  default:
    //alert(key);
  };
}
function keyHandler (evt) {
  var key;
  if(evt){ // non IE
	key  = (evt.which || evt.charCode || evt.keyCode);
  } else { // IE.
  	key = (event.charCode ||  event.which || event.keyCode);
  }
  switch(key){
  case 13:
    textLimit(document.onlyform.test, CHAR_LIMIT);
    setCursorIndex();
    break;
  case 38:
    // UP
    document.onlyform.test.value = UPCursor();
    break;
  case 40:
    // DOWN
    document.onlyform.test.value =  DOWNCursor();
    break;
  case 9:
    // TAB
    //document.onlyform.test.value +=  'shit';
    //document.onlyform.test.value += " ";
    break;
  default:
    //alert(key);
  };
}

