/*
	Orange Automated Image Caching Script
	This script caches all cacheable images automatically upon page load

	Written by:
		Stephen Brown, SDB, stephen.brown@akqa.com
		AKQA
		February 2003

	Optimised:
		Stephen Brown, SDB, stephen.brown@akqa.com
		AKQA
		February 2005
*/

var hImages = new Array; /* Hash Image library */
/**
 *		hasChildImage returns true if a child exists in child Node 0
 *		getChildImage returns that child Node
 */
 function hasChildImage(anyObject) {
	if (document.getElementById) {
		if (anyObject.childNodes[0] && anyObject.childNodes[0].src) {
			return true;
		}
	} else if (document.all) {
		if (anyObject.children[0] && anyObject.children[0].src) {
			return true;
		}
	}
	return false;
}
function getChildImage(anyObject) {
	if (document.getElementById) {
		return anyObject.childNodes[0];
	} else if (document.all) {
		return anyObject.children[0];
	}
	return false;
}
oraImageCache = function () {
	var debug = false;
	this.debug = debug;

	var popupDefaultWidth = 800;
	var popupDefaultHeight = 600;
	this.popupDefaultWidth = popupDefaultWidth;
	this.popupDefaultHeight = popupDefaultHeight;
	var popupSettings = 'left=100,top=100,resizable=0,scrollbars=yes';
	this.popupSettings = popupSettings;

	this.getDefaultWidth = function() {
		return this.popupDefaultWidth;
	}
	this.getDefaultHeight = function() {
		return this.popupDefaultHeight;
	}

	function setDefaultPopupDimensions(width, height) {
		this.setDefaultWidth(width);
		this.setDefaultHeight(height);
	}
	this.setDefaultPopupDimensions = setDefaultPopupDimensions;

	function setPopupSettings(newSettings) {
		this.popupSettings = newSettings;
	}
	this.setPopupSettings = setPopupSettings;

	function getPopupSettings() {
		return this.popupSettings;
	}
	this.getPopupSettings = getPopupSettings;

	function setDefaultWidth(value) {
		this.popupDefaultWidth = value;
	}
	this.setDefaultWidth = setDefaultWidth;

	function setDefaultHeight(value) {
		this.popupDefaultHeight = value;
	}
	this.setDefaultHeight = setDefaultHeight;

	/* Adds the current image URL to the HASH */
	this.addToHash = function (parseName, addOverState) {
		parseName = this.convertName(parseName, addOverState);

		if (hImages[parseName] != null) {
			/* This HASH Image already Exists - Skipping */
		} else {
			hImages[parseName] = new Image(1,1);
			hImages[parseName].src = parseName;
		}
	}

	/* Retrieves from the HASH the image URL */
	this.getFromHash = function (parseName, addOverState) {
		var removeOverState = !addOverState;
		var outputSrc;

		parseName = this.convertName(parseName, addOverState, removeOverState);
		if (hImages[parseName] && typeof hImages[parseName].src != "undefined") {
			outputSrc = hImages[parseName].src;
			return (addOverState) ? outputSrc.replace(/_over/,'-over') : outputSrc;
		}
		return parseName;
	}

	/* Converts the image name, and returns (with Over State when necessary */
	function convertName (parseName, addOverState, removeOverState) {
		var ext = (parseName.indexOf(".gif") != -1) ? "gif" : (parseName.indexOf("jpg") != -1) ? "jpg" : -1;
		if (ext != -1) {
			// if ext = -1, then the extension file type is not supported
			if (addOverState && (parseName.indexOf('-over.'+ext) < 0)) { parseName = parseName.replace('.'+ext,'-over.'+ext); }
			if (removeOverState) { parseName = parseName.replace('-over.'+ext,'.'+ext); }
		}
		return parseName;
	}
	this.convertName = convertName;

	/* Searches through the pages Anchors object to find ALL images, and set their rollover states */
	this.searchAnchors = function (skipTracking) {
		/**
		 * Amends the HREF of all TARGET="_blank" links
		 * Amends the HREF of all TARGET="_opener" links
		 * Amends the HREF of all TARGET="_fullwindow" links
		 */
		var allAnchors =
			(document.getElementsByTagName) ? document.getElementsByTagName("A") :
			(document.all) ? document.all.tags["A"] : null;

		if (allAnchors != null) {
			for (var anchor=0; anchor<allAnchors.length; anchor++) {

				var anchorObj = allAnchors[anchor];
				var anchorTarget = anchorObj.target.toString().toLowerCase();
				var anchorHref = anchorObj.href.toString();

				var aOnClick = this.getOnClick(anchorObj);
				var sOnClick = (aOnClick[1] != null) ? aOnClick[1] : null;
				var addReturn = false;

				if (anchorTarget == '_blank') {
					var popupStr = "genericPopup(this.href, oIC.getDefaultWidth(), oIC.getDefaultHeight(), oIC.getPopupSettings());\n";
					sOnClick = (sOnClick != null) ? sOnClick + popupStr : popupStr;
					if (this.debug && sOnClick != null) { alert("'anchorTarget' BLANK:\n\n[\n"+sOnClick+"]"); }
					addReturn = true;
				} else if (anchorTarget == '_opener') {
					var openerStr = "window.opener.location.href = this.href;\n";
					sOnClick = (sOnClick != null) ? sOnClick + openerStr : openerStr;
					if (this.debug && sOnClick != null) { alert("'anchorTarget' OPENER:\n\n[\n"+sOnClick+"]"); }
					addReturn = true;
				} else if (anchorTarget == '_fullwindow') {
					var paramsStr = 'left=1,top=1,resizable=1,scrollbars=1,toolbar=1,location=1,menubar=1,location=1,status=1';
					var fullWindowStr = "genericPopup(this.href, screen.width, screen.height, '"+paramsStr+"');\n";
					sOnClick = (sOnClick != null) ? sOnClick + fullWindowStr : fullWindowStr;
					if (this.debug && sOnClick != null) { alert("'anchorTarget' FULLWINDOW:\n\n[\n"+sOnClick+"]"); }
					addReturn = true;
				}
				if (sOnClick != null && sOnClick.indexOf("return false;") == -1) {
					if (anchorHref == location.href + '#') {
						addReturn = true;
					}
					if (addReturn) {
						if (sOnClick != null) {
							sOnClick+= "return false;\n";
						} else {
							sOnClick = "return false;\n";
						}
					}
					if (this.debug && sOnClick != null) { alert("'anchorHref' return false:\n\n[\n"+sOnClick+"]"); }
				}

				// Set new OnClick
				if (sOnClick != null) {
					if (this.debug) { alert(anchorObj.outerHTML+"\n\n[\n"+sOnClick+"]"); }
					anchorObj.onclick = new Function(sOnClick);
				}
			}
		}

		/* Loop through all Links tags, and adds the Anchors with Image found to the LinksWithImages Array object */
		var LinksWithImages = (document.getElementById) ? this.getAIMGs_DOM(skipTracking) :
			(document.all) ? this.getAIMGs_IE(skipTracking) : new Array;

		/* Loop through all INPUT tags, and adds TYPE="image" OR TYPE="submit" to InputTypeImage Array object */
		var InputTypeImages = (document.getElementById) ? this.getIIMGs_DOM(skipTracking) :
			(document.all) ? this.getIIMGs_IE(skipTracking) : new Array;

		/* Loop through all INPUT tags, and adds TYPE="text" to InputTypeText Array object */
		var InputTypeText = (document.getElementById) ? this.getIText_DOM(skipTracking) :
			(document.all) ? this.getIText_IE(skipTracking) : new Array;


		/* Loops through all Links with Images, and adds the MouseOver and MouseOut events */
		var imageChildNums;
		for (var eachL=0; eachL<LinksWithImages.length; eachL++) {
			this.addRolloverTo (LinksWithImages[eachL]);
		}

		/* Loops through all Input with type Image, and adds the MouseOver and MouseOut events */
		for (var eachI=0; eachI<InputTypeImages.length; eachI++) {
			this.addRolloverTo (InputTypeImages[eachI]);
		}

		/* Loops through all Input with type Text, and adds the Focus event */
		for (var eachI=0; eachI<InputTypeText.length; eachI++) {
			InputTypeText[eachI].onfocus = oFocus;
			InputTypeText[eachI].onblur = oBlur;
		}
	}

	this.getAIMGs_IE = function(skipTracking) {
		var anchorImages = this.getChildren(this.getType(document.all.tags["A"], true, null, "norollover", false));
		//this.getType(anchorImages, skipTracking, null, null, true); // DO NOT TRACK IMAGES THAT ARE IN ANCHORS SEPARATELY
		return anchorImages;
	}
	this.getIIMGs_IE = function(skipTracking) {
		return this.getType(document.all.tags["INPUT"], true, "image|submit", "norollover", true);
	}
	this.getIText_IE = function(skipTracking) {
		return this.getType(document.all.tags["INPUT"], true, "text", null, true, "handsetIds");
	}

	this.getAIMGs_DOM = function(skipTracking) {
		var anchorImages = this.getChildren(this.getType(document.getElementsByTagName("A"), true, null, "norollover", false));
		//this.getType(anchorImages, skipTracking, null, null, true); // DO NOT TRACK IMAGES THAT ARE IN ANCHORS SEPARATELY
		return anchorImages;
	}
	this.getIIMGs_DOM = function(skipTracking) {
		return this.getType(document.getElementsByTagName("INPUT"), true, "image|submit", "norollover", true);
	}
	this.getIText_DOM = function(skipTracking) {
		return this.getType(document.getElementsByTagName("INPUT"), true, "text", null, true, "handsetIds");
	}

	/* Searches through given tags for particular items based on CLASS="" and TYPE="" parameter values */
	this.getType = function(allTags, SKIP_TRACKING, SEARCH_PARAMS, SEARCH_CLASSES, ADD_TO_HASH, SEARCH_ID) {
		var SKIP_TRACKING = true;
		var linksArr = new Array;
		var bFound;
		for (var i=0; i<allTags.length; i++) {
			var tag = allTags[i];
			bFound = false;
			if (SEARCH_PARAMS == null || this.isInStr(tag.type, SEARCH_PARAMS)) {
				if (SEARCH_CLASSES == null || !this.isInStr(tag.className, SEARCH_CLASSES)) {
					if (ADD_TO_HASH) {
						this.addToHash(tag.src);
						this.addToHash(tag.src, true);
					}
					bFound = true;
				}
			}
			if (SEARCH_ID != null) {
				bFound = this.isInStr(tag.name, SEARCH_ID);
			}

			if (bFound) linksArr[linksArr.length] = tag;
			if (!SKIP_TRACKING) {
				this.addTrackingTo(tag);
				if (tag.className.toString().indexOf("uniqueClick") != -1) {
					this.addUniqueTrackingTo(tag);
				}
			}
		}
		return linksArr;
	}

	/* Matches a string to an array of strings */
	this.isInStr = function(strValue, searchParams) {
		var myArr = searchParams.split('|');
		for (var i=0; i<myArr.length; i++) {
			if (strValue.indexOf(myArr[i]) != -1) return true;
		}
		return false;
	}

	/* Places all parsed arrays children into returning array */
	this.getChildren = function(arr) {
		var retarr = new Array;
		for (var i=0; i<arr.length; i++) {
			var item = arr[i];
			for (var c=0; c<item.childNodes.length; c++) {
				var childNode = item.childNodes[c];
				if (childNode.src != null) {
					retarr[retarr.length] = childNode;
				}
			}
		}
		return retarr;
	}

	/* Adds rollover to parsed Anchor */
	function addRolloverTo(oActiveElement) {
		if (oActiveElement != null) {
			oActiveElement.onmouseover = function() { eval('oMouseOver(this);') }
			oActiveElement.onmouseout = function() { eval('oMouseOut(this);') }
		}
	}
	this.addRolloverTo = addRolloverTo;

	/* Removes rollover from parsed Anchor */
	function removeRolloverFrom(oActiveElement) {
		if (oActiveElement != null) {
			oActiveElement.onmouseover = function() {}
			oActiveElement.onmouseout = function() {}
		}
	}
	this.removeRolloverFrom = removeRolloverFrom;

	/* Checking for Previous OnClick Statements */
	function getOnClick(anyObject) {
		var retval = new Array();
		retval[0] = false;
		retval[1] = null;

		if (anyObject.onclick != '' && anyObject.onclick != null) {
			var functionlines = anyObject.onclick.toString().split('\n');
			var functiontext = '';
			for (var i=1; i<functionlines.length-1; i++) {
				var line = functionlines[i];
				if (line.indexOf("{") == -1 && line.indexOf("}") == -1) {
					if (line.indexOf("return") != -1) {
						retval[0] = (line.indexOf("false") != -1) ? 'false' : (line.indexOf("true") != -1) ? 'true' : retval[0];
					} else {
						functiontext += line + '\n';
					}
				}
			}
			retval[1] = functiontext;
		}
		return retval;
	}
	this.getOnClick = getOnClick;

	/* Checking for INPUT VALUE, IMG ALT or ANCHOR TEXT */
	function getLinkText(anyObject) {
		var retval = false;
		if (anyObject != null) {
			if (anyObject.innerText && anyObject.innerText != '') {
				retval = escape(unescape(anyObject.innerText));
			} else if (hasChildImage(anyObject)) {
				retval = escape(unescape(getChildImage(anyObject).alt));
			} else if (anyObject.type == 'image') {
				retval = escape(unescape(anyObject.alt));
			} else if (anyObject.type == 'submit') {
				retval = escape(unescape(anyObject.value));
			} else if (anyObject.innerHTML && anyObject.innerHTML != '') {
				retval = escape(unescape(anyObject.innerHTML));
			}
		}
		return retval;
	}
	this.getLinkText = getLinkText;

	/* Checking for FORM Action or Anchor HREF */
	function getLinkURL(anyObject) {
		var retval = false;
		if (anyObject != null) {
			if (anyObject.href && anyObject.href != '') {
				retval = anyObject.href;
			} else if (anyObject.type == 'image' || anyObject.type == 'submit') {
				retval = anyObject.form.action;
			}
		}
		return retval;
	}
	this.getLinkURL = getLinkURL;

	/* Tracking Functionality: Standard Tracking Clicks */
	function addTrackingTo(anyObject) {
		var arr = this.getOnClick(anyObject);

		var sLinkText = this.getLinkText(anyObject);
		var sLinkURL = this.getLinkURL(anyObject);

		var sOnClick = (arr[1] != null) ? arr[1] : '';
		sOnClick += 'aaBuildClicker(this, "'+sLinkText+'", "'+sLinkURL+'");\n';
		if (arr[0] != '') {
			sOnClick = sOnClick + "\nreturn "+arr[0]+";\n";
		}
		if (sOnClick != null) {
			anyObject.onclick = new Function(sOnClick);
		}
	}
	this.addTrackingTo = addTrackingTo;

	/* Tracking Functionality: Unique Tracking Clicks */
	function addUniqueTrackingTo(anyObject) {
		var arr = this.getOnClick(anyObject);

		var sLinkText = this.getLinkText(anyObject);
		var sLinkURL = this.getLinkURL(anyObject);

		var sOnClick = (arr[1] != null) ? arr[1] : '';
		sOnClick += 'aaUniqueClicker(this, "'+sLinkText+'", "'+sLinkURL+'");\n';
		if (arr[0] != '') {
			sOnClick = sOnClick + "\nreturn "+arr[0]+";\n";
		}
		if (sOnClick != null) {
			anyObject.onclick = new Function(sOnClick);
		}
	}
	this.addUniqueTrackingTo = addUniqueTrackingTo;

	return this;
}
var oIC = new oraImageCache();

/* Mouse Rollover function (Using Object Parse, instead of name) */
function oMouseOver(childobject) {
	if(childobject) {
		/* Support for Missing ALT or VALUE */
		if (childobject.alt && childobject.alt != '') {
			setTimeout('javascript:window.status="'+childobject.alt+'";',1);
		} else if (childobject.value && childobject.value != '') {
			setTimeout('javascript:window.status="'+childobject.value+'";',1);
		} else {
			/* Blank Status */
			setTimeout('javascript:window.status="";',1);
		}
		childobject.src = oIC.getFromHash(childobject.src, true);
	}
}

/* Mouse Rollout function (Using Object Parse, instead of name) */
function oMouseOut(childobject) {
	if(childobject) {
		setTimeout("javascript:window.status='';",1);
		childobject.src = oIC.getFromHash(childobject.src);
	}
}

/* Input Focus function (attached to object; uses "this") */
var lastFocus = null;
function oFocus() {
	lastFocus = this;
	if(this.value == 0) {
		this.value = '';
	}
}

/* Input Blur function (attached to object; uses "this") */
function oBlur() {
	if(this.value == '' && this == lastFocus) {
		this.value = 0;
	}
}

ora_doc_onload = function() {
	oIC.searchAnchors();
}

if (location.search != null && location.search.indexOf("debug=true") != -1) {
		oIC.debug = true;
		alert("Image Caching Debug Enabled");
}