// -----------------------------------------------------------------
// - Library Name	: LibTools.js
// - Author			: Steve van den Buys
// - Date			: 01/03/2001 (dd/mm/yyyy)
// -----------------------------------------------------------------
// - GENERAL DESCRIPTION
// -----------------------------------------------------------------
// - This library contains custom Objects that can be of help when
// - developing client-side script.	At the start of each Object
// - definition, you will find a more detailed explanation of its
// - purpose.
// -----------------------------------------------------------------
// - OBJECTS AVAILABLE
// -----------------------------------------------------------------
// - Dictionary		: a container that can hold name/value pairs
// - Locator		: a 'You are here' visual component
// - Is				: a browser detection component (courtesy of
// -				  Netscape Communications)
// -----------------------------------------------------------------



// -----------------------------------------------------------------
// - OBJECT			: Is
// - Version		: 3.02
// - History		:		17/05/1999	is.nav5up and is.ie5up added
// -						21/11/2000	is.gecko and is.ie5_5 added,
// -									changed is.nav5 and
// -									is.nav5up to is.nav6 and
// -									is.nav6up
// -						22/02/2001  correct detection for
// -									IE 5.x, Opera 4, Opera 5,
// -									add support for winME and 
// -									win2k
// -						26/03/2001	correct Opera detection
// -----------------------------------------------------------------
// - GENERAL DESCRIPTION
// -----------------------------------------------------------------
// - The 'Is'-constructor detects browser vendor, version number,
// - browser vendor AND major version number, Javascript version
// - number, OS platform and version. The code also returns an 
// - 'is'-object that can be used in code. Simply include this
// - library in your page and use the properties of 'is' in your
// - conditional statements...
// - 
// - This object was created by Netscape Communications. Permission
// - has been granted to reuse and distribute. 
// -----------------------------------------------------------------
// - FUNCTIONS AVAILABLE
// -----------------------------------------------------------------
// - Is()			: the constructor that does it all...
// -----------------------------------------------------------------
// - PROPERTIES
// -----------------------------------------------------------------
// - a) browser vendor properties :
// -
// -	is.nav, is.ie, is.opera, is.hotjava, is.webtv, 
// -	is.TVNavigator, is.AOLTV
// -
// - b) browser version number
// -
// -	is.major	: integer indicating major version number
// -	is.minor	: float indicating full version number
// -
// - c) browser vendor AND major version number
// -
// -	is.nav2, is.nav3, is.nav4, is.nav4up, is.nav6, is.nav6up,
// -	is.gecko, is.ie3, is.ie4, is.ie4up , is.ie5, is.ie5up,  
// -	is.ie5_5, is.ie5_5up, is.hotjava3, is.hotjava3up
// -
// - d) JavaScript version number
// -
// -	is.js		: float indicating full JavaScript version number
// -
// - e) OS platform and version
// -
// -	is.win, is.win16, is.win32, is.win31, is.win95, is.winnt,
// -	is.win98, is.winme, is.win2k, 
// -	is.os2,
// -	is.mac, is.mac68k, is.macppc,
// -	is.unix,
// -	is.sun, is.sun4, is.sun5, is.suni86,
// -	is.irix, is.irix5, is.irix6,
// -	is.hpux, is.hpux9, is.hpux10,
// -	is.aix, is.aix1, is.aix2, is.aix3, is.aix4,
// -	is.linux, is.sco, is.unixware, is.mpras, is.reliant,
// -	is.dec, is.sinix, is.freebsd, is.bsd,
// -	is.vms
// -----------------------------------------------------------------
// - ADDITIONAL INFORMATION
// -----------------------------------------------------------------
// See http://www.it97.de/JavaScript/JS_tutorial/bstat/navobj.html 
// and 
// http://www.it97.de/JavaScript/JS_tutorial/bstat/Browseraol.html
// for detailed lists of userAgent strings.
//
// Note: you don't want your Nav4 or IE4 code to "turn off" or
// stop working when Nav5 and IE5 (or later) are released, so
// in conditional code forks, use is.nav4up ("Nav4 or greater")
// and is.ie4up ("IE4 or greater") instead of is.nav4 or is.ie4
// to check version in code which you want to work on future
// versions.
// -----------------------------------------------------------------

function Is ()
{   // convert all characters to lowercase to simplify testing
    var agt=navigator.userAgent.toLowerCase();

    // *** BROWSER VERSION ***
    // Note: On IE5, these return 4, so use is.ie5up to detect IE5.

    this.major = parseInt(navigator.appVersion);
    this.minor = parseFloat(navigator.appVersion);

    // Note: Opera and WebTV spoof Navigator.  We do strict client detection.
    // If you want to allow spoofing, take out the tests for opera and webtv.
    this.nav  = ((agt.indexOf("mozilla")!=-1) && (agt.indexOf("spoofer")==-1)
                && (agt.indexOf("compatible") == -1) && (agt.indexOf("opera")==-1)
                && (agt.indexOf("webtv")==-1) && (agt.indexOf("hotjava")==-1));
    this.nav2 = (this.nav && (this.major == 2));
    this.nav3 = (this.nav && (this.major == 3));
    this.nav4 = (this.nav && (this.major == 4));
    this.nav4up = (this.nav && (this.major >= 4));
    this.navonly      = (this.nav && ((agt.indexOf(";nav") != -1) ||
                          (agt.indexOf("; nav") != -1)) );
    this.nav6 = (this.nav && (this.major == 5));
    this.nav6up = (this.nav && (this.major >= 5));
    this.gecko = (agt.indexOf("gecko") != -1);


    this.ie     = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
    this.ie3    = (this.ie && (this.major < 4));
    this.ie4    = (this.ie && (this.major == 4) && (agt.indexOf("msie 4")!=-1) );
    this.ie4up  = (this.ie  && (this.major >= 4));
    this.ie5    = (this.ie && (this.major == 4) && (agt.indexOf("msie 5.0")!=-1) );
    this.ie5_5  = (this.ie && (this.major == 4) && (agt.indexOf("msie 5.5") !=-1));
    this.ie5up  = (this.ie  && !this.ie3 && !this.ie4);
    this.ie5_5up= (this.ie && !this.ie3 && !this.ie4 && !this.ie5);
	this.ie6    = (this.ie && (this.major == 4) && (agt.indexOf("msie 6.") != -1));
	this.ie6up  = (this.ie && !this.ie3 && !this.ie4 && !this.ie5 && !this.ie5_5);
 
    // KNOWN BUG: On AOL4, returns false if IE3 is embedded browser
    // or if this is the first browser window opened.  Thus the
    // variables is.aol, is.aol3, and is.aol4 aren't 100% reliable.
    this.aol   = (agt.indexOf("aol") != -1);
    this.aol3  = (this.aol && this.ie3);
    this.aol4  = (this.aol && this.ie4);
    this.aol5  = (agt.indexOf("aol 5") != -1);
    this.aol6  = (agt.indexOf("aol 6") != -1);

    this.opera = (agt.indexOf("opera") != -1);
    this.opera2 = (agt.indexOf("opera 2") != -1 || agt.indexOf("opera/2") != -1);
    this.opera3 = (agt.indexOf("opera 3") != -1 || agt.indexOf("opera/3") != -1);
    this.opera4 = (agt.indexOf("opera 4") != -1 || agt.indexOf("opera/4") != -1);
    this.opera5 = (agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1);
    this.opera5up = (this.opera && !this.opera2 && !this.opera3 && !this.opera4);

    this.webtv = (agt.indexOf("webtv") != -1); 

    this.TVNavigator = ((agt.indexOf("navio") != -1) || (agt.indexOf("navio_aoltv") != -1)); 
    this.AOLTV = this.TVNavigator;

    this.hotjava = (agt.indexOf("hotjava") != -1);
    this.hotjava3 = (this.hotjava && (this.major == 3));
    this.hotjava3up = (this.hotjava && (this.major >= 3));

    // *** JAVASCRIPT VERSION CHECK ***
    if (this.nav2 || this.ie3) this.js = 1.0;
    else if (this.nav3) this.js = 1.1;
    else if (this.opera5up) this.js = 1.3;
    else if (this.opera) this.js = 1.1;
    else if ((this.nav4 && (this.minor <= 4.05)) || this.ie4) this.js = 1.2;
    else if ((this.nav4 && (this.minor > 4.05)) || this.ie5) this.js = 1.3;
    else if (this.hotjava3up) this.js = 1.4;
    else if (this.nav6 || this.gecko) this.js = 1.5;
    // NOTE: In the future, update this code when newer versions of JS
    // are released. For now, we try to provide some upward compatibility
    // so that future versions of Nav and IE will show they are at
    // *least* JS 1.x capable. Always check for JS version compatibility
    // with > or >=.
    else if (this.nav6up) this.js = 1.5;
    // note ie5up on mac is 1.4
    else if (this.ie5up) this.js = 1.3

    // HACK: no idea for other browsers; always check for JS version with > or >=
    else this.js = 0.0;

    // *** PLATFORM ***
    this.win   = ( (agt.indexOf("win")!=-1) || (agt.indexOf("16bit")!=-1) );
    // NOTE: On Opera 3.0, the userAgent string includes "Windows 95/NT4" on all
    //        Win32, so you can't distinguish between Win95 and WinNT.
    this.win95 = ((agt.indexOf("win95")!=-1) || (agt.indexOf("windows 95")!=-1));

    // is this a 16 bit compiled version?
    this.win16 = ((agt.indexOf("win16")!=-1) || 
               (agt.indexOf("16bit")!=-1) || (agt.indexOf("windows 3.1")!=-1) || 
               (agt.indexOf("windows 16-bit")!=-1) );  

    this.win31 = ((agt.indexOf("windows 3.1")!=-1) || (agt.indexOf("win16")!=-1) ||
                    (agt.indexOf("windows 16-bit")!=-1));

    // NOTE: Reliable detection of Win98 may not be possible. It appears that:
    //       - On Nav 4.x and before you'll get plain "Windows" in userAgent.
    //       - On Mercury client, the 32-bit version will return "Win98", but
    //         the 16-bit version running on Win98 will still return "Win95".
    this.win98 = ((agt.indexOf("win98")!=-1) || (agt.indexOf("windows 98")!=-1));
    this.winnt = ((agt.indexOf("winnt")!=-1) || (agt.indexOf("windows nt")!=-1));
    this.win32 = (this.win95 || this.winnt || this.win98 || 
                    ((this.major >= 4) && (navigator.platform == "Win32")) ||
                    (agt.indexOf("win32")!=-1) || (agt.indexOf("32bit")!=-1));

    this.winme = ((agt.indexOf("win 9x 4.90")!=-1));
    this.win2k = ((agt.indexOf("windows nt 5.0")!=-1));

    this.os2   = ((agt.indexOf("os/2")!=-1) || 
                    (navigator.appVersion.indexOf("OS/2")!=-1) ||   
                    (agt.indexOf("ibm-webexplorer")!=-1));

    this.mac    = (agt.indexOf("mac")!=-1);
    // hack ie5 js version for mac
    if (this.mac && this.ie5up) this.js = 1.4;
    this.mac68k = (this.mac && ((agt.indexOf("68k")!=-1) || 
                               (agt.indexOf("68000")!=-1)));
    this.macppc = (this.mac && ((agt.indexOf("ppc")!=-1) || 
                                (agt.indexOf("powerpc")!=-1)));

    this.sun   = (agt.indexOf("sunos")!=-1);
    this.sun4  = (agt.indexOf("sunos 4")!=-1);
    this.sun5  = (agt.indexOf("sunos 5")!=-1);
    this.suni86= (this.sun && (agt.indexOf("i86")!=-1));
    this.irix  = (agt.indexOf("irix") !=-1);    // SGI
    this.irix5 = (agt.indexOf("irix 5") !=-1);
    this.irix6 = ((agt.indexOf("irix 6") !=-1) || (agt.indexOf("irix6") !=-1));
    this.hpux  = (agt.indexOf("hp-ux")!=-1);
    this.hpux9 = (this.hpux && (agt.indexOf("09.")!=-1));
    this.hpux10= (this.hpux && (agt.indexOf("10.")!=-1));
    this.aix   = (agt.indexOf("aix") !=-1);      // IBM
    this.aix1  = (agt.indexOf("aix 1") !=-1);    
    this.aix2  = (agt.indexOf("aix 2") !=-1);    
    this.aix3  = (agt.indexOf("aix 3") !=-1);    
    this.aix4  = (agt.indexOf("aix 4") !=-1);    
    this.linux = (agt.indexOf("inux")!=-1);
    this.sco   = (agt.indexOf("sco")!=-1) || (agt.indexOf("unix_sv")!=-1);
    this.unixware = (agt.indexOf("unix_system_v")!=-1); 
    this.mpras    = (agt.indexOf("ncr")!=-1); 
    this.reliant  = (agt.indexOf("reliantunix")!=-1);
    this.dec   = ((agt.indexOf("dec")!=-1) || (agt.indexOf("osf1")!=-1) || 
                  (agt.indexOf("dec_alpha")!=-1) || (agt.indexOf("alphaserver")!=-1) || 
                  (agt.indexOf("ultrix")!=-1) || (agt.indexOf("alphastation")!=-1)); 
    this.sinix = (agt.indexOf("sinix")!=-1);
    this.freebsd = (agt.indexOf("freebsd")!=-1);
    this.bsd = (agt.indexOf("bsd")!=-1);
    this.unix  = ((agt.indexOf("x11")!=-1) || this.sun || this.irix || this.hpux || 
                 this.sco ||this.unixware || this.mpras || this.reliant || 
                 this.dec || this.sinix || this.aix || this.linux || this.bsd || this.freebsd);

    this.vms   = ((agt.indexOf("vax")!=-1) || (agt.indexOf("openvms")!=-1));
}

// Code to initialise the 'is'-object so that it is available to all pages that
// include this library

var is;
var isIE3Mac = false;
// this section is designed specifically for IE3 for the Mac

if ((navigator.appVersion.indexOf("Mac")!=-1) && (navigator.userAgent.indexOf("MSIE")!=-1) && 
(parseInt(navigator.appVersion)==3))
       isIE3Mac = true;
else   is = new Is(); 

// -----------------------------------------------------------------
// - END OF OBJECT DEFINITION : Is
// -----------------------------------------------------------------



// -----------------------------------------------------------------
// - OBJECT			: Dictionary
// - Version		: 1.2
// - History		: 1.0	01/03/2001	Basic version
// -				  1.1	09/03/2001	Modified to use two arrays
// -									instead of a 2D-array (due
// -									to Internet Explorer 5
// -									problems)
// -				  1.2	14/03/2001  Added Clean(). This function
// -									takes care of 'undefined'
// -									problem when displaying
// -									contents of the dictionary
// -----------------------------------------------------------------
// - GENERAL DESCRIPTION
// -----------------------------------------------------------------
// - This object is a Collection object allowing you to store, 
// - modify, retrieve and delete key/value-pairs. In short, it's
// - like an array but instead of accessing it through an index,
// - you use the key to retrieve, modify or delete values.
// -----------------------------------------------------------------
// - FUNCTIONS AVAILABLE
// -----------------------------------------------------------------
// - Dictionary()				: constructor
// - getItem(strKey)			: returns the value of strKey. 
// -							  Returns -1 if key does not exist
// - Add(strkey, strValue)		: adds a key/value-pair. If key 
// -							  already exists -1 is returned
// - Exists(strKey)				: does strKey exist? Returns -1
// -							  if key/value-pair does not exist
// - Remove(strKey)				: removes key/value pair. Returns -1
// -						      if key does not exist
// - removeAll()				: clears dictionary
// - Keys()						: returns an array containing all 
// -							  keys in the dictionary
// - Update(strKey, strValue)	: replaces value of strKey with
// -							  strValue (the name of the key
// -							  cannot be changed : remove key
// -							  and add renamed key if you want
// -							  to change the name of the key)
// - Clean()					: creates new arrays with empty 
//								  indexes removed (see History 1.2)
// -----------------------------------------------------------------

function Dictionary() {
	this.arrKey = new Array();
	this.arrValue = new Array();
	this.index = 0;
};

Dictionary.prototype.getItem = function(strKey) {
	var pos = this.Exists(strKey);
	
	if (pos != -1) {
		return this.arrValue[pos];
	}
	else {
		return -1;
	}
};

Dictionary.prototype.Add = function(strKey, strValue) {
	if (this.Exists(strKey) == -1) {
		this.arrKey[this.index] = strKey;
		this.arrValue[this.index++] = strValue;
	}
	else {
		return -1;
	}
};

Dictionary.prototype.Exists = function(strKey) {
	for (i=0; i < this.index; i++) {
		if (strKey == this.arrKey[i]) {
			return i;
		}
	}
	return -1;
};

Dictionary.prototype.Remove = function(strKey) {
	var pos = this.Exists(strKey);
	
	if (pos != -1) {
		this.arrKey[pos] ="";
		this.arrValue[pos] = "";
		this.Clean();
	}
	else {
		return -1;
	}
};

Dictionary.prototype.Clean = function() {
	var tempKey = new Array();
    var tempVal = new Array();
    var intCount = 0;

    for (i=0; i < this.index - 1; i++) {
		if (this.arrKey != "") {
			tempKey[intCount] = this.arrKey[i];
            tempVal[intCount++] = this.arrValue[i];
		}
	}
    
    this.index = intCount;
    this.arrKey = tempKey;
    this.arrValue = tempVal;
};

Dictionary.prototype.removeAll = function() {
	this.arrKey = new Array();
	this.arrValue = new Array();
	this.index = 0;
	
};

Dictionary.prototype.Keys = function() {
	var arrKeys = new Array();
	var intCount = 0;
	
	for (i=0; i < this.index; i++) {
		if (this.arrKey[i] != "") {
			arrKeys[intCount] = this.arrKey[i];
			intCount++;
		}
	}
	return arrKeys;
};

Dictionary.prototype.Update = function(strKey, strValue) {
	var pos = this.Exists(strKey);
	
	if (pos != -1) {
		this.arrValue[pos] = strValue;
	}
	else {
		return -1;
	}
};

// -----------------------------------------------------------------
// - END OF OBJECT DEFINITION : Dictionary
// -----------------------------------------------------------------



// -----------------------------------------------------------------
// - OBJECT			: Locator
// - Version		: 1.0
// - History		: 1.0	14/03/2001	Basic version
// -				  1.1	30/03/2001	Added support for Gecko
// -									browsers + attempt to get
// -									Netscape 4 running (does
// -									not work yet)
// -				  1.2	30/03/2001	Made Locator object self-
// -									contained. However, this
// -									causes CSS-problems with
// -									IE 4. Need to investigate...
// -				  1.3	25/04/2001	added : refreshLocator()
// -----------------------------------------------------------------
// - GENERAL DESCRIPTION
// -----------------------------------------------------------------
// - This Object offers a Locator component. You can use this
// - component to offer surfers a 'You are here' element where they
// - can see how they have navigated around the site. They can also
// - click on any of the displayed items to return to that page in
// - the site
// -----------------------------------------------------------------
// - FUNCTIONS AVAILABLE
// -----------------------------------------------------------------

function Locator() {
	this.dictLocations = new Dictionary();
};

/*	-- Causes problems with IE4
function Locator(strDivClass, strTextClass) {
	this.dictLocations = new Dictionary();
	this.strTextClass = strTextClass;
	document.write('<DIV ID=nav CLASS=' + strDivClass + '>&nbsp;</DIV>');
};
*/

Locator.prototype.addToLocator = function(strLocation, strDescription) {
	var arrkeys = new Array();
		
	if (this.dictLocations.Exists(strDescription) == -1) {
		this.dictLocations.Add(strDescription, strLocation);
	}
	
	this.refreshLocator();
};

Locator.prototype.deleteFromLocator = function(strDescription) {
	if (strDescription == "*") {
		this.dictLocations.removeAll();
	}
	else {
		if (this.dictLocations.Exists(strDescription)) {
			this.dictLocations.Remove(strDescription);
		}
	}
	this.refreshLocator();
}; 

Locator.prototype.refreshLocator = function() {
	var navbar = "";
	
	arrKeys = this.dictLocations.Keys();
	
	for (i=0; i < arrKeys.length; i++) {
		// Causes problems with IE4			
		// if (!isIE3Mac && is.ie4) {
			navbar = navbar + " | <A HREF=" + this.dictLocations.getItem(arrKeys[i]) + " TARGET=content CLASS=StatBarLocatieTekst>" + arrKeys[i] + "</A>&nbsp;";
		// }
		// else if (!isIE3Mac && (is.ie5up || is.gecko)) {
		// 	navbar = navbar + " | <A HREF=" + this.dictLocations.getItem(arrKeys[i]) + " TARGET=content CLASS=" + this.strTextClass + ">" + arrKeys[i] + "</A>&nbsp;";
		// }
	}
	
	if (!isIE3Mac && is.gecko) {
		// statements for Gecko
		document.getElementById("nav").innerHTML = navbar;
	}
	else if (!isIE3Mac && is.ie4up) {
		nav.innerHTML = navbar;	
	}
};

function waitms(vMilliSeconds)
{
	var date;
	var Msec;
	var MsecFixed;
	date = new Date();
	MsecFixed = date.getMilliseconds();
	
	if (MsecFixed < (999 - vMilliSeconds))
	{
		while(Msec < (MsecFixed + vMilliSeconds))
		{
			date = new Date();
			Msec = date.getMilliseconds();
		}
	}
	else
	{
		while(Msec < (999 - MsecFixed + vMilliSeconds))
		{
			date = new Date();
			Msec = date.getMilliseconds();
		}
	}
};

function waits(vSeconds)
{
	var date;
	var Sec;
	var SecFixed;
	date = new Date();
	SecFixed = date.getSeconds();
	
	if (SecFixed < (59 - vSeconds))
	{
		while(Sec < (SecFixed + vSeconds))
		{
			date = new Date();
			Sec = date.getSeconds();
		}
	}
	else
	{
		while(Sec < (59 - SecFixed + vSeconds))
		{
			date = new Date();
			Sec = date.getSeconds();
		}
	}
};

function LTrim(str) 
{
    for (var i=0; str.charAt(i)==" "; i++);
    return str.substring(i,str.length);
};

function RTrim(str) {
	for (var i=str.length-1; str.charAt(i)==" "; i--);
    return str.substring(0,i+1);
};

function Trim(str) 
{
	return LTrim(RTrim(str));
};


function replace(string,text,by) {
// Replaces text with by in string
    var strLength = string.length;
    var txtLength = text.length;
    
    if ((strLength == 0) || (txtLength == 0)) return string;

    var i = string.indexOf(text);
    
    if ((!i) && (text != string.substring(0,txtLength))) return string;
    
    if (i == -1) return string;

    var newstr = string.substring(0,i) + by;

    if (i+txtLength < strLength)
        newstr += replace(string.substring(i+txtLength,strLength),text,by);

    return newstr;
};

