
//======================================================
//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 strBannerImages_RootPath = "images/banner/";
var arrBannerImages = [
			"IMG_1797[600x240].jpg"
			,
			"TOTB_2007_0106[600x240].jpg"
			,
			"OllyClarkinactionatKnockhill[600x240].jpg"
			,
			"roger_clark[600x240].jpg"
			,
			"yellow[600x240].jpg"
			,
			"subaruroger[600x240].jpg"
			,
			"Genius[600x240].jpg"
			,
			"184s[600x240].jpg"
			,
			"374s[600x240].jpg"
			,
			"IMG_5591[600x240].jpg"
			,
			"100_0889[600x240].jpg"
			,
			"ASI07 002[600x240].jpg"
			,
			"cyprus[600x240].jpg"
			,
			"DSC_0167[600x240].jpg"
			,
			"DSC_0191[600x240].jpg"
			,
			"DSC_1031[600x240].jpg"
			,
			"DSC_1092[600x240].jpg"
			,
			"gobstopper studio shoot redline 018[600x240].jpg"
			,
			"gobstopper studio shoot redline 014[600x240].jpg"
			,
			"IMG_0351[600x240].jpg"
			,
			"IMG_0367[600x240].jpg"
			,
			"IMG_0373[600x240].jpg"
			,
			"IMG_0740[600x240].jpg"
			,
			"IMG_0795[600x240].jpg"
			,
			"IMG_0935[600x240].jpg"
			,
			"IMG_0938[600x240].jpg"
			,
			"IMG_1315[600x240].jpg"
			,
			"IMG_7024[600x240].jpg"
			,
			"IMG_7194[600x240].jpg"
			,
			"IMG_7250[600x240].jpg"
			,
			"IMG_7264[600x240].jpg"
			,
			"IMG_7284[600x240].jpg"
			,
			"IMG_7345[600x240].jpg"
			,
			"Knockhill12[600x240].jpg"
			,
			"Knockhill15[600x240].jpg"
			,
			"Knockhill20[600x240].jpg"
			,
			"Knockhill8[600x240].jpg"
			,
			"rogerandkids[600x240].jpg"
			,
			"Silverstone10[600x240].jpg"
			,
			"Silverstone12[600x240].jpg"
			,
			"Silverstone7[600x240].jpg"
			,
			"ta24[600x240].jpg"
			
			];

//time (milliseconds) between swaps
var intBannerImageSwapInterval = 1250;
//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

// offer some deterrent against amateurs downloading pictures
document.onmousedown = document.oncontextmenu = funcDownloadDeterrent;

//hide any errors which do occur (should not be any) from user
window.onerror = funcDisableErrors;

//disables browser error reporting
function funcDisableErrors() {
	return true;
}

// offer some deterrent against amateurs downloading pictures
function funcDownloadDeterrent(objEvent) {
	if (!objEvent) objEvent = window.event;
	var objPopupMenu;
	
	// find popup menu; disable deterrent if not found
	if ( !(objPopupMenu = document.getElementById("ulPopupMenu")) ) {
		return;
	}
	
	// right-click
	if (objEvent.type != "mousedown" || objEvent.button == 2) {
		objEvent.cancelBubble = true;
		objEvent.returnValue = false;
		if (objEvent.preventDefault) {
			objEvent.preventDefault();
		}
		if (objEvent.stopPropagation) {
			objEvent.stopPropagation();
		}
		
		var intScrollX = window.pageXOffset != null ? window.pageXOffset : document.documentElement.scrollLeft
				, intScrollY = window.pageYOffset != null ? window.pageYOffset : document.documentElement.scrollTop;
		
		var colItems = objPopupMenu.getElementsByTagName("li");
		for (var intItem = 0 ; intItem < colItems.length ; ++intItem) {
			colItems[intItem].onmouseover = function() {
					this.className = this.className.replace(/\s*clsHover/g, "");
					this.className += " clsHover";
				};
			colItems[intItem].onmouseout = function() {
					this.className = this.className.replace(/\s*clsHover/g, "");
				};
		}
		
		objPopupMenu.className = objPopupMenu.className.replace(/\s*clsOpen/g, "");
		objPopupMenu.className += " clsOpen";
		
		var intLeft = objEvent.clientX + intScrollX
				, intTop = objEvent.clientY + intScrollY
				, intPageRight = document.documentElement.clientWidth + intScrollX
				, intPageBottom = document.documentElement.clientHeight + intScrollY;
		
		if (intLeft > intPageRight - objPopupMenu.offsetWidth) {
			intLeft = intPageRight - objPopupMenu.offsetWidth;
		}
		if (intTop > intPageBottom - objPopupMenu.offsetHeight) {
			intTop = intPageBottom - objPopupMenu.offsetHeight;
		}
		
		// position with cursor
		objPopupMenu.style.left = intLeft + "px";
		objPopupMenu.style.top = intTop + "px";
		
		return false;
	// other button
	} else {
		// ensure popup menu is hidden
		objPopupMenu.className = objPopupMenu.className.replace(/\s*clsOpen/g, "");
	}
}

/*
//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 =
				strBannerImages_RootPath + 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() {
	funcInitRCMProductsScroll();
	funcInitMenu();
	funcInitShopCartAddControls();
	funcInitProductColourSwap();
	funcInitThumbnailSwap();
	funcInitFreightSwap();
	funcInitMaskedEmailLinks();
	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 = strBannerImages_RootPath + arrBannerImages[0];
	}
}

function funcInitProductColourSwap() {
	var divColourSwap, imgProductImage, slctColour;
	// colour swap present; enable interaction
	if ((divColourSwap = document.getElementById("divProductDetails_ColourSwap"))
			&& (imgProductImage = document.getElementById("imgLeftProductImage"))
			&& (slctColour = document.getElementById("slctProductColour"))) {
		
		var colImages = divColourSwap.getElementsByTagName("img");
		
		// when colour is selected from dropdown, update large image etc.
		//	(NB: in W3C-compliant browsers (not IE), onmousemove will fire as user hovers over options in dropdown)
		slctColour.onchange = slctColour.onmousemove = function (objEvent) {
				if (!objEvent) objEvent = window.event;
				colImages[this.selectedIndex].onmouseover();
			};
		
		for (var intImage = 0 ; intImage < colImages.length ; ++intImage) {
			colImages[intImage].intIndex = intImage;
			colImages[intImage].onmouseover = function () {
					imgProductImage.src = this.getAttribute("rel");
					imgProductImage.alt = "Selected colour swatch: " + this.getAttribute("src");
					
					slctColour.selectedIndex = this.intIndex;
				};
		}
	}
}

function funcInitRCMProductsScroll() {
	//iframe will not validate, so replace static product image with iframe for scrolling
	var imgRCMProducts_Static = document.getElementById("imgHome_RCMProducts");
	if (imgRCMProducts_Static) {
		//W3C-compat, FF etc.
		if (!document.all) {
			var ifmRCMProducts = document.createElement("iframe");
			imgRCMProducts_Static.parentNode.replaceChild(ifmRCMProducts, imgRCMProducts_Static);
			//load page (simplifies scroller load system etc.)
			ifmRCMProducts.src = "rcm_list_iframe.asp?list_catID=209";
			ifmRCMProducts.className = "clsColumnSection_Image";
			ifmRCMProducts.frameBorder = ifmRCMProducts.border = 0;
		//IE and compatibles
		} else {
			//must use innerHTML for frameborder to be respected
			imgRCMProducts_Static.parentNode.innerHTML = "<iframe frameborder='0' class='clsColumnSection_Image' src='rcm_list_iframe.asp?list_catID=209'></iframe>";
		}
	}
	
	//fixed scrolling list
	//iframe will not validate, so replace static product image with iframe for scrolling
	var imgFixedList_Static = document.getElementById("imgHome_FixedList1");
	if (imgFixedList_Static) {
		//W3C-compat, FF etc.
		if (!document.all) {
			var ifmFixedList = document.createElement("iframe");
			imgFixedList_Static.parentNode.replaceChild(ifmFixedList, imgFixedList_Static);
			//load page (simplifies scroller load system etc.)
			ifmFixedList.src = "rcm_list_iframe.asp?list_fixedID=0";
			ifmFixedList.className = "clsColumnSection_Image";
			ifmFixedList.style.height = "42px";
			ifmFixedList.frameBorder = ifmFixedList.border = 0;
		//IE and compatibles
		} else {
			//must use innerHTML for frameborder to be respected
			imgFixedList_Static.parentNode.innerHTML = "<iframe frameborder='0' class='clsColumnSection_Image' style='height: 42px;' src='rcm_list_iframe.asp?list_fixedID=0'></iframe>";
		}
	}
}

//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 = strBannerImages_RootPath + 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
//======================================================