/*
DEPRECATED - See camjOM-2.0.js

This is only in use by Abbeys at the time of writing.

Ajax Order Management
Current Version: 1.0 (03/02/2010)
Dependencies: camjax 2.82

Initial Release


The Ajax Order Management JavaScript library may be used by BHC e-commerce applications
to change aspects of an order without leaving the page, and retrieve appropriate 
information in return after order totals etc. are recalculated as the result of changes.

*/

if(!camjaxController || camjaxController == 'undefined')
{
	alert("Warning: Camjax Controller has not been initialised. Ajax Order Management library will not function.");
}

function AjaxOrderLine()
{
	this.id = '';
	this.quantity = 0;
	this.unitCost = 0;
	this.totalCost = 0;
}

function AjaxOrder()
{
	this.total = 0;
	this.totalExTax = 0;
	this.totalExShipping = 0;
	this.subTotal = 0;
	this.taxAmount = 0;
	this.shippingCost = 0;
	this.orderLines = new Array();
}

function AjaxOrderManager()
{
	this.lastChangeTimes = new Array();
	this.changeDelay = 0.5;
	this.shoppingCartActionUrl = '/shop/shoppingCart.do';
	
	this.orderLineQuantityFieldPrefix = 'aom_orderLineQuantity';
	this.orderLineTotalCostFieldPrefix = 'aom_orderLineTotalCost';
	this.orderSubTotalFieldId = 'aom_orderSubTotal';
	this.orderShippingCostFieldId = 'aom_orderShippingCost';
	this.orderTaxAmountFieldId = 'aom_orderTaxAmount';
	this.orderTotalFieldId = 'aom_orderTotal';
	this.orderTotalExShippingFieldId = 'aom_orderTotalExShipping';
	this.orderTotalExTaxFieldId = 'aom_orderTotalExTax';

	this.changeOrderLineQuantity = changeOrderLineQuantity;
	this.checkChangeOrderLineQuantity = checkChangeOrderLineQuantity;
	this.displayUpdatedOrderData = displayUpdatedOrderData;
	
	/*
	ORDER LINE QUANTITY
	*/
	

	function changeOrderLineQuantity(quantityTextBox)
	{
		var orderLineId = getOrderLineIdFromFieldName(quantityTextBox.name);
		
		if(orderLineId != null)
		{
			var newQuantity = getValidQuantityFromFieldValue(quantityTextBox.value);
			var changeTime = new Date().valueOf();
			
			ajaxOrderManager.lastChangeTimes[orderLineId] = changeTime;
			
			setTimeout('ajaxOrderManager.checkChangeOrderLineQuantity(' + changeTime + ',\'' + orderLineId + '\',' + newQuantity + ')', ajaxOrderManager.changeDelay * 1000);
		}
	}


	
	function getOrderLineIdFromFieldName(fieldName)
	{
		if(fieldName.substring(0,ajaxOrderManager.orderLineQuantityFieldPrefix.length) != ajaxOrderManager.orderLineQuantityFieldPrefix)
		{
			alert("Field name " + fieldName + " cannot be parsed by Ajax Order Management. Expecting name: " + ajaxOrderManager.orderLineQuantityFieldPrefix + "[orderLineId]");
			return null;
		}
		
		return fieldName.substring(ajaxOrderManager.orderLineQuantityFieldPrefix.length, fieldName.length);
	}
	
	function getValidQuantityFromFieldValue(fieldValue)
	{
		if(isNaN(fieldValue) || parseInt(fieldValue) < 1)
		{
			return 1;
		}
		
		return parseInt(fieldValue);
	}
	
	function checkChangeOrderLineQuantity(changeTime, orderLineId, newQuantity)
	{
		if(changeTime == ajaxOrderManager.lastChangeTimes[orderLineId])
		{
			submitChangeOrderLineQuantity(orderLineId, newQuantity);
		}
	}
	
	function submitChangeOrderLineQuantity(orderLineId, newQuantity)
	{
		var orderLineIdParameter = 'orderLineId=' + orderLineId;
		var newQuantityParameter = '&quantity=' + newQuantity;
		var shoppingCartActionParameter = '&action=changeOrderLineQuantity';

		camjaxController.sendAjax(ajaxOrderManager.shoppingCartActionUrl, orderLineIdParameter + newQuantityParameter + shoppingCartActionParameter, ajaxOrderManager.displayUpdatedOrderData, null);
	}
	
	function displayUpdatedOrderData(responseText)
	{		
		var orderData = parseOrderUpdateData(responseText);
		
		var orderTotalField = document.getElementById(ajaxOrderManager.orderTotalFieldId);
		var orderTotalExTaxField = document.getElementById(ajaxOrderManager.orderTotalExTaxFieldId);
		var orderSubTotalField = document.getElementById(ajaxOrderManager.orderSubTotalFieldId);
		var orderShippingCostField = document.getElementById(ajaxOrderManager.orderShippingCostFieldId);
		var orderTaxAmountField = document.getElementById(ajaxOrderManager.orderTaxAmountFieldId);
		var orderTotalExShippingField = document.getElementById(ajaxOrderManager.orderTotalExShippingFieldId);
		
		updateFieldIfExists(orderTotalField, orderData.total);
		updateFieldIfExists(orderTotalExTaxField, orderData.totalExTax);
		updateFieldIfExists(orderSubTotalField, orderData.subTotal);
		updateFieldIfExists(orderShippingCostField, orderData.shippingCost);
		updateFieldIfExists(orderTaxAmountField, orderData.taxAmount);
		updateFieldIfExists(orderTotalExShippingField, orderData.totalExShipping);
		
		for(var i = 0; i < orderData.orderLines.length; i ++)
		{
			var orderLineTotalCostField = document.getElementById(ajaxOrderManager.orderLineTotalCostFieldPrefix + orderData.orderLines[i].id);
			var orderLineQuantityField = document.getElementById(ajaxOrderManager.orderLineQuantityFieldPrefix + orderData.orderLines[i].id);
			updateFieldIfExists(orderLineTotalCostField, orderData.orderLines[i].totalCost);
			
			if(orderLineQuantityField != null && orderLineQuantityField.value)
			{
				orderLineQuantityField.value = orderData.orderLines[i].quantity;
			}
			else
			{
				updateFieldIfExists(orderLineQuantityField, orderData.orderLines[i].quantity);
			}
		}
	}
	
	function parseOrderUpdateData(responseText)
	{
		var orderData = new AjaxOrder();
		orderData.total = parseFieldValue("OrderTotal", responseText);
		orderData.totalExTax = parseFieldValue("OrderTotalExTax", responseText);
		orderData.totalExShipping = parseFieldValue("OrderTotalExShipping", responseText);
		orderData.subTotal = parseFieldValue("OrderSubTotal", responseText);
		orderData.shippingCost = parseFieldValue("OrderShippingCost", responseText);
		orderData.taxAmount = parseFieldValue("OrderTaxAmount", responseText);
		
		orderData.orderLines = parseOrderLines(new Array(), responseText);
		
		return orderData;
	}
	
	function updateFieldIfExists(field, updateValue)
	{
		if(field != null && field != 'undefined')
		{
			while(field.firstChild) field.removeChild(field.firstChild);
			field.appendChild(document.createTextNode(updateValue));
		}
	}
	
	function parseOrderLines(orderLines, responseText)
	{
		var lastOrderLineIdIndex = responseText.indexOf("[OrderLineId");
		while(lastOrderLineIdIndex >= 0)
		{
			var orderLine = new AjaxOrderLine();
			
			orderLine.id = parseFieldValue("OrderLineId", responseText);
			orderLine.quantity = parseFieldValue("OrderLineQuantity", responseText);
			orderLine.totalCost = parseFieldValue("OrderLineTotalCost", responseText);
			orderLines.push(orderLine);
			
			responseText = responseText.substring(lastOrderLineIdIndex + 1, responseText.length);
			lastOrderLineIdIndex = responseText.indexOf("[OrderLineId", responseText);
			responseText = responseText.substring(lastOrderLineIdIndex, responseText.length);
		}
		
		return orderLines;
	}
	
	function parseFieldValue(fieldName, responseText)
	{
		fieldName = "[" + fieldName + "=";
		var fieldNameIndex = responseText.indexOf(fieldName);
		if(fieldNameIndex >= 0)
		{
			var result = responseText.substring(fieldNameIndex + fieldName.length);
			var endOfFieldIndex = result.indexOf("]");
			
			return result.substring(0, endOfFieldIndex);
		}
		
		return null;
	}
}

var ajaxOrderManager = new AjaxOrderManager();
