function print(config,msg){
	config.document.getElementById(config.debugId).value+="\n"+msg;
}

function drawForm(par){
    
	populateSourceTable(par); //populateSourceTableData
	let tableId="entryTable"; 
	generateTable(par,"formDiv",tableId);
	generateRow(par,tableId,"User");//generateTableRow
	

}

function generateQConfig(listName){
    let qConfig=new Object();
    qConfig.containerPath="TECANT/Data";
    qConfig.schemaName="lists";
    qConfig.queryName=listName;
    return qConfig;
 }
 

function sourceVar(crfEntryName,elementId,sourceName){
	let f=new Object();
	f.masterSelectVarName=crfEntryName;
	f.selectId=elementId;
	f.inputType="innerHTML";
	f.sourceSelectVarName=sourceName;
	return f;
}

function getField(config, data, varName){
	let debug=true;
	if (debug) print(config, "getField");
	let fields=data.metaData.fields;
	for (f in fields){
		if (debug) print(config,"Checking "+f+": name "+fields[f].name+"/"+varName);
		if (fields[f].name!=varName) continue;
		return fields[f];
	}
	return null;
}


function generateHead(config, headDivName,divName,title){
	print(config,"generateHead");
	let tb=config.document.createElement('table');
	tb.className='t2';
	let row=tb.insertRow();
	let cell=config.document.createElement('th');
	row.appendChild(cell);	
	cell.setAttribute("colspan","4");
	cell.style.fontSize="20px";
	cell.style.textAlign="center";
	let cellData=config.document.createTextNode(title);
	cell.appendChild(cellData);
	cell=row.insertCell();
	cell.style.fontSize="20px";
	let input=config.document.createElement("input");	
	input.type="button";
	input.value="Show";
	input.id="toggle"+divName+"VisbilityButton";
	input.onclick=function(){toggleVisibility(config,divName,input.id)};
	cell.appendChild(input);
	config.document.getElementById(headDivName).appendChild(tb);
	print(config,"generateHead: Done");
}

function toggleVisibility(config,divName,buttonName){

	let x = config.document.getElementById(divName);
	if (x.style.display === "none") {
    		x.style.display = "block";
		config.document.getElementById(buttonName).value="Hide";

  	} else {
    		x.style.display = "none";
		config.document.getElementById(buttonName).value="Show";

  	}
}

function selectRowsSuccess(config,data){
	print(config,"Select rows on "+data.queryName+" got "+data.rows.length+" rows.");
}

function populateSourceTable(par){
	let debug=true;
	if (debug){
		print(par.config,"populateSourceTable: Starting");
	}
    let config=generateQConfig(par.source.queryName);
    config.schemaName=par.source.schemaName; 
	
	if (!("source" in par)) return;
	if (debug){
		print(par.config,"populateSourceTable ["+par.source.queryName+"]");
	}

	config.success=function(data){populateSourceTableData(data,par)};
	//config.success=function(data){selectRowsSuccess(par.config,data)};
	
	config.failure=function(errorTxt){print(par.config,"populateSourceData:fail"+errorTxt.exception)};
	LABKEY.Query.selectRows(config);
}

function populateSourceTableData(data,par){
	let debug=true;
	if (debug){
		print(par.config, "populateSourceTableData: nrow: "+data.rows.length);
	}
	let entry=data.rows[0];
	for (let i=0;i < par.source.vars.length;i++){
		let srcVarName=par.source.vars[i];
		if (debug){
			print(par.config, "populateSourceTable ["+srcVarName+"]");
		}
		let row=par.vars[srcVarName];
		let el=par.config.document.getElementById(row.selectId);
		if (debug){
			print(par.config, "Element: "+el);
		}
		el.innerHTML=entry[row.sourceSelectVarName];
	}
}

function generateTable(par,divName,elementId){
	let debug=true;
	if (debug)
		print(par.config,"generateTable");
	let tb=par.config.document.createElement('table');
	tb.className="t2";
	tb.id=elementId;
	par.config.document.getElementById(divName).appendChild(tb);
	if (debug)
		print(par.config,"generateTable: Done");
}


function generateRow(parameters, tableId, rowId){
	let debug=true;
	if (debug)
		print(parameters.config,"generateRow: Start");
	let config=generateQConfig(parameters.masterQuery);
	config.success=function(data){generateTableRow(data, parameters, tableId, rowId)};
	LABKEY.Query.selectRows(config);
	if (debug)
		print(parameters.config,"generateRow: End");
	return;

}

function generateTableRow(data, parameters, tableId, rowId){
	let debug=true;
	if (debug)
		print(parameters.config,"generateTableRow: start");
	let tb=parameters.config.document.getElementById(tableId);
	let row=parameters.vars[rowId];
	if (debug)
		print(parameters.config,"getField for "+row.masterSelectVarName);
	
	let field=getField(parameters.config,data,row.masterSelectVarName);
	let trow=tb.insertRow();
	let cell=parameters.config.document.createElement('th');
	trow.appendChild(cell);
	let text = parameters.config.document.createTextNode(field.shortCaption);
	cell.appendChild(text);
	cell=trow.insertCell();
	let input = parameters.config.document.createElement("select");
	input.id = row.selectId;
	input.onchange=function(){row.callback(parameters,rowId)};
	cell.appendChild(input); 
	if (debug)
		print(parameters.config,"generateTableRow: end");
	
}

function generateListAndPopulateDaughterSelect(parameters,rowId){;}
function generateList(parameters,rowId){;}