
//======================================================
//Support Presentation JavaScript
//Copyright (c) 2007 Daniel Phillimore - Roger Clark Motorsport
//Permission denied for this code to be copied or
//... => reproduced in any way
//======================================================

//=================================
//Global settings/params

var objCurrentSubmenu = null;

//*************************************************************
//faded image swap configuration

var boolUseRandomBannerShuffle = false;

//define images for faded shuffle
var arrBannerImages = [
			
			"DSC_1092[600x240].jpg"
			,
			"ta24[600x240].jpg"
			,
			"TOTB_2007_0106[600x240].jpg"
			,
			"DSC_1031[600x240].jpg"
			,
			"DSC_1099[600x240].JPG"
			,
			"DSC_1031_top[600x240].jpg"
			,
			"DSC_1031_front[600x240].jpg"
			,
			"ta26[600x240].jpg"
			,
			"rogerandkids[600x240].jpg"
			,
			"cyprus[600x240].jpg"
			,
			"DSC_0191[600x240].jpg"
			,
			"DSC_0167[600x240].jpg"
			,
			"DSC_0139[600x240].jpg"
			,
			"DSC_0124[600x240].jpg"
			,
			"DSC_0064[600x240].jpg"
			,
			"DSC_0025[600x240].jpg"
			,
			"DSC_0023[600x240].jpg"
			,
			"100_0889[600x240].jpg"
			,
			"ASI07 002[600x240].jpg"
			,
			"KIF_2032[600x240].jpg"
			
			];
			
//time (milliseconds) between swaps
var intBannerImageSwapInterval = 1500;
//amount to shift opacity on each interval elapse
var intBannerImageSwapOpacityShift = 10;
//time (milliseconds) between each interval elapse
var intBannerImageSwapOpacityShiftInterval = 120;

//*************************************************************

//calculate maximum image index available for banner
var intMaxBannerImageIndex = arrBannerImages.length - 1;

//object references to banner image swap elements
var objBannerImage1 = null, objBannerImage2 = null;

//stores index of banner images in current swap in above array
var intCurrentBannerTransition_OldIndex = 0;
var intCurrentBannerTransition_NewIndex = 0;
//current opacity of new image fading in
var intCurrentBannerTransition_Position = 0;

var objCurrentBanner_FreeImageContainer = null;

//====================================
//scrolling entrance image mask

var intMaskScrollInterval = 50;
var intMaskScrollShift = 20;
var intMaskScrollRightMargin = 110;

//preset to width of mask on load
var intMaskScrollPosition = 0;

var objScrollingImageMask = null;
//====================================

//====================================
var intMaskOpacityInterval = 100;
var intMaskOpacityShift = 10;

//start on transparent and fade in to opaque
var intMaskOpacity = 0;
//====================================

var intCurrentPreload_BannerImage = 0;
var arrBannerImagePreloads = new Array();

//for checkout
var objFreightData = {};
//=================================

//mod 26/1/08: changed to after DOM loaded, this is legacy fallback
//init display on load
window.onload = funcInit;
var boolInited = false;	//flag stops multiple init()s

//hide any errors which do occur (should not be any) from user
window.onerror = funcDisableErrors;

//disables browser error reporting
function funcDisableErrors()
{
	return true;
}

/*
//downloads all banner images to help prevent flickering
function funcPreloadBannerImages()
{
	//iterate through all banner images for preload
	for (intCurrentPreload_BannerImage in arrBannerImages)
	{
		//create new image object for preload
		arrBannerImagePreloads[intCurrentPreload_BannerImage] = new Image();
		//load image into object
		arrBannerImagePreloads[intCurrentPreload_BannerImage].src =
				"images/banner/" + arrBannerImages[intCurrentPreload_BannerImage];
	}
}
*/

//menu items hover
function funcMenuLinkOn()
{
	this.className = "clsMenuLinkHover";
}

//menu items hover off
function funcMenuLinkOff()
{
	this.className = "clsMenuLink";
}

//shop cart add controls for products
function funcShop_IncrementQuantity()
{
	var intID = this.id.split("_")[1];
	if (intID)
	{
		var objThisItem_QuantityText = document.getElementById("txtQuantity_" + intID);
		if (objThisItem_QuantityText) objThisItem_QuantityText.value++;
	}
}
function funcShop_DecrementQuantity()
{
	var intID = this.id.split("_")[1];
	if (intID)
	{
		var objThisItem_QuantityText = document.getElementById("txtQuantity_" + intID);
		if (objThisItem_QuantityText && objThisItem_QuantityText.value > 1) objThisItem_QuantityText.value--;
	}	
}

//initialises graphics system
function funcInit()
{
	funcInitShopCartAddControls();
	funcInitThumbnailSwap();
	funcInitFreightSwap();
	funcInitMaskedEmailLinks();
	funcInitMenu();
	funcInitUKZones();
	
	//store reference to banner image container
	objBannerImage1 = document.getElementById("imgBanner1");
	objBannerImage2 = document.getElementById("imgBanner2");
	
	//only applies to home page
	if (objBannerImage1 && objBannerImage2)
	{	
		//show image after load
		objBannerImage1.onload = funcImageLoaded;
		objBannerImage2.onload = funcImageLoaded;
		objBannerImage1.onerror = objBannerImage1.onabort = funcImageLoad_Error;
		objBannerImage2.onerror = objBannerImage2.onabort = funcImageLoad_Error;
		
		objCurrentBanner_FreeImageContainer = objBannerImage2;
		
		//start with new image
		objBannerImage1.src = "images/banner/" + arrBannerImages[0];
	}
}

//initialises view UK zones link on member settings pages
function funcInitUKZones()
{
	var objHoverLink = document.getElementById("lnkViewUKZones");
	var objHoverDiv = document.getElementById("divViewUKZones");
	if (objHoverLink && objHoverDiv)
	{
		objHoverLink.onmousedown = funcHandleUKZones_Show;
	}
}

function funcHandleUKZones_Show()
{
	var objHoverLink = document.getElementById("lnkViewUKZones");
	var objHoverDiv = document.getElementById("divViewUKZones");
	if (objHoverLink && objHoverDiv)
	{
		objHoverLink.onmousedown = funcHandleUKZones_Hide;
		objHoverLink.innerHTML = "Click to hide United Kingdom Zones";
		objHoverDiv.style.display = "block";
	}
}
function funcHandleUKZones_Hide()
{
	var objHoverLink = document.getElementById("lnkViewUKZones");
	var objHoverDiv = document.getElementById("divViewUKZones");
	if (objHoverLink && objHoverDiv)
	{
		objHoverLink.onmousedown = funcHandleUKZones_Show;
		objHoverLink.innerHTML = "Click to view United Kingdom Zones";
		objHoverDiv.style.display = "none";
	}
}

//enable inc/dec cart quantity controls
function funcInitShopCartAddControls()
{
	var colInputs = document.getElementsByTagName("div");
	
	for (var intInput = 0 ; intInput < colInputs.length ; intInput++)
	{
		if (colInputs[intInput].id.split("_")[0] == "cmdDecrement")
			colInputs[intInput].onclick = funcShop_DecrementQuantity;
		else if (colInputs[intInput].id.split("_")[0] == "cmdIncrement")
			colInputs[intInput].onclick = funcShop_IncrementQuantity;
	}
	
	colInputs = document.getElementsByTagName("input");
	
	for (var intInput = 0 ; intInput < colInputs.length ; intInput++)
	{
		if (colInputs[intInput].id.split("_")[0] == "cmdDecrement")
			colInputs[intInput].onclick = funcShop_DecrementQuantity;
		else if (colInputs[intInput].id.split("_")[0] == "cmdIncrement")
			colInputs[intInput].onclick = funcShop_IncrementQuantity;
	}
}

//ensures an image element is not shown until its image is fully loaded
function funcImageLoaded()
{
	this.style.visibility = "visible";
	
	//swap image (with fade effect)
	window.setTimeout(funcSwapBannerImages, intBannerImageSwapInterval);
}

//ensures graceful handling of unloadable images
function funcImageLoad_Error()
{
	//skip to next image
	intCurrentBannerTransition_OldIndex++;
	intCurrentBannerTransition_NewIndex++;
	//proceed with banner swap, but with errored image skipped
	//... => (no need for timeout here - this is a new swap)
	window.setTimeout(funcSwapBannerImages, intBannerImageSwapInterval);
}

//swaps the current image
function funcSwapBannerImages()
{
	//random shuffling through banner images
	if (boolUseRandomBannerShuffle)
	{
		//generate random image index within available bounds
		intCurrentBannerTransition_NewIndex = Math.floor(Math.random() * intMaxBannerImageIndex);
	}
	//use serial cycle
	else
	{
		//get next image in scrolling banner cycle
		intCurrentBannerTransition_NewIndex = intCurrentBannerTransition_OldIndex + 1;
		//reset to first if reached end of cycle
		if (intCurrentBannerTransition_NewIndex > intMaxBannerImageIndex)
			intCurrentBannerTransition_NewIndex = 0;
	}
	
	if (objCurrentBanner_FreeImageContainer == objBannerImage1)
		objCurrentBanner_FreeImageContainer = objBannerImage2;
	else
		objCurrentBanner_FreeImageContainer = objBannerImage1;
	
	intCurrentBannerTransition_Position = 0;
	//IE DirectX filters support
	if (objBannerImage2.filters)
		objBannerImage2.filters.alpha.opacity = 0;
	objBannerImage2.style.MozOpacity = objBannerImage2.style.opacity = 0;
	
	//show image after load
	objBannerImage2.style.visibility = "hidden";
	
	//only start fading images into each other once both are loaded
	objBannerImage2.onload = objBannerImage2.onabort = funcWaitForImageLoadBeforeFade;
	objBannerImage2.onerror = objBannerImage2.onabort = funcWaitForImageLoadBeforeFade_Error;
	
	//get path of next image and display in banner
	objBannerImage2.src = "images/banner/" + arrBannerImages[intCurrentBannerTransition_NewIndex];
}

//ensures an image element is not faded until its image is fully loaded
function funcWaitForImageLoadBeforeFade()
{
	objBannerImage2.style.visibility = "visible";
	//set timeout to start fade of transition
	window.setTimeout(funcFadeTransition, intBannerImageSwapInterval);
}

//ensures graceful handling of unloadable images (or user aborted with Stop button)
function funcWaitForImageLoadBeforeFade_Error()
{
	//skip to next image
	intCurrentBannerTransition_OldIndex++;
	intCurrentBannerTransition_NewIndex++;
	//proceed with banner swap, but with errored image skipped
	//... => (no need for timeout here - this is a new swap)
	window.setTimeout(funcSwapBannerImages, intBannerImageSwapInterval);
}

//handles fading the transition between images in a swap
function funcFadeTransition()
{
	//shift opacity on each interval elapse
	intCurrentBannerTransition_Position += intBannerImageSwapOpacityShift;
	//finished transition
	if (intCurrentBannerTransition_Position > 100)
	{
		//IE DirectX filters support
		if (objBannerImage1.filters)
			objBannerImage1.filters.alpha.opacity = 100;
		objBannerImage1.style.MozOpacity = objBannerImage1.style.opacity = 1;
		
		//new image is now the "old" one, so shift index
		intCurrentBannerTransition_OldIndex = intCurrentBannerTransition_NewIndex;
		
		//===================================
		//prevent flicker - move new image in front
		//... to enable load of next image behind (hidden)
		
		objBannerImage2.style.zIndex = 2;
		objBannerImage1.style.zIndex = 1;
		
		var objTemp = objBannerImage1;
		objBannerImage1 = objBannerImage2;
		objBannerImage2 = objTemp;
		
		//===================================
		
		//no "new" image is now selected
		intCurrentBannerTransition_NewIndex = -1;
		
		//swap image (with fade effect)
		window.setTimeout(funcSwapBannerImages, intBannerImageSwapInterval);
	}
	//not yet finished transition
	else
	{
		//IE DirectX filters support
		if (objBannerImage1.filters)
		{
			//old image fades out
			objBannerImage1.filters.alpha.opacity = 100 - intCurrentBannerTransition_Position;
			//new image fades in
			objBannerImage2.filters.alpha.opacity = intCurrentBannerTransition_Position;
		}
		objBannerImage1.style.MozOpacity = objBannerImage1.style.opacity = (100 - intCurrentBannerTransition_Position) / 100;
		objBannerImage2.style.MozOpacity = objBannerImage2.style.opacity = (intCurrentBannerTransition_Position) / 100;
		
		//fade needs to continue until images are faded in/out
		window.setTimeout(funcFadeTransition, intBannerImageSwapOpacityShiftInterval);
	}
}

//initialises the thumbnail swap system by assigning event handlers for directing link url to image src
function funcInitThumbnailSwap()
{
	//only allow to run once
	if (boolInited) return;
	boolInited = true;
	
	var objLargeSwap = document.getElementById("imgThumbnailSwap_Large_Image");
	
	if (document.links && objLargeSwap)
	{
		//get collection of page hyperlinks
		var colLinks = document.links;
		for (var intLink = 0 ; intLink < colLinks.length ; intLink++)
		{
			//only add thumbnail swap functionality to correct elements
			if (colLinks[intLink].className == "clsThumbnailSwap_Thumbnail")
			{
				//add event handler to get image source URL from hyperlink
				//(degrades gracefully as direct link to image)
				colLinks[intLink].onclick = funcSwapThumbnail;
			}
		}
		
		objLargeSwap.onclick = funcExpandLargeImage;
	}
}

//event handler
function funcSwapThumbnail()
{
	var objLargeSwap = document.getElementById("imgThumbnailSwap_Large_Image");
	if (objLargeSwap)
	{
		//swap source image
		objLargeSwap.src = (this.href.charAt(this.href.length - 1) == "#")?"images/blank.gif":this.href;
	}
	return false;
}

//allows expansion of large image loaded from thumbnail
function funcExpandLargeImage()
{
	//open popup with expanded version of image
	window.open(this.src, "wndRCM_Expand");
}

function funcInitFreightSwap()
{
	var objDeliverySelect = document.getElementById("slctDelivery");
	if (objDeliverySelect)
	{
		objDeliverySelect.onchange = funcUpdateFreight;
	}
}

function funcUpdateFreight()
{
	var objThisFreightData = objFreightData[this.options[this.selectedIndex].text];
	
	if (objThisFreightData)
	{
		var objDeliveryTotalDiv = document.getElementById("divDeliveryTotal");
		if (objDeliveryTotalDiv) objDeliveryTotalDiv.innerHTML = objThisFreightData["intDeliveryTotal"];
		var objGrossTotalDiv = document.getElementById("divGrossTotal");
		if (objGrossTotalDiv) objGrossTotalDiv.innerHTML = objThisFreightData["intGrossTotal"];
		var objTotalVATDiv = document.getElementById("divTotalVAT");
		if (objTotalVATDiv) objTotalVATDiv.innerHTML = objThisFreightData["intTotalVAT"];
		var objNetTotalDiv = document.getElementById("divNetTotal");
		if (objNetTotalDiv) objNetTotalDiv.innerHTML = objThisFreightData["intNetTotal"];
	}
}

function funcInitMaskedEmailLinks()
{
	if (document.links)
	{
		//can't iterate over doc.links array in IE
		for (var intLink = 0 ; intLink < document.links.length ; intLink++)
		{
			//only apply e-mail functionality to certain class
			if (document.links[intLink].className.indexOf("clsEmailLink") > -1)
			{
				document.links[intLink].onclick = funcSendEmail;
			}
		}
	}
}

//removes need for hardcoded mailto: links
function funcSendEmail()
{
	var strEmail = "mailto:" + (this.textContent || this.innerText);
	top.location.href = strEmail;
	
	return false;
}

function funcInitMenu()
{
	document.onmouseover = funcShowSubmenu;
}

function funcShowSubmenu(objEvent)
{
	//cross-browser event model
	objEvent = objEvent || window.event;
	
	var objSourceElement = objEvent.target || objEvent.srcElement;
	
	if (objSourceElement)
	{
		var objSubmenu = document.getElementById(objSourceElement.id + "_Submenu");
		
		//hide any currently showing submenu
		if (objCurrentSubmenu && objSourceElement != objCurrentSubmenu && objSourceElement.parentNode.className != "clsSubmenu")
		{
			objCurrentSubmenu.style.visibility = "hidden";
			
			//remove hover from submenu parent
			var objSubmenuParent = document.getElementById(objCurrentSubmenu.id.split("_")[0]);
			if (objSubmenuParent && objSubmenuParent.className != "clsMenuItem clsSelectedMenuItem")
				objSubmenuParent.className = "clsMenuItem";
		}
		
		var objThisSubmenu = null;
		
		if (objSourceElement.parentNode.className == "clsSubmenu")
		{
			objThisSubmenu = objSourceElement.parentNode;
		}
		else if (objSourceElement.className == "clsSubmenu")
		{
			objThisSubmenu = objSourceElement;
		}
		
		//parent of submenu must remain in hovered state
		if (objThisSubmenu && objThisSubmenu.className == "clsSubmenu")
		{
			var objSubmenuParent = document.getElementById(objThisSubmenu.id.split("_")[0]);
			if (objSubmenuParent && objSubmenuParent.className != "clsMenuItem clsSelectedMenuItem")
				objSubmenuParent.className = "clsMenuItem clsMenuItem_Hover";
		}
		
		//check submenu exists
		if (objSubmenu)
		{
			//store reference to now open submenu for future closing
			objCurrentSubmenu = objSubmenu;
			
			objSubmenu.style.left = objSourceElement.offsetLeft + "px";
			objSubmenu.style.top = (objSourceElement.offsetTop + 22) + "px";
			objSubmenu.style.visibility = "visible"; //show submenu
		}
	}
}

//======================================================
//Support Presentation JavaScript
//Copyright (c) 2007 Daniel Phillimore - Roger Clark Motorsport
//Permission denied for this code to be copied or
//... => reproduced in any way
//======================================================