try
{
  var gintBrowserVersion = 1;
  var gintActiveTab = 1;
  var gintActiveTabOffset = 3;
  var gintTabHeight = 22;
  var gintTabCount = 7;
  var garrTabInit = new Array(false, false, false, false, false, false);
  var gintCW;
  var gintCH;
  var gspnSelItem = null;
  var gintSelFID = -1;
  var gbolDebug = false;
  checkBrowser();
} catch(e) {log(e, "inline code");}

function checkBrowser()
{
  try
  {
    //No Oldies.
    var intIEVer = parseFloat(5.0);
    var strbAgt = navigator.userAgent.toLowerCase();
    var bolIsOk = false;
  
    var intPosInit = strbAgt.indexOf("mac_powerpc");
    var intPosInit2 = strbAgt.indexOf("msie"); 
  
    if(intPosInit > -1 && intPosInit2 > -1)
    {
      window.location.replace("oldbrowser.html");
    }
  
    intPosInit = strbAgt.indexOf("opera");
    
    if(intPosInit > -1)
    {
      bolIsOk = true;
      gintBrowserVersion = 3;
    } else
    {
      intPosInit = strbAgt.indexOf("safari");
      if(intPosInit > -1)
      {
        bolIsOk = true;
        gintBrowserVersion = 4;
      } else
      {
        intPosInit = strbAgt.indexOf("gecko");
        if(intPosInit > -1)
        {
          bolIsOk = true;
          gintBrowserVersion = 2;
        } else
        {
          intPosInit = strbAgt.indexOf("msie");
          var intPosEnd = strbAgt.indexOf(";", intPosInit);
          var intVersion = parseFloat(strbAgt.substring(intPosInit+5, intPosEnd));
          if(intVersion >= intIEVer)
          {
            bolIsOk = true;
            gintBrowserVersion = 1;
          }
        }
      }
    }
  
    if(!bolIsOk)
      window.location.replace("oldbrowser.html");
  } catch(e) {log(e, "checkBrowser");}
}

function resize()
{
  try
  {
    switch(gintBrowserVersion)
    {
      case 1:case 3:
        var intCW = document.body.clientWidth;
        var intCH = document.body.clientHeight;
        break;
      case 2:case 4:
        var intCW = window.innerWidth;
        var intCH = window.innerHeight
        break;
    }
    
    var intNewPageWidth = intCW - 20;
    if(intNewPageWidth < 525)
      intNewPageWidth = 525;
    setDim("divPages"+gintActiveTab, 1, intNewPageWidth);
    setDim("divPages"+gintActiveTab, 2, (intCH - 20 - gintTabHeight));
    
    var intTabHeight = gintTabHeight + 2*gintActiveTabOffset;      
    for(var i=1; i<=gintTabCount; i++)
    {
      getEl("divTabs"+i).style.top = getDim("divPages"+gintActiveTab, 2) + parseNum(getEl("divPages"+gintActiveTab).style.top) - 2*gintActiveTabOffset;
      setDim("divTabs"+i, 1, 75);
      setDim("divTabs"+i, 2, intTabHeight);
    }
    getEl("divTabs" + gintActiveTab).style.top = parseNum(getEl("divTabs" + gintActiveTab).style.top) + gintActiveTabOffset;
    
    resizePage(gintActiveTab);
  } catch(e) {log(e, "resize");}
}

function resizePage(intPage)
{
  try
  {
    switch(intPage)
    {
      case 1:
        setDim("divPages1Contents", 1, getDim("divPages1", 1)-20-5);
        setDim("divPages1Contents", 2, getDim("divPages1", 2)-20-5);
        setDim("divPage1Text", 1, getDim("divPages1", 1)-20-4);
        setDim("divPage1Text", 2, getDim("divPages1", 2)-20-4);
      with(getEl("imgTab1Bgrd"))
      {
        style.left = (parseNum(getEl("divPages1Contents").style.width) - parseNum(style.width))/2;
        style.top = (parseNum(getEl("divPages1Contents").style.height) - parseNum(style.height))/2;
      }
        break;
      case 2:
        setDim("divTree", 2, getDim("divPages2", 2) - 9);
        setDim("divTree", 1, 200);
        setDim("divPhTleBg", 1, getDim("divPages2", 1) - 2 - 5 - getDim("divTree", 1) - 5);
        setDim("divPhDescBg", 1, getDim("divPhTleBg", 1));
        if(getEl("divPhDescBg").style.visibility == "visible")
          setDim("divPhCont", 2, getDim("divTree", 2) - 12 - 5 - 4 - 3 - 22);
        else
          setDim("divPhCont", 2, getDim("divTree", 2) - 12 - 5 - 4 - 3);
        setDim("divPhCont", 1, getDim("divPhTleBg", 1));
        setDim("divAlbum", 1, getDim("divPhCont", 1));
        setDim("divAlbum", 2, getDim("divPhCont", 2));
        positionPhotoAndShadows();
        break;
      case 3:
        setDim("divPages3Contents", 1, getDim("divPages3", 1)-20-5);
        setDim("divPages3Contents", 2, getDim("divPages3", 2)-20-5);
        setDim("ifrmMap", 1, getDim("divPages3", 1)-20-8);
        setDim("ifrmMap", 2, getDim("divPages3", 2)-parseNum(getEl("ifrmMap").offsetTop)-30);
        break;
      case 4:
        setDim("divPages4Contents", 1, getDim("divPages4", 1)-20-5);
        setDim("divPages4Contents", 2, getDim("divPages4", 2)-20-5);
        setDim("ifrmEssay", 2, getDim("divPages4Contents", 2)-getEl("ifrmEssay").offsetTop-10);
        break;
      case 5:
        setDim("divPages5Contents", 1, getDim("divPages5", 1)-20-5);
        setDim("divPages5Contents", 2, getDim("divPages5", 2)-20-5);
        break;
      case 6:
        setDim("divPages6Contents", 1, getDim("divPages6", 1)-20-4);
        setDim("divPages6Contents", 2, getDim("divPages6", 2)-20-4);
        getEl("ifrmResume").style.width = (parseNum(getDim("divPages6Contents", 1))-2);
        getEl("ifrmResume").style.height = (parseNum(getDim("divPages6Contents", 2))-32);
        break;
      case 7:
        setDim("divPages7Contents", 1, getDim("divPages7", 1)-20-4);
        setDim("divPages7Contents", 2, getDim("divPages7", 2)-20-4);
        setDim("divPage7Text", 1, getDim("divPages7", 1)-20-4);
        setDim("divPage7Text", 2, getDim("divPages7", 2)-20-4);
      with(getEl("imgTab7Bgrd"))
      {
        style.left = (parseNum(getEl("divPages7Contents").style.width) - parseNum(style.width))/2;
        style.top = (parseNum(getEl("divPages7Contents").style.height) - parseNum(style.height))/2;
      }
        break;
    }
  } catch(e) {log(e, "resizePage");}
}

function setDim(strElNm, intDim, intVal)
{
  try
  {
    //I prefer IE's width/height model over W3C...convert Mozilla/Safari
    var el = getEl(strElNm);
    intVal = parseNum(intVal);
    
    switch(gintBrowserVersion)
    {
      case 1:case 3:
        switch(intDim)
        {
          case 1:
            el.style.pixelWidth = intVal;
            break;
          case 2:
            el.style.pixelHeight = intVal;
            break;
        }
        break;
      case 2:case 4:
        switch(intDim)
        {
          case 1:
            el.style.width = parseNum(intVal - (parseNum(el.style.borderLeftWidth) + parseNum(el.style.borderRightWidth) + parseNum(el.style.paddingRight) + parseNum(el.style.paddingLeft)));
            break;
          case 2:
            el.style.height = parseNum(intVal - (parseNum(el.style.borderTopWidth) + parseNum(el.style.borderBottomWidth) + parseNum(el.style.paddingTop) + parseNum(el.style.paddingBottom)));
            break;
        }
        break;
    }
  } catch(e) {log(e, "setDim");}
}

function parseNum(val)
{
  try
  {
    val = parseInt(val);
    if(isNaN(val))
      val = 0;
    if(val < 0)
      val = 0;
    return val;
  } catch(e) {log(e, "parseNum");return 0;}
}

function getDim(strElNm, intDim)
{
  try
  {
    //I prefer IE's width/height model over W3C...convert Mozilla/Safari
    var el = getEl(strElNm);
    var intRtn = 0;
         
    switch(gintBrowserVersion)
    {
      case 1: case 3:
        switch(intDim)
        {
          case 1:
            intRtn = el.style.pixelWidth;
            break;
          case 2:
            intRtn = el.style.pixelHeight;
            break;
        }
        break;
      case 2:case 4:
        switch(intDim)
        {
          case 1:
            intRtn = parseNum(el.style.width) +( parseNum(el.style.borderLeftWidth) + parseNum(el.style.borderRightWidth) + parseNum(el.style.paddingRight) + parseNum(el.style.paddingLeft));
            break;
          case 2:
            intRtn = parseNum(el.style.height) +( parseNum(el.style.borderTopWidth) + parseNum(el.style.borderBottomWidth) + parseNum(el.style.paddingTop) + parseNum(el.style.paddingBottom));
            break;
        }
        break;
    }
    
    return parseNum(intRtn);
  } catch(e) {log(e, "getDim");return 0;}
}

function getChild(obj, intIndex)
{
  try
  {
    if(!isNaN(parseInt(intIndex)))
      return obj.getElementsByTagName("DIV").item(intIndex);
    else
      return obj.getElementsByTagName("DIV").item(0);
  } catch(e) {log(e, "getChild");return null;}
}

function getEl(strElNm)
{
  try
  {
    return document.getElementById(strElNm);
  } catch(e) {log(e, "getEl");return null;}
}

function load()
{
  try
  {
    switch(gintBrowserVersion)
    {
      case 4:
        //because safari doesn't properly support overflow:auto, suggest minimal size.
        //window.resizeTo(670, 600);
        window.setInterval("stupidSafari();", 200);
        break;
    }
    var strQS = new String(document.location);
    var intEQ = strQS.indexOf("tab=");
    if(intEQ >= 0)
    {
      var intTab = parseInt(strQS.substr(intEQ+4,1));
      if(!isNaN(intTab) && intTab >0 && intTab < 8)
      {
        changeTab(intTab);
      }
    }
    
    if(strQS.indexOf("debug") >= 0)
    {
      gbolDebug = true;
      alert("Debugging is on.");
    }
  } catch(e) {log(e, "load");}
}

function stupidSafari()
{
  try
  {
    var intCW = window.innerWidth;
    var intCH = window.innerHeight;
    if(gintCW != intCW || gintCH != intCH)
      resize();
  } catch(e) {log(e, "stupidSafari");}
}

function changeTab(intTab)
{
  try
  {
    if(gintActiveTab != intTab)
    {
      function resetTab(intTab)
      {
        with(getEl("divTabs"+intTab).style)
        {
          if(i == 1)
          {
            borderLeft = "2px outset";
            
            //recall that changes to the border affect the overall width in non-IE browsers
            if(gintBrowserVersion == 2 || gintBrowserVersion == 4)
              width = parseNum(width) + 1;
          } else
          {
            borderLeft = "1px outset";
            
            //recall that changes to the border affect the overall width in non-IE browsers
            if(gintBrowserVersion == 2 || gintBrowserVersion == 4)
              width = parseNum(width) + 2;
          }
          borderRight = "1px outset";
          borderTop = "#d3d3d3 2px solid";
          backgroundColor = "#d3d3d3";
          zIndex = 5;
          top = parseNum(top) - gintActiveTabOffset;
        }
      }
      
      for(var i=1; i<=gintTabCount; i++)
      {
        if(i == intTab)
        {
          with(getEl("divTabs"+i).style)
          {
            borderRight = "2px outset";
            borderTop = "#ffffff 2px solid";
            borderLeft = "2px outset";
            backgroundColor = "#FFFFFF";
            top = parseNum(top) + gintActiveTabOffset;
            zIndex = 15;
            
            //recall that changes to the border affect the overall width in non-IE browsers
            if(i == 1)
            {
              if(gintBrowserVersion == 2 || gintBrowserVersion == 4)
                width = parseNum(width) - 1;
            } else
            {
              if(gintBrowserVersion == 2 || gintBrowserVersion == 4)
                width = parseNum(width) - 2;
            }
          }
        } else if(i == gintActiveTab)
        {
          resetTab(i);
        }
      }
      
      getEl("divPages"+intTab).style.display = "block";
      getEl("divPages"+gintActiveTab).style.display = "none";
      gintActiveTab = intTab;
      
      switch (intTab)
      {
        case 1:
          garrTabInit[0] = true;
          break;
        case 2:
          if(!garrTabInit[1])
          {
            renderNavTree("/", 1, "ph");
            garrTabInit[1] = true;
          }
          break;
        case 3:
          if(!garrTabInit[2])
          {
            getEl("ifrmMap").src = "images/europe.gif";
            garrTabInit[2] = true;
          }
          break;
        case 5:
          if(!garrTabInit[4])
          {
            garrTabInit[4] = true;
          }
          break;
        case 6:
          if(!garrTabInit[5])
          {
            getEl("ifrmResume").src = "resume.html";
            garrTabInit[5] = true;
          }
          break;
        case 7:
          if(!garrTabInit[6])
          {
            getEl("imgTab7Bgrd").src = "images/tatoo.gif";
            garrTabInit[6] = true;
          }
          break;
      }
      
      resize();
    }
  } catch(e) {log(e, "changeTab");}
}
    
function setIFRMSB()
{
  //only IE raises this lovely event.
  try
  {
    if(event.srcElement.readyState == "complete" || event.srcElement.readyState == 4)
    {
      var colSty = document.frames(event.srcElement.id).document.body.style;
      with(colSty)
      {
      	scrollbar3dLightColor = "#999999";
      	scrollbarArrowColor = "#ffffff";
      	scrollbarBaseColor = "#999999";
      	scrollbarDarkShadowColor = "#999999";
      	scrollbarFaceColor = "#999999";
      	scrollbarHighlightColor = "#ffffff";
      	scrollbarShadowColor = "#999999";
      }
      document.frames(event.srcElement.id).document.body.oncontextmenu = returnFalse;
    }
  } catch(e){}
}

function returnFalse()
{
  return false;
}

//Begin Essays Page
function showEssay(strFN)
{
  try
  {
    getEl("ifrmEssay").style.visibility = "visible";
    getEl("ifrmEssay").src = "essays/" + strFN;
  } catch(e) {log(e, "showEssay");}
}
//End Essays Page

//Begin Music Page
function playFile(strFileName)
{
  try
  {
    window.open(strFileName);
  } catch(e) {log(e, "playFile");}
}
//End Music Page


//Begin Photos Page
/*
var gxmlPhotos = new ActiveXObject("MSXML2.DOMDocument.3.0");
with(gxmlPhotos)
{
  validateOnParse = false;
  resolveExternals = false;
  preserveWhiteSpace = false;
  async = false;
  load("includes/xml/photos.xml");
}

var gxmlPhotoTree = new ActiveXObject("MSXML2.DOMDocument.3.0");
with(gxmlPhotoTree)
{
  validateOnParse = false;
  resolveExternals = false;
  preserveWhiteSpace = false;
  async = false;
  load("includes/xml/phototree.xsl");
}
*/
function renderNavTree(strXPATHTransformNode, intCurrentID, strCurrentItemType)
{
  //txtTemp.value = gxmlPhotos.selectSingleNode(strXPATHTransformNode).transformNode(gxmlPhotoTree);
  //divTree.innerHTML = gxmlPhotos.selectSingleNode(strXPATHTransformNode).transformNode(gxmlPhotoTree);
}

function treeMouseOver(spnItem)
{
  try
  {
    switch(spnItem.getAttribute("itemtype"))
    {
      case "ph":
        if(spnItem.className.toLowerCase() != "itemselected")
          spnItem.className = "ItemHover";
        break;
      case "fldr":
        var oPar = spnItem.parentNode;
        oPar.style.borderTop = "none";
        oPar.style.border = "1px outset";
        break;
    }
  } catch(e) {log(e, "treeMouseOver");}
}

function treeMouseOut(spnItem)
{
  try
  {
    switch(spnItem.getAttribute("itemtype"))
    {
      case "ph":
        if(spnItem.className.toLowerCase() != "itemselected")
          spnItem.className = "Item";
        break;
      case "fldr":
        var oPar = spnItem.parentNode;
        with(oPar.style)
        {
          border = "none";
          borderTop = "1px solid #FFFFFF";
          borderBottom = "1px solid #999999";
          borderRight = "1px solid #999999";
          borderLeft = "1px solid #999999";
        }
        break;
    }
  } catch(e) {log(e, "treeMouseOut");}
}

function getNextSib(obj)
{
  try
  {
    //IE doesn't include text nodes.  Compensating.
    var objRtn = null;
    switch(gintBrowserVersion)
    {
      case 1:
        objRtn = obj.nextSibling;
        break;
      case 2:case 3:case 4:
        objRtn = obj.nextSibling.nextSibling;
        break;
    }
    return objRtn;
  } catch(e) {log(e, "checkBrowser");return null;}
}

function expandColapse(spnItemName)
{
  try
  {
    if(spnItemName)
    {
      with(spnItemName)
      {
        if(getAttribute("expanded") == "false")
        {

          getNextSib(parentNode).style.display = "";
          setAttribute("expanded", "true");
          
          if(getAttribute("itemtype") == "fldr")
            showRevealButton(spnItemName.getElementsByTagName("IMG").item(0), false);
        } else
        {
          getNextSib(parentNode).style.display = "none";
          setAttribute("expanded", "false");

          if(getAttribute("itemtype") == "fldr")
            showRevealButton(spnItemName.getElementsByTagName("IMG").item(0), true);
        }
      }
    }
  } catch(e) {log(e, "expandColapse");}
}

function showRevealButton(objImgButton, bolReveal)
{
  try
  {
    if(bolReveal)
      objImgButton.src = "images/reveal.gif";
    else
      objImgButton.src = "images/collapse.gif";
  } catch(e) {log(e, "showRevealButton");}
}

function selectItem(spnItemName)
{
  try
  {
    if(spnItemName)
    {
      try{gspnSelItem.className = "Item";} catch(e){}
      var imgPh = getEl("imgPh");
      if(spnItemName.getAttribute("itemtype") != "fldr")
      {
        //pictures
        imgPh.style.display = "none";
        var divShadowStyles = null;
        for(var i = 1; i < 6; i++)
        {
          divShadowStyles = eval("getEl('divPhShd"+i+"').style");
          with(divShadowStyles)
          {
            display = "none";
          }
        }
        
        imgPh.src = "images/photos/" + spnItemName.getAttribute("file");
        spnItemName.className = "ItemSelected";      
        getEl("divPhExplain").style.display = "none";
        getEl("divAlbum").style.display = "none";
        getEl("divPhTle").innerHTML = spnItemName.innerHTML;
        getEl("divPhDesc").innerHTML = spnItemName.getAttribute("desc");
        getEl("divPhDescBg").style.visibility = "visible";
        getEl("divPhDesc").style.visibility = "visible";
        var intW = spnItemName.getAttribute("wt") + "px";
        var intH = spnItemName.getAttribute("ht") + "px";
        imgPh.style.width = intW;
        imgPh.style.height = intH;
        
        var colSty = imgPh.style;
        var divShadowStyles;
        for(var i = 1; i < 6; i++)
        {
          divShadowStyles = eval("getEl('divPhShd"+i+"').style");
          with(divShadowStyles)
          {
            height = intH;
            width = intW;
            display = "";
          }
        }
        
        imgPh.style.display = "";
        positionPhotoAndShadows();        
      } else
      {
        //folders
        var colSpns = getEl("divTree").getElementsByTagName("DIV");
        var i = 0;
        var intCount = colSpns.length;
        for(i=0; i<intCount; i++)
        {
          if(colSpns.item(i).getAttribute("itemtype") == "fldr" && colSpns.item(i) != spnItemName && colSpns.item(i).getAttribute("expanded") == "true")
            expandColapse(colSpns.item(i));
        }
        
        imgPh.style.display = "none";
        getEl("divPhShd1").style.display = "none";
        getEl("divPhShd2").style.display = "none";
        getEl("divPhShd3").style.display = "none";
        getEl("divPhShd4").style.display = "none";
        getEl("divPhShd5").style.display = "none";
        getEl("divPhExplain").style.display = "none";
        getEl("divAlbum").style.display = "";
        getEl("divPhTle").innerHTML = spnItemName.getAttribute("text") + " Table of Contents";
        getEl("divPhDescBg").style.visibility = "hidden";
        getEl("divPhDesc").style.visibility = "hidden";
          
        if(gintSelFID != spnItemName.getAttribute("fid"))
        {
          getEl("divAlbum").innerHTML = "";
          var arrThms = spnItemName.getAttribute("tmbpths").split(",");
          i = 0;
          intCount = arrThms.length - 1;
          var strTemp = "";
          for(i=0; i<intCount; i++)
          {
            strTemp += '<img style="border:3px solid #FFFFFF;border:2px solid #FFFFFF" onmouseover="this.style.border=\'2px solid #C0C0C0\';" onmouseout="this.style.border=\'2px solid #FFFFFF\';" src="images/photos/thumbnails/'+arrThms[i]+'" onclick="showFullPhoto('+spnItemName.getAttribute("fid")+', '+i+');">';
            getEl("divAlbum").innerHTML = strTemp;
          }
  
          gintSelFID = spnItemName.getAttribute("fid");
        }
      }
          
      gspnSelItem = spnItemName;
      resize();
    }
  } catch(e) {log(e, "selectItem");}
}

function positionPhotoAndShadows()
{
  try
  {
    var imgPh = getEl("imgPh");
    var colSty = imgPh.style;
    var divShadowStyles = null;
    var intDesiredTop = ((getDim("divPhCont", 2) - getDim("imgPh", 2))/2);
    var intDesiredLeft = ((getDim("divPhCont", 1) - getDim("imgPh", 1))/2);
    
    if(intDesiredTop > 0)
      colSty.top = intDesiredTop + "px";
    else
      colSty.top = "0px";
      
    if(intDesiredLeft > 0)
      colSty.left = intDesiredLeft + "px";
    else
      colSty.left = "0px";
    
    var intTop = parseNum(colSty.top);
    var intLeft = parseNum(colSty.left);
    
    for(var i = 1; i < 6; i++)
    {
      divShadowStyles = eval("getEl('divPhShd"+i+"').style");
      with(divShadowStyles)
      {
        top = intTop + i+2 + "px";
        left = intLeft + i+2 + "px";
      }
    }
  } catch(e) {log(e, "positionPhotoAndShadows");}
}

function showFullPhoto(intFID, intPHIndex)
{
  try
  {
    var colSpns = getEl("divTree").getElementsByTagName("DIV");
    var i = 0;
    var intCount = colSpns.length;
    for(i=0; i<intCount; i++)
    {
      if(colSpns.item(i).getAttribute("itemtype") == "fldr" && parseInt(colSpns.item(i).getAttribute("fid")) == intFID)
      {
        if(colSpns.item(i).getAttribute("expanded") == "false")
          expandColapse(colSpns.item(i));
        
        var divItem = null;
        try
        {
          switch(gintBrowserVersion)
          {
            case 1:
              divItem = colSpns.item(i).parentNode.nextSibling.childNodes.item(intPHIndex).childNodes.item(0);
              break;
            case 2:case 3:
              divItem = colSpns.item(i).parentNode.nextSibling.nextSibling.childNodes.item((intPHIndex*2)+1).childNodes.item(1);
              break;
            case 4:
              //this has to be due to a bug in safari.
              if(intPHIndex == 0)
                divItem = colSpns.item(i).parentNode.nextSibling.nextSibling.childNodes.item((intPHIndex*2)).childNodes.item(1);
              else
                divItem = colSpns.item(i).parentNode.nextSibling.nextSibling.childNodes.item((intPHIndex*2)).childNodes.item(0);
              break;
          }
        } catch(f) {}
        
        if(divItem)
        {
          getEl("divAlbum").style.display = "none";
          selectItem(divItem);
        }
      }
    }
  } catch(e) {log(e, "showFullPhoto");}
}
//End Photos Page

function log(e, strFunction)
{
  try
  {
    if(gbolDebug)
      alert(strFunction + ":" + e.message);
  } catch(f)
  {
    alert("An unhandled exception was thrown in log().  Please report this to problems@eberhard.net.");
  }
}
