/**
 * JavaScript til menudata
 *
 * Buyingexperience A/S 2004 (http://buyingexperience.com)
 * ved Thomas B. Christiansen
 *
 * for: BRFkredit
 *
 */

function rt() {
  window.onerror=null;
  return true;	
}
window.onerror=null;

/*
 * Browsercheck
 */
var BE_NS = 0;
var BE_IE4 = false;

if (navigator.appName == "Netscape") {
  BE_NS = parseInt(navigator.appVersion.substring(0,1));	
} else { BE_IE4 = true; }

var layerRef="", styleSwitch="";
if (BE_NS < 5 && !BE_IE4) {
  layerRef="document.layers"; 
  styleSwitch="";
} else if (BE_IE4) {
  layerRef="document.all";
  styleSwitch=".style";
} 

var BE_containerTag = (BE_NS <= 4 && !BE_IE4) ? "" : "div";

/**
 * BE_getDivElementById
 *
 * @param String id
 * @return Object divElement
 */
function BE_getDivElementById(id) {
  if (BE_NS >= 5) return document.getElementById(id);
  else return eval(layerRef + '[\"' + id +'\"]');
}

/**
 * MenuPunkt.constructor
 *
 * @param String id
 * @return MenuPunkt menuPunkt
 */
function MenuPunkt(id) {
  this.id = id;
  this.navn = "";
  this.href = "";
  this.foraelder = null;
  this.boern = {};

}

MenuPunkt.prototype.toString = function() {
  return this.id;
}

/**
 * BE_MenuData.constructor
 *
 */
function BE_MenuData() {
  this.idTabel = {}; // Tabel, hvor menupunkter kan slås op pr. id
  this.urlTabel = {}; // Tabel, hvor menupunkter kan slås op pr.URL (med alt efter protokol og domæne)
  this.pathTabel = {}; // Tabel, hvor menupunkter kan slås op på path-delen af URL'en
  this.servletIdTabel = {}; // Tabel, hvor gamle servlet-dialoger kan slås op pr. id
  this.logIndTabel = new Array(); // Tabel til menupunkter, der kræver log-ind
  var erKlar = false;
}

/*
 * BE_MenuData.transformer
 *
 * Transformér data fra Notes-output og generér objekttræ af menupunkter
 */
BE_MenuData.prototype.transformer = function() {
  // Check tilgængelighed af menudata
  if ((typeof(_Niveau) == 'undefined') || !(_Niveau) || (typeof(_Href) == 'undefined') || !(_Href)) return;

  for (var niveau in _Niveau) {
    if (niveau != "length") {
      // Dan evt. foraeldremenupunkt
      var foraelder = null;
      var foraelderId = this.danId(niveau);

      if ((typeof(this.idTabel[foraelderId]) == 'undefined') || (this.idTabel[foraelderId] == null)) {
    	foraelder = this.danMenuPunkt(this.danId(niveau));
      } else {
    	foraelder = this.idTabel[foraelderId];
      }

      // Tilføj forælder til hash-tabeller
      this.tilfoejMenuPunktTilTabeller(foraelder);

      // Knyt foraelder til evt. bedsteforaelder
      // Bedsteforaelder-id
      var bedsteforaelderId = (foraelder.id.lastIndexOf(".") != -1) ? foraelder.id.substring(0, foraelder.id.lastIndexOf(".")) : "";
      if (bedsteforaelderId != "") this.idTabel[bedsteforaelderId].boern[foraelder.ordning] = foraelder;

      // Knyt evt. bedsteforælder til forælder
      if (bedsteforaelderId != "") foraelder.foraelder = this.idTabel[bedsteforaelderId];
    
      // Behandl boerne-menupunkter
      for (var boern in _Niveau[niveau]) {
	if (boern != "length") {

	  // Dan gamle id'er
	  var gammeltId = new String(niveau + boern);
	  var gammeltForaelderId = gammeltId.substring(0, gammeltId.length - 1);

	  // Dan børne-id
	  var barnId = this.danId(niveau) + "." + boern;

	  // document.write("<p>barnId = " + barnId + "</p>");

	  // Dan menupunkt
	  var barn = this.danMenuPunkt(barnId);
      
	  // Tilføj menupunkt til hash-tabeller
	  this.tilfoejMenuPunktTilTabeller(barn);

	  // Knyt forælder til menupunkt
	  barn.foraelder = foraelder;
      
	  // Knyt menupunkt til forælder 
	  if (barn.id.length > 1 ) {
	    foraelder.boern[barn.ordning] = barn;
	  }
	}      
      }
    }
  }
  // Hvis transformering er gået godt, sæt MenuData-objekt til at være klar
  this.erKlar = true;
}

/**
 * BE_MenuData.erGammelServletDialog
 *
 * @param String url
 * @return boolean erGammelServletDialog
 */
BE_MenuData.prototype.erGammelServletDialog = function(url) {
  if (!(url) || url == "") return false;
  return url.indexOf("Servlet/Page") > -1;
}

/**
 * BE_MenuData.findGammelServletId
 *
 * @param String url
 * @return String servletId
 */
BE_MenuData.prototype.findGammelServletId = function(url) {
  var regExp = /ID=([A-Za-z0-9_-]*)&/;
  var servletIdMatch = regExp.exec(url);
  return servletIdMatch ? servletIdMatch[1] : null;
}

/**
 * BE_MenuData.tilfoejMenuPunktTilTabeller
 *
 * @param MenuPunkt menuPunkt
 */
BE_MenuData.prototype.tilfoejMenuPunktTilTabeller = function(menuPunkt) {
  if (menuPunkt == null) return;

  // Indsæt menupunkt i id-tabel
  this.idTabel[menuPunkt.id] = menuPunkt;

  // Afgør, hvilken slags URL der er tale om: gammel servlet-dialog eller alt andet
  if (this.erGammelServletDialog(menuPunkt.href)) {
    // Find servlet-id
    var servletId = this.findGammelServletId(menuPunkt.href);
    
    // Indsæt menupunkt i servlet-id-tabel
    if (servletId) {
      if ((typeof(this.servletIdTabel[servletId]) == 'undefined') || (this.servletIdTabel[servletId] == null)) {
	this.servletIdTabel[servletId] = {};
      } 
      this.servletIdTabel[servletId][menuPunkt.id] = menuPunkt;
    }

  } else {                    
    // Indsæt menupunkt i url-tabel
    if ((typeof(this.urlTabel[menuPunkt.href]) == 'undefined') || (this.urlTabel[menuPunkt.href] == null)) {
      this.urlTabel[menuPunkt.href] = {};
    } 
    this.urlTabel[menuPunkt.href][menuPunkt.id] = menuPunkt;

    // Indsæt menupunkt i path-tabel
    var path = menuPunkt.href.split("?")[0];
    if ((typeof(this.pathTabel[path]) == 'undefined') || (this.pathTabel[path] == null)) {
      this.pathTabel[path] = {};
    }
    this.pathTabel[path][menuPunkt.id] = menuPunkt;
  }
}

/**
 * BE_MenuData.hentMenuPunktPrId
 *
 * @param String id
 * @return MenuPunkt menuPunkt
 */
BE_MenuData.prototype.hentMenuPunktPrId = function(id) {
  if (!this.erKlar) return null;
  return (typeof(this.idTabel[id]) != 'undefined') ? this.idTabel[id] : null;
}

/**
 * BE_MenuData.danMenuPunkt
 *
 * Danner menupunkt-objekt ved ud fra id at indhente relevante data fra Notes-output
 *
 * @param String id
 * @return MenuPunkt menuPunkt
 */
BE_MenuData.prototype.danMenuPunkt = function(id) {
  // Foraelder-id
  var foraelderId = (id.lastIndexOf(".") != -1) ? id.substring(0, id.lastIndexOf(".")) : "";
  // Gammelt forælder-id
  var gammeltForaelderId = foraelderId.replace(/\W/g, "");

  // Opret nyt menupunkt
  var menuPunkt = new MenuPunkt(id);

  // Ordning : menupunktets placering blandt dets søskende
  menuPunkt.ordning = id.substring(id.lastIndexOf(".") + 1, id.length);

  // Tildel navn
  menuPunkt.navn = (foraelderId != "") ? _Niveau[gammeltForaelderId][menuPunkt.ordning] : "";

  // Tildel href
  menuPunkt.href = (foraelderId != "") ? _Href[gammeltForaelderId][menuPunkt.ordning] : "";

  return menuPunkt
}

/*
 * BE_MenuData.danId
 *
 * Danner id for menupunkt ved at splitte gammelt id op og adskille dele med punktummer
 *
 * @param String gammeltId
 * @return String id
 */
BE_MenuData.prototype.danId = function(gammeltId) {
  // Dan nyt id ved at dele det gamle op pr. ciffer og indsætte punktummer som skilletegn
  var id = "";
  var gammeltIdStr = new String(gammeltId);
  for (var i=0; i < gammeltIdStr.length; i++) {
    id = id + gammeltIdStr.charAt(i);
    if (i == gammeltIdStr.length - 1) break; // Afbryd efter sidste ciffer
    id = id + ".";
  }
  return id;
}

/*
 * BE_MenuData.saetLogIndMenuPunkt
 *
 * @param String navn
 * @param String ikkeLoggetIndNavn
 */
BE_MenuData.prototype.saetLogIndMenuPunkt = function(navn, ikkeLoggetIndNavn) {
  var menuPunkt = null;
  for (var menuPunktIter in this.idTabel) {
    menuPunkt = this.idTabel[menuPunktIter];
    if (menuPunkt.navn == navn) break;
  }
  if (menuPunkt != null && ikkeLoggetIndNavn != null && ikkeLoggetIndNavn != "") {
    this.logIndTabel[menuPunkt.id] = ikkeLoggetIndNavn;
  }
}

/*
 * BE_MenuData.kraeverLogInd
 *
 * @param String menuPunktId
 * @return boolean kraeverLogInd
 */
BE_MenuData.prototype.kraeverLogInd = function(menuPunktId) {
    // Check, om menupunkt eksisterer, ellers returner false
  if (this.hentMenuPunktPrId(menuPunktId) == null) return false;

  // Antagelsen er, at det er bedst ikke at være restriktiv med visningen af menupunkter, hvis noget skulle gå galt
  // Check, om menupunktet kræver log-ind
  if ((typeof(this.logIndTabel[menuPunktId]) != 'undefined') && (this.logIndTabel[menuPunktId] != null)) {
    return true;
  } 
  return false;
}

/*
 * BE_MenuData.hentIkkeLoggetIndNavn
 *
 * @param String menuPunktId
 * @return String ikkeLoggetIndNavn
 */
BE_MenuData.prototype.hentIkkeLoggetIndNavn = function(menuPunktId) {
  // Check, om menupunkt eksisterer, ellers returner tom streng
  if (this.hentMenuPunktPrId(menuPunktId) == null) return "";

  var ikkeLoggetIndNavn = "";
  ikkeLoggetIndNavn = this.logIndTabel[menuPunktId];
  return ikkeLoggetIndNavn != "" && (typeof(ikkeLoggetIndNavn) != 'undefined') ? ikkeLoggetIndNavn : idHashTabel[menuPunktId].navn;
}

/*
 * BE_MenuData.danMenuPunktUndertraeHtml
 *
 * @param MenuPunkt menuPunkt
 * @return String undertraeHtml
 */
BE_MenuData.prototype.danMenuPunktUndertraeHtml = function(menuPunkt, maalMenuPunktId) {
  if (!(menuPunkt)) return "";

  // Bevægelse ad den rette sti mod mål-menupunkt? Check med id for mål-menupunkt
  var menuPunktIdKomp = menuPunkt.id.split(".");
  var maalMenuPunktIdKomp = maalMenuPunktId.split(".");
  var erPaaDenRetteSti = true;
  for (var j = 0; j < menuPunktIdKomp.length; j++) {
    if (menuPunktIdKomp[j] != maalMenuPunktIdKomp[j]) erPaaDenRetteSti = false;
  }

  var logInd = this.kraeverLogInd(menuPunkt.id);
  var strBuf = (menuPunkt.navn != "") ? ((BE_NS > 4 || BE_IE4) ? new String(BE_divHtml) : new String(BE_divHtmlNN4)) :
  ((BE_NS > 4 || BE_IE4) ? new String(BE_divHtmlTom) : new String(BE_divHtmlTomNN4));

  // Udskil evt. topmenupunkt
  if (menuPunkt.foraelder != null && menuPunkt.foraelder.navn == "") strBuf = new String(BE_divHtmlTop);

  // Indsæt container-tag
  strBuf = strBuf.replace(/\$\{containerTag\}/g, BE_containerTag);

  // Indsæt menuPunkt.id
  strBuf = strBuf.replace(/\$\{menuPunkt\.id\}/g, menuPunkt.id);

  // Indsæt menuPunkt.navn
  if (!logInd || BE_erLoggetInd) {
    strBuf = strBuf.replace(/\$\{menuPunkt\.navn\}/g, menuPunkt.navn != "" ? menuPunkt.navn : "");
  } else {
    strBuf = strBuf.replace(/\$\{menuPunkt\.navn\}/g, this.hentIkkeLoggetIndNavn([menuPunkt.id]));
  }

  // Indsæt menuPunkt.href
  strBuf = strBuf.replace(/\$\{menuPunkt\.href\}/g, menuPunkt.href);

  // Iterér evt. over børn og kald rekursivt
  var underMenuPunkter = "";
  // Check for log-ind
  if (!logInd || BE_erLoggetInd) {
    // Udvælg menupunkter
    if ((menuPunktIdKomp.length < maalMenuPunktIdKomp.length - 1 && erPaaDenRetteSti) ||
	(this.hentMenuPunktPrId(maalMenuPunktId).boern != null &&
	 menuPunktIdKomp.length < maalMenuPunktIdKomp.length &&
	 erPaaDenRetteSti) ||
	menuPunkt.id == maalMenuPunktId) {
      // Er der børn?
      if (menuPunkt.boern != null) {
	for (var barnIter in menuPunkt.boern) {
	  underMenuPunkter += this.danMenuPunktUndertraeHtml(menuPunkt.boern[barnIter], maalMenuPunktId);
	}
      }
    } 
  }

  // Indsæt eventuelle undermenupunkter
  strBuf = strBuf.replace(/\$\{underMenuPunkter\}/g, underMenuPunkter);

  return strBuf;
}

// Cookie-utils

/**
 * BE_setCookie
 *
 * @param String name
 * @param String value
 * @param String expires (default: end of current session)
 * @param String path (default: path of calling document)
 * @param String domain (default: domain of calling document)
 * @param boolean secure (default: false)
 */
function BE_setCookie(name, value, expires, path, domain, secure) {
  var newCookie = name + "=" + escape(value) +
      ((expires) ? "; expires=" + expires.toGMTString() : "") +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      ((secure) ? "; secure" : "");
  document.cookie = newCookie;
}

/**
 * BE_getCookie
 *
 * @param String name
 * @return String cookieValue
 */
function BE_getCookie(name) {
  var dc = document.cookie;
  var prefix = name + "=";
  var begin = dc.indexOf("; " + prefix);
  if (begin == -1) {
    begin = dc.indexOf(prefix);
    if (begin != 0) return null;
  } else
    begin += 2;
  var end = document.cookie.indexOf(";", begin);
  if (end == -1)
    end = dc.length;
  return unescape(dc.substring(begin + prefix.length, end));
}

/*
 * BE_onClickHandler
 *
 * @param String menuPunktId
 */
function BE_onClickHandler(menuPunktId) {
  var menuPunkt = BE_menuData.hentMenuPunktPrId(menuPunktId);
  if (menuPunkt == null) return;
  BE_setCookie("BE_senesteMenuPunktUrl", menuPunkt.href, null, "/", null, false);
  BE_setCookie("BE_senesteMenuPunktId", menuPunkt.id, null, "/", null, false);
}

/*
 * BE_detekterSidensMenupunkt
 *
 * @return String menuPunktId
 */
function BE_detekterMenuPunkt() {
  var aktuelPathSearch = new String(window.location.pathname + window.location.search);
  var aktuelPath = new String(window.location.pathname);
  var menuPunkt = null;
  var senesteMenuPunktUrl = BE_getCookie("BE_senesteMenuPunktUrl");
  var senesteMenuPunktPath = (senesteMenuPunktUrl) ? senesteMenuPunktUrl.split("?")[0] : "";
  var senesteMenuPunktId = BE_getCookie("BE_senesteMenuPunktId");

  // Gammel servlet-dialog?
  if (BE_menuData.erGammelServletDialog(aktuelPathSearch)) {  
    // Find menupunkt pr. servlet-id
    var servletId = BE_menuData.findGammelServletId(aktuelPathSearch);
    if (servletId && BE_menuData.servletIdTabel[servletId]) {
      var kortesteMenuPunktIdLgd = -1;
      var kortesteMenuPunktId = "";
      for (var menuPunktIter in BE_menuData.servletIdTabel[servletId]) {
	menuPunkt = BE_menuData.servletIdTabel[servletId][menuPunktIter];
	if (menuPunkt.id == senesteMenuPunktId) {
	  // Returner, hvis menupunkt-id stemmer med det fra cookie
	  return menuPunkt.id;
	} else {
	  // Registrer hidtil korteste menupunkt-id = højest placeret i hierarkiet.
	  // Hvis menupunkter er placeret på samme højde, tages bare det første
	  if (kortesteMenuPunktIdLgd == -1) {
	    kortesteMenuPunktIdLgd = menuPunkt.id.length;
	    kortesteMenuPunktId = menuPunkt.id;
	  }
	  else if (menuPunkt.id.length < kortesteMenuPunktId) {
	    kortesteMenuPunktIdLgd = menuPunkt.id.length;
	    kortesteMenuPunktId = menuPunkt.id;
								
	  }
	}
      }
      return kortesteMenuPunktId;
    }
  } else {
    // Anden slags side
    // Forsøg match på fuld URL inkl. parametre
    if (BE_menuData.urlTabel[aktuelPathSearch]) {
      var kortesteMenuPunktIdLgd = -1;
      var kortesteMenuPunktId = "";
      for (var menuPunktIter in BE_menuData.urlTabel[aktuelPathSearch]) {
	menuPunkt = BE_menuData.urlTabel[aktuelPathSearch][menuPunktIter];
	if (menuPunkt.id == senesteMenuPunktId) {
	  // Returner, hvis menupunkt-id stemmer med det fra cookie
	  return menuPunkt.id;
	} else {
	  // Registrer hidtil korteste menupunkt-id = højest placeret i hierarkiet.
	  // Hvis menupunkter er placeret på samme højde, tages bare det første
	  if (kortesteMenuPunktIdLgd == -1) {
	    kortesteMenuPunktIdLgd = menuPunkt.id.length;
	    kortesteMenuPunktId = menuPunkt.id;
	  }
	  else if (menuPunkt.id.length < kortesteMenuPunktId) {
	    kortesteMenuPunktIdLgd = menuPunkt.id.length;
	    kortesteMenuPunktId = menuPunkt.id;
	  }
	}
      }
      return kortesteMenuPunktId;
      
      // Ellers forsøg match på URL uden parametre
    } else if (BE_menuData.pathTabel[aktuelPath]) {
      var kortesteMenuPunktIdLgd = -1;
      var kortesteMenuPunktId = "";
      for (var menuPunktIter in BE_menuData.pathTabel[aktuelPath]) {
	menuPunkt = BE_menuData.pathTabel[aktuelPath][menuPunktIter];
	if (menuPunkt.id == senesteMenuPunktId) {
	  // Returner, hvis menupunkt-id stemmer med det fra cookie
	  return menuPunkt.id;
	} else {
	  // Registrer hidtil korteste menupunkt-id = højest placeret i hierarkiet.
	  // Hvis menupunkter er placeret på samme højde, tages bare det første
	  if (kortesteMenuPunktIdLgd == -1) {
	    kortesteMenuPunktIdLgd = menuPunkt.id.length;
	    kortesteMenuPunktId = menuPunkt.id;
	  }
	  else if (menuPunkt.id.length < kortesteMenuPunktId) {
	    kortesteMenuPunktIdLgd = menuPunkt.id.length;
	    kortesteMenuPunktId = menuPunkt.id;
	  }
	}
      }
      return kortesteMenuPunktId;

      // Check med cookies
      // Der checkes både med menupunkt-id og URL/path, da brugeren kan have bevæget sig ind på et andet hovedområde via et krydslink
    } else {
      // Check, om det er en gammel servlet-dialogs menupunkt, der skal holdes fast i
      if (BE_menuData.erGammelServletDialog(senesteMenuPunktUrl)) {
	var servletId = BE_menuData.findGammelServletId(senesteMenuPunktUrl);
	if (servletId && BE_menuData.servletIdTabel[servletId]) {
	  for (var menuPunktIter in BE_menuData.servletIdTabel[servletId]) {
	    menuPunkt = BE_menuData.servletIdTabel[servletId][menuPunktIter];
	    if (menuPunkt.id == senesteMenuPunktId) {
	      // Returner, hvis menupunkt-id stemmer med det fra cookie
	      return menuPunkt.id;
	    }
	  }
	}
      } else {
	// Check med URL
	for (var menuPunktIter in BE_menuData.urlTabel[senesteMenuPunktUrl]) {
	  menuPunkt = BE_menuData.urlTabel[senesteMenuPunktUrl][menuPunktIter];
	  if (menuPunkt.id == senesteMenuPunktId) {
	    // Returner, hvis menupunkt stemmer med det fra cookies
	    return menuPunkt.id;
	  } 
	}
	// Check med path
	for (var menuPunktIter in BE_menuData.pathTabel[senesteMenuPunktPath]) {
	  menuPunkt = BE_menuData.pathTabel[senesteMenuPunktPath][menuPunktIter];
	  if (menuPunkt.id == senesteMenuPunktId) {
	    // Returner, hvis menupunkt stemmer med det fra cookies
	    return menuPunkt.id;
	  }
	}
      }
    }
  }
  // Returner default: menupunkt-id = 1.1 
  return "1.1";
}

/**
 * BE_fremhaevMenuPunkt
 *
 * @param String menuPunktId
 */ 
function BE_fremhaevMenuPunkt(menuPunktId) {
  var menuPunkt = BE_menuData.hentMenuPunktPrId(menuPunktId);
  if (menuPunkt == null) return;

  // Hent DOM-element
  var aDiv = BE_getDivElementById("BE_a-" + menuPunkt.id);

  // Fremhæv menupunkt
  if (aDiv) aDiv.className = "BE_mpSelect";
}

/**
 * BE_MenuData.danMenuSti
 *
 * @param String menuPunktId
 * @return MenuPunkt[] menuSti 
 */
BE_MenuData.prototype.danMenuSti = function(menuPunktId) {
  var menuSti = new Array();
  var menuPunkt = this.hentMenuPunktPrId(menuPunktId);
  // Check, om menupunkt eksisterer, ellers returner null
  if (menuPunkt == null) return null;

  var foraelder = menuPunkt.foraelder;

  menuSti[0] = menuPunkt;

  // Gennemløb stien hele vejen op til roden af menuhierarkiet
  var i = 1;
  while (foraelder != null) {
    // Hvis forælderen ikke har noget navn, så afbryd
    if (foraelder.navn == "") break;
    menuSti[i] = foraelder;
    foraelder = foraelder.foraelder;
    i++;
  }
  return menuSti.reverse();
};

/*
 * Initialiser menudata
 */
var BE_menuData = new BE_MenuData();
BE_menuData.transformer();

// Detektering af aktivt menupunkt
var BE_aktivtMenuPunkt = BE_detekterMenuPunkt();

// Check for log-ind
var BE_erLoggetInd = BE_getCookie("USERINFO") != null ? true : false;
