// This file must be included after dom.js
var aTimedPopup = new Array();

function TimedPopup(caller, target, x, y, callerRollOverTime, callerCrossOverTime, callerClickCrossOverTime, targetRollOutTime, targetDisplayTime) {
	// ** Setup the target object
	this.target = xGetElementById(target);
	this.target.CallerID = caller;
	this.target.TargetID = target;
	this.target.TargetShowing = false;
	
	xTop(this.target, y);
	xLeft(this.target, x);
	
	// Target clocks
	this.target.TargetDisplayClock = null;
	this.target.TargetDisplayTime = (targetDisplayTime == null) ? 3000 : targetDisplayTime;
	this.target.TargetRollOutClock = null;
	this.target.TargetRollOutTime = (targetRollOutTime == null) ? 300 : targetRollOutTime;
	
	// Target Event Handlers
	this.target.TargetMouseOut = function(e) {
		var target = (e.target) ? e.target : e.srcElement;
		while (target != null && target.TargetID == null) {
			target = (target.parentNode) ? target.parentNode : target.parentElement;
		}
		if (target == null) return;
		
		if (target.TargetShowing) {
			clearInterval(target.TargetRollOutClock);
			target.TargetRollOutClock = setInterval("HideTarget('" +target.TargetID+ "', '" +target.CallerID+ "')", target.TargetRollOutTime);
		}
	}
	xAddEventListener(this.target, "MouseOut", this.target.TargetMouseOut, true);

	this.target.TargetMouseMove = function(e) {
		var target = (e.target) ? e.target : e.srcElement;
		while (target != null && target.TargetID == null) {
			target = (target.parentNode) ? target.parentNode : target.parentElement;
		}
		if (target == null) return;
		
		if (target.TargetShowing) {
			var parent = FindTarget(target.TargetID, target.CallerID);
			clearInterval(parent.caller.CallerCrossOverClock);
			clearInterval(target.TargetRollOutClock);
			clearInterval(target.TargetDisplayClock);
			
			target.TargetDisplayClock = setInterval("HideTarget('" +target.TargetID+ "', '" +target.CallerID+ "')", target.TargetDisplayTime);
		}
	}
	xAddEventListener(this.target, "MouseMove", this.target.TargetMouseMove, true);
	
	
	// ** Setup the caller object
	this.caller = xGetElementById(caller);
	this.caller.TargetID = target;
	this.caller.CallerID = caller;
	
	// Caller clocks
	this.caller.CallerRollOverClock = null;
	this.caller.CallerRollOverTime = (callerRollOverTime == null) ? 500 : callerRollOverTime;
	this.caller.CallerCrossOverClock = null;
	this.caller.CallerCrossOverTime = (callerCrossOverTime == null) ? 750 : callerCrossOverTime;
	this.caller.CallerClickCrossOverTime = (callerClickCrossOverTime == null) ? 1000 : callerClickCrossOverTime;

	// Caller Event Handlers
	this.caller.CallerMouseOver = function(e) {
		var caller = (e.target) ? e.target : e.srcElement;
		while (caller != null && caller.TargetID == null) {
			caller = (caller.parentNode) ? caller.parentNode : caller.parentElement;
		}

		var parent = FindTarget(caller.TargetID, caller.CallerID);
		
		if (!parent.target.TargetShowing) {
			clearInterval(caller.CallerRollOverClock);
			caller.CallerRollOverClock = setInterval("ShowTarget('" +caller.TargetID+ "', '" +caller.CallerID+ "')", caller.CallerRollOverTime);

			clearInterval(parent.target.TargetDisplayClock);
			parent.target.TargetDisplayClock = setInterval("HideTarget('" +parent.target.TargetID+ "', '" +parent.target.CallerID+ "')", (parent.target.TargetDisplayTime + caller.CallerRollOverTime));
		}
	}
	xAddEventListener(this.caller, "MouseOver", this.caller.CallerMouseOver, true);
	
	this.caller.CallerMouseOut = function(e) {
		var caller = (e.target) ? e.target : e.srcElement;
		while (caller != null && caller.TargetID == null) {
			caller = (caller.parentNode) ? caller.parentNode : caller.parentElement;
		}
		
		clearInterval(caller.CallerCrossOverClock);
		caller.CallerCrossOverClock = setInterval("HideTarget('" +caller.TargetID+ "', '" +caller.CallerID+ "')", caller.CallerCrossOverTime);
	}
	xAddEventListener(this.caller, "MouseOut", this.caller.CallerMouseOut, true);
	
	this.caller.CallerClick = function(e) {
		var caller = (e.target) ? e.target : e.srcElement;
		while (caller != null && caller.TargetID == null) {
			caller = (caller.parentNode) ? caller.parentNode : caller.parentElement;
		}
		
		ShowTarget(caller.TargetID, caller.CallerID);

		clearInterval(caller.CallerCrossOverClock);
		caller.CallerCrossOverClock = setInterval("HideTarget('" +caller.TargetID+ "', '" +caller.CallerID+ "')", caller.CallerClickCrossOverTime);
	}
	xAddEventListener(this.caller, "Click", this.caller.CallerClick, true);
	
	aTimedPopup.push(this);
}


function ShowTarget(targetID, callerID) {
	var parent = FindTarget(targetID, callerID);
	if (parent == null) return;
	
	xDisplay(parent.target, "block");
	xVisibility(parent.target, true);
	
	parent.target.TargetShowing = true;

	clearInterval(parent.target.TargetRollOutClock);
	clearInterval(parent.caller.CallerRollOverClock);
}

function HideTarget(targetID, callerID) {
	var parent = FindTarget(targetID, callerID);
	if (parent == null) return;
	
	xDisplay(parent.target, "none");
	xVisibility(parent.target, false);

	parent.target.TargetShowing = false;
	
	clearInterval(parent.target.TargetRollOutClock);
	clearInterval(parent.target.TargetDisplayClock);
	clearInterval(parent.caller.CallerRollOverClock);
	clearInterval(parent.caller.CallerCrossOverClock);
}

function FindTarget(targetID, callerID) {
	for(t in aTimedPopup) {
		if (aTimedPopup[t].target.TargetID.toLowerCase() == targetID.toLowerCase() &&
			aTimedPopup[t].caller.CallerID.toLowerCase() == callerID.toLowerCase()
		)
			return aTimedPopup[t];
	}
	return null;
}

