// JScript source code
var debug = false;

function ProductCalculator_Pricelist(id, type)
{
	this.id = id;
	this.type = type;
	
	this.prices = [];
	this.Interval = 1;
	
	this.AddPrice = function()
	{
		this.prices[this.prices.length] = arguments;
	}
	this.Calculate = function(quantity)
	{
		if ( this.type == PRODUCTCALCULATOR_PRICELISTTYPE.MINMAX )
			return this.DoCalculateMINMAX(quantity);
		else if ( this.type == PRODUCTCALCULATOR_PRICELISTTYPE.INTERVAL )
			return this.DoCalculateINTERVAL(quantity);
		else if ( this.type == PRODUCTCALCULATOR_PRICELISTTYPE.MINPRICE )
			return this.DoCalculateMINPRICE(quantity);
	}
	this.GetPriceIndex=function(quantity, maxIndex)
	{
		var _priceIndex = -1;
		/* Search where quantity < max */
		var _lastMax = 0;
		for( var _index = 0; _index < this.prices.length; _index++)
		{
			if ( quantity <= this.prices[_index][maxIndex] && quantity > _lastMax )
			{
				_priceIndex = _index;
				break;
			}
			_lastMax = this.prices[_index][maxIndex];
		}
		
		if ( _priceIndex == -1 )
		{
			for( var _index = 0; _index< this.prices.length; _index++)
			{
				if ( this.prices[_index][1] == -1 )
				{
					_priceIndex = _index;
					break;
				}
			}
		}
		return _priceIndex;
	}
	this.ConvertToPrice=function(sVal)
	{
		var strVal = parseFloat(sVal / 100).toString();
		
		var iDotIndex = strVal.indexOf(".");
		if ( iDotIndex < 0) 
			strVal += ".00";
		else if ( iDotIndex > (strVal.length-3) )
			strVal += "0";
		else if ( iDotIndex < (strVal.length-2) )
		{
			strVal = strVal.substring(0, iDotIndex+3);
		}
		return strVal;
	}
	this.EvalInterval=function(quantity)
	{
		//Increase quantity to match interval
		var _inotNeeded = parseInt(quantity)%parseInt(this.Interval);
		if ( quantity < this.Interval ) 
			quantity = this.Interval;
		else if ( _inotNeeded > 0)
			quantity += parseInt(this.Interval -_inotNeeded);
		return quantity;
	}
	this.DoCalculateMINPRICE=function(quantity)
	{
		//Min, Max, MinPrice, ExtraUnitPrice, NormalPrice, Currency
		var _priceIndex = this.GetPriceIndex(quantity, 1);
		if ( _priceIndex == -1 ) return [0,0,0,0,null];
		
		
		var _retVal = [quantity,0,0,this.prices[_priceIndex][1], this.prices[_priceIndex]];
		_retVal[0] = quantity;
		_retVal[1] = this.prices[_priceIndex][2];

		//Increase quantity to match interval
		_retVal[3] = quantity = this.EvalInterval(quantity);
		
		var basePrice = parseFloat( this.prices[_priceIndex][2] );
		var extraPrice = parseFloat( this.prices[_priceIndex][3] );
		var extraQuantity = quantity - parseFloat( this.prices[_priceIndex][0] );
		
		var extraTotal = parseFloat(extraPrice * extraQuantity);
		var total = parseFloat( basePrice + extraTotal );
		
		var unitPrice = parseFloat( total / quantity );
		var roundedPrice = parseInt(Math.round(unitPrice));
		var totalPrice = roundedPrice * quantity;
		
		_retVal[1] = this.ConvertToPrice( roundedPrice );
		_retVal[2] = this.ConvertToPrice( totalPrice );
		
		return _retVal;
	}
	this.DoCalculateINTERVAL=function(quantity)
	{
		var _priceIndex = this.GetPriceIndex(quantity, 1);
		
		if ( _priceIndex == -1 ) return [0,0,0,0,null];
		
		var _retVal = [quantity,0,0,this.prices[_priceIndex][1], this.prices[_priceIndex]];
		_retVal[0] = quantity;
		_retVal[1] = this.prices[_priceIndex][2];
		
		_retVal[3] = quantity = this.EvalInterval(quantity);
		
		_retVal[1] = this.ConvertToPrice( parseFloat(this.prices[_priceIndex][2]) );
		_retVal[2] = this.ConvertToPrice( parseFloat( this.prices[_priceIndex][2]*quantity ) );
		
		return _retVal;
	}
	this.DoCalculateMINMAX=function(quantity)
	{
		var _priceIndex = this.GetPriceIndex(quantity, 1);
		if ( _priceIndex == -1) return [0,0,0,0, null]; //quantity, ItemPrice, Total, MinQuantity
	
		var _retVal = [0,0,0,0, null];
		_retVal[0] = quantity;
		_retVal[1] = this.prices[_priceIndex][4]
		_retVal[3] = quantity;
		_retVal[4] = this.prices[_priceIndex];
		
		_retVal[1] = this.ConvertToPrice( parseFloat(this.prices[_priceIndex][2]) );
		_retVal[2] = this.ConvertToPrice( parseFloat( this.prices[_priceIndex][2]*quantity ) );
		return _retVal;	
	}
}
var ProductCalculator = {
	/* DOM Objects IDS */
	QuantityElementID: "",
	QuantityElement2ID: "",
	ItemPriceElementID: "",
	TotalPriceElementID: "",
	
	/*PRIVATE MEMEBERS*/
	pricelists:[],
	
	/* METHODS */	
	Calculate:function(quantity, pricelistid)
	{
		if ( this.pricelists[pricelistid] != null )
		{
			var retval = this.pricelists[pricelistid].Calculate(quantity);
			if ( this.OnCalculateCompete != null )
			{
				this.OnCalculateCompete(retval[0], retval[1], retval[2], retval[3], retval[4]);
			}
		}
	},
	AddPriceList:function(pricelisttype)
	{
		return (this.pricelists[this.pricelists.length] = new ProductCalculator_Pricelist(this.pricelists.length, pricelisttype));
	},

	/* EVENTS */
	OnCalculateCompete: function(quantity, itemprice, totalprice, quantity2, pricelistitem)
	{
	}
}
var PRODUCTCALCULATOR_PRICELISTTYPE = {
	MINMAX: 2,
	INTERVAL: 4,
	MINPRICE: 6
}
