function Size ( h, w ) 
{
	this.height = h;
	this.width = w;
}

function SizeNameToSize ( name, size ) {
	var sizeName = '';
	switch ( name ) 
	{
		case "Business Card" : sizeName = '2x3.5'; break;
		case "Bookmark" : sizeName = '2x6'; break;
		default : sizeName = name;
	}
	var splitArray = sizeName.split('x');

	size.height = Math.min( splitArray[0], splitArray[1] );
	size.width = Math.max( splitArray[0], splitArray[1] );
}

function Printing_Price( Quantity, Product, SizeName ) 
{
	var size = new Size();
	SizeNameToSize( SizeName, size );
    var temp = 0;

	try 
	{
		Quantity = parseInt( Quantity );
	}
	catch ( e ) 
	{
		return 0;
	}
	if ( Quantity <= 0 ) 
	{
		return 0;
	}
	switch ( Product ) 
	{
		case "12 Pt. Postcard" : temp = OffsetPrintingFees( Product, Quantity, size.height, size.width ); break;
		case "Digital" : temp = DigitalPrintingFees ( Quantity, size.height, size.width ); break;
		default : temp = 0;
	}
	
	var bc_price;
	switch ( Product )
	{
		case "12 Pt. Postcard" : bc_price = OffsetPrintingFees( Product, Quantity, 2, 3.5 ); break;
		case "Digital" : bc_price = DigitalPrintingFees ( Quantity, 2, 3.5 ); break;
		default : bc_price = 0;
	}
	
	temp = Math.max(bc_price, temp);
	
	return temp;
}

function OffsetPrintingFees ( Product, Quantity, Size1, Size2 ) {
	tempPrice = 0;
	if (( Size1 < 1.5 ) || (Size1 > 27 ) || ( Size2 < 1.5) || (Size2 > 39 )) {
		return 0;
	}
	switch ( Product ) {
		case "12 Pt. Postcard" : tempPrice = TwelvePointPriceFromTable( Quantity, Size1, Size2 ); break;
		case "Sticker" : tempPrice = StickerPriceFromTable( Quantity, Size1, Size2 ); break;
		default : return "---";
	}
	if ( tempPrice != 0 )
		return tempPrice;
	else {
		if ( Product == "Sticker" )
			return OffsetStickerPriceFromArea( Quantity, Size1, Size2 );
		else
			return OffsetPostcardPriceFromArea( Quantity, Size1, Size2 );
	}
}

function DigitalPrintingFees ( Quantity, Size1, Size2 ) {
	tempPrice = 0;
	if (( Size1 < 1.5 ) || ( Size1 > 13.5 )  || ( Size2 < 1.5 ) || ( Size2 > 19.5 ) )
		return 0;
	if ( ( tempPrice = DigitalPriceFromTable( Quantity, Size1, Size2 ) ) > 0 )
		return tempPrice;
	else
		return DigitalPriceFromArea( Quantity, Size1, Size2 );
}

function TwelvePointPriceFromTable ( Quantity, Size1, Size2 ) {
	qtyNames = [ 1000,5000,10000,15000,20000,25000,30000,35000,40000,45000,50000 ];

	return OffsetPriceFromTable( Quantity, Size1, Size2, qtyNames );
	
} // TwelvePointPriceFromTable

function TenPointPriceFromTable ( Quantity, Size1, Size2 ) {

	qtyNames = [ 0,5000,10000,15000,20000,25000,30000,35000,40000,45000,50000 ]; // Zero skips a row

	return OffsetPriceFromTable( Quantity, Size1, Size2, qtyNames );
	
} // TwelvePointPriceFromTable

function StickerPriceFromTable ( Quantity, Size1, Size2 ) {
	qtyNames = [ 0,2000,4000,6000,8000,10000,12000,14000,16000,18000,20000 ]; // Zero skips a row

	return OffsetPriceFromTable( Quantity, Size1, Size2, qtyNames );
	
} // TwelvePointPriceFromTable

function ClosestMatchInterpolation ( Quantity, Product, Size1, Size2 ) {
	closestMatch = ClosestOffsetSize( Size1, Size2 );

	if ( closestMatch == "" )
		return 0;
	
	closestMatchArea = SizeNameToArea( closestMatch );
	if ( closestMatchArea == 0 )
		return 0;
		
	ratio = ( ( Size1 * Size2 ) / closestMatchArea );
	splitArray = closestMatch.split("x");
	
	try {
		tempSize1 = parseFloat( splitArray[0] );
		tempSize2 = parseFloat( splitArray[1] );
	}
	catch ( e ) {
		return 0;
	}
	
	switch ( Product ) {
		case "12 Pt. Postcard" : closestMatchPrice = TwelvePointPriceFromTable( Quantity, tempSize1, tempSize2 ); break;
		case "Sticker" : closestMatchPrice = StickerPriceFromTable( Quantity, tempSize1, tempSize2 ); break;
		default : {
			return 0;
		}
	}
	return ( ratio * closestMatchPrice );		
}

function SizeNameToArea( SizeName ) {
	size = new Size(0,0);
	SizeNameToSize( SizeName, size );
	try {
		tempArea = parseFloat( size.height) * parseFloat( size.width );
		return tempArea;
	}
	catch ( e ) {
		return 0;
	}
}

function ClosestOffsetSize ( Size1, Size2 ) {
	var sizeNames = ["2x3.5","2x6","3.5x5.5","4x6","4.25x6","4x9","5x7","6x8","7x10","8.5x11" ];
	var surfaceArea = ( Size1 * Size2 );
	i = 0;
	closestFound = false;

	while ( ( i <= ( sizeNames.length ) ) && !closestFound ) {
		areaNow = SizeNameToArea( sizeNames[ i ] );
		areaNext = SizeNameToArea( sizeNames[ i+1 ] );
		if ( ( areaNow == 0 ) || ( areaNext == 0 ) )
			return "";
		closestFound = Math.abs( surfaceArea - areaNow ) < Math.abs( surfaceArea - areaNext );
		i++;
	}
	if ( closestFound ) {
		return sizeNames[ i-1 ];

	}
	else {
		return sizeNames[ sizeNames.length - 1 ]; // return the last element in the array
	}
}

function OffsetPriceFromTable ( Quantity, Size1, Size2, QuantityNames ) {
	sizeNames = ["2x3.5","2x6","3.5x5.5","4x6","4.25x6","4x9","5x7","6x8","7x10","8.5x11"];
	priceArray = [ [ 119,159,209,249,259,349,349,449,559,749 ],
				[ 149,199,250,299,329,449,449,599,899,999 ],
				[ 239,319,399,479,529,719,719,959,1439,1599 ],
				[ 329,439,549,659,729,989,989,1319,1979,2199 ],
				[ 419,559,699,839,919,1259,1259,1679,2519,2799 ],
				[ 509,679,849,1019,1119,1529,1529,2039,3059,3399 ],
				[ 599,799,999,1199,1319,1799,1799,2399,3599,3999 ],
				[ 659,879,1099,1319,1449,1979,1979,2639,3959,4399 ],
				[ 779,1039,1299,1559,1709,2339,2339,3119,4679,5199 ],
				[ 869,1159,1449,1739,1909,2599,2599,3479,5219,5799 ],
				[ 959,1279,1599,1919,2109,2879,2879,3839,5759,6399 ] ];
	return PriceFromTable( Quantity, Size1, Size2, QuantityNames, sizeNames, priceArray );
}
		
function DigitalPriceFromTable ( Quantity, Size1, Size2 ) {
	sizeNames = [ "2x3.5","2x6","3.5x5.5","4x6","4.25x6","5x7","5.5x8.5","6x9","8.5x11","11x17" ];
	quantityNames = [ 100,200,300,400,500 ];
	priceArray = [  [ 89,99,109,109,109,129,129,129,169,259 ],
				    [ 99,109,129,129,129,179,179,179,259,429 ],
				    [ 109,119,149,159,159,229,229,229,349,609 ],
				    [ 119,129,169,179,179,279,279,279,429,779 ],
				    [ 129,139,189,209,209,329,329,329,519,949 ] ];
				    
    if ((Size1>=5)&&(Size1<=6)&&(Size2>=7)&&(Size2<=9))
    {
        Size1 = 5;
        Size2 = 7;
    }
	return PriceFromTable( Quantity, Size1, Size2, quantityNames, sizeNames, priceArray );
} // DigitalPriceFromTable
		
function PriceFromTable ( Quantity, Size1, Size2, QuantityNames, SizeNames, PriceArray ) {

	sizeName = Size1 + "x" + Size2;
	
	sizeFound = false;
	col = 0;
	
	while ( !( sizeFound = ( SizeNames[col] == sizeName ) ) && ( col < SizeNames.length-1 ) )
		col++;
	if ( !sizeFound )
		return 0;
	else {
		row = 0;
		while ( !( qtyFound = ( QuantityNames[row] == Quantity ) ) && ( row < QuantityNames.length-1 ) )
			row++;

		if ( qtyFound ) {
			return PriceArray[row][col];
		}
		else
			return 0;
	} // else (size was found)
}
			
function OffsetPostcardPriceFromArea( Quantity, Size1, Size2 ) {

// Calculates print price based on surface area, $149 minimum
	minimumPrice = 149;
	
	price5000 = 13 * Size1 * Size2; // ...is $13 per sq. inch

	tempPrice = price5000 * ( 1 + ( 0.6 * ( ( Quantity / 5000 ) - 1 ) ) );

	if ( tempPrice < minimumPrice )
		tempPrice = minimumPrice;

	return tempPrice;
}

function OffsetStickerPriceFromArea( Quantity, Size1, Size2 ) {

// Calculates print price based on surface area, $149 minimum
	minimumPrice = 149;
	
	price2000 = 13 * Size1 * Size2; // ...is $13 per sq. inch

	tempPrice = price2000 * ( 1 + ( 0.6 * ( ( Quantity / 2000 ) - 1 ) ) );
	
	if ( tempPrice < minimumPrice )
		tempPrice = minimumPrice;

	return tempPrice;
}

function NumberPerSheet( SheetSize1, SheetSize2, Gutter, Size1, Size2 ) {
    if ((Size1 == 0) || (Size2 == 0))
        return 0;
	var numberUp;
	x = parseInt( Math.floor( SheetSize1 / ( Size1 + Gutter ) ) );
	y = parseInt( Math.floor( SheetSize2 / ( Size2 + Gutter ) ) );
	xr = parseInt( Math.floor( SheetSize1 / ( Size2 + Gutter ) ) );
	yr = parseInt( Math.floor( SheetSize2 / ( Size1 + Gutter ) ) );
	
	if ( ( x * y ) >= ( xr * yr ) )
		numberUp = x * y;
	else
		numberUp = xr * yr;
	return numberUp;
}
		
function SheetsNeeded( Quantity, NumberUp ) {
	return Math.ceil( Quantity / NumberUp );
}
		
function DigitalPriceFromArea( Quantity, Size1, Size2 ) {
	setUpFee = 80.0;
	perSheetRate = 1.75;
	var numberUp = NumberPerSheet( 19.5, 13.5, 0.125, Size1, Size2 );
	if (numberUp == 0)
	    return 0;
	sheetsNeeded = SheetsNeeded( Quantity, numberUp );
	return ( setUpFee + ( perSheetRate * sheetsNeeded ) );	
}