// Innerjoin Navigation Tree
// written by Pierrick Serranne
// for the E.L.S. website (www.els.be)

/******************************************************************************
* Define the MenuItem object.                                                 *
******************************************************************************/
function InnerJoinMenuItem(text, url, target, icon) {
  this.text = text;
  this.url = url ? url : "";
  this.target =  target ? target : "";
  this.icon = icon ? icon : "";

  this.number = InnerJoinSubNumber++;

  this.submenu     = null;
  this.expanded    = false;
  this.InnerJoinMakeSubmenu = InnerJoinMakeSubmenu;
}

function InnerJoinMakeSubmenu(menu) {
  this.submenu = menu;
}

/******************************************************************************
* Define the Menu object.                                                     *
******************************************************************************/

function InnerJoinMenu() {
  this.items   = new Array();
  this.InnerJoinAddItem = InnerJoinAddItem;
}

function InnerJoinAddItem(item) {
  this.items[this.items.length] = item;
}

/******************************************************************************
* Define the icon list, addIcon function and InnerJoinIcon item.                    *
******************************************************************************/

function IconList() {
  this.items = new Array();
  this.addIcon = addIcon;
}

function addIcon(item) {
  this.items[this.items.length] = item;
}

function InnerJoinIcon(iconfile, match, type) {
  this.file = iconfile;
  this.match = match;
  this.type = type;
}

/******************************************************************************
* Global variables.  Not to be altered unless you know what you're doing.     *
* User-configurable options are at the end of this document.                  *
******************************************************************************/

var InnerJoinLoaded = false;
var InnerJoinLevel;
var InnerJoinBar = new Array();
var InnerJoinIndices = new Array();
var InnerJoinBrowser = null;
var InnerJoinNN3 = false;
var InnerJoinNN4 = false;
var InnerJoinIE4 = false;
var InnerJoinUseStyle = true;

if(navigator.appName == "Netscape" && navigator.userAgent.indexOf("WebTV") == -1) {
  if(parseInt(navigator.appVersion) == 3 && (navigator.userAgent.indexOf("Opera") == -1)) {
    InnerJoinBrowser = true;
    InnerJoinNN3 = true;
    InnerJoinUseStyle = false;
  } else if(parseInt(navigator.appVersion) >= 4) {
    InnerJoinBrowser = true;
    InnerJoinNN4 = true;
  }
} else if (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) >= 4) {
  InnerJoinBrowser = true;
  InnerJoinIE4 = true;
}

var InnerJoinClickedItem = false;
var InnerJoinExpansion = false;

var InnerJoinSubNumber = 1;
var InnerJoinTrackedItem = false;
var InnerJoinTrack = false;

var InnerJoinPreHREF = "";
if(InnerJoinIE4 || InnerJoinNN3) {
  InnerJoinPreHREF += document.location.href.substring(0, document.location.href.lastIndexOf("/") +1);
}

var InnerJoinFirstRun = true;
var InnerJoinCurrentTime = 0; // for checking timeout.
var InnerJoinUpdating = false;
var InnerJoinWinSize, InnerJoinyval;
var InnerJoinOutputString = "";

/******************************************************************************
* Code that picks up frame names of frames in the parent frameset.            *
******************************************************************************/

if(InnerJoinBrowser) {
  var InnerJoinFrameNames = new Array();
  for(i = 0; i < parent.frames.length; i++)
    InnerJoinFrameNames[i] = parent.frames[i].name;
}

/******************************************************************************
* Dummy function for sub-menus without URLs                                   *
* Thanks to Michel Plungjan for the advice. :)                                *
******************************************************************************/

function myVoid() { ; }

/******************************************************************************
* Functions to draw the menu.                                                 *
******************************************************************************/

function InnerJoinSubAction(SubItem, ReturnValue) {

  SubItem.expanded = (SubItem.expanded) ? false : true;
  if(SubItem.expanded) {
    InnerJoinExpansion = true;
  }

  InnerJoinClickedItem = SubItem.number;
  
  if(InnerJoinTrackedItem && InnerJoinTrackedItem != SubItem.number) {
    InnerJoinTrackedItem = false;
  }

  if(!ReturnValue) {
    setTimeout("InnerJoinDisplayMenu()", 10);
  }

  return ReturnValue;
}

function InnerJoinRegisterClick(SubItem, ReturnValue) {
  InnerJoinClickedItem = SubItem.number;
  
  if(InnerJoinTrackedItem && InnerJoinTrackedItem != SubItem.number) {
    InnerJoinTrackedItem = false;
  }
    
  return ReturnValue;
}


function InnerJoinStartMenu() {
  InnerJoinLoaded = true;
  if(InnerJoinFirstRun) {
    InnerJoinCurrentTime++;
    if(InnerJoinCurrentTime == InnerJoinTimeOut) { // call InnerJoinDisplayMenu
      setTimeout("InnerJoinDisplayMenu()",10);
    } else {
      setTimeout("InnerJoinStartMenu()",100);
    }
  } 
}

function InnerJoinDisplayMenu() {
  if(InnerJoinBrowser && !InnerJoinUpdating) {
    InnerJoinUpdating = true;
    InnerJoinFirstRun = false;

    if(InnerJoinTrack) { InnerJoinTrackedItem = InnerJoinTrackExpand(menu); }

    if(InnerJoinExpansion && InnerJoinSubsAutoClose) { InnerJoinCloseSubs(menu); }

    InnerJoinLevel = 0;
    InnerJoinDoc = parent.frames[InnerJoinMenuFrame].document
    InnerJoinDoc.open("text/html", "replace");
    InnerJoinOutputString = '<html><head>';
    if(InnerJoinLinkedSS) {
      InnerJoinOutputString += '<link rel="stylesheet" type="text/css" href="' + InnerJoinPreHREF + InnerJoinSSHREF + '">';
    } else if(InnerJoinUseStyle) {
      InnerJoinOutputString += '<style type="text/css">body {color:' + InnerJoinTextColor + ';background:';
      InnerJoinOutputString += (InnerJoinBackground == "") ? InnerJoinBGColor : InnerJoinMakeBackImage(InnerJoinBackground);
      InnerJoinOutputString += ';} #root {color:' + InnerJoinRootColor + ';background:' + ((InnerJoinBackground == "") ? InnerJoinBGColor : 'transparent') + ';font-family:' + InnerJoinRootFont + ';font-size:' + InnerJoinRootCSSize + ';} ';
      InnerJoinOutputString += 'a {font-family:' + InnerJoinMenuFont + ';font-size:' + InnerJoinMenuCSSize + ';text-decoration:none;color:' + InnerJoinLinkColor + ';background:' + InnerJoinMakeBackground() + ';} ';
      InnerJoinOutputString += InnerJoinMakeA('pseudo', 'hover', InnerJoinAhoverColor);
      InnerJoinOutputString += InnerJoinMakeA('class', 'tracked', InnerJoinTrackColor);
      InnerJoinOutputString += InnerJoinMakeA('class', 'subexpanded', InnerJoinSubExpandColor);
      InnerJoinOutputString += InnerJoinMakeA('class', 'subclosed', InnerJoinSubClosedColor) + '</style>';
    }

    InnerJoinOutputString += '</head><body ';
    if(InnerJoinBackground != "") {
      InnerJoinOutputString += 'background="' + InnerJoinPreHREF + InnerJoinMenuImageDirectory + InnerJoinBackground + '" ';
    }
    InnerJoinOutputString += 'bgcolor="' + InnerJoinBGColor + '" text="' + InnerJoinTextColor + '" link="' + InnerJoinLinkColor + '" vlink="' + InnerJoinLinkColor + '" alink="' + InnerJoinLinkColor + '">';
    InnerJoinOutputString += '<table border="0" cellpadding="0" cellspacing="0" width="' + InnerJoinTableWidth + '">';
    InnerJoinOutputString += '<tr valign="top"><td nowrap><img src="' + InnerJoinPreHREF + InnerJoinMenuImageDirectory + InnerJoinRootIcon + '" align="left" border="0" vspace="0" hspace="0">';
    if(InnerJoinUseStyle) {
      InnerJoinOutputString += '<span id="root">&nbsp;' + InnerJoinMenuText + '</span>';
    } else {
      InnerJoinOutputString += '<font size="' + InnerJoinRootFontSize + '" face="' + InnerJoinRootFont + '" color="' + InnerJoinRootColor + '">' + InnerJoinMenuText + '</font>';
    }
    InnerJoinDoc.writeln(InnerJoinOutputString + '</td></tr>');

    InnerJoinListItems(menu);

    InnerJoinDoc.writeln('</table></body></html>');
    InnerJoinDoc.close();

    if((InnerJoinClickedItem || InnerJoinTrackedItem) && (InnerJoinNN4 || InnerJoinIE4) && !InnerJoinFirstRun) {
      InnerJoinItemName = "sub" + (InnerJoinClickedItem ? InnerJoinClickedItem : InnerJoinTrackedItem);
      if(document.layers && parent.frames[InnerJoinMenuFrame].scrollbars) {    
        InnerJoinyval = parent.frames[InnerJoinMenuFrame].document.anchors[InnerJoinItemName].y;
        InnerJoinWinSize = parent.frames[InnerJoinMenuFrame].innerHeight;
      } else {
        InnerJoinyval = InnerJoinGetPos(parent.frames[InnerJoinMenuFrame].document.all[InnerJoinItemName]);
        InnerJoinWinSize = parent.frames[InnerJoinMenuFrame].document.body.offsetHeight;
      }
      if(InnerJoinyval > (InnerJoinWinSize - 60)) {
        parent.frames[InnerJoinMenuFrame].scrollBy(0, parseInt(InnerJoinyval - (InnerJoinWinSize * 1/3)));
      }
    }

    InnerJoinClickedItem = false;
    InnerJoinExpansion = false;
    InnerJoinTrack = false;
  }
InnerJoinUpdating = false;
}

function InnerJoinListItems(menu) {
  var i, isLast;
  for (i = 0; i < menu.items.length; i++) {
    InnerJoinIndices[InnerJoinLevel] = i;
    isLast = (i == menu.items.length -1);
    if (InnerJoinLevel > 1)
      InnerJoinDisplayItem(menu.items[i], isLast, true)
    else
      InnerJoinDisplayItem(menu.items[i], isLast, false);
    if (menu.items[i].submenu && menu.items[i].expanded) {
      InnerJoinBar[InnerJoinLevel] = (isLast) ? false : true;
      InnerJoinLevel++;
      InnerJoinListItems(menu.items[i].submenu);
      InnerJoinLevel--;
    } else {
      InnerJoinBar[InnerJoinLevel] = false;
    } 
  }
}

function InnerJoinDisplayItem(item, last, showIcon) {
  var i, img, more;

  
    var InnerJoinouseOverText;

    var InnerJoinClickCmd;
    var InnerJoinDblClickCmd = false;
    var InnerJoinfrm = "parent.frames['code']";
    var InnerJoinref = '.menu.items[' + InnerJoinIndices[0] + ']';

    if(InnerJoinLevel > 0) {
      for(i = 1; i <= InnerJoinLevel; i++) {
        InnerJoinref += ".submenu.items[" + InnerJoinIndices[i] + "]";
      }
    }

 if(item.submenu) {
    if(!InnerJoinEmulateWE && !item.expanded && (item.url != "")) {
      InnerJoinClickCmd = "return " + InnerJoinfrm + ".InnerJoinSubAction(" + InnerJoinfrm + InnerJoinref + ",true);";
    } else {
      InnerJoinClickCmd = "return " + InnerJoinfrm + ".InnerJoinSubAction(" + InnerJoinfrm + InnerJoinref + ",false);";
    }
    if(item.url == "") {
      InnerJoinouseOverText = (item.text.indexOf("'") != -1) ? InnerJoinEscapeQuotes(item.text) : item.text;
    } else {
      InnerJoinouseOverText = "Expand/Collapse";
    }
  }
  else {
    if(!InnerJoinEmulateWE && !item.expanded && (item.url != "")) {
      InnerJoinClickCmd = "return " + InnerJoinfrm + ".InnerJoinRegisterClick(" + InnerJoinfrm + InnerJoinref + ",true);";
    } else {
      InnerJoinClickCmd = "return " + InnerJoinfrm + ".InnerJoinRegisterClick(" + InnerJoinfrm + InnerJoinref + ",false);";
    }
  }
 

  InnerJoinOutputString = '<tr valign="top"><td nowrap>';
  if(InnerJoinLevel > 0) {
    for (i = 0; i < InnerJoinLevel; i++) {
      InnerJoinOutputString += (InnerJoinBar[i]) ? InnerJoinMakeImage("menu_bar.gif") : InnerJoinMakeImage("menu_pixel.gif");
    }
  }

  more = false;
  if(item.submenu) {
    if(InnerJoinSubsGetPlus || InnerJoinEmulateWE) {
      more = true;
    } else {
      for (i = 0; i < item.submenu.items.length; i++) {
        if (item.submenu.items[i].submenu) {
          more = true;
        }
      }
    }
  }
  if(!more) {
    img = (last) ? "menu_corner.gif" : "menu_tee.gif";
  } else {
    if(item.expanded) {
      img = (last) ? "menu_corner_minus.gif" : "menu_tee_minus.gif";
    } else {
      img = (last) ? "menu_corner_plus.gif" : "menu_tee_plus.gif";
    }
    if(item.url == "" || item.expanded || InnerJoinEmulateWE) {
      InnerJoinOutputString += InnerJoinMakeVoid(item, InnerJoinClickCmd, InnerJoinouseOverText);
    } else {
      InnerJoinOutputString += InnerJoinMakeLink(item, true)  + ' onclick="' + InnerJoinClickCmd + '">';
    }
  }
  InnerJoinOutputString += InnerJoinMakeImage(img);

  if(item.submenu) {
    if(InnerJoinEmulateWE && item.url != "") {
      InnerJoinOutputString += '</a>' + InnerJoinMakeLink(item, false) + '>';
    }

    img = (item.expanded) ? "menu_folder_open.gif" : "menu_folder_closed.gif";

    if(!more) {
      if(item.url == "" || item.expanded) {
        InnerJoinOutputString += InnerJoinMakeVoid(item, InnerJoinClickCmd, InnerJoinouseOverText);
      } else {
        InnerJoinOutputString += InnerJoinMakeLink(item, true) + ' onclick="' + InnerJoinClickCmd + '">';
      }
    }
    //if (showIcon)
    //  InnerJoinOutputString += InnerJoinMakeImage(img);

  } else {
    InnerJoinOutputString += InnerJoinMakeLink(item, true) + ' onclick="' + InnerJoinClickCmd + '">';
    img = (item.icon != "") ? item.icon : InnerJoinFetchIcon(item.url);
    if (showIcon)
      InnerJoinOutputString += InnerJoinMakeImage(img);
  }

  if(item.submenu && (item.url != "") && (item.expanded && !InnerJoinEmulateWE)) {
    InnerJoinOutputString += '</a>' + InnerJoinMakeLink(item, false) + '>';
  }
  
  

  //if(InnerJoinNN3 && !InnerJoinLinkedSS) {
    var stringColor;
    //if(item.submenu && (item.url == "") && (item.number == InnerJoinClickedItem)) {
    if(item.submenu && (item.expanded && !InnerJoinEmulateWE)) {
      stringColor = (item.expanded) ? InnerJoinSubExpandColor : InnerJoinSubClosedColor;
    } else if(InnerJoinTrackedItem && InnerJoinTrackedItem == item.number) {
      stringColor = InnerJoinTrackColor;
    } else if(InnerJoinClickedItem == item.number) {
      stringColor = InnerJoinTrackColor;
    } else {
      stringColor = InnerJoinLinkColor;
    }
    //InnerJoinOutputString += '<font color="' + stringColor + '" size="' + InnerJoinMenuFontSize + '" face="' + InnerJoinMenuFont + '">';
    InnerJoinOutputString += '<font color="' + stringColor + '">';
  //}
  InnerJoinOutputString += '&nbsp;' + item.text + ((InnerJoinNN3 && !InnerJoinLinkedSS) ? '</font>' : '') + '</a>' ;
  InnerJoinDoc.writeln(InnerJoinOutputString + '</td></tr>');
}

function InnerJoinEscapeQuotes(myString) {
  var newString = "";
  var cur_pos = myString.indexOf("'");
  var prev_pos = 0;
  while (cur_pos != -1) {
    if(cur_pos == 0) {
      newString += "\\";
    } else if(myString.charAt(cur_pos-1) != "\\") {
      newString += myString.substring(prev_pos, cur_pos) + "\\";
    } else if(myString.charAt(cur_pos-1) == "\\") {
      newString += myString.substring(prev_pos, cur_pos);
    }
    prev_pos = cur_pos++;
    cur_pos = myString.indexOf("'", cur_pos);
  }
  return(newString + myString.substring(prev_pos, myString.length));
}

function InnerJoinTrackExpand(thisMenu) {
  var i, targetPath;
  var foundNumber = false;
  for(i = 0; i < thisMenu.items.length; i++) {
    if(thisMenu.items[i].url != "" && InnerJoinTrackTarget(thisMenu.items[i].target)) {
      targetPath = parent.frames[thisMenu.items[i].target].location.pathname;
      if(targetPath.lastIndexOf(thisMenu.items[i].url) != -1 && (targetPath.lastIndexOf(thisMenu.items[i].url) + thisMenu.items[i].url.length) == targetPath.length) {
        return(thisMenu.items[i].number);
      }
    }
    if(thisMenu.items[i].submenu) {
      foundNumber = InnerJoinTrackExpand(thisMenu.items[i].submenu);
      if(foundNumber) {
        if(!thisMenu.items[i].expanded) {
          thisMenu.items[i].expanded = true;
          if(!InnerJoinClickedItem) { InnerJoinClickedItem = thisMenu.items[i].number; }
          InnerJoinExpansion = true;
        }
        return(foundNumber);
      }
    }
  }
return(foundNumber);
}

function InnerJoinCloseSubs(thisMenu) {
  var i, j;
  var foundMatch = false;
  for(i = 0; i < thisMenu.items.length; i++) {
    if(thisMenu.items[i].submenu && thisMenu.items[i].expanded) {
      if(thisMenu.items[i].number == InnerJoinClickedItem) {
        foundMatch = true;
        for(j = 0; j < thisMenu.items[i].submenu.items.length; j++) {
          if(thisMenu.items[i].submenu.items[j].expanded) {
            thisMenu.items[i].submenu.items[j].expanded = false;
          }
        }
      } else {
        if(foundMatch) {
          thisMenu.items[i].expanded = false; 
        } else {
          foundMatch = InnerJoinCloseSubs(thisMenu.items[i].submenu);
          if(!foundMatch) {
            thisMenu.items[i].expanded = false;
          }
        }
      }
    }
  }
return(foundMatch);
}

function InnerJoinFetchIcon(testString) {
  var i;
  for(i = 0; i < InnerJoinIconList.items.length; i++) {
    if((InnerJoinIconList.items[i].type == 'any') && (testString.indexOf(InnerJoinIconList.items[i].match) != -1)) {
      return(InnerJoinIconList.items[i].file);
    } else if((InnerJoinIconList.items[i].type == 'pre') && (testString.indexOf(InnerJoinIconList.items[i].match) == 0)) {
      return(InnerJoinIconList.items[i].file);
    } else if((InnerJoinIconList.items[i].type == 'post') && (testString.indexOf(InnerJoinIconList.items[i].match) != -1)) {
      if((testString.lastIndexOf(InnerJoinIconList.items[i].match) + InnerJoinIconList.items[i].match.length) == testString.length) {
        return(InnerJoinIconList.items[i].file);
      }
    }
  }
return("menu_link_default.gif");
}

function InnerJoinGetPos(myObj) {
  return(myObj.offsetTop + ((myObj.offsetParent) ? InnerJoinGetPos(myObj.offsetParent) : 0));
}

function InnerJoinCheckURL(myURL) {
  var tempString = "";
  if((myURL.indexOf("http://") == 0) || (myURL.indexOf("https://") == 0) || (myURL.indexOf("mailto:") == 0) || (myURL.indexOf("ftp://") == 0) || (myURL.indexOf("telnet:") == 0) || (myURL.indexOf("news:") == 0) || (myURL.indexOf("gopher:") == 0) || (myURL.indexOf("nntp:") == 0) || (myURL.indexOf("javascript:") == 0)) {
    tempString += myURL;
  } else {
    tempString += InnerJoinPreHREF + myURL;
  }
return(tempString);
}

function InnerJoinMakeVoid(thisItem, thisCmd, thisText) {
  var tempString = "";
  tempString +=  '<a name="sub' + thisItem.number + '" href="javascript:parent.frames[\'code\'].myVoid();" onclick="' + thisCmd + '" onmouseover="window.status=\'' + thisText + '\';return true;" onmouseout="window.status=\'' + window.defaultStatus + '\';return true;"';
  if(thisItem.number == InnerJoinClickedItem) {
    var tempClass;
    tempClass = thisItem.expanded ? "subexpanded" : "subclosed";
    tempString += ' class="' + tempClass + '"';
  }
  return(tempString + '>');
}

function InnerJoinMakeLink(thisItem, addName) {
  var tempString = '<a';

  if(InnerJoinTrackedItem && InnerJoinTrackedItem == thisItem.number) {
    tempString += ' class="tracked"'
  }
  if(addName) {
    tempString += ' name="sub' + thisItem.number + '"';
  }
  tempString += ' href="' + InnerJoinCheckURL(thisItem.url) + '"';
  if(thisItem.target != "") {
    tempString += ' target="' + thisItem.target + '"';
  }
return tempString;
}

function InnerJoinMakeImage(thisImage) {
  return('<img src="' + InnerJoinPreHREF + InnerJoinMenuImageDirectory + thisImage + '" align="left" border="0" vspace="0" hspace="0">');
}

function InnerJoinMakeBackImage(thisImage) {
  var tempString = 'transparent url("' + ((InnerJoinPreHREF == "") ? "" : InnerJoinPreHREF);
  tempString += InnerJoinMenuImageDirectory + thisImage + '")'
  return(tempString);
}

function InnerJoinMakeA(thisType, thisText, thisColor) {
  var tempString = "";
  tempString += 'a' + ((thisType == "pseudo") ? ':' : '.');
  return(tempString + thisText + '{color:' + thisColor + ';background:' + InnerJoinMakeBackground() + ';}');
}

function InnerJoinMakeBackground() {
  return((InnerJoinBackground == "") ? InnerJoinBGColor : 'transparent');
}

function InnerJoinTrackTarget(thisTarget) {
  if(thisTarget.charAt(0) == "_") {
    return false;
  } else {
    for(i = 0; i < InnerJoinFrameNames.length; i++) {
      if(thisTarget == InnerJoinFrameNames[i]) {
        return true;
      }
    }
  }
  return false;
}
