/**
 * @version			1.0.8 - 23 oktober 2011
 * 
 * @copyright		1.0.8,	23 oktober 2011,	Rob Ruigrok,			JSLint compatible
 * @copyright		1.0.7,	4 mei 2010,			Jan Niemantsverdriet,	Mogelijkheid om de minimale z-index op te geven  
 * @copyright		1.0.6,	9 april 2010,		Jan Niemantsverdriet,	Functie om 1 specifieke select weer te tonen  
 * @copyright		1.0.5,	2 februari 2010,	Jan Niemantsverdriet,	Meer variabelen gedeclareerd  
 * @copyright		1.0.4,	6 oktober 2008,		Jan Niemantsverdriet,	bRemoveLayer geeft altijd boolean terug, variabelen gedeclareerd  
 * @copyright		1.0.3,	24 september 2008,	Jan Niemantsverdriet,	IE loopt niet meer vast op bRemoveLayer 
 * @copyright		1.0.2,	4 juli 2008,		Jan Niemantsverdriet,	Selects in IE6 worden verborgen bij openen layer, sluiten layer door er naast te klikken gebeurt nu met bRemoveLayer
 * @copyright		1.0.1,	5 februari 2008,	Jan Niemantsverdriet,	Probleem met z-index opgelost
 * @copyright		1.0.1,	5 februari 2008,	Jan Niemantsverdriet,	Sluiten na onclick toegevoegd
 * @copyright		1.0.0,	?,					Jan Niemantsverdriet,	Gemaakt
 * 
 * @copyright		afhankelijkheid:	BB/Screen/layer.css
 * @copyright		afhankelijkheid:	BB/JSDivers/check.js
 */

/**
 * @var Array				alle openstaande lagen
 */
var aLayers = [];

/**
 * @var Array				alle verborgen selects
 */
var oLayersSelects = {};

/**
 * @var integer				een teller voor id's voor nieuwe layers
 */
var iNewLayerId = 0;


/**
 * Geeft de hoogte van de pagina
 * 
 * @return integer			de hoogte in pixels
 * @since 1.0.3 - 4 juli
 */
function iGetPageHeight() {
	"use strict";
	if (document.body.parentNode.scrollHeight > document.body.parentNode.clientHeight) {
		return document.body.parentNode.scrollHeight;
	} else {
		return document.body.parentNode.clientHeight;
	}
}

/**
 * Geeft het source object van een event
 * 
 * @param Event	a_oEvent		het event
 * @return DOM					het source object
 * @since 1.0.1 - 5 februari 2008
 */
function oGetEventSrc(a_oEvent) {
	"use strict";
	if (a_oEvent.srcElement) {
		return a_oEvent.srcElement;
	}
	return a_oEvent.target;
}

/**
 * Check of de browser binnen de criteria valt
 *
 * @param string a_sName			de naam van de browser
 * @param float	a_fMinVersion		de minimale versie (optioneel, null om niet te checken)
 * @param float a_fMaxVersion		de maximale versie (optioneel)
 * @return boolean					true als de browser, browser a_sName is en tussen of op versie a_fMinVersion en a_fMaxVersion zit
 * @since 1.0.3 - 4 juli
 */
function bCheckBrowser(a_sName, a_fMinVersion, a_fMaxVersion) {
	"use strict";
	var sBrowserName, fVersion, aMS;
	sBrowserName = navigator.appName;
	fVersion = parseFloat(navigator.appVersion);
	if (sBrowserName !== a_sName) {
		return false;
	}
	if (sBrowserName === "Microsoft Internet Explorer") {
		aMS = navigator.appVersion.split(/MSIE/);
		fVersion = parseFloat(aMS[1]);
	}
	if (bIsDefined(a_fMinVersion) && !!bIsNull(a_fMinVersion) && fVersion < a_fMinVersion) {
		return false;
	}
	if (bIsDefined(a_fMaxVersion) && fVersion > a_fMaxVersion) {
		return false;
	}
	return true;
}

/**
 * Toont alle selects die verborgen waren door het tonen van een layer
 *
 * @param string a_sId				het id van de layer
 * @since 1.0.2 - 4 juli 2008
 */
function vLayersShowSelects(a_sId) {
	"use strict";
	var aSelects, iCounter;
	aSelects = oLayersSelects[a_sId];
	for (iCounter = 0; iCounter < aSelects.length; iCounter += 1) {
		aSelects[iCounter].style.display = "inline";
	}
}

/**
 * Verbergt alle selects (vanwege problemen met IE)
 * 
 * @param string a_sId				het id van de layer waarvoor de selects verborgen moeten worden
 * @since 1.0.2 - 4 juli 2008
 */
function vLayersHideSelects(a_sId) {
	"use strict";
	var aSelects, aNewSelects, iCounter;
	aSelects = document.getElementsByTagName('select');
	aNewSelects = [];
	for (iCounter = 0; iCounter < aSelects.length; iCounter += 1) {
		if (aSelects[iCounter].tagName === "SELECT") {
			if (aSelects[iCounter].style.display !== "none") {
				aNewSelects.push(aSelects[iCounter]);
				//alert(aSelects[iCounter]);
				aSelects[iCounter].style.display = "none";
			}
		}
	}
	oLayersSelects[a_sId] = aNewSelects;
}


/**
 * Verwijderd een laag van het scherm
 * 
 * @param string|DIV uDiv				het div element, of de id ervan
 * @return boolean						true als er daadwerkelijk een laag verwijderd is
 */
function bRemoveLayer(uDiv) {
	"use strict";
	var oDiv, aTempLayers, iCounter;
	if (bIsString(uDiv)) {
		oDiv = document.getElementById(uDiv);
		if (bIsNull(oDiv)) {
			return false;
		}
	}
	if (bCheckBrowser("Microsoft Internet Explorer", null, "6.0")) {
		vLayersShowSelects(oDiv.id);
	}
	document.body.removeChild(oDiv);
	aTempLayers = [];
	for (iCounter = 0; iCounter < aLayers.length; iCounter += 1) {
		if (aLayers[iCounter] !== oDiv) {
			aTempLayers.push(aLayers[iCounter]);
		}
	}
	aLayers = aTempLayers;
}

/**
 * Voegt een nieuwe laag toe op het scherm
 * 
 * @param string a_sId						de id voor de laag
 * @param boolean|void a_bCloseOnClick		true = sluit als er op geklikt wordt (niet meegeven = false)
 * @param integer|void a_bCloseOnClick		wordt bij de z-index van de layer opgeteld
 * @return DIV								de div van de nieuwe laag
 */
function oAddLayer(a_sId, a_bCloseOnClick, a_iExtraZIndex) {
	"use strict";
	var sId, oDiv;
	if (!bIsDefined(a_bCloseOnClick)) {
		a_bCloseOnClick = false;
	}
	if (!bIsDefined(a_iExtraZIndex)) {
		a_iExtraZIndex = 0;
	}
	sId = (bIsDefined(a_sId) ? a_sId : "layer" + iNewLayerId);
	oDiv = document.createElement("div");
	oDiv.className = "layer";
	oDiv.style.zIndex = (aLayers.length) * 10 + 10001 + a_iExtraZIndex;
	oDiv.style.height = iGetPageHeight() + "px";
	oDiv.style.width = document.body.clientWidth + "px";
	oDiv.id = sId;
	if (a_bCloseOnClick) {
		oDiv.onclick = function (a_oEvent) {
			if (!bIsDefined(a_oEvent)) {
				a_oEvent = window.event;
			}
			if (oGetEventSrc(a_oEvent) === this) {
				bRemoveLayer(this.id);
			}
		};
	}
	if (bCheckBrowser("Microsoft Internet Explorer", null, "6.0")) {
		vLayersHideSelects(a_sId);
	}
	document.body.appendChild(oDiv);
	oDiv.style.top = 0;
	oDiv.style.left = 0;
	aLayers.push(oDiv);
	iNewLayerId += 1;
	return oDiv;
}

