//<!--
// DYNAMIC LIST SCRIPT
// (c) Copyright by Ralf Isau 2004
// Version: 2.01.01 (24.06.2011)
// Last revised: 24.06.2011
// Note:	This script enables a document to dynamically expand and collaps element groups
//			depending on mouse moves or clicks. A rollover from top to bottom will open a group
//			a rollover from bottom to top will close it again. With "dlBindListImages" a set of
//			marker images (named by list item name with suffix "_i") can be linked with group
//			list items.
// Dependencies: The script 'browsercheck.js' has to be loaded before!

// Global definitions:
var objEventQueue = new Array();

// Check browser type:
var browser_with_bubble_up_events = new Boolean(false);
browser_with_bubble_up_events = ( (browser.isIE4up && browser.isWin) || browser.isSafari || browser.isIE4upMac) ? true : false; // Browser with bubble-up events
var browser_with_ie_event = new Boolean(false);
browser_with_ie_event = ( (browser.isIE4up && browser.isWin) || browser.isSafari || browser.isIE4upMac) ? true : false; // Browser with event object in IE style

// PUBLIC FUNCTIONS:
// BindListImages: Link images with (group) list items
// - arg1:	rudimentary file name without path and suffixes like "_n", "_h", "_s" and "_o"
// - arg2-n:	name or id of <IMG> tag
function dlBindListImages(strImgFileName)
{
	var i = 0;
	while(dlBindListImages.arguments.length >= ++i) {
		diLoad(dlBindListImages.arguments[i],strImgFileName);
	}
}

// ToggleVisibility: Switch id's visibility between hidden and visible
function dlToggleVisibility(strNameOrId, objEvent) {
	var id = GetObjectByIdOrName(strNameOrId);
	if (id) {
		switch (id.blnSticked) {
			case true:	if (id.strInitiatorTag == dlGetTargetId(id, objEvent)) {
							id.blnSticked=false;
							id.strInitiatorTag=null;
							id.strDisplayStatus = dlGetCSSDisplayStatus(id);
							dlCollapsNow(id);
							diSwitch(strNameOrId+"_i","n");
						}
						break;
			default:	id.blnSticked=true;
						id.strInitiatorTag=dlGetTargetId(id, objEvent);
						if (dlGetCSSDisplayStatus(id) == "none") {
							dlExpandNow(id,"");
						}
						diSwitch(strNameOrId+"_i","o");
						break;
		}
		if (browser_with_bubble_up_events) { objEvent.cancelBubble = true; }
	}
}

function dlExpandGroup(strNameOrId, objEvent) {
	var id = GetObjectByIdOrName(strNameOrId);
	var rc = new Boolean(true);
	diOn(strNameOrId+"_i");
	id.objActualEvent = objEvent;
	if (! id.blnSticked) {
		strEvent = (id.strDisplayStatus && id.strDisplayStatus != "none") ? id.strDisplayStatus : "";
		dlQueueEvent(id, strEvent);
	}
	else {
		window.status="Zum Zusammenklappen auf Gruppeneintrag klicken!";
		id.TimerID = window.setTimeout("window.status='';", 750);
 	}
	return rc;
}

function dlCollapsGroup(strNameOrId, objEvent) {
	var id = GetObjectByIdOrName(strNameOrId);
	var rc = new Boolean(true);
	diOff(id.id+"_i");
	id.objActualEvent = objEvent;
	if (! id.blnSticked) {
		dlQueueEvent(id, "none");
	}
	else {
		window.status="Zum Zusammenklappen auf Gruppeneintrag klicken!";
		id.TimerID = window.setTimeout("window.status='';", 750);
	}
	return rc;
}

// Get CSS display status of a named dynamic list object which is part of the actual document.
function dlGetCSSDisplayStatus(objId) {
	var objDisplay = GetObjectByIdOrName(objId);
	if ( browser.isWin && (browser.isIE55 || (browser.isIE6up && ! browser.isIE9up)) ) {
		return	objDisplay.style.display;
	}
	return objDisplay.style.getPropertyValue('display');
}

// Set CSS display status of a named dynamic list object which is part of another frame(set).
//	Arg. 1: Id of iframe or frameset. Current window if empty.
function dlSetCSSDisplayStatus(strFrameId, ElementId, strStatus) {
	var	objWin = (strFrameId) ? GetObjectByIdOrName(strFrameId).contentWindow : window;
	var objDisplay = (typeof ElementId == "string") ? objWin.document.getElementById(ElementId) : ElementId;
	if ( browser.isWin && (browser.isIE55 || (browser.isIE6up && ! browser.isIE9up)) ) {
		objDisplay.style.display = strStatus;
	}
	else {
		objDisplay.style.setProperty('display', strStatus, '');
	}
	return true;
}

// PRIVATE FUNCTIONS:
// dlGetTargetId: Try to generate a unique from object's tagName, name & id
function  dlGetTargetId(objActual, objEvent)
{
	var strId = "";
	if (typeof objEvent.target != "undefined") {
		strId = objEvent.srcElement.tagName + ((objEvent.target.id && typeof objEvent.target.id != "undefined") ? "_" + objEvent.target.id : "");
		if (browser.isIE) {
			strId = strId + ((objEvent.srcElement.name && typeof objEvent.srcElement.name != "undefined") ? "_" + objEvent.srcElement.name : "");
		}
		else if (browser.isNS || browser.isMozilla) {
			strId = strId + ((objEvent.target.name && typeof objEvent.target.name != "undefined") ? "_" + objEvent.target.name : "");
		}
		else  {
			strId = strId + ((objEvent.target.name && typeof objEvent.target.name != "undefined") ? "_" + objEvent.target.name : "");
		}
	}
	return(strId);
}

function dlQueueEvent(id, EventToQueue) {
	if (id.TimerID > 0) {
		window.clearTimeout(id.TimerID);
		id.TimerID = 0;
	}
	id.PendingStyleDisplay = EventToQueue;
	id.FromY = id.ToY;
	id.ToY = (browser_with_ie_event) ? event.clientY : id.objActualEvent.pageY;
	objEventQueue[id.id] = id;
	id.TimerID = window.setTimeout("dlExecuteQueuedEvent('"+id.id+"');", 750);
}

// dlExecuteQueuedEvent: Called by timer to execute a queued event
function dlExecuteQueuedEvent(ObjectID) {
	with(objEventQueue[ObjectID]) {
		window.clearTimeout(TimerID);
		TimerID = 0;
		if (PendingStyleDisplay == "none") {
			var ds = dlGetCSSDisplayStatus(ObjectID);
			strDisplayStatus = (ds && ds != "none") ? ds : "";
			// Collaps only when cursor moves from bottom to top
			if (ToY < FromY) { dlCollapsNow(objEventQueue[ObjectID]) }
			else { window.status="" }
		}
		else {
			dlExpandNow(objEventQueue[ObjectID], PendingStyleDisplay);
			FromY = (window.event) ? window.event.clientY : objActualEvent.pageY; // save mouse Y-coordinate
		}
	}
}

function dlExpandNow(id, EventToExecute) {
	dlSetCSSDisplayStatus('', id, EventToExecute);
	window.status="Zum Feststellen auf Gruppeneintrag klicken!";
	return true;
}

function dlCollapsNow(id) {
	dlSetCSSDisplayStatus('', id, "none");
	window.status="";
	return true;
}
//-->
