/*
 * Filename: 	roi_costs_tables.js
 * Description: Contains all the functions for setting up the Costs data tables into multi-dimensional arrays
*/


function Create_VOIP_Gateway_Channels()
{
	VOIP_Gateway_Channels = new Array(14);
	
	for (i = 0; i < VOIP_Gateway_Channels.length; ++ i)
		VOIP_Gateway_Channels[i] = new Array(5);

	// column #1
	VOIP_Gateway_Channels[0][0] = 10;
	VOIP_Gateway_Channels[1][0] = 20;
	VOIP_Gateway_Channels[2][0] = 30;
	VOIP_Gateway_Channels[3][0] = 40;
	VOIP_Gateway_Channels[4][0] = 50;
	VOIP_Gateway_Channels[5][0] = 60;
	VOIP_Gateway_Channels[6][0] = 70;
	VOIP_Gateway_Channels[7][0] = 80;
	VOIP_Gateway_Channels[8][0] = 90;
	VOIP_Gateway_Channels[9][0] = 100;
	VOIP_Gateway_Channels[10][0] = 110;
	VOIP_Gateway_Channels[11][0] = 120;
	VOIP_Gateway_Channels[12][0] = 180;
	VOIP_Gateway_Channels[13][0] = 240;

	// column #2 is calculated further down....

	// column #3
	VOIP_Gateway_Channels[0][2] = 641.64;
	VOIP_Gateway_Channels[1][2] = 641.64;
	VOIP_Gateway_Channels[2][2] = 641.64;
	VOIP_Gateway_Channels[3][2] = 816.24;
	VOIP_Gateway_Channels[4][2] = 816.24;
	VOIP_Gateway_Channels[5][2] = 816.24;
	VOIP_Gateway_Channels[6][2] = 990.84;
	VOIP_Gateway_Channels[7][2] = 990.84;
	VOIP_Gateway_Channels[8][2] = 990.84;
	VOIP_Gateway_Channels[9][2] = 1165.44;
	VOIP_Gateway_Channels[10][2] = 1165.44;
	VOIP_Gateway_Channels[11][2] = 1165.44;
	VOIP_Gateway_Channels[12][2] = 1165.44;
	VOIP_Gateway_Channels[13][2] = 1165.44;

	// column #4
	VOIP_Gateway_Channels[0][3] =  13339.23;
	VOIP_Gateway_Channels[1][3] =  13339.23;
	VOIP_Gateway_Channels[2][3] =  13339.23;
	VOIP_Gateway_Channels[3][3] =  15106.01;
	VOIP_Gateway_Channels[4][3] =  15106.01;
	VOIP_Gateway_Channels[5][3] =  15106.01;
	VOIP_Gateway_Channels[6][3] =  16874.99;
	VOIP_Gateway_Channels[7][3] =  16874.99;
	VOIP_Gateway_Channels[8][3] =  16874.99;
	VOIP_Gateway_Channels[9][3] =  18638.97;
	VOIP_Gateway_Channels[10][3] = 18638.97;
	VOIP_Gateway_Channels[11][3] = 18638.97;
	VOIP_Gateway_Channels[12][3] = 21822.93;
	VOIP_Gateway_Channels[13][3] = 25006.89;

	// column #5 is calculated further down....

	// column #2 - calculated
	for(i = 0; i < VOIP_Gateway_Channels.length; i++)
	{
		VOIP_Gateway_Channels[i][1] = VOIP_Gateway_Channels[i][3] - VOIP_Gateway_Channels[i][2];
	}

	// column #5 - calculated
	for(i = 0; i < VOIP_Gateway_Channels.length; i++)
	{
		VOIP_Gateway_Channels[i][4] = VOIP_Gateway_Channels[i][3] / VOIP_Gateway_Channels[i][0];
	}

	return VOIP_Gateway_Channels;
}



function Create_VOIP_Gateway_Boards()
{
	VOIP_Gateway_Boards= new Array(14);
	
	for (i = 0; i < VOIP_Gateway_Boards.length; ++ i)
		VOIP_Gateway_Boards[i] = new Array(6);

	// column #1 - channnels
	VOIP_Gateway_Channels[0][0] = 10;
	VOIP_Gateway_Channels[1][0] = 20;
	VOIP_Gateway_Channels[2][0] = 30;
	VOIP_Gateway_Channels[3][0] = 40;
	VOIP_Gateway_Channels[4][0] = 50;
	VOIP_Gateway_Channels[5][0] = 60;
	VOIP_Gateway_Channels[6][0] = 70;
	VOIP_Gateway_Channels[7][0] = 80;
	VOIP_Gateway_Channels[8][0] = 90;
	VOIP_Gateway_Channels[9][0] = 100;
	VOIP_Gateway_Channels[10][0] = 110;
	VOIP_Gateway_Channels[11][0] = 120;
	VOIP_Gateway_Channels[12][0] = 180;
	VOIP_Gateway_Channels[13][0] = 240;

	// column #2
	VOIP_Gateway_Boards[0][1] = 4330.08;
	VOIP_Gateway_Boards[1][1] = 4330.08;
	VOIP_Gateway_Boards[2][1] = 4330.08;
	VOIP_Gateway_Boards[3][1] = 5587.2;
	VOIP_Gateway_Boards[4][1] = 5587.2;
	VOIP_Gateway_Boards[5][1] = 5587.2;
	VOIP_Gateway_Boards[6][1] = 8939.52;
	VOIP_Gateway_Boards[7][1] = 8939.52;
	VOIP_Gateway_Boards[8][1] = 8939.52;
	VOIP_Gateway_Boards[9][1] = 8939.52;
	VOIP_Gateway_Boards[10][1] = 8939.52;
	VOIP_Gateway_Boards[11][1] = 8939.52;
	VOIP_Gateway_Boards[12][1] = 15644.16;
	VOIP_Gateway_Boards[13][1] = 15644.16;

	// column #3 - all blank values
	for(i = 0; i < VOIP_Gateway_Boards.length; i++)
	{
		VOIP_Gateway_Boards[i][2] = 0;
	}
	
	// column #4 - calculated
	for(i = 0; i < VOIP_Gateway_Boards.length; i++)
	{
		VOIP_Gateway_Boards[i][3] = VOIP_Gateway_Boards[i][1] * 0.12;
	}

	// column #5 - calculated
	for(i = 0; i < VOIP_Gateway_Boards.length; i++)
	{
		VOIP_Gateway_Boards[i][4] = VOIP_Gateway_Boards[i][1] + VOIP_Gateway_Boards[i][2] + VOIP_Gateway_Boards[i][3];
	}

	// column #6 - calculated
	for(i = 0; i < VOIP_Gateway_Boards.length; i++)
	{
		VOIP_Gateway_Boards[i][5] = VOIP_Gateway_Boards[i][4] / VOIP_Gateway_Boards[i][0];
	}

	return VOIP_Gateway_Boards;
}

function Create_VOIP_Gateway_VX1200s()
{
	VOIP_Gateway_VX1200s= new Array(14);
	
	for (i = 0; i < VOIP_Gateway_VX1200s.length; ++ i)
		VOIP_Gateway_VX1200s[i] = new Array(5);
	
	// column #1 - channels
	VOIP_Gateway_VX1200s[0][0] =  10;
	VOIP_Gateway_VX1200s[1][0] =  20;
	VOIP_Gateway_VX1200s[2][0] =  30;
	VOIP_Gateway_VX1200s[3][0] =  40;
	VOIP_Gateway_VX1200s[4][0] =  50;
	VOIP_Gateway_VX1200s[5][0] =  60;
	VOIP_Gateway_VX1200s[6][0] =  70;
	VOIP_Gateway_VX1200s[7][0] =  80;
	VOIP_Gateway_VX1200s[8][0] =  90;
	VOIP_Gateway_VX1200s[9][0] =  100;
	VOIP_Gateway_VX1200s[10][0] = 110;
	VOIP_Gateway_VX1200s[11][0] = 120;
	VOIP_Gateway_VX1200s[12][0] = 180;
	VOIP_Gateway_VX1200s[13][0] = 240;

	// column #2
	VOIP_Gateway_VX1200s[0][1] = 6048;
	VOIP_Gateway_VX1200s[1][1] = 6048;
	VOIP_Gateway_VX1200s[2][1] = 6048;
	VOIP_Gateway_VX1200s[3][1] = 6768;
	VOIP_Gateway_VX1200s[4][1] = 6768;
	VOIP_Gateway_VX1200s[5][1] = 6768;
	VOIP_Gateway_VX1200s[6][1] = 9072;
	VOIP_Gateway_VX1200s[7][1] = 9072;
	VOIP_Gateway_VX1200s[8][1] = 9072;
	VOIP_Gateway_VX1200s[9][1] = 9072;
	VOIP_Gateway_VX1200s[10][1] = 9072;
	VOIP_Gateway_VX1200s[11][1] = 9072;
	VOIP_Gateway_VX1200s[12][1] = 13248;
	VOIP_Gateway_VX1200s[13][1] = 14688;

	// column #3
	for(i = 0; i < VOIP_Gateway_VX1200s.length; i++)
	{
		VOIP_Gateway_VX1200s[i][2] =  576;
	}
	
	// column #4
	for(i = 0; i < VOIP_Gateway_VX1200s.length; i++)
	{
		VOIP_Gateway_VX1200s[i][3] = 1431;
	}

	// column #5 - calculated
	for(i = 0; i < VOIP_Gateway_VX1200s.length; i++)
	{
		VOIP_Gateway_VX1200s[i][4] = VOIP_Gateway_VX1200s[i][1] + VOIP_Gateway_VX1200s[i][2] + VOIP_Gateway_VX1200s[i][3];
	}

	// column #6 - calculated
	for(i = 0; i < VOIP_Gateway_VX1200s.length; i++)
	{
		VOIP_Gateway_VX1200s[i][5] = VOIP_Gateway_VX1200s[i][4] / VOIP_Gateway_VX1200s[i][0];
	}

	return VOIP_Gateway_VX1200s;
}

function Create_Audio_OR_Data_Ports()
{
	Audio_OR_Data_Ports= new Array(14);
	
	for (i = 0; i < Audio_OR_Data_Ports.length; ++ i)
		Audio_OR_Data_Ports[i] = new Array(5);

	// column #1 - channels
	Audio_OR_Data_Ports[0][0] =  10;
	Audio_OR_Data_Ports[1][0] =  20;
	Audio_OR_Data_Ports[2][0] =  30;
	Audio_OR_Data_Ports[3][0] =  40;
	Audio_OR_Data_Ports[4][0] =  50;
	Audio_OR_Data_Ports[5][0] =  60;
	Audio_OR_Data_Ports[6][0] =  70;
	Audio_OR_Data_Ports[7][0] =  80;
	Audio_OR_Data_Ports[8][0] =  90;
	Audio_OR_Data_Ports[9][0] =  100;
	Audio_OR_Data_Ports[10][0] = 110;
	Audio_OR_Data_Ports[11][0] = 120;
	Audio_OR_Data_Ports[12][0] = 180;
	Audio_OR_Data_Ports[13][0] = 240;

	// column #2 is calculated further down ....
	
	// column #3
	Audio_OR_Data_Ports[0][2] =  551.4;
	Audio_OR_Data_Ports[1][2] =  958.8;
	Audio_OR_Data_Ports[2][2] =  1366.2;
	Audio_OR_Data_Ports[3][2] =  1773.6;
	Audio_OR_Data_Ports[4][2] =  2181;
	Audio_OR_Data_Ports[5][2] =  2588.4;
	Audio_OR_Data_Ports[6][2] =  2995.8;
	Audio_OR_Data_Ports[7][2] =  3403.2;
	Audio_OR_Data_Ports[8][2] =  3810.6;
	Audio_OR_Data_Ports[9][2] =  4218;
	Audio_OR_Data_Ports[10][2] = 4625.4;
	Audio_OR_Data_Ports[11][2] = 5032.8;
	Audio_OR_Data_Ports[12][2] = 7477.2;
	Audio_OR_Data_Ports[13][2] = 9921.6;

	// column #4
	Audio_OR_Data_Ports[0][3] =  5490.96;
	Audio_OR_Data_Ports[1][3] =  9502.21;
	Audio_OR_Data_Ports[2][3] =  13513.46;
	Audio_OR_Data_Ports[3][3] =  17524.71;
	Audio_OR_Data_Ports[4][3] =  21535.96;
	Audio_OR_Data_Ports[5][3] =  25547.21;
	Audio_OR_Data_Ports[6][3] =  29558.46;
	Audio_OR_Data_Ports[7][3] =  33569.71;
	Audio_OR_Data_Ports[8][3] =  37580.96;
	Audio_OR_Data_Ports[9][3] =  41592.21;
	Audio_OR_Data_Ports[10][3] = 45603.46;
	Audio_OR_Data_Ports[11][3] = 49614.71;
	Audio_OR_Data_Ports[12][3] = 73682.21;
	Audio_OR_Data_Ports[13][3] = 97749.71;

	// column #2 - calculated
	for(i = 0; i < Audio_OR_Data_Ports.length; i++)
	{
		Audio_OR_Data_Ports[i][1] = Audio_OR_Data_Ports[i][3] - Audio_OR_Data_Ports[i][2];
	}

	// column #5 - calculated
	for(i = 0; i < Audio_OR_Data_Ports.length; i++)
	{
		Audio_OR_Data_Ports[i][4] = Audio_OR_Data_Ports[i][3] / Audio_OR_Data_Ports[i][0];
	}

	return Audio_OR_Data_Ports;
}

function Create_Contract_Terms()
{
	Contract_Terms = new Array(6);
	
	Contract_Terms[0] = 12;
	Contract_Terms[1] = 24;
	Contract_Terms[2] = 36;
	Contract_Terms[3] = 48;
	Contract_Terms[4] = 60;
	Contract_Terms[5] = 72;
	
	return Contract_Terms;
}

function Create_Hosting_Costs()
{
	Hosting_Costs = new Array(3);
	
	for (i = 0; i < Hosting_Costs.length; ++ i)
		Hosting_Costs[i] = new Array(4);

	// setup static data for hosting costs -- including labels for ease of maintenance
	Hosting_Costs[0][0] = "Global Switch";
	Hosting_Costs[0][1] = 1200;
	Hosting_Costs[0][2] = "/month";
	Hosting_Costs[0][3] = 0.1;

	Hosting_Costs[1][0] = "Internet Access 500 GB";
	Hosting_Costs[1][1] = 900;
	Hosting_Costs[1][2] = "/month";
	Hosting_Costs[1][3] = 1.0;

	Hosting_Costs[2][0] = "Support (1 FTE)";
	Hosting_Costs[2][1] = (92*40*20/12);
	Hosting_Costs[2][2] = "/month";
	Hosting_Costs[2][3] = 0.164;

	return Hosting_Costs;
}

function Calculate_Hosting_Support_Total_Month(Hosting_Costs)
{
	// The hosting cost is just a single value that is calculated from the hosting costs table
	Hosting_Support_Total_Month = (Hosting_Costs[0][1] * Hosting_Costs[0][3])
								+ (Hosting_Costs[1][1] * Hosting_Costs[1][3])
								+ (Hosting_Costs[2][1] * Hosting_Costs[2][3]);

	return Hosting_Support_Total_Month;
}

function Create_Video_Ports_Scopia()
{
	Video_Ports_Scopia= new Array(4);
	
	for (i = 0; i < Video_Ports_Scopia.length; ++ i)
		Video_Ports_Scopia[i] = new Array(5);

	// column #1 - port numbers
	Video_Ports_Scopia[0][0] = 10;
	Video_Ports_Scopia[1][0] = 20;
	Video_Ports_Scopia[2][0] = 30;
	Video_Ports_Scopia[3][0] = 40;
	
	// column #2
	Video_Ports_Scopia[0][1] = 52454;
	Video_Ports_Scopia[1][1] = Video_Ports_Scopia[0][1] + 13804;
	Video_Ports_Scopia[2][1] = Video_Ports_Scopia[1][1];
	Video_Ports_Scopia[3][1] = Video_Ports_Scopia[1][1];

	// column #3 - calculated
	Video_Ports_Scopia[0][2] = Video_Ports_Scopia[0][1] * 0.12;
	Video_Ports_Scopia[1][2] = Video_Ports_Scopia[1][1] * 0.2;
	Video_Ports_Scopia[2][2] = Video_Ports_Scopia[2][1] * 0.2;
	Video_Ports_Scopia[3][2] = Video_Ports_Scopia[3][1] * 0.2;

	// column #4 - calculated
	for(i = 0; i < Video_Ports_Scopia.length; i++)
	{
		Video_Ports_Scopia[i][3] = Video_Ports_Scopia[i][1] + Video_Ports_Scopia[i][2];
	}

	// column #5 - calculated
	for(i = 0; i < Video_Ports_Scopia.length; i++)
	{
		Video_Ports_Scopia[i][4] = Video_Ports_Scopia[i][3] / Video_Ports_Scopia[i][0];
	}

	return Video_Ports_Scopia;	
}

function Create_Video_Ports_Neogate()
{
	Video_Ports_Neogate = new Array(4);
	
	for (i = 0; i < Video_Ports_Neogate.length; ++ i)
		Video_Ports_Neogate[i] = new Array(5);

	// column #1 - port numbers
	Video_Ports_Neogate[0][0] = 10;
	Video_Ports_Neogate[1][0] = 20;
	Video_Ports_Neogate[2][0] = 30;
	Video_Ports_Neogate[3][0] = 40;
	
	// column #2 is calculated further down ....
	
	// column #3
	for(i = 0; i < Video_Ports_Neogate.length; i++)
	{
		Video_Ports_Neogate[i][2] = 216;
	}

	// column #4
	for(i = 0; i < Video_Ports_Neogate.length; i++)
	{
		Video_Ports_Neogate[i][3] = 4963.68;
	}

	// column #2 - calculated
	for(i = 0; i < Video_Ports_Neogate.length; i++)
	{
		Video_Ports_Neogate[i][1] = Video_Ports_Neogate[i][3] - Video_Ports_Neogate[i][2];
	}

	// column #5 - calculated
	for(i = 0; i < Video_Ports_Neogate.length; i++)
	{
		Video_Ports_Neogate[i][4] = Video_Ports_Neogate[i][3] / Video_Ports_Neogate[i][0];
	}

	return Video_Ports_Neogate;	
}

function Create_Dell_Server_x2()
{
	Dell_Server_x2s= new Array(12);
	
	for (i = 0; i < Dell_Server_x2s.length; ++ i)
		Dell_Server_x2s[i] = new Array(5);

	// column #1
	Dell_Server_x2s[0][0] =  10;
	Dell_Server_x2s[1][0] =  20;
	Dell_Server_x2s[2][0] =  30;
	Dell_Server_x2s[3][0] =  40;
	Dell_Server_x2s[4][0] =  50;
	Dell_Server_x2s[5][0] =  60;
	Dell_Server_x2s[6][0] =  70;
	Dell_Server_x2s[7][0] =  80;
	Dell_Server_x2s[8][0] =  90;
	Dell_Server_x2s[9][0] =  100;
	Dell_Server_x2s[10][0] = 110;
	Dell_Server_x2s[11][0] = 120;

	// column #2 - all set to static value
	for(i = 0; i < Dell_Server_x2s.length; i++)
	{
		Dell_Server_x2s[i][1] = 2 * 5608.83;
	}
	
	// column #3 - all set to static value
	for(i = 0; i < Dell_Server_x2s.length; i++)
	{
		Dell_Server_x2s[i][2] = 0;
	}

	// column #4 - calculated
	for(i = 0; i < Dell_Server_x2s.length; i++)
	{
		Dell_Server_x2s[i][3] = Dell_Server_x2s[i][1] + Dell_Server_x2s[i][2];
	}

	// column #5 - calculated
	for(i = 0; i < Dell_Server_x2s.length; i++)
	{
		Dell_Server_x2s[i][4] = Dell_Server_x2s[i][3] / Dell_Server_x2s[i][0];
	}

	return Dell_Server_x2s;	
}

function Create_VOIP_Medians(VOIP_Gateway_Channels, VOIP_Gateway_Boards, VOIP_Gateway_VX1200s)
{
	VOIP_Medians = new Array(3);
	
	for (i = 0; i < VOIP_Medians.length; ++ i)
		VOIP_Medians[i] = new Array(2);

	// setup static data for medians of VOIP tables -- including labels for ease of maintenance
	VOIP_Medians[0][0] = "OXE";
	dataArray = GetColumnIntoArray(VOIP_Gateway_Channels, 4);
	VOIP_Medians[0][1] = Median(dataArray);

	VOIP_Medians[1][0] = "E1";
	dataArray = GetColumnIntoArray(VOIP_Gateway_Boards, 5);
	VOIP_Medians[1][1] = Median(dataArray);

	VOIP_Medians[2][0] = "VX";
	dataArray = GetColumnIntoArray(VOIP_Gateway_VX1200s, 5);
	VOIP_Medians[2][1] = Median(dataArray);

	return VOIP_Medians;
}

function Create_OXE_vs_VX_TCO(VOIP_Gateway_Channels, VOIP_Gateway_VX1200s)
{
	OXE_vs_VX_TCO = new Array(4);
	
	for (i = 0; i < OXE_vs_VX_TCO.length; ++ i)
		OXE_vs_VX_TCO[i] = new Array(3);
		
	// column #1 - calculated manually for each row because of the static row to pull data from
	OXE_vs_VX_TCO[0][0] = VOIP_Gateway_Channels[2][1] + VOIP_Gateway_Channels[2][2] * 6;	/* this is the row for 30 channels */
	OXE_vs_VX_TCO[1][0] = VOIP_Gateway_Channels[5][1] + VOIP_Gateway_Channels[5][2] * 6;	/* this is the row for 60 channels */
	OXE_vs_VX_TCO[2][0] = VOIP_Gateway_Channels[8][1] + VOIP_Gateway_Channels[8][2] * 6;	/* this is the row for 90 channels */
	OXE_vs_VX_TCO[3][0] = VOIP_Gateway_Channels[11][1] + VOIP_Gateway_Channels[11][2] * 6;	/* this is the row for 120 channels */

	// column #2 - calculated manually because not all rows will be given a value and it is calculated using static
	// rows from the 1200 table
	OXE_vs_VX_TCO[0][1] = (VOIP_Gateway_VX1200s[2][1] + VOIP_Gateway_VX1200s[2][2]) + 6 * VOIP_Gateway_VX1200s[2][3];
	OXE_vs_VX_TCO[1][1] = (VOIP_Gateway_VX1200s[5][1] + VOIP_Gateway_VX1200s[5][2]) + 6 * VOIP_Gateway_VX1200s[2][3];
	OXE_vs_VX_TCO[2][1] = 0;
	OXE_vs_VX_TCO[3][1] = (VOIP_Gateway_VX1200s[11][1] + VOIP_Gateway_VX1200s[11][2]) + 6 * VOIP_Gateway_VX1200s[2][3];
	
	// column #3 - calculated
	for(i = 0; i < OXE_vs_VX_TCO.length; i++)
	{
		OXE_vs_VX_TCO[i][2] = OXE_vs_VX_TCO[i][1] / OXE_vs_VX_TCO[i][0];
	}

	return OXE_vs_VX_TCO;
}

function Create_Channels_120_Over_6years(VOIP_Gateway_Channels)
{
	Channels_120_Over_6years = new Array(2);
	
	for (i = 0; i < Channels_120_Over_6years.length; ++ i)
		Channels_120_Over_6years[i] = new Array(7);

	// Row 1 -- OXE
	Channels_120_Over_6years[0][0] = "OXE";
	Channels_120_Over_6years[0][1] = VOIP_Gateway_Channels[11][3];	// row for 120 VOIP Channels
	for(i = 2; i < Channels_120_Over_6years[0].length; i++)
	{
		// last row + SES value for 120 VOIP OXE Channels
		Channels_120_Over_6years[0][i] = Channels_120_Over_6years[0][i-1] + VOIP_Gateway_Channels[11][2];	
	}

	// Row 1 -- VX1200
	Channels_120_Over_6years[1][0] = "VX1200";
	Channels_120_Over_6years[1][1] = VOIP_Gateway_VX1200s[11][3];	// row for 120 VOIP Channels
	for(i = 2; i < Channels_120_Over_6years[0].length; i++)
	{
		// last row + Maint value for 120 VOIP VX1200 Channels
		Channels_120_Over_6years[1][i] = Channels_120_Over_6years[1][i-1] + VOIP_Gateway_VX1200s[11][2];	
	}

	return Channels_120_Over_6years;
}

function Create_Old_Monthly_Values()
{
	// the Old Monthly Values array includes a total line at the bottom
	Old_Monthly_Values = new Array(5);
	
	for (i = 0; i < Old_Monthly_Values.length; ++ i)
		Old_Monthly_Values[i] = new Array(6);
		
	// Note: Currently this table isn't used in the ROI spreadsheet, so not implementing it now
	return null;
}

function Create_Audio_Data_IM_RTUs()
{
	Audio_Data_IM_RTUs = new Array(17);
	
	for (i = 0; i < Audio_Data_IM_RTUs.length; ++ i)
		Audio_Data_IM_RTUs[i] = new Array(5);

	// column #1
	Audio_Data_IM_RTUs[0][0] = 10;
	Audio_Data_IM_RTUs[1][0] = 20;
	Audio_Data_IM_RTUs[2][0] = 30;
	Audio_Data_IM_RTUs[3][0] = 40;
	Audio_Data_IM_RTUs[4][0] = 50;
	Audio_Data_IM_RTUs[5][0] = 60;
	Audio_Data_IM_RTUs[6][0] = 70;
	Audio_Data_IM_RTUs[7][0] = 80;
	Audio_Data_IM_RTUs[8][0] = 90;
	Audio_Data_IM_RTUs[9][0] = 100;
	Audio_Data_IM_RTUs[10][0] = 150;
	Audio_Data_IM_RTUs[11][0] = 200;
	Audio_Data_IM_RTUs[12][0] = 250;
	Audio_Data_IM_RTUs[13][0] = 300;
	Audio_Data_IM_RTUs[14][0] = 400;
	Audio_Data_IM_RTUs[15][0] = 500;
	Audio_Data_IM_RTUs[16][0] = 1000;

	// column #2 is calculated further down....

	// column #3
	Audio_Data_IM_RTUs[0][2] =  14.4;
	Audio_Data_IM_RTUs[1][2] =  28.8;
	Audio_Data_IM_RTUs[2][2] =  43.2;
	Audio_Data_IM_RTUs[3][2] =  57.6;
	Audio_Data_IM_RTUs[4][2] =  72.0;
	Audio_Data_IM_RTUs[5][2] =  86.4;
	Audio_Data_IM_RTUs[6][2] =  100.8;
	Audio_Data_IM_RTUs[7][2] =  115.2;
	Audio_Data_IM_RTUs[8][2] =  129.6;
	Audio_Data_IM_RTUs[9][2] =  144.0;
	Audio_Data_IM_RTUs[10][2] = 216.0;
	Audio_Data_IM_RTUs[11][2] = 288.0;
	Audio_Data_IM_RTUs[12][2] = 360.0;
	Audio_Data_IM_RTUs[13][2] = 432.0;
	Audio_Data_IM_RTUs[14][2] = 576.0;
	Audio_Data_IM_RTUs[15][2] = 720.0;
	Audio_Data_IM_RTUs[16][2] = 1440.0;

	// column #4
	Audio_Data_IM_RTUs[0][3] =  203.51;
	Audio_Data_IM_RTUs[1][3] =  345.31;
	Audio_Data_IM_RTUs[2][3] =  487.11;
	Audio_Data_IM_RTUs[3][3] =  628.91;
	Audio_Data_IM_RTUs[4][3] =  770.71;
	Audio_Data_IM_RTUs[5][3] =  912.51;
	Audio_Data_IM_RTUs[6][3] =  1054.31;
	Audio_Data_IM_RTUs[7][3] =  1196.11;
	Audio_Data_IM_RTUs[8][3] =  1337.91;
	Audio_Data_IM_RTUs[9][3] =  1479.71;
	Audio_Data_IM_RTUs[10][3] = 2188.71;
	Audio_Data_IM_RTUs[11][3] = 2897.71;
	Audio_Data_IM_RTUs[12][3] = 3606.71;
	Audio_Data_IM_RTUs[13][3] = 4315.71;
	Audio_Data_IM_RTUs[14][3] = 5733.71;
	Audio_Data_IM_RTUs[15][3] = 7151.71;
	Audio_Data_IM_RTUs[16][3] = 14241.71;

	// column #5 is calculated further down....

	// column #2 - calculated
	for(i = 0; i < Audio_Data_IM_RTUs.length; i++)
	{
		Audio_Data_IM_RTUs[i][1] = Audio_Data_IM_RTUs[i][3] - Audio_Data_IM_RTUs[i][2];
	}

	// column #5 - calculated
	for(i = 0; i < Audio_Data_IM_RTUs.length; i++)
	{
		Audio_Data_IM_RTUs[i][4] = Audio_Data_IM_RTUs[i][3] / Audio_Data_IM_RTUs[i][0];
	}

	return Audio_Data_IM_RTUs;		
}

function Create_Video_RTUs()
{
	Video_RTUs = new Array(17);
	
	for (i = 0; i < Video_RTUs.length; ++ i)
		Video_RTUs[i] = new Array(5);

	// column #1 - RTU count
	Video_RTUs[0][0] = 10;
	Video_RTUs[1][0] = 20;
	Video_RTUs[2][0] = 30;
	Video_RTUs[3][0] = 40;
	Video_RTUs[4][0] = 50;
	Video_RTUs[5][0] = 60;
	Video_RTUs[6][0] = 70;
	Video_RTUs[7][0] = 80;
	Video_RTUs[8][0] = 90;
	Video_RTUs[9][0] = 100;
	Video_RTUs[10][0] = 150;
	Video_RTUs[11][0] = 200;
	Video_RTUs[12][0] = 250;
	Video_RTUs[13][0] = 300;
	Video_RTUs[14][0] = 400;
	Video_RTUs[15][0] = 500;
	Video_RTUs[16][0] = 1000;

	// column #2 is calculated further down....

	// column #3
	Video_RTUs[0][2] =  51.6;
	Video_RTUs[1][2] =  103.2;
	Video_RTUs[2][2] =  154.8;
	Video_RTUs[3][2] =  206.4;
	Video_RTUs[4][2] =  258.0;
	Video_RTUs[5][2] =  309.6;
	Video_RTUs[6][2] =  361.2;
	Video_RTUs[7][2] =  412.8;
	Video_RTUs[8][2] =  464.4;
	Video_RTUs[9][2] =  516.0;
	Video_RTUs[10][2] = 774.0;
	Video_RTUs[11][2] = 1032.0;
	Video_RTUs[12][2] = 1290.0;
	Video_RTUs[13][2] = 1548.0;
	Video_RTUs[14][2] = 2064.0;
	Video_RTUs[15][2] = 2580.0;
	Video_RTUs[16][2] = 5160.0;
	
	// column #4
	Video_RTUs[0][3] =  670.8;
	Video_RTUs[1][3] =  1341.6;
	Video_RTUs[2][3] =  2012.4;
	Video_RTUs[3][3] =  2683.2;
	Video_RTUs[4][3] =  3354.0;
	Video_RTUs[5][3] =  4024.8;
	Video_RTUs[6][3] =  4695.6;
	Video_RTUs[7][3] =  5366.4;
	Video_RTUs[8][3] =  6037.2;
	Video_RTUs[9][3] =  6708.0;
	Video_RTUs[10][3] = 10062.0;
	Video_RTUs[11][3] = 13416.0;
	Video_RTUs[12][3] = 16770.0;
	Video_RTUs[13][3] = 20124.0;
	Video_RTUs[14][3] = 26832.0;
	Video_RTUs[15][3] = 33540.0;
	Video_RTUs[16][3] = 67080.0;

	// column #2 - calculated
	for(i = 0; i < Video_RTUs.length; i++)
	{
		Video_RTUs[i][1] = Video_RTUs[i][3] - Video_RTUs[i][2];
	}

	// column #5 - calculated
	for(i = 0; i < Video_RTUs.length; i++)
	{
		Video_RTUs[i][4] = Video_RTUs[i][3] / Video_RTUs[i][0];
	}

	return Video_RTUs;	
}

function Create_Teamwork_Unit_Costs(Dell_Server_x2s, VOIP_Gateway_VX1200s, Audio_OR_Data_Ports, Video_Ports_Scopia,
									Video_Ports_Neogate, Audio_Data_IM_RTUs, Video_RTUs)
{
	Teamwork_Unit_Costs = new Array(8);
	
	for (i = 0; i < Teamwork_Unit_Costs.length; ++ i)
		Teamwork_Unit_Costs[i] = new Array(4);

	// Row 1
	Teamwork_Unit_Costs[0][0] = "Dell Server";
	Teamwork_Unit_Costs[0][1] = Dell_Server_x2s[0][4]; // High
	Teamwork_Unit_Costs[0][2] = Dell_Server_x2s[Dell_Server_x2s.length - 1][4]; // Low
	Dell_Server_Totals_Col = GetColumnIntoArray(Dell_Server_x2s, 4);
	Teamwork_Unit_Costs[0][3] = Median(Dell_Server_Totals_Col) / ExchangeRate; // Median divided by the exchange rate
		
	// Row 2
	Teamwork_Unit_Costs[1][0] = "VoIP Gateway Channel (VX)";
	Teamwork_Unit_Costs[1][1] = VOIP_Gateway_VX1200s[2][5] / ExchangeRate; // High
	Teamwork_Unit_Costs[1][2] = VOIP_Gateway_VX1200s[VOIP_Gateway_VX1200s.length - 1][5] / ExchangeRate; // Low
	VX1200s_Totals_Col = GetColumnIntoArray(VOIP_Gateway_VX1200s, 5);
	// remove the first two rows as they are not used in this calculation
	VX1200s_Totals_Col.splice(0, 1);
	VX1200s_Totals_Col.splice(0, 1);
	// Median divided by the exchange rate -- note that the spreadsheet skips the first two rows in the VX1200 table for
	// this median calculation
	Teamwork_Unit_Costs[1][3] = Median(VX1200s_Totals_Col) / ExchangeRate;
	
	// Row 3
	Teamwork_Unit_Costs[2][0] = "Audio Port (G.711)";
	Teamwork_Unit_Costs[2][1] = Audio_OR_Data_Ports[0][4] / ExchangeRate; // High
		// Low: (taken as two above the lowest in table for some reason
	Teamwork_Unit_Costs[2][2] = Audio_OR_Data_Ports[Audio_OR_Data_Ports.length - 1 - 2][4] / ExchangeRate; 
	Audio_Data_Totals_Col = GetColumnIntoArray(Audio_OR_Data_Ports, 4);
	// remove the last two rows as they are not used in this calculation
	Audio_Data_Totals_Col.splice(Audio_Data_Totals_Col.length-1, 1);
	Audio_Data_Totals_Col.splice(Audio_Data_Totals_Col.length-1, 1);
	// Median divided by the exchange rate -- note that the spreadsheet skips the last two rows in the Audio OR Data table for
	// this median calculation
	Teamwork_Unit_Costs[2][3] = Median(Audio_Data_Totals_Col) / ExchangeRate;
	
	
	// Row 4
	Teamwork_Unit_Costs[3][0] = "Data Port";
	Teamwork_Unit_Costs[3][1] = Audio_OR_Data_Ports[0][4] / ExchangeRate; // High
		// Low: (taken as two above the lowest in table for some reason
	Teamwork_Unit_Costs[3][2] = Audio_OR_Data_Ports[Audio_OR_Data_Ports.length - 1 - 2][4] / ExchangeRate; 
	Audio_Data_Totals_Col = GetColumnIntoArray(Audio_OR_Data_Ports, 4);
	// remove the last two rows as they are not used in this calculation
	Audio_Data_Totals_Col.splice(Audio_Data_Totals_Col.length-1, 1);
	Audio_Data_Totals_Col.splice(Audio_Data_Totals_Col.length-1, 1);
	// Median divided by the exchange rate -- note that the spreadsheet skips the last two rows in the Audio OR Data table for
	// this median calculation
	Teamwork_Unit_Costs[3][3] = Median(Audio_Data_Totals_Col) / ExchangeRate;
	
	// Row 5
	Teamwork_Unit_Costs[4][0] = "Video Port (QCIF, W480p)";
	Teamwork_Unit_Costs[4][1] = Video_Ports_Scopia[0][4] / ExchangeRate; // High
	Teamwork_Unit_Costs[4][2] = Video_Ports_Scopia[Video_Ports_Scopia.length - 1][4] / ExchangeRate; // Low
	Video_Ports_Totals_Col = GetColumnIntoArray(Video_Ports_Scopia, 4);
	Teamwork_Unit_Costs[4][3] = Median(Video_Ports_Totals_Col) / ExchangeRate; // Median divided by the exchange rate
	
	// Row 6
	Teamwork_Unit_Costs[5][0] = "Neogate";
	Teamwork_Unit_Costs[5][1] = Video_Ports_Neogate[0][4] / ExchangeRate; // High
	Teamwork_Unit_Costs[5][2] = Video_Ports_Neogate[Video_Ports_Neogate.length - 1][4] / ExchangeRate; // Low
	Video_Ports_Neo_Totals_Col = GetColumnIntoArray(Video_Ports_Neogate, 4);
	Teamwork_Unit_Costs[5][3] = Median(Video_Ports_Neo_Totals_Col) / ExchangeRate; // Median divided by the exchange rate

	// Row 7
	Teamwork_Unit_Costs[6][0] = "Data RTU (inc. Audio, Web & IM)";
	Teamwork_Unit_Costs[6][1] = Audio_Data_IM_RTUs[0][4] / ExchangeRate; // High
	Teamwork_Unit_Costs[6][2] = Audio_Data_IM_RTUs[Audio_Data_IM_RTUs.length - 1][4] / ExchangeRate; // Low
	Data_RTU_Totals_Col = GetColumnIntoArray(Audio_Data_IM_RTUs, 4);
	Teamwork_Unit_Costs[6][3] = Median(Data_RTU_Totals_Col) / ExchangeRate; // Median divided by the exchange rate
	
	// Row 8
	Teamwork_Unit_Costs[7][0] = "Video RTU";
	Teamwork_Unit_Costs[7][1] = Video_RTUs[0][4] / ExchangeRate; // High
		// Low: (taken as two above the lowest in table for some reason
	Teamwork_Unit_Costs[7][2] = Video_RTUs[9][4] / ExchangeRate; 
	Video_RTU_Totals_Col = GetColumnIntoArray(Video_RTUs, 4);
	// remove the last two rows as they are not used in this calculation
	Video_RTU_Totals_Col.splice(10, 7);
	// Median divided by the exchange rate -- note that the spreadsheet skips the last two rows in the Audio OR Data table for
	// this median calculation
	Teamwork_Unit_Costs[7][3] = Median(Video_RTU_Totals_Col) / ExchangeRate;	
	
	return Teamwork_Unit_Costs;

}

function Create_Average_Costs_Port_User(Teamwork_Unit_Costs)
{
	Average_Costs_Port_User = new Array(3);
	
	for (i = 0; i < Average_Costs_Port_User.length; ++ i)
		Average_Costs_Port_User[i] = new Array(3);
		
	// Row 1 - Audio
	Average_Costs_Port_User[0][0] = "Audio";
	Average_Costs_Port_User[0][1] = Teamwork_Unit_Costs[0][3] * AudioData_Server_Ratio_Audio
										+ (Teamwork_Unit_Costs[1][3] + Teamwork_Unit_Costs[2][3]);
	Average_Costs_Port_User[0][2] = 0;

	// Row 2 - Data + IM
	Average_Costs_Port_User[1][0] = "Data + IM";
	Average_Costs_Port_User[1][1] = Teamwork_Unit_Costs[0][3] * AudioData_Server_Ratio_Data + Teamwork_Unit_Costs[3][3];
	Average_Costs_Port_User[1][2] = Teamwork_Unit_Costs[6][3];

	// Row 2 - Data + IM
	Average_Costs_Port_User[2][0] = "Data + IM";
	Average_Costs_Port_User[2][1] = Teamwork_Unit_Costs[4][3] + Teamwork_Unit_Costs[5][3];
	Average_Costs_Port_User[2][2] = Teamwork_Unit_Costs[7][3];

	return Average_Costs_Port_User;
}

function Create_Hosting_Costs_Per_Unit(Hosting_Support_Total_Month)
{
	Hosting_Costs_Per_Unit = new Array(12);
	
	for (i = 0; i < Hosting_Costs_Per_Unit.length; ++ i)
		Hosting_Costs_Per_Unit[i] = new Array(3);
		
	// Column #1
	Hosting_Costs_Per_Unit[0][0]=  10;
	Hosting_Costs_Per_Unit[1][0]=  20;
	Hosting_Costs_Per_Unit[2][0]=  30;
	Hosting_Costs_Per_Unit[3][0]=  40;
	Hosting_Costs_Per_Unit[4][0]=  50;
	Hosting_Costs_Per_Unit[5][0]=  60;
	Hosting_Costs_Per_Unit[6][0]=  70;
	Hosting_Costs_Per_Unit[7][0]=  80;
	Hosting_Costs_Per_Unit[8][0]=  90;
	Hosting_Costs_Per_Unit[9][0]=  100;
	Hosting_Costs_Per_Unit[10][0]= 110;
	Hosting_Costs_Per_Unit[11][0]= 120;

	// Column #2
	for(i = 0; i < Hosting_Costs_Per_Unit.length; i++)
	{
		Hosting_Costs_Per_Unit[i][1] = Hosting_Support_Total_Month;
	}

	// Column #3
	for(i = 0; i < Hosting_Costs_Per_Unit.length; i++)
	{
		Hosting_Costs_Per_Unit[i][2] = Hosting_Costs_Per_Unit[i][1] / Hosting_Costs_Per_Unit[i][0];
	}
	
	HostingCostsPriceColumn = GetColumnIntoArray(Hosting_Costs_Per_Unit, 2);
	Average_Hosting_Price = Average(HostingCostsPriceColumn);
	
	return Hosting_Costs_Per_Unit;
}


function Create_End_User_Variables()
{
	End_User_Variables = new Array(7);
	
	for (i = 0; i < End_User_Variables.length; ++ i)
		End_User_Variables[i] = new Array(6);
		
	// Column #1 - term
	End_User_Variables[0][0]=  12;
	End_User_Variables[1][0]=  24;
	End_User_Variables[2][0]=  36;
	End_User_Variables[3][0]=  48;
	End_User_Variables[4][0]=  54;
	End_User_Variables[5][0]=  60;
	End_User_Variables[6][0]=  72;

	// Column #2 - AP
	End_User_Variables[0][1]=  150;
	End_User_Variables[1][1]=  140;
	End_User_Variables[2][1]=  130;
	End_User_Variables[3][1]=  130;
	End_User_Variables[4][1]=  130;
	End_User_Variables[5][1]=  130;
	End_User_Variables[6][1]=  130;

	// Column #3 - DP
	End_User_Variables[0][2]=  100;
	End_User_Variables[1][2]=  95;
	End_User_Variables[2][2]=  90;
	End_User_Variables[3][2]=  90;
	End_User_Variables[4][2]=  90;
	End_User_Variables[5][2]=  90;
	End_User_Variables[6][2]=  90;

	// Column #4 - VP
	End_User_Variables[0][3]=  350;
	End_User_Variables[1][3]=  330;
	End_User_Variables[2][3]=  310;
	End_User_Variables[3][3]=  310;
	End_User_Variables[4][3]=  310;
	End_User_Variables[5][3]=  310;
	End_User_Variables[6][3]=  310;

	// Column #5 - WC
	End_User_Variables[0][4]=  23;
	End_User_Variables[1][4]=  21;
	End_User_Variables[2][4]=  20;
	End_User_Variables[3][4]=  20;
	End_User_Variables[4][4]=  20;
	End_User_Variables[5][4]=  20;
	End_User_Variables[6][4]=  20;
 
	// Column #6 - VC
	End_User_Variables[0][5]=  23;
	End_User_Variables[1][5]=  21;
	End_User_Variables[2][5]=  20;
	End_User_Variables[3][5]=  20;
	End_User_Variables[4][5]=  20;
	End_User_Variables[5][5]=  20;
	End_User_Variables[6][5]=  20;

	return End_User_Variables;
}

function Create_End_User_Sell_Price(End_User_Variables, ContractTerm)
{

	/* B. Squire - 20/10/2009 - changed this table to use the new End User Variables table, according
	 * to v2.0 of the spreadsheet
	 */
	var End_User_Sell_Price = new Array(5);
	
	
	for (i = 0; i < End_User_Sell_Price.length; ++ i)
		End_User_Sell_Price[i] = new Array(2);
		
	// get the index for the row for the given contract term
	var endPriceRowIndexForTerm = RowIndexForValue(ContractTerm, End_User_Variables, 0);

	// each row is created manually
	End_User_Sell_Price[0][0] = "Audio Ports";
	End_User_Sell_Price[0][1] = Math.ceil(End_User_Variables[endPriceRowIndexForTerm][1]);

	End_User_Sell_Price[1][0] = "Data Ports";
	End_User_Sell_Price[1][1] = Math.ceil(End_User_Variables[endPriceRowIndexForTerm][2]);

	End_User_Sell_Price[2][0] = "Video Ports";
	End_User_Sell_Price[2][1] = Math.ceil(End_User_Variables[endPriceRowIndexForTerm][3]);

	End_User_Sell_Price[3][0] = "Data Users";
	End_User_Sell_Price[3][1] = Math.ceil(End_User_Variables[endPriceRowIndexForTerm][4]);

	End_User_Sell_Price[4][0] = "Video Users";
	End_User_Sell_Price[4][1] = Math.ceil(End_User_Variables[endPriceRowIndexForTerm][5]);

	return End_User_Sell_Price;
}

function Create_Cost_Vs_Revenue(VOIP_Gateway_VX1200s, Audio_OR_Data_Ports, Video_Ports_Scopia, Video_Ports_Neogate,
								Audio_Data_IM_RTUs, Video_RTUs, BenefitResult, ContractTerm, Hosting_Support_Total_Month)
{
	Cost_Vs_Revenue = new Array(12);
	
	for (i = 0; i < Cost_Vs_Revenue.length; ++ i)
		Cost_Vs_Revenue[i] = new Array(5);
	
	var AudioPortsQuantity = document.getElementById("selQuantityAudioPort").value;
	var DataPortsQuantity = document.getElementById("selQuantityDataPort").value;
	var VideoPortsQuantity = document.getElementById("selQuantityVideoPort").value;
	var DataUsersQuantity = document.getElementById("selQuantityDataUser").value;
	var VideoUsersQuantity = document.getElementById("selQuantityVideoUser").value;
		
	var rowNumAudioPorts_VX1200s = RowIndexForValue(AudioPortsQuantity, VOIP_Gateway_VX1200s, 0);
	var rowNumAudioPorts_AudioData = RowIndexForValue(AudioPortsQuantity, Audio_OR_Data_Ports, 0);
	var rowNumDataPorts_AudioData = RowIndexForValue(DataPortsQuantity, Audio_OR_Data_Ports, 0);
	var rowNumVideoPorts_VideoScopia = RowIndexForValue(VideoPortsQuantity, Video_Ports_Scopia, 0);
	var rowNumVideoPorts_VideoNeo = RowIndexForValue(VideoPortsQuantity, Video_Ports_Neogate, 0);
	var rowNumkDataUsers_AudioRTU = RowIndexForValue(DataUsersQuantity, Audio_Data_IM_RTUs, 0);
	var rowNumVideoUsers_VideoRTU = RowIndexForValue(VideoUsersQuantity, Video_RTUs, 0);

	// setup the first column for all rows
	Cost_Vs_Revenue[0][0] =  6;
	Cost_Vs_Revenue[1][0] =  12;
	Cost_Vs_Revenue[2][0] =  18;
	Cost_Vs_Revenue[3][0] =  24;
	Cost_Vs_Revenue[4][0] =  30;
	Cost_Vs_Revenue[5][0] =  36;
	Cost_Vs_Revenue[6][0] =  42;
	Cost_Vs_Revenue[7][0] =  48;
	Cost_Vs_Revenue[8][0] =  54;
	Cost_Vs_Revenue[9][0] =  60;
	Cost_Vs_Revenue[10][0] = 66;
	Cost_Vs_Revenue[11][0] = 72;

	// Cost column
	// first version of cost
	var voip_cost = VOIP_Gateway_VX1200s[rowNumAudioPorts_VX1200s][4];
	var audio_cost = Audio_OR_Data_Ports[rowNumAudioPorts_AudioData][3];
	var dataports_cost = (DataPortsQuantity != 0 ? Audio_OR_Data_Ports[rowNumDataPorts_AudioData][3] : 0);
	var videoports_scopia_cost = (VideoPortsQuantity != 0 ? Video_Ports_Scopia[rowNumVideoPorts_VideoScopia][3] : 0);
	var videoports_neogate_cost = (VideoPortsQuantity != 0 ? Video_Ports_Neogate[rowNumVideoPorts_VideoNeo][3] : 0);
	var datausers_cost = (DataUsersQuantity !=  0? Audio_Data_IM_RTUs[rowNumkDataUsers_AudioRTU][3] : 0);
	var videousers_cost = (VideoUsersQuantity !=  0? Video_RTUs[rowNumVideoUsers_VideoRTU][3] : 0);
	
	var cost = voip_cost + audio_cost + dataports_cost + videoports_scopia_cost + videoports_neogate_cost + datausers_cost + videousers_cost;
	
	var server_costs = Dell_Server_x2s[0][3] + (12*Hosting_Support_Total_Month);
							  
	Cost_Vs_Revenue[0][1] = cost / ExchangeRate + server_costs;
	Cost_Vs_Revenue[1][1] = cost / ExchangeRate + server_costs;
	
	// second version of cost
	var cost = (VOIP_Gateway_VX1200s[rowNumAudioPorts_VX1200s][3]
				+ Audio_OR_Data_Ports[rowNumAudioPorts_AudioData][2]
				+ (DataPortsQuantity != 0 ? Audio_OR_Data_Ports[rowNumDataPorts_AudioData][2] : 0)
				+ (VideoPortsQuantity != 0 ? Video_Ports_Scopia[rowNumVideoPorts_VideoScopia][2] : 0)
				+ (VideoPortsQuantity != 0 ? Video_Ports_Neogate[rowNumVideoPorts_VideoNeo][2] : 0)
				+ (DataUsersQuantity !=  0? Audio_Data_IM_RTUs[rowNumkDataUsers_AudioRTU][2] : 0)
				+ (VideoUsersQuantity !=  0? Video_RTUs[rowNumVideoUsers_VideoRTU][2] : 0));
	
	Cost_Vs_Revenue[2][1] = (ContractTerm < 24 ? undefined : cost / ExchangeRate / 2 + 6 * (Hosting_Support_Total_Month) + Cost_Vs_Revenue[1][1]);
	Cost_Vs_Revenue[3][1] = (ContractTerm < 24 ? undefined : cost / ExchangeRate / 2 + 6 * (Hosting_Support_Total_Month) + Cost_Vs_Revenue[2][1]);
	Cost_Vs_Revenue[4][1] = (ContractTerm < 36 ? undefined : cost / ExchangeRate / 2 + 6 * (Hosting_Support_Total_Month) + Cost_Vs_Revenue[3][1]);
	Cost_Vs_Revenue[5][1] = (ContractTerm < 36 ? undefined : cost / ExchangeRate / 2 + 6 * (Hosting_Support_Total_Month) + Cost_Vs_Revenue[4][1]);
	Cost_Vs_Revenue[6][1] = (ContractTerm < 48 ? undefined : cost / ExchangeRate / 2 + 6 * (Hosting_Support_Total_Month) + Cost_Vs_Revenue[5][1]);
	Cost_Vs_Revenue[7][1] = (ContractTerm < 48 ? undefined : cost / ExchangeRate / 2 + 6 * (Hosting_Support_Total_Month) + Cost_Vs_Revenue[6][1]);
	Cost_Vs_Revenue[8][1] = (ContractTerm < 60 ? undefined : cost / ExchangeRate / 2 + 6 * (Hosting_Support_Total_Month) + Cost_Vs_Revenue[7][1]);
	Cost_Vs_Revenue[9][1] = (ContractTerm < 60 ? undefined : cost / ExchangeRate / 2 + 6 * (Hosting_Support_Total_Month) + Cost_Vs_Revenue[8][1]);
	Cost_Vs_Revenue[10][1] = (ContractTerm < 72 ? undefined : cost / ExchangeRate / 2 + 6 * (Hosting_Support_Total_Month) + Cost_Vs_Revenue[9][1]);
	Cost_Vs_Revenue[11][1] = (ContractTerm < 72 ? undefined : cost / ExchangeRate / 2 + 6 * (Hosting_Support_Total_Month) + Cost_Vs_Revenue[10][1]);	
	
	// Revenue column
	// Because there are some hard coded formulas at work based on the row's year value and the contract terms, just hardcoding these here.
	Cost_Vs_Revenue[0][2] = (ContractTerm < 12 ? undefined : CalculateRevenue(End_User_Sell_Price, AudioPortsQuantity, DataPortsQuantity, VideoPortsQuantity, DataUsersQuantity, VideoUsersQuantity));
	Cost_Vs_Revenue[1][2] = (ContractTerm < 12 ? undefined : CalculateRevenue(End_User_Sell_Price, AudioPortsQuantity, DataPortsQuantity, VideoPortsQuantity, DataUsersQuantity, VideoUsersQuantity) + Cost_Vs_Revenue[0][2]);
	Cost_Vs_Revenue[2][2] = (ContractTerm < 24 ? undefined : CalculateRevenue(End_User_Sell_Price, AudioPortsQuantity, DataPortsQuantity, VideoPortsQuantity, DataUsersQuantity, VideoUsersQuantity) + Cost_Vs_Revenue[1][2]);
	Cost_Vs_Revenue[3][2] = (ContractTerm < 24 ? undefined : CalculateRevenue(End_User_Sell_Price, AudioPortsQuantity, DataPortsQuantity, VideoPortsQuantity, DataUsersQuantity, VideoUsersQuantity) + Cost_Vs_Revenue[2][2]);
	Cost_Vs_Revenue[4][2] = (ContractTerm < 36 ? undefined : CalculateRevenue(End_User_Sell_Price, AudioPortsQuantity, DataPortsQuantity, VideoPortsQuantity, DataUsersQuantity, VideoUsersQuantity) + Cost_Vs_Revenue[3][2]);
	Cost_Vs_Revenue[5][2] = (ContractTerm < 36 ? undefined : CalculateRevenue(End_User_Sell_Price, AudioPortsQuantity, DataPortsQuantity, VideoPortsQuantity, DataUsersQuantity, VideoUsersQuantity) + Cost_Vs_Revenue[4][2]);
	Cost_Vs_Revenue[6][2] = (ContractTerm < 48 ? undefined : CalculateRevenue(End_User_Sell_Price, AudioPortsQuantity, DataPortsQuantity, VideoPortsQuantity, DataUsersQuantity, VideoUsersQuantity) + Cost_Vs_Revenue[5][2]);
	Cost_Vs_Revenue[7][2] = (ContractTerm < 48 ? undefined : CalculateRevenue(End_User_Sell_Price, AudioPortsQuantity, DataPortsQuantity, VideoPortsQuantity, DataUsersQuantity, VideoUsersQuantity) + Cost_Vs_Revenue[6][2]);
	Cost_Vs_Revenue[8][2] = (ContractTerm < 60 ? undefined : CalculateRevenue(End_User_Sell_Price, AudioPortsQuantity, DataPortsQuantity, VideoPortsQuantity, DataUsersQuantity, VideoUsersQuantity) + Cost_Vs_Revenue[7][2]);
	Cost_Vs_Revenue[9][2] = (ContractTerm < 60 ? undefined : CalculateRevenue(End_User_Sell_Price, AudioPortsQuantity, DataPortsQuantity, VideoPortsQuantity, DataUsersQuantity, VideoUsersQuantity) + Cost_Vs_Revenue[8][2]);
	Cost_Vs_Revenue[10][2] = (ContractTerm < 72 ? undefined : CalculateRevenue(End_User_Sell_Price, AudioPortsQuantity, DataPortsQuantity, VideoPortsQuantity, DataUsersQuantity, VideoUsersQuantity) + Cost_Vs_Revenue[9][2]);
	Cost_Vs_Revenue[11][2] = (ContractTerm < 72 ? undefined : CalculateRevenue(End_User_Sell_Price, AudioPortsQuantity, DataPortsQuantity, VideoPortsQuantity, DataUsersQuantity, VideoUsersQuantity) + Cost_Vs_Revenue[10][2]);

	// Benefit column
	Cost_Vs_Revenue[0][3] = (ContractTerm < 12 ? undefined : 26 * BenefitResult);
	Cost_Vs_Revenue[1][3] = (ContractTerm < 12 ? undefined : 26 * BenefitResult + Cost_Vs_Revenue[0][3]);
	Cost_Vs_Revenue[2][3] = (ContractTerm < 24 ? undefined : 26 * BenefitResult + Cost_Vs_Revenue[1][3]);
	Cost_Vs_Revenue[3][3] = (ContractTerm < 24 ? undefined : 26 * BenefitResult + Cost_Vs_Revenue[2][3]);
	Cost_Vs_Revenue[4][3] = (ContractTerm < 36 ? undefined : 26 * BenefitResult + Cost_Vs_Revenue[3][3]);
	Cost_Vs_Revenue[5][3] = (ContractTerm < 36 ? undefined : 26 * BenefitResult + Cost_Vs_Revenue[4][3]);
	Cost_Vs_Revenue[6][3] = (ContractTerm < 48 ? undefined : 26 * BenefitResult + Cost_Vs_Revenue[5][3]);
	Cost_Vs_Revenue[7][3] = (ContractTerm < 48 ? undefined : 26 * BenefitResult + Cost_Vs_Revenue[6][3]);
	Cost_Vs_Revenue[8][3] = (ContractTerm < 60 ? undefined : 26 * BenefitResult + Cost_Vs_Revenue[7][3]);
	Cost_Vs_Revenue[9][3] = (ContractTerm < 60 ? undefined : 26 * BenefitResult + Cost_Vs_Revenue[8][3]);
	Cost_Vs_Revenue[10][3] = (ContractTerm < 72 ? undefined : 26 * BenefitResult + Cost_Vs_Revenue[9][3]);
	Cost_Vs_Revenue[11][3] = (ContractTerm < 72 ? undefined : 26 * BenefitResult + Cost_Vs_Revenue[10][3]);

	// Net Benefit Column - calculated
	for(i = 0; i < Cost_Vs_Revenue.length; i++)
	{
		Cost_Vs_Revenue[i][4] = (Cost_Vs_Revenue[i][3] == undefined ? undefined : Cost_Vs_Revenue[i][3] - Cost_Vs_Revenue[i][2]);
	}

	return Cost_Vs_Revenue;
}

function CalculateRevenue(End_User_Sell_Price, AudioPortsQuantity, DataPortsQuantity, VideoPortsQuantity, DataUsersQuantity, VideoUsersQuantity)
{
	return 6 * (End_User_Sell_Price[0][1] * AudioPortsQuantity
				+ End_User_Sell_Price[1][1] * DataPortsQuantity
				+ End_User_Sell_Price[2][1] * VideoPortsQuantity
				+ End_User_Sell_Price[3][1] * DataUsersQuantity
				+ End_User_Sell_Price[4][1] * VideoUsersQuantity)
}

function Create_Net_Benefits_Series(Cost_Vs_Revenue)
{
	var Net_Benefits_Series = [];
    for (var i = 0; i < Cost_Vs_Revenue.length; i ++)
	{
		// stop once we hit the end of the data, which would be due to a shorter selected
		// contract term selected
		if(Cost_Vs_Revenue[i][4] == undefined)
			break;

		Net_Benefits_Series.push([Cost_Vs_Revenue[i][0], Cost_Vs_Revenue[i][4]]);	
	}
	
	return Net_Benefits_Series;
}
