/** Main script for the GI_values application.*/

var app, listtable, GIdatatable, mealdatatable, mealdataview,mealtable;
var treedv, choicedv, treetable, choiceselect, choicecond,leafcond, choicedetail;
var mealdao, pv_id, pv_food, pv_GI_val, pv_GI_err, pv_GL_val, pv_size, pv_DCC,pv_AC;
var curr_pv_id,curr_pv_food, curr_pv_GI_val, curr_pv_GI_err, curr_pv_GL_val, curr_pv_size, curr_pv_DCC,curr_pv_A;
var level2detail, tstobj,btn_add_food, GI_agg, GL_agg, DCC_agg, Name_agg, Meal_Size_agg, Carb_agg;
var curr_food_id, col_meal_id, col_meal_DCC, col_meal_size, col_factor, treemode;

function page_init() 
{ 

	listtable = document.getElementById('selectiontable');
	treetable = document.getElementById('treetable');
	choiceselect = document.getElementById('choiceselect');
	pv_food = document.getElementById('preview_food');
	pv_GI_val = document.getElementById('preview_GI_val');
	pv_GI_err = document.getElementById('preview_GI_err');
	pv_GL_val = document.getElementById('preview_GL_val');
	pv_DCC = document.getElementById('preview_DCC');
	pv_size = document.getElementById('preview_size');
	pv_AC = document.getElementById('preview_AC');
	btn_add_food = document.getElementById('btn_add_food');
	mealtable = document.getElementById("mealtable");
	calculator_init();

};

function add_food()
{
	app.begin_history();
	mealdataview.insert(0);
	mealdataview.setvalue(0, curr_pv_id);
	mealdataview.setvalue(1, curr_pv_food);
	mealdataview.setvalue(2, curr_pv_GI_val);
	mealdataview.setvalue(3, curr_pv_GI_err); 
	mealdataview.setvalue(4, curr_pv_GL_val); 
	mealdataview.setvalue(5, curr_pv_DCC); 
	mealdataview.setvalue(6, curr_pv_size);
	mealdataview.setvalue(7, curr_pv_AC);
	mealdataview.setvalue(8, curr_pv_AC/curr_pv_size);
	app.end_history();
};

function showValues(dataview)
{
	// Show previews
	
	if (dataview.getvalue(2) != "") 
	{
			curr_pv_id = Number(choicedv.getvalue(0));
			curr_pv_food = choicedv.getvalue(1)
			curr_pv_GI_val = choicedv.getvalue(2);
			curr_pv_GI_err = choicedv.getvalue(3);
			curr_pv_GL_val = choicedv.getvalue(4);
			curr_pv_DCC 	 = Number(choicedv.getvalue(5)).toFixed(2);
			curr_pv_size 	 = choicedv.getvalue(6);
			curr_pv_AC		 = choicedv.getvalue(7);	
			pv_food.innerHTML = MakeSpanned(curr_pv_food,"table_value");
			pv_GI_val.innerHTML = MakeSpanned(curr_pv_GI_val,"table_value");
			pv_GI_err.innerHTML = MakeSpanned(curr_pv_GI_err,"table_value");
			pv_GL_val.innerHTML = MakeSpanned(curr_pv_GL_val,"table_value");
			pv_size.innerHTML 	= MakeSpanned(curr_pv_size,"table_value");
			pv_DCC.innerHTML 		= MakeSpanned(curr_pv_DCC,"table_value");
			pv_AC.innerHTML 		= MakeSpanned(curr_pv_AC,"table_value");
			btn_add_food.style.visibility="visible";
	}
	else
	{ // Clear preview
			curr_food_id = -1;
			pv_food.innerHTML = "&nbsp;";
			pv_GI_val.innerHTML = "&nbsp;";
			pv_GI_err.innerHTML = "&nbsp;";
			pv_GL_val.innerHTML 	= "&nbsp;";
			pv_size.innerHTML 	= "&nbsp;";
			pv_DCC.innerHTML 		= "&nbsp;";
			pv_AC.innerHTML 		= "&nbsp;";
			btn_add_food.style.visibility="hidden";

	}
}

function update_Row_Values(dataview, row_idx, col_idx, oldvalue, newvalue)
{

	var curr_data;
	var Meal_size = dataview.columns[6].getdata(row_idx);
	var factor = dataview.columns[8].getdata(row_idx);
	// Adjust available carbs..
	var Avail_carb = Meal_size * factor;
	dataview.columns[7].setdata(row_idx, Avail_carb.toFixed(dataview.columns[7].decimal_places));
	// Adjust GL..
	var GI_val = dataview.columns[2].getdata(row_idx);
	curr_data = Avail_carb * GI_val/100;
	dataview.columns[4].setdata(row_idx, curr_data.toFixed(3));
	// Adjust DCC..

	curr_data = Avail_carb / 15;
	dataview.columns[5].setdata(row_idx, curr_data.toFixed(6));
}


function Total_GI(dataview, curr_col)
{
	var Carb_sum = Number(0);
	// Calculate total carbs
	for (row_idx in dataview.selection)
	{
		Carb_sum+= Number(dataview.columns[7].getdata(row_idx));
  
	}
	
	// Calculate each row so sum up Meal glycemic index
	var Meal_sum = Number(0);
	var row_idx = 0;
	for (row_idx in dataview.selection)
	{

		Meal_sum+= Number((dataview.columns[7].getdata(row_idx) / Carb_sum) * dataview.columns[2].getdata(row_idx) );
	  
	}  
	var curr_col = dataview.columns[2];
	if ((Meal_sum.toFixed) && (curr_col.aggregate.decimal_places))
	{
		return(Number(Meal_sum).toFixed(curr_col.aggregate.decimal_places));
	}
	else
	{
		return(Number(Meal_sum));
	}
	return(Meal_sum);
}

function OnTreeChange(dataview)
{
	if (treemode == false)
	{
		choicedv.conditions.length = 0;
		choicedv.masterdetail = choicedetail;
		new view_condition(choicedv,"tree", "<>",'',4);
		choicedv.refresh;
		treemode = true;
	}
}

function freetextsearch(item, keycode)
{
	if (keycode == 13) 
	{
		if (treemode == true)
		{
			choicedetail = choicedv.masterdetail;
			choicedv.masterdetail = null;
			
		}
		choicedv.conditions.length = 0;
		new view_condition(choicedv,"leafs", "<>",'',4);
		new view_condition(choicedv,"freetext", "in",item.value,3);
		choicedv.refresh();
		treemode = false;
	}
}

function calculator_init()
{
 
	app = new application("Menial tasks - GI/GL Calculator");
	app.IEOKcolor = "#EEEEFF"; // F#?"ing IE
	GIdatatable = new datatable('GI_data', app);
	
	GIdatatable.populate_from_csv_URL("/include/application/GI_data.csv", "\n", "|");
	treedv = new dataview('treedv', GIdatatable, app);
	new dataviewcolumn(treedv, "id", 0, 30, "");
	new dataviewcolumn(treedv, "parentid", 1, 30, "");
	new dataviewcolumn(treedv, "name", 3, 30, "");
	new dataviewcolumn(treedv, "GI", 4, 30, "");
	var treecond = new view_condition(treedv,"tree", "=",'',4);
	treeobj = new data_aware_object(treedv, treetable, "tree", 0 , 2, OnTreeChange);
	treeobj.options.parentcol_idx = 1;
	treeobj.options.top_parentid = -1;
	treeobj.options.stateClass = "tree_state";
	treeobj.options.captionClass = "tree_caption";

	treedv.refresh();
	choicedv = new dataview('choicedv', GIdatatable, app);
	new dataviewcolumn(choicedv, "id", 0, 30, "", null,  "decimal");
	new dataviewcolumn(choicedv, "name", 3, 30, "", null, "string");
	new dataviewcolumn(choicedv, "GI_val", 4, 30, "", null, "decimal");
	new dataviewcolumn(choicedv, "GI_err", 5, 30, "", null, "decimal");
	new dataviewcolumn(choicedv, "GL_val", 6, 30, "", null, "decimal");
	new dataviewcolumn(choicedv, "DCC", 7, 30, "", null, "string");
	new dataviewcolumn(choicedv, "size", 8, 30, "", null, "decimal");
	new dataviewcolumn(choicedv, "ACS", 9, 30, "", null, "decimal");
	choicecond = new view_condition(choicedv,"tree", "<>",'',4);
	choicedetail = new masterdetail(treedv, choicedv, 0,1);
	new data_aware_object(choicedv, choiceselect, "select", 0 , 3, showValues, add_food);

	mealdatatable = new datatable('mealdatatable', app); 
	new datatablecolumn(mealdatatable, "id");
	new datatablecolumn(mealdatatable, "name");
	new datatablecolumn(mealdatatable,"GI_val");
	new datatablecolumn(mealdatatable,"GI_err");
	new datatablecolumn(mealdatatable,"GL_val");
	new datatablecolumn(mealdatatable,"DCC");
	new datatablecolumn(mealdatatable,"size");
	new datatablecolumn(mealdatatable,"mealid");
	new datatablecolumn(mealdatatable,"ACS");
	new datatablecolumn(mealdatatable,"factor");
	mealdataview = new dataview('mealdataview', mealdatatable, app);
	col_meal_id = new dataviewcolumn(mealdataview, "id", 0, 30, null,null, "decimal");
	col_meal_id.visible = false; 
	Name_agg = new aggregate("caption",null, "food_Caption_total");
	Name_agg.value = "Total for meal";
	new dataviewcolumn(mealdataview, "Name", 1, 30, null,Name_agg,"string");
	var Total_GI_agg = new aggregate("custom",2, "agg", Total_GI);
	new dataviewcolumn(mealdataview, "GI values", 2, 30, null, Total_GI_agg, "decimal");
	new dataviewcolumn(mealdataview, "GI error", 3, 30, null,null, "decimal");
	GL_agg = new aggregate("sum",2, "agg");
	new dataviewcolumn(mealdataview, "GL values", 4, 30, null, GL_agg, "decimal");
	var DCC_agg = new aggregate("sum",2, "agg");
	col_meal_DCC = new dataviewcolumn(mealdataview, "DCC", 5, 30, null, DCC_agg, "decimal");
	col_meal_DCC.decimal_places = 2;
	Meal_Size_agg = new aggregate("sum",2, "agg");
	col_meal_size = new dataviewcolumn(mealdataview, "Meal size(g)", 6, 30, null, Meal_Size_agg, "decimal");
	col_meal_size.editable = "true";
	Carb_agg = new aggregate("sum",2, "agg");	
	new dataviewcolumn(mealdataview, "Avail. Carb.(g)", 7, 30, null, Carb_agg, "decimal");
	col_factor = new dataviewcolumn(mealdataview, "Factor", 8, 30, null, null, "decimal");
	col_factor.visible = false; 
	mealdao = new data_aware_object(mealdataview, mealtable, "table", 0 , 1, null, null, update_Row_Values);
	mealdao.options.headerClass = "table_header";
	mealdao.options.valueClass = "table_value";
	mealdao.options.editClass = "edit_input";

	mealdao.DeleteBtn = "Delete food"

	mealdao.options.deleteBtnImgURL = "./images/button_remove_item_meal.png";

	mealdatatable.refresh();

	/*new dataviewcolumn(level2dv, "level2", 30, "", 0);
	var level2cond = new view_condition(level2dv,"level2", "<>",1,10);
	level2dv.refresh();
	*/
	treemode = true;
}


