/*******************************************************************
*
* File    : xAlphabetTruffleBox.js
*
* Created : 04/10/2006 14:52
*
* Author  : Barry Jones (barry.jones@screenpages.com)
*
* Purpose : To create a javascript library housing the functionality
		for the online chocolate servery
*
* History
* Date         		Version		Description
*
* 04/10/2006 14:52	1.0		Initial version
* 14/11/2007 		1.1		OSR: new site term profanity is included.
***********************************************************************/


function AlphabetTruffleBoxObject() {

	var sSoundEffect	= "";

	var sSiteURL		= "";
	var sLastPOIndex	= "0";
	var lUpdateBasket 	= false;
	var sBasketMessage	= "";

	var iMaxSize 		= 33; 		// maximum no of chocolate grid positions allowed in Alphabet Truffles currently
	var iBoxSize 		= 22; 		// default box size
	var iBoxPrice		= 0;
	var sBoxStyle		= ""		// product ID
	var sBoxVariantID 	= "";
	var sBoxName 		= "";
	var sBoxWeight 		= "";

	var iArrayLen		= 0;		// Current total number of chocolates in the box.
	var iBoxImageSize	= 134;		// The default height of the MEDIUM box image.

	var aChocolates		= new Array("[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]");	// Bespoke Alphabet Truffle Box

	var aBespokeBoxesAvailable	= ""
	var sTempBoxSelection	= "";

	var sPrefilledVariantID = "";
	var sPrefilledProductID = "";
	var sPrefilledDisplayMessage = "";
	var sPrefilledMessage = "";
	var sPrefilledPrice = "";
	var sPrefilledImageName = "";
	var sPrefilledBoxSize = "";
	var sPrefilledBoxWeight = "";
	var sPrefilledOccasionID = "";

	var aBoxPositions	= new Array();

	var aBoxSizes		= new Array();
	aBoxSizes[0] = 22;
	aBoxSizes[1] = 33;
	aBoxSizes[2] = 44;

	var bWait		= false;
	var bLoaded		= false;
	var _bClose		= true;

	var lSoundSwitchedOn	= false;

	this.SwitchSoundOn	= SwitchSoundOn;

	this.returnBoxSize 	= returnBoxSize;
	this.returnBoxStyle 	= returnBoxStyle;

	this.smallerBoxChosen	= smallerBoxChosen;
	this.changeTruffleBoxSize	= changeTruffleBoxSize;
	this.setTruffleBoxSize 	= setTruffleBoxSize;

	this.setUpdateMode	= _SetUpdateMode;
	this.getUpdateMode	= _GetUpdateMode;

	this.defaultBoxSize	= _defaultBoxSize;

	this.addItem 		= addItem;
	this.removeItem 	= removeItem;
	this.deletePreviousItem	= deletePreviousItem;
	this.deleteCurrentItem	= deleteCurrentItem;

	this.removeAllItems	= removeAllItems;

	this.startMessageAgain	= startMessageAgain;
	this.fillBlankSpaces	= _fillBlankSpaces;
	this.fillExistingBox	= FillExistingBox;

	this.upgradeToNextBox	= upgradeToNextBox;
	this.selectOccasion 	= selectOccasion;
	this.resetOccasionsDropdown	= resetOccasionsDropdown;
	this.selectPrefilledBox = selectPrefilledBox;
	this.backToBespokeSelectionGrid = backToBespokeSelectionGrid;

	this.addToBasket		= _addToBasket;
	this.AJAX_AddtoBasket 		= _AJAX_AddtoBasket;
	this.AJAX_PrefilledAddtoBasket	= _AJAX_PrefilledAddtoBasket;
	this.AJAX_ConfirmAddToBasket 	= _AJAX_ConfirmAddToBasket;
	this.AJAX_ConfirmDeleteBasketItem = _AJAX_ConfirmDeleteBasketItem;
	//[1.1] new site term profanity is included.
	this.CheckForProfanity		  =CheckForProfanity;
	//[/1.1]

	this.setURL 		= _setURL;
	this.getURL 		= _getURL;

	this.setMaxSize		= SetMaxSize;
	this.getMaxSize		= GetMaxSize;

	this.checkUpgradeAvailable = checkUpgradeAvailable;

	this.checkMessageCompleted = checkMessageCompleted;

	this.SetBoxImages	= SetBoxImages;

	this.isObsolete		= isObsolete;

	this.returnChocList	= ReturnChocList;

	this.returnBespokeSelection = function () {return sBoxVariantID + "," + sBoxStyle + "," + iBoxPrice + "," + iBoxSize + "," + sBoxWeight + "," + sBoxName;};
	this.returnPrefilledSelection = function () {return sPrefilledVariantID + "," + sPrefilledProductID + "," + sPrefilledDisplayMessage + "," + sPrefilledMessage + "," + sPrefilledPrice + "," + sPrefilledImageName + "," + sPrefilledBoxSize + "," + sPrefilledBoxWeight;};

	this.initScrollBoxes	= _initScrollBoxes;
	this.scrollToBox	= _scrollToBox;
	this.iBoxPosition	= _iBoxPosition;

	this.okToLeave		= _okToLeave;

	this.disableOpeningMessage	= disableOpeningMessage;

	this.selectPlaceHolder		= selectPlaceHolder;
	this.selectNextPlaceHolder	= SelectNextPlaceHolder;

	//*** Keyboard navigation:
	this.MoveRightOneSpace	= MoveRightOneSpace;
	this.MoveLeftOneSpace	= MoveLeftOneSpace;
	this.MoveDownOneSpace	= MoveDownOneSpace;
	this.MoveUpOneSpace	= MoveUpOneSpace;

	//*** Redundant functions:
	this.offerBoxUpgrade	= offerBoxUpgrade;

	//*** Redundant functions End Of.


	function SwitchSoundOn()
	{
		var sImageSrc = xUtil.getObject('oSoundImage').src;
		if (sImageSrc.indexOf("_Off") >= 0)
		{
			lSoundSwitchedOn = true;
			xUtil.getObject('oSoundImage').src = "/PUBLIC/IMAGES/SERVERY/Alphabet/AT_Sound_On.jpg";
			jQuery("#divSwitchSoundOnBubble").hide(20, function() { if (jQuery.browser.msie) this.style.removeAttribute("filter"); } );

			//*** Google Analytics tracking:
			pageTracker._trackPageview("/ThorntonsSite/pages/servery/AT_SwitchSoundOn");
		}
		else
		{
			lSoundSwitchedOn = false;
			xUtil.getObject('oSoundImage').src = "/PUBLIC/IMAGES/SERVERY/Alphabet/AT_Sound_Off.jpg";

			//*** Google Analytics tracking:
			pageTracker._trackPageview("/ThorntonsSite/pages/servery/AT_SwitchSoundOff");
		}
	}

	// ------------------------------------------------------------------------------- ReturnChocList()
	// *** Return current chocolate list from box
	function ReturnChocList()
	{
		var sReturnList = "";
		var nBoxSize = returnBoxSize();
		var i = 0;
		for (i = 0; i < nBoxSize; i++)
		{
			sReturnList = sReturnList + aChocolates[i] + ",";
		}
		sReturnList = sReturnList.substr(0, sReturnList.length - 1);

		return sReturnList;
	}


	// ------------------------------------------------------------------------------- _defaultBoxSize()
	function _defaultBoxSize(iVal) {
		iBoxSize = iVal;
	}

	// ------------------------------------------------------------------------------- _SetUpdateMode()
	//*** Are we adding a new box or updating an existing box in the basket.
	function _SetUpdateMode(lValue)
	{
		lUpdateBasket = lValue;
	}

	// ------------------------------------------------------------------------------- _GetUpdateMode()
	//*** Return which mode we're in i.e. adding new or editing an existing.
	function _GetUpdateMode()
	{
		return lUpdateBasket;
	}

	// ------------------------------------------------------------------------------- _intScrollBoxes()
	function _initScrollBoxes(sArr) {
		aBoxPositions = sArr.split(',');
	}
	// ------------------------------------------------------------------------------- _scrollToBox()
	function _scrollToBox(sVariantID)
	{
		//var i = 2;
		//return ((1 - ((i + 1) * iBoxImageSize) + iBoxImageSize) - i * 5.5);
		for (i = 0; i < aBoxPositions.length; i++)
		{
			if (aBoxPositions[i] == sVariantID)
			{
				return ((1 - ((i + 1) * iBoxImageSize) + iBoxImageSize) - i * 5.5);
			}
		}
	}
	// ------------------------------------------------------------------------------- _iBoxPosition()
	function _iBoxPosition(sVariantID)
	{
		for (i = 0; i < aBoxPositions.length; i++)
		{
			if (aBoxPositions[i] == sVariantID)
			{
				return i;
			}
		}
	}

	// ------------------------------------------------------------------------------- returnBoxSize()
	function returnBoxSize()
	{
		return parseInt(iBoxSize, 10);
	}

	function changeTruffleBoxSize(iVal, iProductID, iVariantID, iPrice, sName, sWeight)
	{
		//*** Google Analytics tracking:
		pageTracker._trackPageview("/ThorntonsSite/pages/servery/AT_ChangeBoxSize" + iVal + "Click");

		// Check to see if by changing the size we are going to lose any chocolates
		if (LosingAnyChocs(iVal) == true)
		{
			sTempBoxSelection = "" + iVal + "|" + iProductID + "|" + iVariantID + "|" + iPrice + "|" + sName + "|" + sWeight;
			xUtil.displayPopUp('oBoxReduceSizeMsg', 400, 150);
		}
		else
		{
			setTruffleBoxSize(true, iVal, iProductID, iVariantID, iPrice, sName, sWeight);
		}
	}

	// *** If downgrading box size are we losing any chocolates.
	function LosingAnyChocs(iVal)
	{
		var lReturnValue = false;
		for (var i = (iMaxSize - 1); i >= iVal; i--)
		{
			if (aChocolates[i] !== "[BLANK]")
			{
				lReturnValue = true;
				break;
			}
		}
		return lReturnValue;
	}


	function smallerBoxChosen()
	{
		xUtil.closeWindow('oBoxReduceSizeMsg');

		var aNewSelection = sTempBoxSelection.split("|");
		var nBoxSize = parseInt(aNewSelection[0], 10);

		// Remove the chocolates that don't fit
		for (ix = iMaxSize; ix > nBoxSize; ix--)
			this.removeItem(ix);

		setTruffleBoxSize(true, nBoxSize, aNewSelection[1], aNewSelection[2], aNewSelection[3], aNewSelection[4], aNewSelection[5]);
	}

	// ------------------------------------------------------------------------------- setTruffleBoxSize()
	function setTruffleBoxSize(lRefresh, iVal, iProductID, iVariantID, iPrice, sName, sWeight)
	{
		xUtil.closeWindow('oInfo');

		iBoxPrice = iPrice;
		sBoxStyle = iProductID;
		sBoxVariantID = iVariantID;
		sBoxName = sName;
		sBoxWeight = sWeight;

		//oOrderOptions.updateAlphabetTruffleBox(iVal, iProductID, iVariantID, iPrice, sName, sWeight);

		if(!bWait) { xUtil.getObject('AT_BoxSize_'+iBoxSize).className = "AT_BoxLinkText_Off"; }
		iBoxSize = iVal;
		if(!bWait) { xUtil.getObject('AT_BoxSize_'+iVal).className = "AT_BoxLinkText_On"; }

		// Update Box Size Image just underneath box list (TB: removed in new version)
		//if(!bWait) { xUtil.getObject('AT_BoxSize_Image').src = "/PUBLIC/PICTURES/SERVERY/BOX/MEDIUM/" + iProductID + ".jpg"; }

		//*** Loop through all rows and make sure each one is correctly in focus (i.e. fully visible or greyed out).
		updateTruffleBoxVisibility(parseInt(iVal,10));

		if (lRefresh == true)
		{
			//xUtil.getObject('oAlphabetTruffleBoxImage').style.display = "block";

			xUtil.getObject('oPrefilledTrufflesContainer').style.display = "none";
			xUtil.getObject('oAlphabetTrufflesContainer').style.display = "block";
		}
	}

	// ------------------------------------------------------------------------------- updateTruffleBoxVisibility()
	// *** Loop through all four rows (only 3 currently active) and make them fully visible or greyed out.
	function updateTruffleBoxVisibility(nNumberOfChocs)
	{
		var nRowsAvailable = nNumberOfChocs / 11;
		var nMaxRows = iMaxSize / 11;
		var i;
		for (i = 1; i <= nMaxRows; i++)
		{
			if (i <= nRowsAvailable && i == 3)
			{
				setTimeout("document.getElementById('oTrufflesRow3').style.opacity = '1';", 50);
				setTimeout("document.getElementById('oTrufflesRow3').style.filter = 'alpha(opacity=100)';", 50);
			}
			else if (i == 3)
			{
				setTimeout("document.getElementById('oTrufflesRow3').style.opacity = '.5';", 50);
				setTimeout("document.getElementById('oTrufflesRow3').style.filter = 'alpha(opacity=50)';", 50);
			}

			if (i <= nRowsAvailable && i == 4)
			{
				setTimeout("document.getElementById('oTrufflesRow4').style.opacity = '1';", 50);
				setTimeout("document.getElementById('oTrufflesRow4').style.filter = 'alpha(opacity=100)';", 50);
			}
			else if (i == 4)
			{
				setTimeout("document.getElementById('oTrufflesRow4').style.opacity = '.5';", 50);
				setTimeout("document.getElementById('oTrufflesRow4').style.filter = 'alpha(opacity=50)';", 50);

				//*** If the 44 box size is not live then we hide this row completely
				if (iMaxSize !== 44)
					setTimeout("document.getElementById('oTrufflesRow4').style.display = 'none';", 55);

			}
		}
	}

	// ------------------------------------------------------------------------------- SetBoxImages()
	function SetBoxImages(sArr)
	{
		aBespokeBoxesAvailable = new Array();
		if (sArr.length > 0)
		{
			aBespokeBoxesAvailable = sArr.split(',');
			aBespokeBoxesAvailable.pop();
		}
	}


	// ------------------------------------------------------------------------------- isObsolete()
	function isObsolete(iID, iBoxSize) {
		var sURL = '';

		if(iBoxSize>0) {
			sURL = 'isObsolete.asp?productid=' + iID + '&iBoxSize=' + iBoxSize;
		} else {
			sURL = 'isObsolete.asp?variantid=' + iID;
		}
		sURL+= '&ran=' + Math.floor(Math.random()*10001)

		var oAJAXVariantCheck = new AjaxDelegate(sURL, null);

		oAJAXVariantCheck.Asynchronous = false; //Make the script wait for a response
		return oAJAXVariantCheck.Fetch();
	}

	// ------------------------------------------------------------------------------- returnBoxStyle()
	function returnBoxStyle()
	{
		return sBoxStyle;
	}

	// ------------------------------------------------------------------------------- _fillBlankSpaces()
	function _fillBlankSpaces()
	{
		xUtil.closeWindow('oBoxNotFinishedMsg');

		var nBoxSize = returnBoxSize();
		var nCounter;
		for (nCounter = 0; nCounter <= (nBoxSize - 1); nCounter++)
		{
			if (aChocolates[nCounter] == "[BLANK]")
			{
				aChocolates[nCounter] = "[SPACE]";
				xUtil.getObject('AT_placeHolder' + (nCounter+1)).innerHTML = '<img src="/PUBLIC/IMAGES/SERVERY/Alphabet/truffles/AW_Alphabet_[SPACE].jpg" border="0"/>';
			}
		}

		this.AJAX_AddtoBasket();
	}

	// ------------------------------------------------------------------------------- FillExistingBox()
	//*** Called when changing a box message from the finishing touches page.
	function FillExistingBox(sExistingChocList)
	{
		var z, lSkipChar;
		var sSavedChocList = "";
		var lSkipChar = false;
		for (z = 0; z < sExistingChocList.length; z++)
		{
			if (sExistingChocList.substr(z, 1) == "[")
				lSkipChar = true;
			else if (sExistingChocList.substr(z, 1) == "]")
				lSkipChar = false;

			if (lSkipChar == false)
				sSavedChocList = sSavedChocList + sExistingChocList.substr(z, 1) + "|"
			else
				sSavedChocList = sSavedChocList + sExistingChocList.substr(z, 1)
		}
		sSavedChocList = sSavedChocList.substr(0, sSavedChocList.length - 1);

		// Split out the chocolate list
		aChocolates = sSavedChocList.split("|");

		var nBoxSize = returnBoxSize();

		//*** If there were any [SPACE] chars at the end change these to [BLANK] so that the cursor can get focus on the grid.
		for (z = (nBoxSize - 1); z >= 0; z--)
		{
			if (aChocolates[z] == "[SPACE]" || aChocolates[z] == "[BLANK]")
			{
				aChocolates[z] = "[BLANK]"
			}
			else
			{
				//*** Exit loop as we're found a different character.
				break;
			}
		}

		//*** Fill the rest of the chocolate box with [BLANKS]
		for (z = nBoxSize; z < 44; z++)
		{
			aChocolates.push("[BLANK]");
		}

		var nCounter, sImageSrc;
		for (nCounter = 0; nCounter <= (nBoxSize - 1); nCounter++)
		{
			if (aChocolates[nCounter] == "[BLANK]")
				sImageSrc = '/PUBLIC/IMAGES/SERVERY/Alphabet/truffles/AW_Alphabet_[SPACE].jpg'
			else
				sImageSrc = '/PUBLIC/IMAGES/SERVERY/Alphabet/truffles/AW_Alphabet_' + aChocolates[nCounter] + '.jpg';

			xUtil.getObject('AT_placeHolder' + (nCounter + 1)).innerHTML = '<img src="' + sImageSrc + '" border="0"/>';
		}
	}


	// ------------------------------------------------------------------------------- addItem()
	function addItem(sVariantCode, bOfferUpgrade)
	{
		//*** If we've started filling in the third/fourth row make sure this box is selected!
		if (returnBoxSize() < _nCurrentPlaceHolderInFocus)
		{
			if (_nCurrentPlaceHolderInFocus >= 23 && _nCurrentPlaceHolderInFocus <= 33)
			{
				//*** Upgrade to a 33 box. Find all box values.
				var sBoxDetails =  xUtil.getObject("hidAT_BoxSize_33").value;
				var aBoxDetails = sBoxDetails.split("|");
				setTruffleBoxSize(false, aBoxDetails[0], aBoxDetails[1], aBoxDetails[2], aBoxDetails[3], aBoxDetails[4], aBoxDetails[5]);
			}
			else if (_nCurrentPlaceHolderInFocus >= 34 && _nCurrentPlaceHolderInFocus <= 44)
			{
				//*** Upgrade to a 44 box. Find all box values.
				var sBoxDetails =  xUtil.getObject("hidAT_BoxSize_44").value;
				var aBoxDetails = sBoxDetails.split("|");
				setTruffleBoxSize(false, aBoxDetails[0], aBoxDetails[1], aBoxDetails[2], aBoxDetails[3], aBoxDetails[4], aBoxDetails[5]);
			}
		}


		// Add the chocolate to the array
		var nCharPos = sVariantCode.indexOf("_");
		//iArrayLen = parseInt(aChocolates.push(sVariantCode.substr(nCharPos+1)), 10);

		aChocolates[_nCurrentPlaceHolderInFocus - 1] = sVariantCode.substr(nCharPos+1);

		//var oImage = new Image();
		//oImage.src = '/PUBLIC/IMAGES/SERVERY/Alphabet/truffles/AW_' + sVariantCode + '.jpg';
		var sImageSrc = '/PUBLIC/IMAGES/SERVERY/Alphabet/truffles/AW_' + sVariantCode + '.jpg';

		// Show the chocolate image in the box
		//xUtil.getObject('AT_placeHolder' + iArrayLen ).innerHTML = '<img src="' + oImage.src + '" border="0"/>';
		xUtil.getObject('AT_placeHolder' + _nCurrentPlaceHolderInFocus).innerHTML = '<img src="' + sImageSrc + '" border="0"/>';

		//TB: This is the old way of upgrading. Redundant now.
		//if (bOfferUpgrade == true)
		//	this.offerBoxUpgrade();

		//*** Remember the current selection in case the customer decides to leave the page and come back later.
		RememberChocSelection();

		//*** Play a sound? After each word, if a space or special character was entered then perform the check.
		if (sVariantCode.substr(nCharPos+1).indexOf("[") >= 0)
		{
			var lContinue = true;
			// Make sure that the previous letter is not a space. We only play the sound once.
			if (_nCurrentPlaceHolderInFocus > 1 && aChocolates[_nCurrentPlaceHolderInFocus - 2] == "[SPACE]")
			{
				lContinue = false;
			}

			if (lContinue == true && lSoundSwitchedOn == true && CheckSoundForLastWordEntered() == true)
			{
			 	jQuery("#player_div").empty();
				jQuery("#player_div").prepend(insertPlayer());
			}
		}

		SelectNextPlaceHolder();

	}

	//*** Check if the last word entered triggers a sound file.
	function CheckSoundForLastWordEntered()
	{
		sSoundEffect = "";
		var lReturnValue = false;

		var sWordEntered = "";
		var i;
		for (i = (_nCurrentPlaceHolderInFocus - 2); i >= 0; i--)
		{
			if (aChocolates[i].indexOf("[") >= 0)
				break;

			sWordEntered = aChocolates[i] + sWordEntered;
		}

		if (sWordEntered !== "")
		{
			for (i = 0; i < aPickupWords.length; i++)
			{
				if (sWordEntered == aPickupWords[i].toUpperCase())
				{
					sSoundEffect = aPickupSounds[i];
					lReturnValue = true;
					break;
				}
			}
		}

		return lReturnValue;
	}

	//*** Insert Flash Player to play sound
	function insertPlayer()
	{
		//var soundz 	= 'gimme_money.mp3';
		var soundz 	= '/PUBLIC/SOUNDS/' + sSoundEffect + ".mp3";

	    	var playerpath	= 'flash/singlemp3player.swf';
		var path	= '';
		var filename	= path + soundz;

		var mp3html = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ';
		mp3html += 'width="1" height="1" ';
		mp3html += 'codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">';
		mp3html += '<param name="movie" value="' + playerpath + '?';
		mp3html += 'showDownload=false&file=' + filename + '&autoStart=true';
		mp3html += '&backColor=ffffff&frontColor=ffffff';
		mp3html += '&repeatPlay=false&songVolume=50" />';
		mp3html += '<param name="wmode" value="transparent" />';
		mp3html += '<embed wmode="transparent" width="1" height="1" ';
		mp3html += 'src="' + playerpath + '?'
		mp3html += 'showDownload=false&file=' + filename + '&autoStart=true';
		mp3html += '&backColor=ffffff&frontColor=ffffff';
		mp3html += '&repeatPlay=false&songVolume=50" ';
		mp3html += 'type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />';
		mp3html += '</object>';

		return mp3html;
	}


	// ------------------------------------------------------------------------------- RememberChocSelection()
	// If the customer leaves the page we store any unfinished message to a cookie. New box entry only.
	function RememberChocSelection()
	{
		if (lUpdateBasket == false)
		{
			//*** Has anything been entered into the box?
			if (IsTheBoxEmpty() == false)
			{
				var expireDate = new Date();
				expireDate.setDate(expireDate.getFullYear() + 1);
				xUtil.writeCookie("Thorntons_AlphabetTruffles_NewMessage", ReturnChocList(), expireDate);
			}
			else
			{
				//*** It was an empty box so make sure cookie is deleted.
				var expireDate = new Date();
				expireDate.setDate(expireDate - 1);
				xUtil.writeCookie("Thorntons_AlphabetTruffles_NewMessage", ReturnChocList(), expireDate);
			}
		}
	}

	// ------------------------------------------------------------------------------- SelectNextPlaceHolder()
	// After we've added a chocolate we need to focus on the next available place holder.
	function SelectNextPlaceHolder()
	{
		// From the current position loop through all remaining positions. The next [BLANK] position wins!
		var lNewPositionFound = false;
		var i;
		for (i = (_nCurrentPlaceHolderInFocus - 1); i < iMaxSize; i++)
		{
			if (aChocolates[i] == "[BLANK]")
			{
				lNewPositionFound = true;
				selectPlaceHolder(i + 1, false);
				break;
			}
		}

		// If none found to the end then start from the beginning.
		if (lNewPositionFound == false)
		{
			for (i = 0; i < (_nCurrentPlaceHolderInFocus - 1); i++)
			{
				if (aChocolates[i] == "[BLANK]")
				{
					lNewPositionFound = true;
					selectPlaceHolder(i + 1, false);
					break;
				}
			}
		}

		if (lNewPositionFound == false)
		{
			// All box spaces are filled. Nothing is in focus. Set the current position to one after the end.
			_nLastPlaceHolderInFocus = iMaxSize;
			_nCurrentPlaceHolderInFocus = iMaxSize + 1;
		}
	}


	// ------------------------------------------------------------------------------- deletePreviousItem()
	//*** Delete the chocolate in the previous place holder (same as the back space delete <-- button)
	function deletePreviousItem()
	{
		if (_nCurrentPlaceHolderInFocus > 1)
		{
			//*** Replace choc in box with blank.
			aChocolates[_nCurrentPlaceHolderInFocus - 2] = "[BLANK]";

			//*** If this was a deletion in the third or fourth row check that if all that row is blank then we downgrade automatically.
			if (_nCurrentPlaceHolderInFocus > 33)
			{
				CheckForDowngrade(4);
			}
			else if (_nCurrentPlaceHolderInFocus > 22)
			{
				CheckForDowngrade(3);
			}

			//*** Rememeber current selection (via a cookie) just in case the customer decides to leave the page and come back later.
			RememberChocSelection();

			//*** set focus into previous place holder just deleted.
			selectPlaceHolder(_nCurrentPlaceHolderInFocus - 1, true);
		}
	}

	// ------------------------------------------------------------------------------- deleteCurrentItem()
	//*** Delete the chocolate in the current place holder (same as the delete button)
	function deleteCurrentItem()
	{
		if (_nCurrentPlaceHolderInFocus > 0)
		{
			//*** Replace choc in box with blank.
			aChocolates[_nCurrentPlaceHolderInFocus - 1] = "[BLANK]";

			//*** If this was a deletion in the third or fourth row check that if all that row is blank then we downgrade automatically.
			if (_nCurrentPlaceHolderInFocus > 33)
			{
				CheckForDowngrade(4);
			}
			else if (_nCurrentPlaceHolderInFocus > 22)
			{
				CheckForDowngrade(3);
			}

			//*** Rememeber current selection (via a cookie) just in case the customer decides to leave the page and come back later.
			RememberChocSelection();

			//*** set focus into current place holder just deleted.
			selectPlaceHolder(_nCurrentPlaceHolderInFocus, true);
		}
	}


	// ------------------------------------------------------------------------------- CheckForDowngrade()
	function CheckForDowngrade(nWhichRow)
	{
		//*** Checking the third and fourth grid rows only.
		if (nWhichRow == 3)
		{
			var lDowngrade = true;
			for (var i = 22; i < 33; i++)
			{
				if (aChocolates[i] !== "[BLANK]")
				{
					lDowngrade = false;
					break;
				}
			}

			if (lDowngrade == true)
			{
				//*** Downgrade to a 22 box. Find all box values.
				var sBoxDetails =  xUtil.getObject("hidAT_BoxSize_22").value;
				var aBoxDetails = sBoxDetails.split("|");
				setTruffleBoxSize(false, aBoxDetails[0], aBoxDetails[1], aBoxDetails[2], aBoxDetails[3], aBoxDetails[4], aBoxDetails[5]);
			}
		}
		else if (nWhichRow == 4)
		{
			var lDowngrade = true;
			for (var i = 33; i < 44; i++)
			{
				if (aChocolates[i] !== "[BLANK]")
				{
					lDowngrade = false;
					break;
				}
			}

			if (lDowngrade == true)
			{
				//*** Downgrade to a 33 box. Find all box values.
				var sBoxDetails =  xUtil.getObject("hidAT_BoxSize_33").value;
				var aBoxDetails = sBoxDetails.split("|");
				setTruffleBoxSize(false, aBoxDetails[0], aBoxDetails[1], aBoxDetails[2], aBoxDetails[3], aBoxDetails[4], aBoxDetails[5]);

				//*** Maybe the third row is also empty?
				CheckForDowngrade(3);
			}
		}


	}

	function checkMessageCompleted()
	{
		//alert("here");
		//xUtil.displayPopUp('oBoxLeavingPageMsg', 400, 150);
	}

	// ------------------------------------------------------------------------------- startMessageAgain()
	function startMessageAgain()
	{
		xUtil.displayPopUp('oBoxStartAgainMsg', 400, 150);
	}

	// ------------------------------------------------------------------------------- removeAllItems()
	function removeAllItems()
	{
		xUtil.closeWindow('oBoxStartAgainMsg');

		var nCounter;
		for (nCounter = iMaxSize; nCounter > 0; nCounter--)
		{
			xUtil.getObject('AT_placeHolder' + nCounter).innerHTML = '<img src="/PUBLIC/IMAGES/SERVERY/Alphabet/truffles/AW_Alphabet_[SPACE].jpg"/>';
		}

		aChocolates = new Array("[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]","[BLANK]");
		_nCurrentPlaceHolderInFocus = 1;
		_nLastPlaceHolderInFocus = 1;

		//*** Rememeber current selection (via a cookie) just in case the customer decides to leave the page and come back later.
		RememberChocSelection();

		//*** Google Analytics tracking:
		pageTracker._trackPageview("/ThorntonsSite/pages/servery/AT_StartAgainClick");

		selectPlaceHolder(1, true);
	}

	// ------------------------------------------------------------------------------- MoveRightOneSpace()
	function MoveRightOneSpace()
	{
		if (_nCurrentPlaceHolderInFocus < iMaxSize)
		{
			selectPlaceHolder(_nCurrentPlaceHolderInFocus + 1, true);
		}
	}

	// ------------------------------------------------------------------------------- MoveLeftOneSpace()
	function MoveLeftOneSpace()
	{
		if (_nCurrentPlaceHolderInFocus > 1)
		{
			selectPlaceHolder(_nCurrentPlaceHolderInFocus - 1, true);
		}
	}

	// ------------------------------------------------------------------------------- MoveDownOneSpace()
	function MoveDownOneSpace()
	{
		if (_nCurrentPlaceHolderInFocus <= (iMaxSize - 11))
		{
			selectPlaceHolder(_nCurrentPlaceHolderInFocus + 11, true);
		}
	}

	// ------------------------------------------------------------------------------- MoveUpOneSpace()
	function MoveUpOneSpace()
	{
		if (_nCurrentPlaceHolderInFocus >= 12 && _nCurrentPlaceHolderInFocus <= iMaxSize)
		{
			selectPlaceHolder(_nCurrentPlaceHolderInFocus - 11, true);
		}
	}

	// ------------------------------------------------------------------------------- selectPlaceHolder()
	// When a box position is clicked on or moved to via arrow buttons we reset the contents of it (chocolate selected or not).
	function selectPlaceHolder(nPlaceHolder, lCheckLastPlaceHolderFocused)
	{
		_nLastPlaceHolderInFocus = _nCurrentPlaceHolderInFocus;
		if (lCheckLastPlaceHolderFocused == true)
		{
			//*** If the last place holder focused on had a chocolate already picked make sure it's displayed again
			if (aChocolates[_nLastPlaceHolderInFocus - 1] !== "[BLANK]")
			{
				var sInnerHTML = xUtil.getObject('AT_placeHolder' + _nLastPlaceHolderInFocus).innerHTML;
				if (sInnerHTML.indexOf("AT_TextBox") >= 0)
				{
					var sVariantCode = "Alphabet_" + aChocolates[_nLastPlaceHolderInFocus - 1];
					var oImage = new Image();
					oImage.src = '/PUBLIC/IMAGES/SERVERY/Alphabet/truffles/AW_' + sVariantCode + '.jpg';
					// Show the chocolate image in the box
					xUtil.getObject('AT_placeHolder' + _nLastPlaceHolderInFocus).innerHTML = '<img src="' + oImage.src + '" border="0"/>';
				}
			}

		}

		_nCurrentPlaceHolderInFocus = nPlaceHolder;

		//alert(aChocolates[_nLastPlaceHolderInFocus - 1]);
		//if(window.event)
		//{
			//alert(xUtil.getObject('AT_placeHolder' + nPlaceHolder).innerHTML);

			// For IE we have trouble focusing on current grid position.
		//	if (aChocolates[_nLastPlaceHolderInFocus - 1] !== "[BLANK]")
		//	{
		//		xUtil.getObject('AT_placeHolder' + nPlaceHolder).innerHTML = '<div class="AT_PlaceHolder_Div"><input type="text" id="AT_TextBox' + nPlaceHolder + '" name="AT_TextBox'+ nPlaceHolder + '" class="AT_PlaceHolder_TextBox" onkeypress="return xUtil.checkKeyStroke(event);" onkeydown="xUtil.checkCommandKey(event);" maxlength="1" /></div>';
		//	}
		//}
		//else
		//	xUtil.getObject('AT_placeHolder' + nPlaceHolder).innerHTML = '<div class="AT_PlaceHolder_Div"><input type="text" id="AT_TextBox' + nPlaceHolder + '" name="AT_TextBox'+ nPlaceHolder + '" class="AT_PlaceHolder_TextBox" onkeypress="return xUtil.checkKeyStroke(event);" onkeydown="xUtil.checkCommandKey(event);" maxlength="1" /></div>';

		xUtil.getObject('AT_placeHolder' + nPlaceHolder).innerHTML = '<div class="AT_PlaceHolder_Div"><input type="text" id="AT_TextBox' + nPlaceHolder + '" name="AT_TextBox'+ nPlaceHolder + '" class="AT_PlaceHolder_TextBox" onkeypress="return xUtil.checkKeyStroke(event);" onkeydown="xUtil.checkCommandKey(event);" maxlength="1" /></div>';

		//jQuery("#AT_TextBox" + nPlaceHolder).focus();

		if(window.event)
		{
			window.setTimeout("xUtil.getObject('AT_TextBox" + nPlaceHolder + "').focus();", 20);
		}
		else
		{
			window.setTimeout("xUtil.getObject('AT_TextBox" + nPlaceHolder + "').focus();", 20);
		}
	}

	// ------------------------------------------------------------------------------- removeItem()
	function removeItem(ix)
	{
		xUtil.getObject('AT_placeHolder' + parseInt(ix, 10)).innerHTML = '<img src="/PUBLIC/IMAGES/SERVERY/Alphabet/truffles/AW_Alphabet_[SPACE].jpg"/>';

		aChocolates[ix - 1] = "[BLANK]";
	}

	function checkUpgradeAvailable()
	{
		var lReturnValue = false;
		var nBoxSize = returnBoxSize();
		for (i = 0; i < aBespokeBoxesAvailable.length; i++)
		{
			if (nBoxSize == parseInt(aBespokeBoxesAvailable[i].substr(0,2), 10))
			{
				if (i < (aBespokeBoxesAvailable.length - 1))
				{
					// Yes we can upgrade! Insert the correct images on the overlay.
					lReturnValue = true;
					var aNewBoxInfo = aBespokeBoxesAvailable[i+1].split("|");
					//xUtil.getObject('imgUpgradeToBox').src = "/PUBLIC/PICTURES/SERVERY/BOX/MEDIUM/" + aNewBoxInfo[1] + ".jpg";
					//xUtil.getObject('imgUpgradeToButton').src = "/PUBLIC/IMAGES/SERVERY/btn_UpgradeToBox_" + aNewBoxInfo[0] + ".jpg";
					xUtil.getObject('imgUpgradeLink').src = "/PUBLIC/IMAGES/SERVERY/img_UpgradeToBox_" + aNewBoxInfo[0] + ".jpg";
					sTempBoxSelection = aBespokeBoxesAvailable[i+1];
				}
				break;
			}
		}
		return lReturnValue;
	}

	function upgradeToNextBox()
	{
		//xUtil.closeWindow('oBoxUpsellMsg');
		xUtil.closeWindow('oBoxUpsellMsg2');
		var aNewSelection = sTempBoxSelection.split("|");
		setTruffleBoxSize(true, aNewSelection[0], aNewSelection[1], aNewSelection[2], aNewSelection[3], aNewSelection[4], aNewSelection[5]);
	}


	function _addToBasket()
	{
		// We need to know if this is a "Bespoke" or "Prefilled" AddToBasket call.
		if (xUtil.getObject('oPrefilledTrufflesContainer').style.display == "none")
		{
			// *** Bespoke Box Entry:
			// *** We only display a popup when they've entered no message at all!
			if (IsTheBoxEmpty() == true)
			{
				xUtil.displayPopUp('oBoxNotFinishedMsg', 420, 160);
			}
			else
			{
				//*** Make sure all remaining empty spaces are filled in (we don't ask customer anymore)
				if (IsTheBoxFull() == false)
				{
					//*** Fill it first then add to basket
					this.fillBlankSpaces();
				}
				else
				{
					this.AJAX_AddtoBasket();
				}
			}
		}
		else
		{
			// Prefilled Box Selection: Add to basket. TB: Not in use for new version. Might be again though!
			//this.AJAX_PrefilledAddtoBasket();
		}
	}

	// ----------------------------------------------------------------------------- IsTheBoxFull()
	// Is the current box full? Are there any empty box places?
	function IsTheBoxFull()
	{
		var lReturnValue = true;

		var nBoxSize = returnBoxSize();
		var i = 0;
		for (i = 0; i < nBoxSize; i++)
		{
			if (aChocolates[i] == "[BLANK]")
			{
				lReturnValue = false;
				break;
			}
		}

		return lReturnValue;
	}

	// ----------------------------------------------------------------------------- IsTheBoxEmpty()
	// Is the current box completely empty?
	function IsTheBoxEmpty()
	{
		var lReturnValue = true;

		var nBoxSize = returnBoxSize();
		var i = 0;
		for (i = 0; i < nBoxSize; i++)
		{
			if (aChocolates[i] !== "[BLANK]")
			{
				lReturnValue = false;
				break;
			}
		}

		return lReturnValue;
	}


	// ----------------------------------------------------------------------------- _AJAX_AddtoBasket()
	function _AJAX_AddtoBasket()
	{
		// This could be an Update to Basket function (i.e. we've returned from the Finishing Touches tab page to amend).
		if (lUpdateBasket == false)
		{
			// Add Item to Basket
			oOrderOptions.confirmBespokeAlphabetTruffleBox();

			oForm = document.forms['frmAlphabetTruffleBox'];
			var sFormParams = xUtil.returnFormFieldsExclude(oForm, "serial");
			var sURL = sSiteURL + "/COREAJAX/EventListener.asp?ran=" + Math.floor(Math.random()*10001) + sFormParams;
			var oAJAXAddToBasket = new AjaxXMLDelegate(sURL, _AJAX_ConfirmAddToBasket);
			oAJAXAddToBasket.Fetch();
		}
		else
		{
			// Delete existing basket item first. Why? Because the variant code may have changed.
			var sOldPOIndex = xUtil.getObject('update_basket_poindex').value;
			var sOldProdCode = xUtil.getObject('update_basket_prod').value;
			var sOldVariantID = xUtil.getObject('update_basket_variantid').value;
			var sUserID = xUtil.getObject('update_user_id').value;
			var sURL = sSiteURL + "/COREAJAX/EventListener.asp?ran=" + Math.floor(Math.random()*10001) + "&function=deletebasketitemfunction&po_index=" + sOldPOIndex + "&prod=" + sOldProdCode + "&variantid=" + sOldVariantID + "&user_id=" + sUserID;
			var oAJAXAddToBasket = new AjaxXMLDelegate(sURL, _AJAX_ConfirmDeleteBasketItem);
			oAJAXAddToBasket.Fetch();

		}
	}

	// ----------------------------------------------------------------------------- _AJAX_PrefilledAddtoBasket()
	function _AJAX_PrefilledAddtoBasket()
	{
		var sURL, oAJAXAddToBasket;
		var oForm = null;

		// This could be an Update to Basket function (i.e. we've returned from the Finishing Touches tab page to amend).
		if (lUpdateBasket == false)
		{
			// Add to Basket
			oOrderOptions.confirmPrefilledAlphabetTruffleBox();
			oForm = document.forms['frmAlphabetTruffleBox'];
		}
		else
		{
			// Delete existing basket item first. Why? Because the variant code may have changed.
			//var sOldPOIndex = xUtil.getObject('update_basket_poindex').value;
			//var sOldProdCode = xUtil.getObject('update_basket_prod').value;
			//var sOldVariantID = xUtil.getObject('update_basket_variantid').value;
			//var sUserID = xUtil.getObject('update_user_id').value;
			//sURL = sSiteURL + "/COREAJAX/EventListener.asp?ran=" + Math.floor(Math.random()*10001) + "&function=deletebasketitemfunction&po_index=" + sOldPOIndex + "&prod=" + sOldProdCode + "&variantid=" + sOldVariantID + "&user_id=" + sUserID;
			//oAJAXAddToBasket = new AjaxXMLDelegate(sURL, _AJAX_ConfirmDeleteBasketItem);
			//oAJAXAddToBasket.Fetch();

			// Add new Item to the Basket
			//oOrderOptions.confirmPrefilledAlphabetTruffleBox();
			//oForm = document.forms['frmAlphabetTruffleBox'];
		}

		var sFormParams = xUtil.returnFormFieldsExclude(oForm, "serial");
		sURL = sSiteURL + "/COREAJAX/EventListener.asp?ran=" + Math.floor(Math.random()*10001) + sFormParams;
		oAJAXAddToBasket = new AjaxXMLDelegate(sURL, _AJAX_ConfirmAddToBasket);
		oAJAXAddToBasket.Fetch();
	}

	function _AJAX_ConfirmDeleteBasketItem(url, oXML)
	{
		// Now create the new Basket Item
		oOrderOptions.confirmBespokeAlphabetTruffleBox();

		var oForm = document.forms['frmAlphabetTruffleBox'];
		var sFormParams = xUtil.returnFormFieldsExclude(oForm, "serial");
		var sURL = sSiteURL + "/COREAJAX/EventListener.asp?ran=" + Math.floor(Math.random()*10001) + sFormParams;
		var oAJAXAddToBasket = new AjaxXMLDelegate(sURL, _AJAX_ConfirmAddToBasket);
		oAJAXAddToBasket.Fetch();
	}

	// ----------------------------------------------------------------------------- _AJAX_ConfirmAddToBasket()
	function _AJAX_ConfirmAddToBasket(url, oXML)
	{
		// Make sure something's in the basket
		var iBasketItemCount = parseInt(oXML.getElementsByTagName('basket_lineitem_count')[0].firstChild.data, 10);
		if (iBasketItemCount > 0)
		{
			// Update last POIndex of Item Added to basket.
			sLastPOIndex = "" + (iBasketItemCount - 1);
			xUtil.getObject('update_basket_poindex').value = sLastPOIndex;

			//*** Clear out our cookie to remember unsaved message.
			var expireDate = new Date();
			expireDate.setDate(expireDate - 1);
			xUtil.writeCookie("Thorntons_AlphabetTruffles_NewMessage", "", expireDate);

			//*** Google Analytics tracking:
			if (lUpdateBasket == false)
				pageTracker._trackPageview("/ThorntonsSite/pages/servery/AT_BuyMeClick")
			else
				pageTracker._trackPageview("/ThorntonsSite/pages/servery/AT_BuyMeChangeMessageClick");

			window.location.href = "AlphabetTrufflesFT.asp?box_id=" + _AT_box_id;
		}
	}

	// ----------------------------------------------------------------------------- _setURL()
	function _setURL(sURL)
	{
		sSiteURL = sURL;
	}

	// ----------------------------------------------------------------------------- SetMaxSize()
	function SetMaxSize(iSize)
	{
		iMaxSize = iSize;
	}

	// ----------------------------------------------------------------------------- GetMaxSize()
	function GetMaxSize()
	{
		return iMaxSize;
	}

	// ----------------------------------------------------------------------------- _getURL()
	function _getURL()
	{
		return sSiteURL;
	}

	// ----------------------------------------------------------------------------- resetOccasionsDropdown()
	function resetOccasionsDropdown(lResetToBlank, lDisplayLastOccasion, lItemOnBasket)
	{
		// Special function when returning from "finishing touches" tab.
		if (lResetToBlank == true)
		{
			xUtil.getObject('drpOccasions').value = "0";
			this.selectOccasion("0", "");
		}
		else if (lDisplayLastOccasion == true)
		{
			xUtil.getObject('drpOccasions').value = sPrefilledOccasionID;
			this.selectOccasion(sPrefilledOccasionID, sPrefilledVariantID);
		}

		// We've just come back from the "Finishing Touches" tab page. Change "add to basket" to "update basket".
		lUpdateBasket = lItemOnBasket;
		if (lItemOnBasket == true)
			sBasketMessage = oOrderOptions.returnAT_BoxMessage();

	}

	function selectOccasion(sValue, sDefaultVariantID)
	{
		// NOT YET: By moving away from the current selection we reset lUpdateBasket to false.
		// lUpdateBasket = false;

		sPrefilledOccasionID = sValue;
		if (sValue == "0")
		{
			// No Occasion selected. Revert back to the Typewriter grid selection.
			//xUtil.getObject('oAlphabetTruffleBoxImage').style.display = "block";

			xUtil.getObject('oPrefilledTrufflesContainer').style.display = "none";
			xUtil.getObject('oAlphabetTrufflesContainer').style.display = "block";

			xUtil.getObject('AT_BoxSize_'+iBoxSize).className = "BoxText_on";
		}
		else
		{
			xUtil.getObject('AT_BoxSize_'+iBoxSize).className = "BoxText";

			//xUtil.getObject('oAlphabetTruffleBoxImage').style.display = "none";
			xUtil.getObject('divPrefilledBoxes').innerHTML = "<div align='center' class='loading'><img src='/PUBLIC/IMAGES/SERVERY/indicator.gif' style='margin:5px 0px 10px 0px;'/><br/><strong>Loading...</strong></div>";

			// Collect all Boxes for the Occasion
			var sURL = "getOccasionPrefilledBoxes.asp?id=" + sValue + "&variantid=" + sDefaultVariantID;
			sURL += '&ran=' + Math.floor(Math.random()*10001)

			var oAJAXBoxList = new AjaxDelegate(sURL, _AJAX_UpdatePrefilledBoxList);
			bWait = true;
			oAJAXBoxList.Fetch();
		}
	}

	function backToBespokeSelectionGrid()
	{
		//xUtil.getObject('oAlphabetTruffleBoxImage').style.display = "block";

		xUtil.getObject('oPrefilledTrufflesContainer').style.display = "none";
		xUtil.getObject('oAlphabetTrufflesContainer').style.display = "block";

		xUtil.getObject('AT_BoxSize_'+iBoxSize).className = "BoxText_on";
	}

	// ------------------------------------------------------------------------------- _AJAX_UpdatePrefilledBoxList()
	function _AJAX_UpdatePrefilledBoxList(url, sHTML)
	{
		xUtil.getObject('divPrefilledBoxes').innerHTML = sHTML;

		var nCharPosStart = sHTML.indexOf("#BOX:START#");

		if (nCharPosStart > 0)
		{
			var nCharPosEnd = sHTML.indexOf("#BOX:END#");

			var sChosenVariant = sHTML.substr(nCharPosStart + 11, (nCharPosEnd - (nCharPosStart + 11)));
			var aChosenVariant = sChosenVariant.split("|");

			nCharPosStart = sHTML.indexOf("#BOXLIST:START#");
			nCharPosEnd = sHTML.indexOf("#BOXLIST:END#");
			var sBoxList = sHTML.substr(nCharPosStart + 15, (nCharPosEnd - (nCharPosStart + 15)));
			aBoxPositions = sBoxList.split("|");

			sPrefilledVariantID = aChosenVariant[0];
			sPrefilledProductID = aChosenVariant[1];
			//sPrefilledDisplayMessage = _FormatDisplayMessage(aChosenVariant[2]);
			sPrefilledDisplayMessage = aChosenVariant[2];
			sPrefilledMessage = aChosenVariant[3];
			sPrefilledPrice = aChosenVariant[5];
			sPrefilledImageName = aChosenVariant[6];
			sPrefilledBoxSize = aChosenVariant[8];
			sPrefilledBoxWeight = aChosenVariant[9];

			xUtil.getObject('imgPrefilledTruffleBox').src = "/PUBLIC/PICTURES/SERVERY/BOX/LARGE/" + aChosenVariant[6];
			xUtil.getObject('divPrefilledMessage').innerHTML = _FormatDisplayMessage(aChosenVariant[2]);
			xUtil.getObject('divPrefilledDescription').innerHTML = aChosenVariant[4];
			xUtil.getObject('divPrefilledPrice').innerHTML = "&#163;" + aChosenVariant[5];
			xUtil.getObject('divPrefilledPricePerWeight').innerHTML = aChosenVariant[7];
			//xUtil.getObject('divPrefilledProductID').innerHTML = "Product code: " + aChosenVariant[1];
			xUtil.getObject('divPrefilledProductID').innerHTML = "Product code: " + aChosenVariant[0];

			xUtil.getObject('oAlphabetTrufflesContainer').style.display = "none";
			xUtil.getObject('oPrefilledTrufflesContainer').style.display = "block";

			wndo[2] = new dw_scrollLayer('wn3', 'lyr3');
			wndo[2].setUpScrollbar("dragBar3", "track3", "v", 1, 1);

			// Always scroll down to the selected variant
			wndo[2].scrollToBox3("down", oAlphabetTruffleBox.scrollToBox(sPrefilledVariantID), oAlphabetTruffleBox.iBoxPosition(sPrefilledVariantID), sPrefilledVariantID);
		}

		bLoaded = true;
		bWait = false;
	}

	function selectPrefilledBox(sVariantID, sProductID, sDisplayMessage, sMessage, sDescription, sPrice, sImageFileName, sPricePerWeight, sBoxSize, sBoxWeight)
	{
		xUtil.getObject('divPrefilled_' + sPrefilledVariantID).className = "";
		xUtil.getObject('divPrefilled_Text_' + sPrefilledVariantID).className = "BoxText";

		sPrefilledVariantID = sVariantID;
		sPrefilledProductID = sProductID;
		//sPrefilledDisplayMessage = _FormatDisplayMessage(sDisplayMessage);
		sPrefilledDisplayMessage = sDisplayMessage;
		sPrefilledMessage = sMessage;
		sPrefilledPrice = sPrice;
		sPrefilledImageName = sImageFileName;
		sPrefilledBoxSize = sBoxSize;
		sPrefilledBoxWeight = sBoxWeight;

		xUtil.getObject('divPrefilled_' + sVariantID).className = "Prefilled_Selected";
		xUtil.getObject('divPrefilled_Text_' + sVariantID).className = "BoxText_on";

		xUtil.getObject('imgPrefilledTruffleBox').src = "/PUBLIC/PICTURES/SERVERY/BOX/LARGE/" + sImageFileName;
		xUtil.getObject('divPrefilledMessage').innerHTML = _FormatDisplayMessage(sDisplayMessage);
		xUtil.getObject('divPrefilledDescription').innerHTML = sDescription;
		xUtil.getObject('divPrefilledPrice').innerHTML = "&#163;" + sPrice;
		xUtil.getObject('divPrefilledPricePerWeight').innerHTML = sPricePerWeight;
		xUtil.getObject('divPrefilledProductID').innerHTML = "Product code: " + sVariantID;
	}

	function _FormatDisplayMessage(sMessage)
	{
		var sReturnValue = sMessage.replace(/\[SMILEY\]/g, "<IMG src='/PUBLIC/IMAGES/SERVERY/ALPHABET/Text_Beige_[SMILEY].jpg' border='0'>");
		sReturnValue = sReturnValue.replace(/\[HEART\]/g, "<IMG src='/PUBLIC/IMAGES/SERVERY/ALPHABET/Text_Beige_[HEART].jpg' border='0'>");
		sReturnValue = sReturnValue.replace(/\[SAD\]/g, "<IMG src='/PUBLIC/IMAGES/SERVERY/ALPHABET/Text_Beige_[SAD].jpg' border='0'>");
		sReturnValue = sReturnValue.replace(/\[STAR\]/g, "<IMG src='/PUBLIC/IMAGES/SERVERY/ALPHABET/Text_Beige_[STAR].jpg' border='0'>");

		return sReturnValue;
	}

	function _okToLeave()
	{
		var lExitThisPage = true;

		//*** TB: We now write to a cookie every time a grid selection is filled.
		//*** Only rememeber if we're entering a new box.
		//if (lUpdateBasket == false)
		//{
		//	//*** Has anything been entered into the box?
		//	if (IsTheBoxEmpty() == false)
		//	{
		//		var expireDate = new Date();
		//		expireDate.setDate(expireDate.getFullYear() + 1);
		//		xUtil.writeCookie("Thorntons_AlphabetTruffles_NewMessage", ReturnChocList(), expireDate);
		//	}
		//	else
		//	{
		//		//*** It was an empty box so make sure cookie is deleted.
		//		var expireDate = new Date();
		//		expireDate.setDate(expireDate - 1);
		//		xUtil.writeCookie("Thorntons_AlphabetTruffles_NewMessage", ReturnChocList(), expireDate);
		//	}
		//}

		return lExitThisPage;
	}

	function _okToLeave_OLD()
	{

		var lExitThisPage = false;

		if (xUtil.getObject('oAlphabetTrufflesContainer').style.display == "block")
		{
			var lDisplayPopup1 = false;
			var lDisplayPopup2 = false;

			//TB: This needs changing:
			if (IsTheBoxFull() == false)
				lDisplayPopup1 = true;

			if (lUpdateBasket == true)
			{
				var sMessageNow = "";
				if (xUtil.getObject('oAlphabetTrufflesContainer').style.display == "block")
				{
					sMessageNow = "" + this.returnChocList();
					sMessageNow = sMessageNow.replace(/,/g,'');
				}
				else
					sMessageNow = sPrefilledMessage;

				if (sMessageNow !== sBasketMessage)
					lDisplayPopup2 = true;
			}

			// At the moment we display only one popup "oBoxLeavingPageMsg1". "oBoxLeavingPageMsg2" does exist but Thorntons couldn't agree to pay!
			if (lDisplayPopup1 == true)
				xUtil.displayPopUp('oBoxLeavingPageMsg1', 400, 150)
			else if (lDisplayPopup2 == true)
				xUtil.displayPopUp('oBoxLeavingPageMsg1', 400, 150)
			else
				lExitThisPage = true;
		}
		else
		{
			lExitThisPage = true;
		}

		return lExitThisPage;
	}

	//[1.1]
	function CheckForProfanity(sProfwords){
		var blngoodmsg;
		blngoodmsg=true;
		var sMsg=this.returnChocList();
		sMsg=sMsg.split("[SPACE]");
		for(var k = 0; k < sMsg.length; k++){
			if(isinarray(sMsg[k],sProfwords)==true){
				blngoodmsg=false;
				break;
			}
			else{
				continue;
			}
		}
		if(blngoodmsg){
			//alert("Good message");
			return true
		}
		else{
			alert("The message you have entered may contain some offensive words. Please amend your message");
			return false
		}

	}
	function isinarray(ssearch,sProfwords){
		var sWord;
		var blnbadword;
		var str_word;
		blnbadword=false;
		sWord=replaceAll(ssearch,",","");
		for(var ind= 0;ind<sProfwords.length; ind++){
			str_word= sProfwords[ind];
			if(issame(str_word.toString(),sWord.toString())==true){
				blnbadword=true;
				break;
			}
			else{
				continue;
			}
			str_word = "";
		}
		return blnbadword;
	}
	function replaceAll(argvalue, x, y){
	  	if ((x == y) || (parseInt(y.indexOf(x)) > -1)) {

	   	 return false;
	  	}

		  while (argvalue.indexOf(x) != -1) {
		    var leading = argvalue.substring(0, argvalue.indexOf(x));
		    var trailing = argvalue.substring(argvalue.indexOf(x) + x.length,
			argvalue.length);
		    argvalue = leading + y + trailing;
		  }
		  return argvalue;
	}

	function issame(sProfword,sSearchWord){
		var flag;
		var intlength1;
		var intlength2;
		var arr1 = new Array();
		var arr2 = new Array();
		var j,k,m,p, str1,str2;
		flag=false;
		intlength1= sProfword.length;
		intlength2= sSearchWord.length;
		m=0;
		if(parseInt(intlength1)==parseInt(intlength2)){
				if(sProfword.toUpperCase().charAt(0)==sSearchWord.toUpperCase().charAt(0))
				{
					for(var i = 0;i< intlength1;i++)
					{
						if(sProfword.charAt(i)=='*')
						{
							continue;
						}
						else
						{
							arr1[m]= sProfword.charAt(i).toUpperCase().toString()
							arr2[m] = sSearchWord.charAt(i).toUpperCase().toString()
							m++;
						}

					}

					str1 = '';
					str2 = '';
					for(j=0;j<arr1.length;j++)
					{

						str1 = str1 + arr1[j]
						str2 = str2 + arr2[j]
					}
					if(str1.toUpperCase() == str2.toUpperCase())
					{
						flag = true;
					}


				}

		}
		else{
			flag=false;
		}
		return flag
	}
	//[/1.1]

	function disableOpeningMessage()
	{
		xUtil.closeWindow("oBoxFirstTimeInMsg");
		var expireDate = new Date();
		expireDate.setDate(expireDate.getFullYear() + 1);
		xUtil.writeCookie("Thorntons_AlphabetTruffles_DisableMsg", "true", expireDate);
	}



	// ---------------------------------- REDUNDANT FUNCTIONS -----------------------------------------


	// ------------------------------------------------------------------------------- offerBoxUpgrade()
	// TB: Not being used anymore
	function offerBoxUpgrade()
	{
		// Offer an upgrade only if we've entered the last chocolate in the box
		// Make sure we have a box to upgrade to! The next box might be out of stock.
		// If there is an upgrade then we show the correct Box image and button in the Overlay.
		// If no upgrade available then display a standard "Your box is complete" overlay.
		if (this.checkUpgradeAvailable() == true)
		{
			//xUtil.displayPopUp('oBoxUpsellMsg', 380, 350);
			xUtil.displayPopUpMessage('oBoxUpsellMsg2');
		}
		else
		{
			//xUtil.displayPopUp('oBoxCompleteMsg', 380, 350);
			xUtil.displayPopUpMessage('oBoxCompleteMsg2');
		}
	}



}