function generateTable(listName,divName,unique){
	//add temp variables
	LABKEY.Query.selectRows({schemaName: 'lists',queryName: listName, requiredVersion:"8.3", 
		parameters:{"divName":divName}, success:function(data){populateTable(data,divName,unique)} });
}

function populateTable(data,divName,unique){
	//generate and populate table with the first suitable entry
	document.getElementById('formStatus').value+="\n Query: "+data.queryName;
	document.getElementById('formStatus').value+="\n divName: "+divName;

	//document.getElementById('formStatus').value+="\n Div: "+resp.params["query.param.divName"];

	var obj=data.metaData.fields;
	for (f in obj){	
		document.getElementById('formStatus').value+="\n Data["+f+"]: "+obj[f];
		for (g in obj[f]){
			document.getElementById('formStatus').value+="\n Data.metaData.fields["+f+"]["+g+"]: "+obj[f][g];
		}
		if ("lookup" in obj[f]){
			for (h in obj[f]["lookup"]){
				document.getElementById('formStatus').value+="\n Lookup["+h+"]: "+obj[f]["lookup"][h];
	
			}
		}

	}
	var crfRef=document.getElementById("crfRefId").innerHTML;
	var entry=new Object();

	for (i=0;i<data.rows.length;i++){
		var entry=data.rows[i];
		if (entry.crfRef!=crfRef) {
			document.getElementById('formStatus').value+="\n Crfref mismatch: "+crfRef+"/"+entry[crfRef];
			continue;
		}	
		break;
	}
	

	var tb=document.createElement('table');
	tb.className="t2";
	document.getElementById(divName).appendChild(tb);

	var fields=data.metaData.fields;
	for (f in fields){
		if (fields[f].hidden) continue;
		
		var vName=fields[f].name;

		if (vName=="crfRef") continue;

		var vType=fields[f].type;

		let row=tb.insertRow();
		let cell=row.insertCell();
		let text = document.createTextNode(fields[f].shortCaption);
		cell.appendChild(text);
		cell=row.insertCell();
		var cellClass="input";
		var cellType="text";
		if ("lookup" in fields[f]){
			cellClass="select";
		}
		if (vType=="string"){
			;
		}
		if (vType=="date"){
			cellType="date";
		}
		
		var input = document.createElement(cellClass);
		input.type = cellType;
		input.id = vName;

		if (vType=="string" ){
			if (vName in entry) { input.value=entry[vName];}
		}

		if (vType=="date"){
			if (vName in entry) {input.valueAsDate=new Date(entry[vName]);}
		}

		if ("lookup" in fields[f]){
			var lookup=fields[f]["lookup"];
			var config=new Object();
			document.getElementById('formStatus').value+="\n Query: "+lookup.queryName;
			config.schemaName=lookup.schemaName;
			config.queryName=lookup.queryName;
			var parameters={"elementId":input.id,"keyColumn":lookup.keyColumn,"displayColumn":lookup.displayColumn};
			if (vName in entry) parameters.selectedKey=entry[vName];
			config.success=function(data){populateSelect(data,parameters)};
			LABKEY.Query.selectRows(config);
		}
		cell.appendChild(input); 
	}
	var row=tb.insertRow();
	let cell=row.insertCell();
	cell.setAttribute("colspan","2");
	var input=document.createElement("input");	
	input.type="button";
	input.value="Add";
	input.onclick=function(){saveData(data.queryName,unique)};
	cell.appendChild(input);
		
}	

function populateSelect(data,parameters){
	document.getElementById('formStatus').value+="\n Data: "+data;
	var elementId=parameters.elementId;
	var keyColumn=parameters.keyColumn;
	var displayColumn=parameters.displayColumn;
	document.getElementById('formStatus').value+="\n ElementId: "+elementId;
	document.getElementById('formStatus').value+="\n keyColumn: "+keyColumn;
	document.getElementById('formStatus').value+="\n displayColumn: "+displayColumn;
	
	if ("selectedKey" in parameters){
		document.getElementById('formStatus').value+="\n SelectedKey: "+parameters["selectedKey"];
	}

	var el = document.getElementById(elementId);
	document.getElementById('formStatus').value+="\n Element: "+el;
   	for(i = el.options.length; i >= 0; i--) {
		el.remove(i);
   	}
	var opt = document.createElement("option");
	opt.text = "<Select>";
	opt.value = -1;
	el.options[0] = opt;

	for (var i = 0; i < data.rows.length; i++) {
		var opt = document.createElement("option");
		opt.text = data.rows[i][displayColumn];
		opt.value = data.rows[i][keyColumn];
		document.getElementById('formStatus').value+="\n Adding: "+opt.value+" : "+opt.text;
	
		el.options[el.options.length] = opt;
		if ("selectedKey" in parameters){
			document.getElementById('formStatus').value+="\n Comparing: " + opt.value  + "/" + 
				parameters["selectedKey"];
			
           		if (opt.value==parameters["selectedKey"]){
				el.selectedIndex=el.options.length-1;
				document.getElementById('formStatus').value+="\n Equal; "+el.selectedIndex;
			}
	   	}
	}

}	

function failureSelect(errorInfo,resp,opt){
	document.getElementById('formStatus').value+="\n Error: ";

}

function saveData(queryName,unique){
	document.getElementById('formStatus').value+="\n saveData: ";
	var config=new Object();
	config.schemaName='lists';//could be made more generic
	config.queryName=queryName;
	var crfRef=document.getElementById("crfRefId").innerHTML;
	config.filterArray=[ LABKEY.Filter.create('crfRef',crfRef)];
	config.success=function(data){saveDataToList(data,unique)};
	LABKEY.Query.selectRows(config);
}

function saveDataToList(data,unique){
	document.getElementById('formStatus').value+="\n saveDataToList: ";
	var update=false;
	if (unique && data.rows.length>0){
		var entry=data.rows[0]
		update=true;
	}
	else{
		var entry=new Object();
		entry.crfRef=document.getElementById("crfRefId").innerHTML;
	}
	
	var config=new Object();
	config.schemaName=data.schemaName;//could be made more generic
	config.queryName=data.queryName;
	//entry.crfRef=document.getElementById("crfRefId").innerHTML;
	
	var fields=data.metaData.fields;
	for (f in fields){
		if (fields[f].hidden) continue;
		
		var vName=fields[f].name;

		if (vName=="crfRef") continue;

		var el=document.getElementById(vName);

		if (!el) continue;
	
		var vType=fields[f].type;

		if ("lookup" in fields[f]){
			entry[vName]=el.options[el.selectedIndex].value;
			continue;
		}
		if (vType=="date"){
			var date=el.valueAsDate;
			if (date==="null") continue;
			date.setUTCHours(12);
			entry[vName]=date.toString();
		}	
		if (vType=="string"){
			entry[vName]=el.value;
		}	
	}
	config.rows=[entry];

	if (update) 
		LABKEY.Query.updateRows(config);
	else 
		LABKEY.Query.insertRows(config); 
}


const _generateTable = generateTable;
export { _generateTable as generateTable };
const _saveData = saveData;
export { _saveData as saveData };