/*
default.js
lastUpdate = "24 June 2008 14:59 UTC+1";
author: Andrew Urquhart (TMTI)
*/



/*
Function: getNode()
Description:
Returns:
History:
20060420 0930BST	v1		Andrew Urquhart		Created
*/
function getNode(strElementId) {
	var objElement = document.getElementById(strElementId);
	if (!objElement) {
		return null;
	};
	return objElement;
}


/*
Function: getEventSourceNode()
Description: Cross-browser means to grab hold of an event's target node
Returns:
History:
20060223 1723GMT	v1		Andrew Urquhart		Copied from http://www.quirksmode.org/js/events_properties.html
*/
function getEventSourceNode(e) {
	var targ = null;
	if (!e) {
		var e = window.event;
	}
	if (e.srcElement) {
		targ = e.srcElement;
	}
	else if (e.target) {
		targ = e.target;
	}
	if (targ.nodeType == 3) { // defeat Safari bug
		targ = targ.parentNode;
	}
	return targ;
}


/*
Function: getAncestorByNodeName()
Description: Returns the ancestor node of the context node (objCurrentNode) with the specified element name (strAncestorName)
Returns: Object (node / exception)
History:
20060426 1150BST	v1		Andrew Urquhart		Created
*/
function getAncestorByNodeName(objCurrentNode, strAncestorName) {
	if (!objCurrentNode || !objCurrentNode.nodeName) {
		return null;
	}
	if (!strAncestorName) {
		return null;
	}

	var objTargetNode			= null;
	var strAncestorNameUpper	= strAncestorName.toUpperCase();

	// Loop backwards up the DOM from our current node to the specified ancestory node (if it exists)
	while (objCurrentNode.parentNode) {
		if (objCurrentNode.nodeName.toUpperCase() == strAncestorNameUpper) {
			objTargetNode = objCurrentNode;
			break;
		}
		objCurrentNode = objCurrentNode.parentNode;
	}

	if (!objTargetNode) {
		return null;
	}

	return objTargetNode;
}


/*
Function: addEvent()
Description:
Returns:
History:
20060312 1615GMT	v1		Andrew Urquhart		Created
*/
function addEvent(objContext, strType, funcHandler) {
	if (objContext.addEventListener) {
		objContext.addEventListener(strType, funcHandler, false);
	}
	else if (objContext.attachEvent) {
		objContext.attachEvent("on" + strType, funcHandler);
	}
	else {
		objContext["on" + strType] = funcHandler;
	}
}


/*
Function: setImageGroup()
Description:
Returns:
History:
20061103 1102BST	v1		Andrew Urquhart		Created
*/
function setImageGroup(strGroupId) {
	if (strGroupId) {
		var objGroup = getNode(strGroupId);
		if (objGroup && objGroup.style) {
			objGroup.style.visibility = 'visible';
		};

		if (window.pairx_previousGroup && strGroupId != window.pairx_previousGroup) {
			var objPreviousGroup = getNode(window.pairx_previousGroup);

			if (objPreviousGroup && objPreviousGroup.style) {
				objPreviousGroup.style.visibility = 'hidden';
			}
		};

		if (objGroup && objGroup.style) {
			window.pairx_previousGroup = strGroupId;
		};
	}
}


/*
Function: doIEAlphaPNGFix()
Description: Correctly handle PNG transparency in Win IE 5.5 and Win IE6. NB: Only invoke from a browser aware context since no browser filtering done here.
Returns: n/a
History:
20061127 1415BST	v1		Andrew Urquhart		Created
*/
function doIEAlphaPNGFix() {
	// Fix transparent instruction icons etc
	var objContainer = document.getElementById("device");
	if (objContainer) {
		var arrDiv	= objContainer.getElementsByTagName("div");

		if (arrDiv) {
			for(var i=0, j=arrDiv.length; i<j; i++) {
				var objDiv = arrDiv[i];
				if (objDiv && objDiv.style && objDiv.style.backgroundImage) {
					var strCurrentImage = objDiv.style.backgroundImage.substring(4, objDiv.style.backgroundImage.length - 1);

					if (strCurrentImage.toLowerCase().lastIndexOf("png") === strCurrentImage.length - 3) {
						objDiv.style.backgroundImage = "none";
						objDiv.style.filter	= "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + strCurrentImage + "', sizingMethod='scale');";
					}
				}
			}
		}
	}

	// Fix transparent furniture
	var objContainer = (document.getElementsByTagName("body") ? document.getElementsByTagName("body")[0] : null);
	if (objContainer) {
		var arrImg	= objContainer.getElementsByTagName("img");

		if (arrImg) {
			for(var i=0, j=arrImg.length; i<j; i++) {
				var objImg = arrImg[i];
				if (objImg && objImg.src) {
					var strCurrentImage = objImg.src;

					if (strCurrentImage.toLowerCase().lastIndexOf("png") === strCurrentImage.length - 3) {
						objImg.style.backgroundColor = "transparent";
						objImg.style.backgroundImage = "none";
						objImg.style.filter	= "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + strCurrentImage + "', sizingMethod='scale');";
						objImg.src = "/assets/transparent.gif";
					}
				}
			}
		}
	}
}


/*
Function: doBlinkImages()
Description: Initialise the flashing of the images in pairing instruction steps
Returns: n/a
History:
20061128 1144BST	v1		Andrew Urquhart		Created
20070713 0949BST	v1.1	Andrew Urquhart		Modified for PairX 3.0 to blink any Image.type with variable blink rates
*/
function doBlinkImages() {
	if (document.getElementById && document.getElementsByTagName) {
		var objContainer = document.getElementById("device");

		if (objContainer) {
			var arrDiv	= objContainer.getElementsByTagName("div");

			if (arrDiv) {
				window.pairxBlinkImages = []; // [id] = Boolean (blink state)

				for(var i=0, j=arrDiv.length; i<j; i++) {
					var objDiv = arrDiv[i];
					if (objDiv && objDiv.id && objDiv.className.indexOf("blink") == 0) { // Note: We assume only 1 class per objDiv
						switch (objDiv.className.toLowerCase()) {
							case "blink5"	: var intBlinkInterval = 250; break;
							case "blink10"	: var intBlinkInterval = 500; break;
							case "blink20"	: var intBlinkInterval = 1000; break;
							case "blink60"	: var intBlinkInterval = 3000; break;
							default : return; // Fail silently
						}

						window.pairxBlinkImages[objDiv.id] = true;
						window.setTimeout("doBlink(\"" + objDiv.id + "\", " + intBlinkInterval + ")", intBlinkInterval);
					}
				}
			}
		}
	}
}


/*
Function: doBlink()
Description:
Returns:
History:
20061128 1150BST	v1		Andrew Urquhart		Created
*/
function doBlink(strNodeId, intBlinkInterval) {
	var objNode = getNode(strNodeId);
	if (objNode) {
		var blnImageOn = window.pairxBlinkImages[strNodeId];

		objNode.style.display = (blnImageOn ? "none" : "block");
		window.pairxBlinkImages[strNodeId] = !blnImageOn;
		window.setTimeout("doBlink(\"" + strNodeId + "\", " + intBlinkInterval + ")", intBlinkInterval);
	}
}


/*
Function: setInstructionHover()
Description: Hover effect for instruction list items without hover-off action
Returns: n/a
History:
20070206 1036GMT	v1		Andrew Urquhart		Created
*/
function setInstructionHover(event) {
	var objNode = getEventSourceNode(event);

	// First unset any other selected steps' styling - purposely doing this rather than using a mouseout
	var objLis = getNode("instructions").getElementsByTagName("li");
	for (var i=0, j=objLis.length; i<j; ++i) {
		objLis[i].className = "";
	}

	if (objNode) {
		if (objNode.nodeName.toUpperCase() != "LI") {
			objNode = getAncestorByNodeName(objNode, "LI");
		}

		if (objNode) {
			// Set the selected list item's styling
			objNode.className = "activestep";
			var strGroupId = objNode.id;
			setImageGroup("group_" + strGroupId.substring(1, strGroupId.length));
		}
	}
	return true;
}


/*
Function: initialise()
Description:
Returns: n/a
History:
20070203 2234GMT	v1		Andrew Urquhart		Created
*/
function initialise() {
	doBlinkImages();

	if (getNode("instructions")) {
		// Perma-hover on instruction steps - used in preference to CSS :hover as don't want the style to unset after hover-out
		var objLis = getNode("instructions").getElementsByTagName("li");
		for (var i=0, j=objLis.length; i<j; ++i) {
			var objLi = objLis[i];

			addEvent(objLi, "mouseover", setInstructionHover);
		}
		objLis = null;


		// Attempt to make all instruction links open in a new window
		var strDomain = self.location.hostname.toUpperCase();
		if (strDomain) {
			var objAs = getNode("instructions").getElementsByTagName("a");
			for (var i=0, j=objAs.length; i<j; ++i) {
				var objA = objAs[i];

				// Only apply to external links
				if (objA.getAttribute("href") && objA.getAttribute("href").toUpperCase().indexOf(strDomain) === -1) {
					objA.setAttribute("target", "_blank");
				}
			}
			objAs = null;
		}
	}
}




addEvent(window, "load", initialise);

var strUA = navigator.userAgent;
if (strUA.indexOf("MSIE 5.5") > 0 || strUA.indexOf("MSIE 6.0") > 0) {
	window.attachEvent("onload", doIEAlphaPNGFix); // Alpha PNG fix for IE5.5 and IE6.0. No fix for IE5.0
}

