//USED BY hydrology21.html
//Jan 2009 BS
//trying to use scs rainfall

function makeRoutingTable()
{

//USED BY hydrology21.html
//BUTTON TO CALCULATE MAX STORAGE VOLUME REQUIRED
//jQuery is required

//jQuery functions to read/write array to table is intentionally disabled because of inefficient DOM traversal
//Instead, table data read/write is achieved using straight javascript DOM traversal
//THeese functions readData, writeData, makeTable are defined in table_tricks.js

var r=4;    //start filling data in this row

var duration=eval($('#duration').val());
//var duration=1440;	//24 hr used for scs rainfall

var dt=5;
var steps=duration/dt;	

if(mod(duration,5)!=0)
{	
	//if duration minutes is not multiple of 5 minutes
	//increase the duration to closest multiple of 5 minutes
	steps=Math.ceil(steps);
}


//read tributary area data
var c=eval($('#cFactor').val());
var area=eval($('#area').val());
var factor=eval($('#areaUnit').val());
var acre=area/factor;

makeTable(steps+r,8);
$('table').attr('id','t');		//give table id so that jquery can access it

$('caption').text('Mass Balance Table');
$('td').css('text-align','right');

//fill table headers
cell('t',1,1).text('Step');
cell('t',1,2).text('Duration');
cell('t',1,3).text('Rainfall');
cell('t',1,4).text('Inflow');
cell('t',1,5).text('Pumping');
cell('t',1,6).text('Discharge');
cell('t',1,7).text('Infiltration');
cell('t',1,8).text('Balance');
cell('t',1,9).text('Storage');

//fill units on row 2
cell('t',2,1).text('-');
cell('t',2,2).text('Minute');
cell('t',2,3).text('in/hr');
cell('t',2,4).text('cu. ft');
cell('t',2,5).text('cu. ft');
cell('t',2,6).text('cu. ft');
cell('t',2,7).text('cu. ft');
cell('t',2,8).text('cu. ft');
cell('t',2,9).text('cu. ft');

//fill col number
cell('t',3,1).text('-');
cell('t',3,2).text('(2)');
cell('t',3,3).text('(3)');
cell('t',3,4).text('(4)');
cell('t',3,5).text('(5)');
cell('t',3,6).text('(6)');
cell('t',3,7).text('(7)');
cell('t',3,8).text('(8)');
cell('t',3,9).text('(9)');

//fill step number on col 1
var col=1;
for(var k=0;k<steps;k++){
	cell('t',k+r,col).text(k+1);
}

//fill minutes on col 2
var col=2;
for(var k=0;k<steps;k++){writeData(k+3,col-1,(k+1)*dt);}


//Fill rainfall intensity on col 3
var col=3;
var hyetograph=new Array();

//which rainfall to use? sf or scs
if($('#rainfall_selector').val()=='SF')
{
	//sf hyetograph
	var R=eval($('#returnPeriod').val());
	var sf=new SF_IDF(R);
	//peak intensity should be at fraction
	var peakfraction=eval($('#fraction').val());
	hyetograph=sf.hyetograph(duration,dt,peakfraction);
}

else if($('#rainfall_selector').val()=='SCS')
	{
		//scs hyetograph
		var scsrain=new SCS($('#scs_type').val());
		hyetograph=scsrain.hyetograph(eval($('#scs_depth').val()),dt);
		
	}
else
{
	//constant rainfall intensity
	var const_rain=new idf_curve(eval($('#constant_rain').val()),0,0);	//this idf curve (with b=intensity, d=0, e=0) mimicks constant intensity throughout the duration 
	hyetograph=const_rain.hyetograph(duration,dt,peakfraction);
}
hyetograph.toTable(r,col);
//console.log(hyetograph);

//total rainfall depth check
var Depth=new Array();
for(var k=0;k<steps;k++)
{
    Depth[k]=eval(readData(k+3,col-1)/(60.0/5.0));
    //console.log(Depth[k]);
}
writeData(steps+r-1,col-1,sum(Depth).toFixed(3));	//total rainfall depth check


//inflow
var inflow=new Array();
var col=4;
for(var k=0;k<steps;k++)
{
    inflow[k]=c*hyetograph[k]*dt/60*1/12*acre*43560.0;	//cu ft
}
inflow.toTable(r,col);

//outflow pumping in col 5
var col=5;
var pumprate=eval($('#pumpingRate').val())/eval($('#pumpingRate_unit').val());	//cfs
var pumping=new Array();
for(var k=0;k<steps;k++)
{
    pumping[k]=pumprate*dt*60;
}
//pumping.table('t',r,col);
pumping.toTable(r,col);

//discharge in col 6
var col=6;
var dischargerate=eval($('#outletDischargeRate').val())/eval($('#outletDischargeRate_unit').val());	//cfs
var discharge=new Array();
for(var k=0;k<steps;k++)
{
    discharge[k]=dischargerate*dt*60;
}
//discharge.table('t',r,col);
discharge.toTable(r,col);

//horton infiltration in col 7
var col=7;
var infiltration=new Array();
//read horton parameters

var initial_f=eval($('#initial').val())/eval($('#infiltration_unit').val());	//inch/hr
var final_f=eval($('#final').val())/eval($('#infiltration_unit').val());	//inch/hr
var decay=eval($('#decay_k').val());
var h=new Horton(initial_f,final_f,decay);
if($('#permeable_area_unit').val()=='percent')
	{var acarea=eval($('#permeable_area').val())/100*acre;
		//console.log('area for infiltration : ' + acarea);
		}
	else
		{var acarea=eval($('#permeable_area').val())/eval($('#permeable_area_unit').val())
			//console.log('area for infiltration : ' + acarea);
			}
for(var k=0;k<steps;k++)
{
    infiltration[k]=h.avg_loss_rate(k*dt/60,(k+1)*dt/60,acarea)*dt*60;	//cu ft unit
}
infiltration.toTable(r,col);

//algebric sum in col 8
var col=8;
var balance=new Array();
for(var k=0;k<steps;k++)
{
    balance[k]=inflow[k]-pumping[k]-discharge[k]-infiltration[k];
}
balance.toTable(r,col);

//calculate real storage at each time step
var col=9;
var S=new Array();
S=storage(balance);
S.toTable(r,col);
S.plot('lineCanvas','Plot of Storage [cu. ft] vs. Minutes',dt,1);	//plot in lineCanvas


//find max storage required
var maximum=S.max();	//cu ft
$('tr:last td').text("-"); //no text in the last row
writeData(steps+r-1,col-2,'Max : ');
writeData(steps+r-1,col-1,maximum.toFixed(2));	//fill max value cu ft in table 
$('#storage').val(addCommas(eval(maximum*eval(($('#storage_unit').val()))).toFixed(3)))	//fill max value in results after unit conversion

formatTable('t');

}//end makeRoutingTable


function storage(B)
{
	//return true storage vol at each time step
	//B is array containing algebric balance
	//Used by hydrology20.html
	var S=new Array();
	for(var k=0;k<B.length;k++)
	{
		if(k==0)
		{
			S[k]=B[k];
			if(S[k]<0)
			{
				//Negative storage not possible
				S[k]=0;
			}
		}
		else
		{
			S[k]=B[k]+S[k-1]; //routing equation
			if(S[k]<0)
			{
				//Negative storage not possible
				S[k]=0;
			}		
		}
	}
	return S;
}//end storage

function setdecimals(n){
	//set decimal to n digits
	$("tr:odd").css("background", "#E0FFFF"); //alternate color stripe
	$('td').each(function (x) {if($(this).attr('value')) {$(this).text(eval($(this).attr('value')).toFixed(n))}})
}

//plot column data
function plotColumnData(column)
{	//console.log('Running plotColumnData(column)..')
	//how many rows of data
	if(countCol('t')<column){alert('Column ' + column + ' does not exist!'); return;}
	var row=countRow('t');
	//console.log('countRow = '+row);
	
	//read data into array
	var A=new Array();
	var chartTitle='Plot of  '+readData(0,column)+' ['+readData(1,column)+']'+' vs. Minutes';	
	for(var k=0;k<(row-3-1);k++)
		{
			A[k]=readData(k+3,column);
			//console.log(k+' : '+A[k]);
		}
	
	A.plot('lineCanvas',chartTitle,5,1);

	/*
	var B=new timeSeries(A,300);
	$('body').append(B.gchart(1));
	*/
	
}

//format table
function formatTable(table_id)
{
	//console.log('Running formatTable(table_id) from routing.js')
	//some table formatting
	//right align table cells
	$('#'+table_id+' td').css('text-align','right');
	setdecimals(2);
//	$('#'+table_id+' tr:odd').css('background','pink');
//	$('#'+table_id+' td').css('border','1');
	$('#'+table_id+' tr:lt(3) td').css('text-align','center')
}