/*
	'*' version note [1.1] 02-04-2007 MS bug 2611: clear form after add to basket,
	'*' version note [1.2] 03-04-2007 MS bug 2611: if no quantities entered, alert the customer, set quantity to nothing after submitting to basket
	'*' version note [1.3] 05/04/2007 MS bug: 2684: added position basket in _AJAX_ConfirmAddToBasket to reposition the basket if the user scrolls down the page
	'*' version note [1.4] 10/04/2007 MS Change Request 2.2 update basket display in header to show total number of lineitems rather than total number of items
	'*' version note [1.5] 15/05/2007 MS bug 07-4971: basket items overwriting so only ever one item in basket, losing basket when moving to another page. more info in RN-07-4971-BadCookie.doc

*/

var fx = new Fx.Styles($('oBasketContainer'), {duration: 800, wait: false});

function oAJAXBasket() {

	this.initialise 						= _initialise;

	this.AJAX_AddtoBasket 				= _AJAX_AddtoBasket;
	this.AJAX_ConfirmAddToBasket 		= _AJAX_ConfirmAddToBasket;
	this.multiAddToBasket				= _multiAddToBasket;
	this.isValidMultiAddQty				= _isValidMultiAddQty;
	this.AJAX_ConfirmMultiAddToBasket	= _AJAX_ConfirmMultiAddToBasket;

	this.isValidQty						= _isValidQty;
	this.setBasketProdImg				= _setBasketProdImg
	this.hideBasket					= _hideBasket;
	this.hideDiv						= _hideDiv;
	this.positionBasket					= _positionBasket;
	this.returnFormFieldsExclude			= _returnFormFieldsExclude;
	this.setURL						= _setURL;
	this.selectVariant					= _selectVariant;
	//[1.5]
	this.AJAX_Blank					= _AJAX_Blank;
	//end [1.5]

	var p_sSiteURL					= '';
	var oBasketBck 					= null;
	var oForm						= null;

	var sBasketProdImg				= '';
	var timerComfirmation				= null;
	var oBasketContainer 				= null;

	// ----------------------------------------------------------------------------- _initialise()
	function _initialise() {
		oBasketBck = oSP.getObject("oBasketBck")
		//oBasketBck.style.backgroundImage = "url(/public/images/basket_box.gif)";

		oBasketContainer = oSP.getObject('oBasketContainer')

		_positionBasket();
	}

	// ----------------------------------------------------------------------------- _setBasketProdImg()
	function _setBasketProdImg(sPath_p) {
		sBasketProdImg = sPath_p;
	}

	// ----------------------------------------------------------------------------- _setURL()
	function _setURL(sSiteURL_p) {
		p_sSiteURL = p_sSiteURL;
	}


	// ----------------------------------------------------------------------------- _multiAddToBasket()
	function _multiAddToBasket(sFormName) {

		//[1.5]
		var sURL = p_sSiteURL + '/RemoveBadCookie.asp';
		var oAJAXRemoveCookie = new AjaxDelegate(sURL, _AJAX_Blank);
		oAJAXRemoveCookie.Fetch();
		//end [1.5]

		oForm = document.forms[sFormName];
		var sFormParams = _returnFormFieldsExclude(oForm, 'serial|prodname|timestamp|prod|item0_stock|item1_stock|item2_stock|item3_stock|item4_stock|item5_stock|item6_stock|item7_stock|item8_stock|item9_stock|chkbox_0|chkbox_1|chkbox_2|chkbox_3|chkbox_4|chkbox_5|chkbox_6|chkbox_7|chkbox_8|chkbox_9|prod_1|prod_2|prod_3|prod_4|prod_5|prod_6|prod_7|prod_8|prod_9');

		//02-04-2007 MS
		for(j=0; j<10; j++){
			oForm.elements['tmpQ' + j].value = oForm.elements['qty_' + j].value;
		}
		//end MS

		if (_isValidMultiAddQty(sFormName)) {

			//[1.4]
			sURL = p_sSiteURL + '/site_includes/runFunction.asp?' + sFormParams + '&inc_price=true';
			//end [1.4]
			sURL+= '&ran=' + Math.floor(Math.random()*10001)

			var oAJAXAddToBasket = new AjaxDelegate(sURL, _AJAX_ConfirmMultiAddToBasket);
			oAJAXAddToBasket.Fetch();

			//[1.1] reset the form
			for(i=0; i<10; i++){

				//product id field
				oForm.elements['prod_' + i].value = '';
				oForm.elements['prod_' + i].disabled = false;

				//product name field
				oSP.getObject("prodName_" + i).innerHTML = '<img src="/PUBLIC/IMAGES/spacer.gif" width="1" height="1"/>';
				oSP.getObject("prodName_" + i).innerHTML = '<img src="/PUBLIC/IMAGES/spacer.gif" width="1" height="1"/>';
				oSP.getObject("prodName_" + i).className = 'normal'

				//product price field
				oSP.getObject("prodPrice_" + i).innerHTML = '<img src="/PUBLIC/IMAGES/spacer.gif" width="1" height="1"/>';

			//product qty field
				oForm.elements['qty_' + i].value ='';
				oForm.elements['qty_' + i].disabled = true;
				oForm.elements['qty_' + i].className ='qtyOut';

				//include checkbox field
				oForm.elements['chkbox_' + i].checked = false;
				oForm.elements['chkbox_' + i].disabled = true;
			//end [1.1]
			}

		} else {
			// No products have a qty > 1
			//
			alert("You have not entered any quantities. You must enter a quantity greater than 0 to add the product to the basket.");
		}
	}


	// ----------------------------------------------------------------------------- _AJAX_ConfirmMultiAddToBasket()
	function _AJAX_ConfirmMultiAddToBasket(url, sHTML) {


			//Update the basket total in the page header
			oSP.updateBasketTotal(null, sHTML)

			var oVariantInfo = oSP.getObject("oVariantInfo")
			var sBasketText = '';
			var iMultiAddIndex;
			var iCounter = 0;

			for(i=0; i<oForm.elements.length; i++) {
				//[1.1] get quantity from tmpQ field not _qty field
				//if (oForm.elements[i].name.indexOf('_qty') > 0 && parseFloat(oForm.elements[i].value) > 0 ) {
				if (oForm.elements[i].name.indexOf('tmpQ') >= 0 && parseFloat(oForm.elements[i].value) > 0 ) {
					iMultiAddIndex = oForm.elements[i].name.substring(4,5)

					sBasketText += oForm.elements['tmpQ' + iMultiAddIndex].value + ' x ' + oForm.elements['item' + iMultiAddIndex + '_prodname'].value;

					if (oForm.elements['item' + iMultiAddIndex + '_variant_option_1'].value && oForm.elements['item' + iMultiAddIndex + '_variant_option_2'].value){
						sBasketText +=  ' (' + oForm.elements['item' + iMultiAddIndex + '_variant_option_1'].value + ' ' + oForm.elements['item' + iMultiAddIndex + '_variant_option_2'].value + ')';
					}
					else{
						if (oForm.elements['item' + iMultiAddIndex + '_variant_option_1'].value){
							sBasketText +=  ' (' + oForm.elements['item' + iMultiAddIndex + '_variant_option_1'].value + ')';
						}
						else{
							if (oForm.elements['item' + iMultiAddIndex + '_variant_option_2'].value){
								sBasketText +=  ' (' + oForm.elements['item' + iMultiAddIndex + '_variant_option_2'].value + ')';
							}
						}
					}

					sBasketText += '<br/>'
					iCounter ++;

				}
			}


			oVariantInfo.innerHTML = sBasketText;


			//oSP.getObject("oBasketProductImg").src = sBasketProdImg + '/' + oForm.elements['item_variant_image'].value;

			//Resize the pop depending on how many products have been added.
			oBasketContainer.style.height = (14 * iCounter) + 100 + 'px';

			//Display the basket success message
			oBasketContainer.style.display = "block";

			var iYPosition = (self.pageYOffset) ? parseFloat(self.innerHeight + self.pageYOffset) - parseFloat(oBasketContainer.style.height.replace('px','')) : parseFloat(document.documentElement.clientHeight + document.documentElement.scrollTop) - parseFloat(oBasketContainer.style.height.replace('px',''));

			
			fx.start({
				'top': [iYPosition]
			});

			timerComfirmation = self.setTimeout(function() {_hideBasket()}, 5000)
	}




	// ----------------------------------------------------------------------------- _AJAX_AddtoBasket()
	function _AJAX_AddtoBasket(sFormName, sProdCode) {

		//[1.5] always remove bad cookie which sometimes occurs on user's computer
		var sURL = p_sSiteURL + '/RemoveBadCookie.asp';
		var oAJAXRemoveCookie = new AjaxDelegate(sURL, _AJAX_Blank);
		oAJAXRemoveCookie.Fetch();
		//end [1.5]

		oForm = document.forms['form_' + sFormName];

		var iQty = oForm.elements['qty'].value;
		var sFormParams = _returnFormFieldsExclude(oForm, 'serial|prodname');

		if (_isValidQty(iQty)) {


			//[1.4]
			sURL = p_sSiteURL + '/site_includes/runFunction.asp?' + sFormParams + '&inc_price=true&rQty=' + iQty;
			//end [1.4]
			sURL+= '&ran=' + Math.floor(Math.random()*10001)

			var oAJAXAddToBasket = new AjaxDelegate(sURL, _AJAX_ConfirmAddToBasket);
			oAJAXAddToBasket.Fetch();

			//Reset the qty back to zero
			oForm.elements['qty'].value = 0;
		} else {

		}
	}

	// ----------------------------------------------------------------------------- _AJAX_ConfirmAddToBasket()
	function _AJAX_ConfirmAddToBasket(url, sHTML) {

			//Update the basket total in the page header
			var aReturnParams = sHTML.split('|');
			oSP.updateBasketTotal(null, aReturnParams[0] + '|' + aReturnParams[1])

			// Populate the basket success message
			var oVariantInfo = oSP.getObject("oVariantInfo")
			oVariantInfo.innerHTML = '<img src="/PUBLIC/IMAGES/spacer.gif" width="1" height="22" style="display:inline;"/>' + aReturnParams[2] + ' x ' + oForm.elements['prodname'].value;
			if (oForm.elements['item_variant_option_1'].value && oForm.elements['item_variant_option_2'].value){
				oVariantInfo.innerHTML = oVariantInfo.innerHTML + ' (' + oForm.elements['item_variant_option_1'].value + ' ' + oForm.elements['item_variant_option_2'].value + ')';
			}
			else{
				if (oForm.elements['item_variant_option_1'].value){
					oVariantInfo.innerHTML = oVariantInfo.innerHTML + ' (' + oForm.elements['item_variant_option_1'].value + ')';
				}
				else{
					if (oForm.elements['item_variant_option_2'].value){
						oVariantInfo.innerHTML = oVariantInfo.innerHTML + ' (' + oForm.elements['item_variant_option_2'].value + ')';
					}
				}
			}

			//oSP.getObject("oBasketProductImg").src = sBasketProdImg + '/' + oForm.elements['item_variant_image'].value;

			//[1.3]
			_positionBasket();
			//[/1.3]

			//Display the basket success message
			oBasketContainer.style.display = "block";

			var iYPosition = (self.pageYOffset) ? parseFloat(self.innerHeight + self.pageYOffset) - parseFloat(oBasketContainer.style.height.replace('px','')) : parseFloat(document.documentElement.clientHeight + document.documentElement.scrollTop) - parseFloat(oBasketContainer.style.height.replace('px',''));

			fx.start({
				'top': [iYPosition]
			});

			timerComfirmation = self.setTimeout(function() {_hideBasket()}, 5000)
	}


	//[1.5]
	// ----------------------------------------------------------------------------- _AJAX_Blank()
	function _AJAX_Blank(url, sHTML) {

	}
	//end [1.5]

	// ----------------------------------------------------------------------------- _isValidQty()
	function _isValidQty(iVal) {
		var rIsNotNumeric = /[^0-9]/
		var rIsNotZero = /[1-9]+/
		var bValid = true;

		if ( rIsNotNumeric.test(iVal) || !rIsNotZero.test(iVal) ) {
			bValid = false
			alert("Quantity must be valid number greater than 0");
		}

		return bValid;
	}

	// ----------------------------------------------------------------------------- _hideBasket()
	function _hideBasket() {
		self.clearTimeout(timerComfirmation);
		if (oBasketContainer.style.display == "block") {
			var iYPosition = parseFloat(document.documentElement.clientHeight + document.documentElement.scrollTop);

			fx.start({
				'top': [iYPosition]
			}).chain(function(){
				_hideDiv("oBasketContainer")
			});
		}
	}

	// ----------------------------------------------------------------------------- _hideDiv()
	function _hideDiv(oDIV) {
		oSP.getObject(oDIV).style.display = "none";
	}

	// ----------------------------------------------------------------------------- _positionBasket()
	function _positionBasket() {
		// Position the basket confirmation msg
		var iCenterHeight
		var iCenterWidth

		iCenterHeight = (self.pageYOffset || self.innerHeight) ? parseFloat(self.pageYOffset) + parseFloat(self.innerHeight) : parseFloat(document.documentElement.scrollTop) + parseFloat(document.documentElement.clientHeight);
		iCenterWidth = (self.pageXOffset) ? parseFloat(self.innerWidth) - parseFloat(oBasketContainer.style.width.replace('px','')) - 20 : parseFloat(document.documentElement.clientWidth) - parseFloat(oBasketContainer.style.width.replace('px','')) - 20 ;

		oBasketContainer.style.left = iCenterWidth + "px";
		oBasketContainer.style.top = iCenterHeight + "px";
		oBasketContainer.style.display = "none";
	}


	// ----------------------------------------------------------------------------- _isValidMultiAddQty()
	function _isValidMultiAddQty(sFormName) {
	/* Checks the Multi Add To Basket form for at least one product with a qty > 1
	*/
		var oForm = document.forms[sFormName];
		var bOk = false

		for(i=0; i<oForm.elements.length; i++) {
			if (oForm.elements[i].name.indexOf('_qty') > 0 && parseFloat(oForm.elements[i].value) > 0 ) {
				bOk = true;
				break;
			}
		}

		return bOk;

	}

	// ----------------------------------------------------------------------------- _returnFormFieldsExclude()
	function _returnFormFieldsExclude(oForm, sExclude) {
	/* Used to gather all the form fields in the incoming form object
	*/
		sExcludesArray = new Array
		sExcludesArray = sExclude.split("|");

		var sMsg = '';
		var sFormParams = '';
		var bAdd = false;

		for(i=0; i<oForm.elements.length; i++) {

			bAdd = ( (oForm.elements[i].value=='') || (oForm.elements[i].type=="radio" && !(oForm.elements[i].checked)) ||  (oForm.elements[i].type=="checkbox" && !(oForm.elements[i].checked)  && (oForm.elements[i].disabled==false)) ) ? false : true;

			if (bAdd) {
				for (s in sExcludesArray) {
					if (oForm.elements[i].name.indexOf(sExcludesArray[s]) == 0){
						bAdd = false;
					}
				}
				if (bAdd == true) {
					sMsg = sMsg + (oForm.elements[i].name + " = " + oForm.elements[i].value + "\n");
					sFormParams = sFormParams + ("&" + oForm.elements[i].name + "=" + oForm.elements[i].value);
				}
			}
		}

		if (oSP.Left(sFormParams,1) == "&")  sFormParams = oSP.Right(sFormParams, sFormParams.length - 1)

		return sFormParams
	}



	// ----------------------------------------------------------------------------- _selectVariant()
	function _selectVariant(sFormName, sProductID, sVariantID, sOption1, sOption2, iPrice, sStockLabel) {

		_hideBasket();

		var oForm = document.forms['form_' + sFormName];

		oForm.elements['varPrice'].value = iPrice;
		oForm.elements['variantid'].value = sVariantID;
		oForm.elements['item_variant_option_1'].value = sOption1;
		oForm.elements['item_variant_option_2'].value = sOption2;

		_AJAX_AddtoBasket(sFormName, sProductID);

	}

}