//LATEST CHANGES: 131, 660, to get forward / backward page flipping to work.
function formElement(aframe) {
	formElementName = "g"+aframe.field_id;
	formField = aframe.parent.window.document.getElementById(formElementName);
	formElementValue = formField.value;
	formElementArray = [];
	if (formElementValue > "") formElementArray = formElementValue.split(",");
}

function cloneObject(what) {for (i in what) {this[i] = what[i]}}

//************************* SELECT TABLE CONTROL CODE *****************************
function iframeReady(aframe,form_id,field_id,group_id,parent_id,label,amin,amax,report_id,amode,fields,apaging) {

	//if not ready, pause for another 1/5 of a second
	//use: <SCRIPT for=linkList event=ondatasetcomplete> ???
	var condition = (!aframe.document || aframe.document.readyState != "complete");
	if (waiting(condition, function(){iframeReady(aframe,form_id,field_id,group_id,parent_id,label,amin,amax,report_id,amode,fields,apaging)}, 200,aframe)) return false;
	aframe.mode = amode;//0:all+selected;1:selected only;2:all,no selected
	aframe.selection_min=amin;
	aframe.group_id=group_id;
	aframe.parent_id=parent_id;
	aframe.form_id=form_id;
	aframe.field_id=field_id;
	aframe.selection_max=amax;
	aframe.paging=apaging;
	aframe.report_id=report_id;

	//if ready, load frame with data.  Not sure why but have to use frames[aframe] instead of "thisframe" Have a bunch of hidden fields, and selectively use them for search & filter based on input in main form. 
	dynHtml = '<HTML><HEAD><title>Presto Select List</title></HEAD><BODY leftmargin="0" topmargin="0" rightmargin="0" marginheight="0" marginwidth="0" onload="parent.pageRefresh('+aframe+')">';
	// Include the Microsoft Tabular Data Control Object (TDC)
	dynHtml += '<object id="linkList" classid="CLSID:333C7BC4-460F-11D0-BC04-0080C7055A83" style="height:1px"><param name="UseHeader" value="True"><param name="FieldDelim" value="	"><param name="DataURL" value="' + top.presto_web_path + 'presto_pub/select_table.cfm?group_id=' + group_id + '&field_id=' + field_id + '&mode=' + aframe.mode;

	// On an iframe reload (e.g. triggered when you step back to page in browser) table highliting of items is lost.  So ensure data set selections are programmed according to form field's current select values.  This doesn't work correctly where a user has DESELECTED all items that were on initial presentation selected.
	formElement(aframe);

	//if mode involves selected items, then add "values" parameter containing record_ids to show, based on any form field value.  if values_in=leaf_links, then this will be ignored.
	if (amode !=2 && formElementValue > "")	dynHtml += '&values=' + formElementValue;

	dynHtml += '"><param name="CaseSensitive" value="False"></object>';
	// Set up the table with mouse events for highlite & selection; include min/max range selection parameters.
	dynHtml += '<table cellSpacing="0" cellPadding="1" border="0" width="100%" datasrc="#linkList" id="datatable"';
	if (aframe.paging != null && aframe.mode != 1) {dynHtml += ' dataPageSize = ' + apaging}
	dynHtml += '>';

	// Draw template body of table for all TDC data to pour into.
	dynHtmlBodyRow = "";
	dynHtmlCol = "";
	dynHtmlHeader = "";
	dynHtmlInputs = "";
	aframe.fields = new cloneObject(fields);//Otherwise sneaking in selection field complicates things.

	if (fields.length)
		{var field=[];
		fields.splice(0,0,["Sel","selected",16,"boolean"]);
		for (i=0;i<fields.length;i++)
			//[0]:field label; 
			//[1]:db_fieldname; 
			//[2]:width=null(freeform)/0/x; 
			//[3]:string/int/boolean/date/float; 
			//[4]:form field to match to.
			{field = fields[i]; 
			if (field[1] == "") field[1] = field[0]
			if (field[2] == null) //Free form width
				{dynHtmlCol += '<col>'; //just say column exists
				dynHtmlBodyRow += '<td><form><span datafld="' + field[1] + '"  DATAFORMATAS="html"></span></td>';}
			else
				{if (field[2] == 0) {} //Hide column
				//This controls searching and filtering.
				else {
					dynHtmlCol += '<col width=' + field[2] + '>'; //set column width
					if (field[3] =="boolean")
						{
						//In future this will have onclick events to filter for selected /unselected items.
						if (field[1] !="selected") dynHtmlHeader += '<th><input type="checkbox" id="'+field[1]+'_filter" class="report_input" disabled>'+field[1]+'</th>';
						else dynHtmlHeader += '<th><input type="checkbox" id="'+field[1]+'_filter" disabled class="report_input"></th>';
						dynHtmlBodyRow += '<td><input type="checkbox" datafld="'+field[1]+'" value="1"></td>';
						}
					else 
						{if (aframe.mode ==1)
						
							dynHtmlHeader += '<th><span style="width:' + (field[2]-4)+ '" class="report_input">'+field[0]+'</span></th>';
						else {
							//This field is crafted to trigger Microsoft TDC filter command on the given column.
							dynHtmlHeader += '<th><input type="text" tabindex="-1" name="'+field[1]+'" id="'+field[1]+'_filter" style="width:' + (field[2]-4)+ '" value="'+field[0]+'" ';
							if (field[3] == "int") 
								dynHtmlHeader += ' onfocus="this.value=\'\'" onclick="this.value=\'\'"';
							else
								dynHtmlHeader += ' onfocus="this.value=\'*\'" onclick="this.value=\'*\'"';
							dynHtmlHeader += ' onkeyup="parent.filter(window,this,\''+field[1]+'\',\''+field[3]+'\')" onblur="this.value=\''+field[0]+'\';"  class="report_input"></th>';
//this.value=\''+field[0]+'\';
						}
						dynHtmlBodyRow += '<td><span datafld="' + field[1] + '" DATAFORMATAS="html"></span></td>';
						}
					}	
				}
		if (field[3] !="boolean")
			dynHtmlInputs += '<input type="hidden" name="'+field[1]+'_copier" datasrc="#linkList" datafld="'+field[1]+'" id="'+field[1]+'" style="width:' + field[2]+ '">';
			
			}
		}

	//Default to having value be same thing as label.
	else {dynHtmlBodyRow += '<td><span datafld="column1"></span></td>';}


	dynHtml += dynHtmlCol + '<THEAD><TR align=left valign=top>'+dynHtmlHeader+'</tr></THEAD><TBODY valign="top"><tr ID=aTr>' + dynHtmlBodyRow + '</tr></TBODY></TABLE>' + dynHtmlInputs + '</form><SCRIPT FOR=aTr EVENT=onclick>		parent.tableSelectRow(window,this)<' + '/SCRIPT><SCRIPT FOR=aTr EVENT=onmouseover>parent.tableHover(window,this)<' + '/SCRIPT><SCRIPT FOR=aTr EVENT=onmouseout>parent.tableHoverOff(window,this)<' + '/SCRIPT></BODY></HTML>';
	// Load Iframe with this data.
	
//alert("*"+dynHtml+"*");
		
	aframe.document.body.innerHTML = dynHtml;
	aframe.datatable.style.cursor="wait";
	datasetInit(aframe);
	//setTableHeight(aframe); // TESTING REMOVAL August 5 2003 Damion (its in datasetInit();

}
//ONMOUSEOVER="parent.tableHover(window)" ONMOUSEOUT="parent.tableHoverOff(window)"

// Quick init of table row selection state (rowcolor).  Assumes no existing color.  Assumes datatable has started to be drawn.
//Take hidden field values and populate select list with them
function datasetInit(aframe) {
	//alert(window.document.body.readyState);
	//Check every 1/3 of a second to see if this frame is finished initializing
	// wait until linkList TDC data is fully available
	condition = (window.document.body.readyState !="complete" || !aframe.linkList || !aframe.linkList.readyState || !(aframe.linkList.readyState == 4)); 
	if (waiting(condition, function(){datasetInit(aframe)}, 500,aframe.name,100)) return true;
	
	arecordset = aframe.linkList.recordset;


	if (arecordset == null) {alert("There is a problem with the data for the " + aframe.name + " form.\n\n  Please notify a system administrator to have the problem resolved!"); return false};

	//AVOIDS TDC ERROR IN WHICH RECORDSET ERRONIOUSLY COMES UP EMPTY.  NO LOGIC TO IT.
	if (arecordset.recordcount == 0) {arecordset.AddNew();arecordset.Delete();}

	//Issue: because of parallel processing, this might not be initialized before other functions ref it.
	aframe.select_column = (arecordset.fields.count)-1;

	//Ensure form field has selected values in dataset,if any.  Uses formElement().
	formElement(aframe);
	setFormField(aframe);

	if (aframe.mode==1) 
		{//formElement(aframe);//needed?
		setTimeout("pageRefresh("+aframe.name+",1)",500)
		//setTableHeight(aframe);
		}
	else {
		//Issue: on reload, aframe.linkList looses selections that form has.  Where not all items are selected, we need to set selections again.  Not sure why time delay required.
		setTimeout("setRecordset("+aframe.name+",1)",200)
	}
	//THIS CAN BE DONE AS SOON AS TABLE IS READY.
	//DISABLED: style controls default height.  Must give this a delay or sometimes it runs even before pageRefresh above and therefore doesn't size to show existing menu items.
	setTimeout("setTableHeight(" + aframe.name +")",500)
	//pageNav(aframe);
	}

// Check each recordset row's value against form field, if found, set row's status to selected.
function setRecordset(aframe) {
	formElement(aframe);//needed here too because of load timing issues.
	var arecordset = aframe.linkList.recordset;
	var i;
	if (arecordset.recordcount)
		{arecordset.moveFirst();
		while(!arecordset.eof)
			{
			for (i=0;i<formElementArray.length;i++)
				if (formElementArray[i] == arecordset.fields(0).value)
					{arecordset.fields(aframe.select_column).value = true;break}
			arecordset.moveNext();

			}
		}
		//alert(formElementArray.length);
	pageRefresh(aframe);
	//setTimeout("pageRefresh("+aframe.name+")",500);

}

	
//Shows selected status of items in VIEWED table (not whole dataset); can set this as well.
function pageRefresh(aframe,select_state) {
	//wait until we can update table
	var theTable = aframe.datatable;
	condition = (theTable.readyState !='complete' || aframe.linkList.readyState !=4)
 	// random() required below to ensure unique call to function.
	if (waiting(condition, function(){pageRefresh(aframe,select_state)},300,aframe,200)) return false;
	
	if (!(theTable.rows.length==null || theTable.rows.length==1))
		{	
		var arecordset = aframe.linkList.recordset;
		aframe.select_column = arecordset.fields.count-1;
		var rowPtr,tableRow,select_field;

		for (tableRow=1;tableRow <= theTable.rows.length;tableRow++)
			{
			//if user filters data, then rowPtr could be empty.
			if (theTable.rows[tableRow] == null) {break}
			rowPtr = theTable.rows[tableRow].recordNumber;	
			if (rowPtr <= 0 || rowPtr > arecordset.recordcount) {break}
			arecordset.absolutePosition=rowPtr;
			select_field = arecordset.fields(aframe.select_column);
			if (arecordset.eof) {break}
			switch (select_state) {
				case 0: select_field.value=false; theTable.rows[tableRow].bgColor = "";break;
				case 1: select_field.value=true; theTable.rows[tableRow].bgColor = select_color;break;
				default:
					//Undefined case
					if (select_field.value == true) 
						theTable.rows[tableRow].bgColor = select_color
					else theTable.rows[tableRow].bgColor = ""
					break;
				}
			}
		}
	tableReady(aframe);
}

function recordsetInit(aframe,select_state) {
	condition = (aframe.linkList.readyState !=4)
	if (waiting(condition, function(){recordsetRefresh(aframe,select_state)},aframe, 200)) return false;
	
	var arecordset = aframe.linkList.recordset;
	if (arecordset.recordcount)
		{arecordset.moveFirst();
		while(!arecordset.eof) {arecordset.fields(aframe.select_column).value = select_state;arecordset.moveNext()}
		}
	pageRefresh(aframe);
}

function rowScroll(aframe,aRow)
	{//Scroll to given row: must delay until remaining rows are drawn.
	condition = (aframe.datatable.readyState !='complete' || !aframe.datatable.rows[aRow])
	if (waiting(condition, function(){rowScroll(aframe,aRow)}, 200)) return false;
	aframe.scrollTo(0,aframe.datatable.rows[aRow].offsetTop);
	}

//When table is completely drawn, change mouse cursor from hourglass back to pointer.	
function tableReady(aframe)
	{condition = (aframe.datatable.readyState !='complete')
	if (waiting(condition, function(){tableReady(aframe)}, 300,aframe.name)) return false;
	aframe.datatable.style.cursor = "";
	pageNav(aframe);
	}


	
//********************************* Table Row Select Code **********************************
// Uses the colors of rows themselves to keep track of which rows are selected.

var selectedRow = "undefined";
var hover_color = "#f0f0f0";
var select_color = "#d8c8f8";
var hover_select_color = "#d0b0e0";

function tableHover(awindow,arow) {
//    var arow = getElement(awindow.event.srcElement,"TR");
	//Just in time: mark that table items are still loading; still enables user to do things.
	
	if (document.all && awindow.datatable.readyState != "complete" && awindow.datatable.style.cursor !="wait") 
		awindow.datatable.style.cursor = "wait";
	
    if (arow==null) return
	switch (arow.bgColor) {
		case "" :arow.bgColor = hover_color; break;
		case hover_color : arow.bgColor = ""; break;
		case select_color : arow.bgColor = hover_select_color; break;
		default : arow.bgcolor = hover_color;
		}

	}
		
function tableHoverOff(awindow,arow) {
//    var arow = getElement(awindow.event.srcElement,"TR")
    if (arow==null) return
	
	switch (arow.bgColor) {
		case hover_color :arow.bgColor = ""; break;
		case hover_select_color :arow.bgColor = select_color; break;
		}
	}

function transferFields(awindow) {
	arecordset = awindow.linkList.recordset;
	var new_value;
	for (i=0 ; i<arecordset.fields.count ; i++)
		{afield = awindow.fields[i];
		if (afield && afield.length == 5) //4th e of array indicates form field to connect.
			{objFld = awindow.fields[i][4];
			if (objFld)
				{//if (objFld == "group_id") {objFld = "form_group_id"}
				//if (objFld == "record_id") {objFld = "form_record_id"}
				//if (objFld != "record_id") objFld += "_L";

				formfield = document.all(objFld);

				if (formfield && formfield.value) 
				{
//					if (formfield.value) new_value=formfield.value;
	//				else new_value="";
				//need provision for setting checkboxes.
				awindow.document.all(awindow.fields[i][1]+"_copier").value = formfield.value;}
				}
			}
		}
	}


function formAction(awindow,acommand)	{
	// Waits until form can be submitted - i.e. status is not in the "processing" state.
	statusWindow = window.parent.frames("report_status");
	//ISSUE: WHAT TO DO IF FORM GETS STUCK IN PROCESSING STATE?
	condition = (statusWindow.status =="processing");
	if (waiting(condition, function(){formAction(awindow,acommand)}, 500,awindow.name,50)) return false;

	if (acommand == 'delete')
		{arecordset = awindow.linkList.recordset; 
		select_column = arecordset.fields.count-1;
		//Isn't ideal, since delete info of record could still be controlled by form field rather than recordset selection.
		if (arecordset.fields(select_column) == true)
			{if (!confirm('Are you sure you want to DELETE this item:\n' + arecordset.fields(0) + ': ' + arecordset.fields(1))) return false}
		else {alert ("Please re-select an item to delete, and then retry this operation");
			return false}
		}

	if (acommand == 'clear') {
		formEditButtons(awindow,false,true,false);
		recordsetInit(awindow,0);
		pageNav(awindow);
		var formfield = document.all("form_record_id");
		if (formfield) formfield.value = "";
		var formfield = document.all("form_group_id");
		if (formfield) formfield.value = "";
		return false;
	}
	
	//Update on a group record is done in main presto window.
	if (acommand == 'update') {
		var formfield = document.all("form_group_id");
		if (formfield && formfield.value > 0) {
			editwin = window.open("presto.cfm?presto_frame=focus_content&ptTab=1&group_id=" + formfield.value,"ptWindow" + top.ptInstallId, "");
			editwin.focus();
			return false;
		}
	}	
	
	//Create function for any report that has create_form_id > 0.  This takes user back to main presto window.
	if (acommand == 'create') {
		if (create_form_id && create_form_id > 0) {
			editwin = window.open("presto.cfm?presto_frame=focus_content&form_mode=create_form&form_id=" + create_form_id + "&ptTab=1","ptWindow" + top.ptInstallId, "");
			editwin.focus();
			return false;
		}
	}
	
	//May have to switch mode of form from update to create or visa versa.
	statusWindow.status = "processing";
	aform=document.all(awindow.name + "_update").form;
	aform.action = "presto.cfm?presto_frame=report_status&presto_" + acommand + "=1&form_parent_id=" + awindow.parent_id;
	aform.target = "report_status";
	//Submit form to presto for processing update or create.
	aform.submit();
	formResults(awindow,acommand);
}


function formResults(awindow,acommand) {
	//Wait until report_status = ready, i.e. it as responded is available.
	if (window.parent==window) return false;
	statusWindow = window.parent.frames("report_status");
	condition = (statusWindow.status != "ready");
	if (waiting(condition, function(){formResults(awindow,acommand)}, 1000,awindow.name,50)) return false;
	
	if (statusWindow.result=="success")
		{switch (acommand) {
			case "delete": 
				awindow.linkList.recordset.Delete(); 
				formEditButtons(awindow,false,true,false);
				var formfield = document.all("form_record_id");
				if (formfield) formfield.value = "";
				var formfield = document.all("form_group_id");
				if (formfield) formfield.value = "";
				break;
			case "update": 
				transferFields(awindow); break;
			case "create": 
				//Place newly created record into form's current record id field.
				var formfield = document.all("form_record_id");
				if (formfield)
					{formfield.value = statusWindow.record_id;
					awindow.linkList.recordset.addNew();
					transferFields(awindow); 
					formEditButtons(awindow,true,false,true);
					awindow.datatable.lastPage();
					}
				else window.status = "Form Record_ID parameter was not updated.";
				break;
			}
		}
	else {alert("Your requested operation could not be performed!")};
}


function formEditButtons(awindow,deleteable,createable,updateable) {
	if (document.all(awindow.name + "_update"))	{
		document.all(awindow.name + "_delete").disabled=!deleteable;
		document.all(awindow.name + "_create").disabled=!createable;
		document.all(awindow.name + "_update").disabled=!updateable;
		}
	}

function tableSelectRowNS(awindow,aninput,rowValue)	{
	var arow = aninput;

	if (rowValue > "")
		{
		switch (arow.bgColor) {
			case select_color: 
				{arow.bgColor = ""; 
				var selected_state = false;			
				break}
			case "": 
				{arow.bgColor = select_color;
				var selected_state = true}
			}
		setHiddenField(awindow,rowValue,selected_state,arow);	
		}
}

//Examines parent elements until "TR" is encountered.
function getElement(el) {
	while ((el!=null) && (el.tagName!="TR")) el = el.parentElement;
	return el
	}

function setHiddenField(awindow,rowValue,selected_state,arow)
	{formElement(awindow) //get hidden form field that mirrors selected values.

	//alert(awindow.selection_max + ":" + awindow.oldRow);
	var found=0;
	// loop through values, and get index of found item, if any.
	for (i=0;i<formElementArray.length;i++)
		{if (formElementArray[i] == rowValue) {found=1;break;}}
		// Add or take value off of list in form field:
	if (selected_state == false && found==1)
		//take item out of hidden field value.
	   	{formElementArray.splice(i,1);
		document.getElementById(formElementName).value = formElementArray.toString()}
	else
	   	{if (selected_state == true && found==0)
			//add item to hidden field.
			{if (awindow.selection_max==1) // only one select item at a time.
				{document.getElementById(formElementName).value = rowValue;
				
				if (awindow.oldRow && awindow.oldRow != arow)
					// clear out existing selected colour
					{awindow.oldRow.bgColor = "";
				    if (document.all && awindow.oldRow.recordNumber != null && awindow.oldRow.recordNumber <= arecordset.recordcount) 
						{
						//Recordset update of old field here.
						arecordset.AbsolutePosition = awindow.oldRow.recordNumber;
						arecordset.fields(awindow.select_column).value=false;
						arecordset.AbsolutePosition = arow.recordNumber;									
						}
					}
				else awindow.oldRow = null;
				}

			else if (awindow.selection_max==0 || formElementArray.length <= awindow.selection_max)
				{startArray(formElementArray,rowValue);
				document.getElementById(formElementName).value = formElementArray.toString()		
				}
			}

		}	
		//alert(formElementArray.toString());
}
			
// select/deselct the specified row in awindow's table. arow is TDC dataset row #.
// ISSUE: tabbing and clicking on space bar bypasses onclick event.
function tableSelectRow(awindow,arow,behaviour) {	
	// 0:select/deselect affect parent form's hidden field values
	// 1: select/deselect don't affect parent form.
    if (arow==null) return

	// Pause until recordset is complete, or else selected state data won't be ready.
	condition = (awindow.linkList.readyState !=4);
	if (waiting(condition, function(){tableSelectRow(awindow,arow,behaviour)}, 300,awindow.name)) return false;
	
	// Microsoft IE: Find out what value this row has in dataset.  Key value is in first column
	var arecordset = awindow.linkList.recordset;
	awindow.select_column = arecordset.fields.count-1;

	arecordset.AbsolutePosition = arow.recordNumber;
	if (arecordset.BOF || arecordset.EOF) {alert("Error: try filter again.  Details: " +arow.recordNumber+","+arecordset.BOF+","+arecordset.EOF);return}
	// Microsoft IE: Find out what value this row has in dataset.  Key value is in first column
	var rowValue=arecordset.fields(0).value;
	
	var selected_state = arecordset.fields(awindow.select_column).value ? false: true;

	//User has clicked on checkbox directly (checkbox name is ""; all other elements have "undefined" for their name parameter); so state has already been flipped!  So Reflip.
	if (awindow.event && awindow.event.srcElement.name == "") (selected_state=!selected_state);
	
	if (rowValue > "") 
		{setHiddenField(awindow, rowValue, selected_state,arow);

		//Issue: changing values in recordset is causing it to be reset.
		if (selected_state==true)
			{global_select=[formElementName];
			// Return as array all selected row data fields (for use by custom code).
			for (i=0;i<arecordset.fields.count;i++)
				global_select.push(arecordset.fields(i).value)
			}
		
		//modify looks of table row
		arecordset.fields(awindow.select_column).value=false;
		//alert(arow.bgColor);
		switch (arow.bgColor) {
			case select_color: arow.bgColor = ""; break;
			case hover_select_color: arow.bgColor = hover_color; break;
			case "": arow.bgColor = hover_select_color;
					arecordset.fields(awindow.select_column).value=true;break;
			case hover_color: arow.bgColor = hover_select_color;
					arecordset.fields(awindow.select_column).value=true;break;
			}
	
		}

	// Examine each field of selected row to see if parent page's form has a field by given ID if any.  If match, transfer field value to form.
	for (i=0 ; i<arecordset.fields.count; i++)
		{afield = awindow.fields[i];
		if (afield && afield.length == 5) //4th e of array indicates form field to connect.
			{objFld = awindow.fields[i][4].toLowerCase();

			if (objFld)
				{if (objFld == "group_id") {objFld = "form_group_id"}
				if (objFld == "record_id") {objFld = "form_record_id"}
				else {
					//if (objFld != "record_id") {objFld += "_L"}
					//objFld = "g" + objFld
				}
				formfield = document.all(objFld);
				//alert(objFld + ":" + formfield);
				if (formfield) 
					{if (arecordset.fields(awindow.select_column).value != true) 
						{formfield.value = "";	formfield.onchange=null;//clears out form & any required status error checking that might be there.
						//on first field, an unselected row triggers button redraw 
						if (i==0) formEditButtons(awindow,false,true,false);
						}
					else 
						{if (arecordset.fields(i).value) {formfield.value = arecordset.fields(i).value}
						else {formfield.value = ""}
						localfield=awindow.fields[i][1];	
						//if onfirst field, set appropriate edit buttons' statuses
						if (i==0) formEditButtons(awindow,true,false,true);
						}
					}
				}
			}
		}		

	// For single select lists, keep track of which row was previously selected.
	awindow.oldRow = arow;
}
	
function startArray(anArray,value)
	{if (anArray[0]=="") anArray[0]=value; else anArray.push(value)}

function dropSelected(awindow) {
	var arecordset = awindow.linkList.recordset;
	formElement(awindow);
	
	if (arecordset.recordcount)
		{arecordset.moveLast();
		while(!arecordset.bof)
			{	// loop back through items, and delete selected ones.
			if (arecordset.fields(awindow.select_column)==false) //an unselected item
				{	//drop deleted item from formElementArray
				for (i=0;i<formElementArray.length;i++)
					{if (formElementArray[i] == arecordset.fields(0).value)
						{formElementArray.splice(i,1);break}
					}
				arecordset.Delete();
				}
			else arecordset.movePrevious();
			}
		// Should be equivalent to all remaining values.
		document.all(formElementName).value = formElementArray.toString();
		}
	setTableHeight(awindow);
	}

function setFormField(awindow) {
	var arecordset = awindow.linkList.recordset;
	var found;
	formElement(awindow);
	
	if (arecordset.recordcount)
		{arecordset.moveLast();
		while(!arecordset.bof)
			{// loop back through items, and transfer selected ones to form field.
			if (arecordset.fields(awindow.select_column)==true) //an unselected item
				{found=0;
				for (i=0;i<formElementArray.length;i++)
					{if (formElementArray[i] == arecordset.fields(0).value)
						{found=1;//alert("found" + arecordset.fields(0).value)
						break
						}
					}
				if (found==0)
					{startArray(formElementArray,arecordset.fields(0).value)}
				}
			arecordset.movePrevious();
			}
		// Should be equivalent to all remaining values.
		
		document.all(formElementName).value = formElementArray.toString();
		//alert("formfield:" + document.all(formElementName).value);
		}
	}
	
//MSIE generates error if we try to do recordset operations on another window, so instead pass reference of source window over to function in other window's parent form. 1) parent window has value of mainFramest of window that requested this one to be opened, so that local refresh of this window doesn't forget this fact.  2) mainFrameset is top-level window reference since reference further on down the hierarchy might point to a refreshed frame, in which case object ID of frame is lost. test
function transferSelectedRows(awindow) {
	var target_window_parent = parent.mainFrameset.frames(1).frames(1).frames(0);
	var x;
	var target_window;
	if (target_window_parent.frames.length)
		{for (x = 0; x < target_window_parent.frames.length; x ++)
			{if (target_window_parent.frames(x).name == awindow.name)
				target_window = target_window_parent.frames(x);
			}
		if (target_window != null)
			{target_window_parent.focus();
			target_window_parent.receiveSelectedRows(awindow,target_window);

			}
		else {alert("No form field exists to send selections to!\n\nGo back to Presto content manager and locate the pertinent form..")};
		}
	else {alert("No form field exists to send selections to!\n\nGo back to Presto content manager and locate the pertinent form.")};
}



function receiveSelectedRows(sourcewindow,localwindow) {
	//wait until we can update table
	formElement(localwindow);
	var theTable = sourcewindow.datatable;

	if (!(theTable.rows.length==null || theTable.rows.length==1))
		{	
		var sourcerecordset = sourcewindow.linkList.recordset;
		var localrecordset = localwindow.linkList.recordset;
		//sourcewindow.select_column = arecordset.fields.count-1;
		var rowPtr,tableRow;
		//var select_column=localrecordset.fields.count-1
		var found;
		var duprecordset = localwindow.linkList.recordset;

		for (tableRow=1;tableRow <= theTable.rows.length;tableRow++)
			{
			//if user filters data, then rowPtr could be empty.
			if (theTable.rows[tableRow] == null) {break}
			rowPtr = theTable.rows[tableRow].recordNumber;	
			if (rowPtr <= 0 || rowPtr > sourcerecordset.recordcount) {break}
			
			sourcerecordset.absolutePosition=rowPtr;
			if (sourcerecordset.eof) {break}
			if (sourcerecordset.fields(sourcewindow.select_column)==true) 
				{
				// Must ensure not inserting duplicates
				found=0;
				for (y=1;y<=duprecordset.recordcount;y++)
					{duprecordset.AbsolutePosition=y;
					if (duprecordset.fields(0).value == sourcerecordset.fields(0).value)
					{found=1;break}
					}
				if (found ==0)
					{//Copy over row from source to destination iframe dataset.
					if (localrecordset.recordcount) {localrecordset.moveLast()};
					localrecordset.AddNew();
					//future: try ie5's copyRow = row.cloneNode(true);
	
					rowCopy(sourcerecordset,localrecordset);
					//all local items have been selected.
					localrecordset.fields(localwindow.select_column).value=true;
					localrecordset.moveNext();
					//Future: order selected values
					startArray(formElementArray,sourcerecordset.fields(0).value);
					//alert("hi");	//NEED A DELAY HERE FOR SLOW BROWSERS
					}
				}			
			}
		}
	document.all(formElementName).value = formElementArray.toString();
	pageRefresh(localwindow); //DON'T ASSUME ALL LOCAL ITEMS ARE SELECTED.
	tableReady(localwindow);
	//above work ends up cancelling table height change after next call if call isn't delayed.
	setTimeout("setTableHeight(" + localwindow.name +")",300)

}


//Set popup report's selected status to be = main form's selected items.  Uses main form's hidden field.  Set all of localwindow's items to be unselected, unless they are selected in source window recordset.
function transferSelections(sourcewindow,localwindow) {
	
	condition = (sourcewindow.linkList.readyState !=4 || localwindow.linkList.readyState !=4)
	if (waiting(condition, function(){transferSelections(sourcewindow,localwindow)},localwindow, 500)) return false;

	formElement(sourcewindow);

	var sourcerecordset = sourcewindow.linkList.recordset;
	var localrecordset = localwindow.linkList.recordset;
	var x,i;
	var select_column=localrecordset.fields.count-1;
	selfield=localrecordset.fields(select_column);
	localrecordset.moveFirst();
	while (!localrecordset.eof)
		{selfield.value = false;
		for (i=0;i<formElementArray.length;i++)
			{if (formElementArray[i] == localrecordset.fields(0).value)
				{formElementArray.splice(i,1);selfield.value = true;break;}
			}
			localrecordset.moveNext();
		}
		newValue = formElementArray.toString();
		formElement(localwindow);
		formField.value = newValue;
		pageRefresh(localwindow);
} 


function rowCopy(recordsetFrom,recordsetTo)	{
	var i;
	//We don't copy the group_list field, hence "-1"
	for (i=0 ; i<recordsetTo.fields.count-1 ; i++)
		{recordsetTo.fields(i).value = recordsetFrom.fields(i).value}
}

//DISABLED: Used by [iframe]_filter_icon button on form paging controls of an iframe
function filterSet(awindow,afield) {

	if (afield.src.indexOf("filter_off.gif")!=-1) 
		{afield.src = "presto_pub/images/filter_on.gif"}
	else 
		{afield.src = "presto_pub/images/filter_off.gif";
		//awindow=aframe.name.slice(0,-6);afield.parent
		//awindow.document.forms[0].reset();
		awindow.linkList.object.Filter = "";
		awindow.linkList.Reset();
		setFormField(awindow);
		pageNav(awindow);
		pageRefresh(awindow);
		awindow.datatable.style.cursor="";
		}
	}
	
	
function filter(awindow,afield,column,type)
	{if (afield.value.toLowerCase() != afield.name.toLowerCase())
		{
		//numeric int fields dont make sense of wildcards so do exact match.
		if (type == "int") {
			var newfilter = column + "=" + afield.value
		}
		else {var newfilter = column + '="' + afield.value + '"'} //Use this for string data:
		//alert(awindow.linkList.object.Filter);

		if (newfilter != awindow.linkList.object.Filter)
			{awindow.linkList.object.Filter = newfilter;
			awindow.linkList.Reset();
			//redraw selections & count of records and current position.
			pageNav(awindow);
			setTimeout("pageRefresh("+awindow.name+")",300);
			}

		}

	with (awindow.parent.document.images(awindow.name+"_filter_icon"))
		{if (awindow.linkList.object.Filter > "") src="presto_pub/images/filter_on.gif";
		else src="presto_pub/images/filter_off.gif";
		}
	}

function sort(awindow,column)
	{
	awindow.linkList.object.Sort = column;
	awindow.linkList.Reset();

	//now reestablish selected items
	pageNav(awindow);
	setTimeout("pageRefresh("+awindow.name+")",500);

	}	
	
	
function setTableHeight(awindow,override)	{
	condition = (awindow.datatable.readyState !='complete')
	if (waiting(condition, function(){setTableHeight(awindow)}, 500,awindow.name)) return false;
	awindow.datatable.style.cursor = "";
	// if no paging, and whole list shown then let window's style, if any, fix its height 
	if ((awindow.paging == null || awindow.paging == "scroll") && awindow.mode ==2  && !override) return;
	// must allow for scrollbars
	var newHeight=awindow.datatable.offsetHeight;
	var aframeref=document.all(awindow.name);
	
	//alert (aframeref.scrollWidth)
	//if there is horizontal scrolling, then we need to add space for vertical scrollbar.
//	alert(awindow.datatable.offsetWidth +">"+ aframeref.scrollWidth +"||"+ awindow.datatable.offsetHeight +">"+ aframeref.scrollHeight)
//	if (awindow.datatable.offsetWidth > aframeref.scrollWidth ||awindow.datatable.offsetHeight - aframeref.scrollHeight >= 0)
	aframeref.style.height = newHeight+25;

}

function resizeWindow(awindow,aselect)	{
	if (aselect.selectedIndex != null)
	{
		if (aselect[aselect.selectedIndex].value=="scroll") 
			{awindow.datatable.dataPageSize = ""}
		else {awindow.datatable.dataPageSize = parseInt(aselect[aselect.selectedIndex].value);
		  //alert(aselect[aselect.selectedIndex].value);
			setTableHeight(awindow,true)
			}
		pageRefresh(awindow)
	}
}


//action="",first,previous,next,last
function pageMove(aframe,action,tried) {
	
	if (tried==null)
	{if (action != "") eval("aframe.datatable." + action + "Page()");}
	//Have to wait until move completed in order to get right recordNumber
	condition = (aframe.datatable.readyState !='complete')
	if (waiting(condition, function(){pageMove(aframe,action,1)}, 200,aframe.name)) return false;
	pageNav(aframe);
	pageRefresh(aframe);
}

function pageNav(aframe) {
	if (aframe.paging !=null && aframe.mode != 1)	
	{
	aparent=aframe.parent.window;
	
	var firstbutton = aparent.document.all(aframe.name + "_first");
	var previousbutton = aparent.document.all(aframe.name + "_previous");
	var nextbutton = aparent.document.all(aframe.name + "_next");
	var lastbutton = aparent.document.all(aframe.name + "_last");
	if (aframe.datatable.rows.length>1)
		{var recordPtr = aframe.datatable.rows[1].recordNumber}
	else
		{var recordPtr = 1}

	aparent.document.all(aframe.name + "_status").disabled=false;
	aparent.document.all(aframe.name + "_status").value = ""+ recordPtr + " / " + aframe.linkList.recordset.recordcount;
	aparent.document.all(aframe.name + "_status").disabled=true;
	firstbutton.disabled = (recordPtr <= 1);
	previousbutton.disabled=firstbutton.disabled;
	lastbutton.disabled = (recordPtr >= aframe.linkList.recordset.recordcount-aframe.datatable.dataPageSize);
	nextbutton.disabled = lastbutton.disabled;
	}
}

//Copy data table data into cut and paste buffer as tab delimited data.  Due to peculiarities in cut and paste operation, we have to create tab delimited data out of HTML table data, rather than straight from the text buffer.  Direct anElement.innerText copy doesn't seperate <TD> data with tabs.
function clipboard(anElement) {

	anElement.border=1;
	var rep = window.document.all(anElement).innerHTML;
	rep = rep.replace(/(\r|\n|\&nbsp;)/g,'');
	rep = rep.replace(/<\/td>/ig,'	</td>');
	rep = rep.replace(/<\/tr>/ig,'\r\n');
	rep = rep.replace(/<[^>]*>/g,'');
	holdtext.innerText = rep;
	Copied = holdtext.createTextRange();
	Copied.execCommand('Copy');
	anElement.border=0;
}

// SCROLLS DOWN TO  value after iframe is fully loaded.
//if (arowIndex.length > 0) rowScroll(aframe,arowIndex[0])

function selectMoveUp(aSelect) {
	for (i=0; i<aSelect.options.length-1; i++) { 
		if (aSelect.options[i+1].selected && !aSelect.options[i].selected) {	
			MoveDn = aSelect.options[i].value;
			aSelect.options[i].value = aSelect.options[i+1].value;
			aSelect.options[i+1].value=MoveDn;
			
			MoveDn = aSelect.options[i].text;
			aSelect.options[i].text = aSelect.options[i+1].text;
			aSelect.options[i+1].text=MoveDn;
	
			aSelect.options[i].selected = 1;	
			aSelect.options[i+1].selected = 0;					
		}
	}
	selectRecord(aSelect);
}
function selectMoveDown(aSelect) {
	for (i=aSelect.options.length-1; i>0; i--) { 
		if (aSelect.options[i-1].selected && !aSelect.options[i].selected) {		
			MoveDn = aSelect.options[i-1].value;
			aSelect.options[i-1].value = aSelect.options[i].value;
			aSelect.options[i].value=MoveDn;
			
			MoveDn = aSelect.options[i-1].text;
			aSelect.options[i-1].text = aSelect.options[i].text;
			aSelect.options[i].text=MoveDn;
	
			aSelect.options[i].selected = 1;	
			aSelect.options[i-1].selected = 0;	
		}
	}
	selectRecord(aSelect);
}
function selectAll(aSelect) {
	aSelect.multiple = true;
	for (i=0; i<aSelect.options.length; i++) {
		aSelect.options[i].selected = true;
	}
}
function selectRecord(aSelect) {
	aSelectOrder = document.getElementById(aSelect.name+"_reorder");
	if (aSelectOrder) {
		aSelectOrder.value="";
		for (i=0; i<aSelect.options.length; i++) {
			aSelectOrder.value += aSelect.options[i].value + ",";
		}
	}
}

