//================================
//Class Item v3.0
// v3 Include Availability
//================================
function CItem(ID, Description, Price, Quantity, ImgString, Availability, Pointer) {
	this.m_ID = ID;
	this.m_Description = Description;
	this.m_Price = Price;
	this.m_Quantity = Quantity;
	this.m_ImgString = ImgString;
	this.m_Availability = Availability;
	this.m_Pointer = Pointer;
	
	this.Total = function () {
				return ToCurrency(parseInt(this.m_Quantity) * parseFloat(this.m_Price));
		}			
}

//================================
//Class ShoppingCart v2.9
//================================

function CJavascriptShoppingCart() {
	this.iItemCount = 0;
	this.PStart = 0;
	this.FreeSpace = 0;
	this.iItem = new Array();
	this.LastAddress = 0;

	this.AddItem = function(PItem) {
		if (this.iItem[this.LastAddress] != null) 
			this.iItem[this.LastAddress].m_Pointer = this.FreeSpace;
		this.iItem[this.FreeSpace] = new CItem(PItem.m_ID, PItem.m_Description, PItem.m_Price, PItem.m_Quantity, PItem.m_ImgString, PItem.m_Availability,-1);
		this.LastAddress = this.FreeSpace;
		this.iItemCount++;
		this.FreeSpace = this.FindNextFree();	
	}
 
	this.RemoveItem = function(ID) {
		var tmp = this.PStart;
		if (this.iItemCount != 0) {
			if (ID == this.iItem[this.PStart].m_ID) {
				this.PStart = (this.iItem[this.PStart].m_Pointer == -1) ? 0 : this.iItem[this.PStart].m_Pointer;
				delete this.iItem[tmp];
			} else {
				var n = this.PStart;
				while ( ID!=this.iItem[this.iItem[n].m_Pointer].m_ID)  
					n = this.iItem[n].m_Pointer;
				if (this.iItem[this.iItem[n].m_Pointer].m_Pointer  == -1)  
					this.LastAddress = n;
				tmp = this.iItem[n].m_Pointer
				this.iItem[n].m_Pointer = this.iItem[this.iItem[n].m_Pointer].m_Pointer;
				delete this.iItem[tmp];			
			}
			this.FreeSpace = this.FindNextFree();
			this.iItemCount--; 
		}
	}

	this.FindNextFree = function() {
		for (var i = 0; i<=this.iItemCount; i++)
			if (this.iItem[i] == null) 
				return i;
	}

	this.FindItem = function(ID) {
		var n = this.PStart;
		if (this.iItemCount <=0) return -1;
		while (ID!=this.iItem[n].m_ID) {
			n = this.iItem[n].m_Pointer;
			if (n == -1) return -1;
		}
		if (this.iItem[n].m_ID == ID) return this.iItem[n]; else return -1;
	}
	
	this.FindItemIndex = function(ID) {
		var n = this.PStart;
		var iCount = 1;
		
		if (this.iItemCount <=0) return -1;
		while (ID!=this.iItem[n].m_ID) {
			iCount = iCount + 1;
			n = this.iItem[n].m_Pointer;
			if (n == -1) return -1;
		}
		if (this.iItem[n].m_ID == ID) return iCount; else return -1;
	}
	
	this.GetItemByIndex = function(iIndex) {
		var n = this.PStart;
		if (this.iItemCount <=0 || iIndex > this.iItemCount) return -1;
		for (var i = 0; i<iIndex; i++) {
			n = this.iItem[n].m_Pointer;
		}
		return this.iItem[n];
	}
	
	this.GetNoItems = function() {
		return this.iItemCount;
	}
	
	this.GetTotalQty = function() {	
		var n = this.PStart;
		var iTotalQty = 0;
		
		if (this.iItemCount <=0) return 0;
		while (n !=-1) {
			iTotalQty += parseInt(this.iItem[n].m_Quantity);
			n = this.iItem[n].m_Pointer;
			if (n == -1) return iTotalQty;
		}
		return iTotalQty;
	}
	
	this.GetSubTotal = function() {
		var subTotal = 0;
		var n = this.PStart;
		if (this.GetNoItems() == 0) return ToCurrency(0);
		while (n != -1) {
			subTotal += parseFloat(this.iItem[n].Total());
			n = this.iItem[n].m_Pointer;
		}
		
		return ToCurrency(subTotal);
	}
			
	this.GetVat = function() {	
		return this.GetSubTotal() * .175;
	}
	
	
	this.GetGTotal = function() { 
		return this.GetSubTotal() + this.GetVat(); 
	}
	
	// If subtotal is > £49.99 then don't charge but if less then £49.99 charge £3.99
	this.GetTotalAndPP = function(Addition, bFromStore) {
		if (this.GetSubTotal() >= 29.99) {
			return ToCurrency(parseFloat(this.GetSubTotal()) + parseFloat(Addition)); 
		} else {
			if (bFromStore) 
				return this.GetSubTotal() ;
			else 
				return ToCurrency(parseFloat(this.GetSubTotal()) + 3.99 + parseFloat(Addition));
		}
	 }
	 
	this.GetPPValue = function(Addition, bFromStore) { 
		if (this.GetSubTotal() >= 29.99) {
			return 0 ;
		} else {
			if (bFromStore) 
				return 0 ; 
			else 
				return 3.99 + parseFloat(Addition);
		}
	}
	
	this.HasItems = function() { 
		if (this.iItemCount > 0)  
			return true;
		else
			return false;
	}
	
	this.HasPreOrderItems = function() {
		var n = this.PStart;
		if (this.GetNoItems() == 0) return false;

		while (n != -1) {
			if (this.iItem[n].m_Availability == "Pre Order" || this.iItem[n].m_Availability == "In Stock Collection") 
				return true;
			n = this.iItem[n].m_Pointer;
		}
		
		return false;
	}
}

ShoppingCart = new CJavascriptShoppingCart();
