var objArray = new Array();
//Variables to Store states of Element Objects
var objType = "";
var objName = "";
var objLength = "";
var objState = "";
var objSelectedIndex = "";
var objValue = "";
var alreadyFoundArray = new Array();
var alreadyFoundIndex = 0;
var found = false;
var lastURL = "";

isSearchNew = true;

//Indexes on the page of select-one and selected-multiple boxes
//This has to be done due to a netscape bug that retains the length of any select box array
//until you get to the next select.
var elementIndexesOfSelects = new Array();
var elementIndex = 0;

function storeValues(theForm)
{
	with(theForm)
	{
		for(var i = 0; i < elements.length;i++)
		{
			 //Setting all state variables to "" for next object
			 objType = "";
			 objName = "";
			 objLength = "";
			 objState = "";
			 objSelectedIndex = "";
			 objValue = "";

			if(elements[i].name != "")
			{
				if(elements[i].type != "select-one" && elements[i].type != "select-multiple")
				{
					//Gathering Info that is same if obj is array or not.
					objType = elements[i].type;
					objName	= elements[i].name;
					
					//Starting check to see if element is part of an array
					var tempName = elements[i].name
					objLength = eval(tempName + ".length");
					
					//Checking typeof length (Netscape bug: doesn't clear length from last object found)
					//if the typeof length is undefined then the obj is not part of an array
					if(typeof objLength == "undefined")
					{
						//Since obj is not part of an array
						//You will only have a single value.
						objValue = elements[i].value;
						if(elements[i].type == "radio" || elements[i].type == "checkbox")
						{
							if(elements[i].checked)
								objState = true;
							else
								objState = false;
						}
					}
					else if(typeof objLength == "number")
					{	
							//in the next section of code we will build an array of object names that are found
							//to be part of an array. Once the objects name is added to the array called
							//"alreadyFoundArray" you do not need to deal with the next object that has the same name.
						if(alreadyFoundArray.length > 0)
						{		
							for(var j = 0; j < alreadyFoundArray.length;j++)
							{
								if(alreadyFoundArray[j] == objName)
								{
									found = true;
									break;
								}
							}
							if(found == false)
							{	
								alreadyFoundArray[alreadyFoundIndex] = objName;
								alreadyFoundIndex++;
								getMultipleValues_States_Check_Radio(theForm, objName);
							}
						}
						else
						{	
							alreadyFoundArray[alreadyFoundIndex] = objName;
							alreadyFoundIndex++;
							getMultipleValues_States_Check_Radio(theForm, objName);
						}
					}
				
					//Create the objects to mirror the objects on the page.
					//We are excluding select boxes at this point
					//We must first check to see if we already put the element in the array on this exit from
					//the page.  We must then check and see if the element was in the object array from an
					//earlier trip to the page.  In which case we are making an update not a new creation.
					if(found == false)
					{
						var nameIndex = objArray.length;
						for(var h = 0; h < objArray.length;h++)
						{    
							if(elements[i].name == objArray[h].name)
							{
								 nameIndex = h;
								 break;
							}
						}
						objArray[nameIndex] = new formElement(objName,objType,objValue,objSelectedIndex,objLength,objState)
					}
					//Set found back to false for next run through the for loop
					found = false;
				}//end of if block to make sure object is not a select box.
				//This section of the code is used to handle select boxes.
				//It will keep track of the indexes of elements that are selects.
				else
				{
					elementIndexesOfSelects[elementIndex] = i;
					elementIndex++;
				}
			}//End of elements[i].name if block
		}//end of for loop
		
		//We will now handle the select boxes we found on the first run through the page
		for(var i = 0; i < elementIndexesOfSelects.length;i++)
		{
			var tempName = "";
			objValue = "";
			objLength = "";
			objState = "";
			objSelectedIndex = "";
			objType = elements[elementIndexesOfSelects[i]].type; 
			objName = elements[elementIndexesOfSelects[i]].name;
			tempName = theForm.elements[elementIndexesOfSelects[i]].name
			objLength = eval(tempName + ".length");
			if(elements[elementIndexesOfSelects[i]].type == "select-one")
			{
				objSelectedIndex = elements[elementIndexesOfSelects[i]].selectedIndex;
				objValue = elements[elementIndexesOfSelects[i]].options[elements[elementIndexesOfSelects[i]].selectedIndex].value;
			}
			else
			{
				getMultIndexes_Values_SelectMultiple(theForm, elements[elementIndexesOfSelects[i]]);				
			}
			//Create arrays for select objects.
			var nameIndex = objArray.length;
			for(var h = 0; h < objArray.length;h++)
			{    
				if(elements[elementIndexesOfSelects[i]].name == objArray[h].name)
				{
					 nameIndex = h;
					 break;
				}
			}
			objArray[nameIndex] = new formElement(objName,objType,objValue,objSelectedIndex,objLength,objState)
		}//End of for loop for select boxes
	}//End of with
	
	//You must zero and clear all temp. storage areas
	alreadyFoundArray.length = 0;
	alreadyFoundIndex = 0;
	elementIndexesOfSelects.length = 0;
	elementIndex = 0;
}//end of store function


function retrieveValues(theForm)
{
	objLength = "";
	var tempName = "";
	if(isSearchNew)
	{
		isSearchNew = false;
		return;
	}
	with(theForm)
	{
		//Looping through all elements on the page
		for(var i = 0; i < elements.length;i++)
		{
			//checking to make sure the elements has a name property
			if(elements[i].name != "")
			{
				//proccessing all elements except select boxes
				if(elements[i].type != "select-one" && elements[i].type != "select-multiple")
				{
					//checking length of element.  This will tell us if element is part of an array
					tempName = elements[i].name
					objLength = eval(tempName + ".length");

					for(var j = 0; j < objArray.length; j++)
					{
						//checking if element on page has been saved into the object array.
						if(elements[i].name == objArray[j].name && elements[i].type == objArray[j].type)
						{
							//if typeof is undefined element is not part of an array.
							if(typeof objLength == "undefined")
							{
								if(elements[i].type == "text" || elements[i].type == "textarea")
								{
									elements[i].value = objArray[j].value;
								}
								else if(elements[i].type == "radio" || elements[i].type == "checkbox")
								{
									elements[i].checked = eval(objArray[j].state);
								}
							}
							else if(typeof objLength == "number")
							{
								//checking to see if lengths match.  If lengths do not match
								//we will assume it is not the same array.
								if(objLength == objArray[j].length)
								{
									if(elements[i].type == "radio" || elements[i].type == "checkbox")
									{
										if(alreadyFoundArray.length > 0)
										{		
											for(var t = 0; t < alreadyFoundArray.length;t++)
											{
												if(alreadyFoundArray[t] == elements[i].name)
												{
													found = true;
													break;
												}
											}
											if(found == false)
											{	
												alreadyFoundArray[alreadyFoundIndex] = elements[i].name;
												alreadyFoundIndex++;
												retrieveStateOf_Radio_Checkbox_Arrays(theForm,j, elements[i].name)
											}
										}
										else
										{	
											alreadyFoundArray[alreadyFoundIndex] = elements[i].name;
											alreadyFoundIndex++;
											retrieveStateOf_Radio_Checkbox_Arrays(theForm,j,elements[i].name)
										}
										found = false;
									}
								}
							}
						}
					}
				}
				//now we handle the select boxes by storing their indexes on the page.
				else
				{
					elementIndexesOfSelects[elementIndex] = i;
					elementIndex++;
				}
			}//End of if checking for name property.
		}//End of full page for loop
		for(var i = 0; i < elementIndexesOfSelects.length;i++)
		{
			for(var c = 0; c < objArray.length;c++)
			{
				if(elements[elementIndexesOfSelects[i]].name == objArray[c].name && elements[elementIndexesOfSelects[i]].length == objArray[c].length)
				{
					if(elements[elementIndexesOfSelects[i]].type == "select-one")
					{
						elements[elementIndexesOfSelects[i]].selectedIndex = objArray[c].index;
						break;
					}
					else
					{
						if (objArray[c].index != "")
							getSelectedIndexesOf_Select_Multiples(theForm,elementIndexesOfSelects[i], c);
						break;
					}
				}
			}
		}//End of for loop for select boxes.
	} // end with
	alreadyFoundArray.length = 0;
	alreadyFoundIndex = 0;
	elementIndexesOfSelects.length = 0;
	elementIndex = 0;
} // end retrieveValues()

function storeLastLink(URL)
{
	lastURL = URL;
}
function retrieveLastLink(type,frameName)
{	
	var loc = "";
	if(type == "new" || type == "New")
	{
		newSearch();
	}

	try
    {
        loc = eval("parent." + frameName + ".location");
    }
    catch(err)
    {
        loc = eval(frameName + ".location");
    }
    
	loc.href = lastURL;
} // end retrieveLastLink()
function returnLastLink()
{
	return lastURL;
}
function newSearch()
{
	isSearchNew = true;
	objArray.length = 0;
}
function getValue(name)
{
	var retValuesArray = new Array();
	var arrCounter = 0;
	for(var i = 0;i < objArray.length;i++)
	{
		if(objArray[i].name == name)
		{
			if(typeof objArray[i].length == "undefined") //Netscape bug
				return objArray[i].value;
			else if(typeof objArray[i].length == "number")
			{
				var values = objArray[i].value.split(",");
				var states = objArray[i].state.split(",");
				if(objArray[i].type == "radio" || objArray[i].type == "checkbox")
				{
					for(var a = 0; a < values.length;a++)
					{
						if(states[a] == "true")
						{
							retValuesArray[arrCounter] = values[a];
							arrCounter++;
						}
					}
					return retValuesArray;
				}	
				else
				{
					return values;
				}
			}
		}
	}
	return "";
} // end getValue()
function getState(name, index)
{
	for(var i = 0;i < objArray.length;i++)
	{
		if(objArray[i].name == name)
		{
			if(typeof objArray[i].length == "undefined")
				return objArray[i].state;
			else if(typeof objArray[i].length == "number")
			{
				var states = objArray[i].state.split(",");
				if(objArray[i].type == "radio" || objArray[i].type == "checkbox")
				{
					return states[index];
				}
			}
		}
	}
	return "";
} // end getState()


/*************************************************/
/*The following functions are internal           */
/*The following functions are internal           */
/*The following functions are internal           */
/*The following functions are internal           */
/*The following functions are internal           */
/*The following functions are internal           */
/*The following functions are internal           */
/*The following functions are internal to        */
/*The operation and will not be used by custom   */
/*solutions developers                           */
/*************************************************/



//This is an internal function.  Not to be called by Developers.
//Used to fill in the selected index and values of select multiple boxes.
function getMultIndexes_Values_SelectMultiple(theForm, element)
{
	var comma = "";
	with(theForm)
	{
		var selectedIndexes = "";
		for(var i = 0; i < element.length; i++)
		{
			if(element.options[i].selected == true)
			{
				objSelectedIndex += comma + i;
				objValue += comma + element.options[i].value;
				comma = ",";
			}
		}
	}
}
//The next two functions are for debugging purposes
function printValues()
{
	alert("The objName is " + objName + 
			"\nThe objType is " + objType +
			"\nThe objLength is " + objLength +
			"\nThe objValue is " + objValue +
			"\nThe objState is " + objState +
			"\nThe objSelectedIndex is " + objSelectedIndex)
}
function printObjectValues()
{
	alert("The objName is " + this.name + 
			"\nThe objType is " + this.type +
			"\nThe objLength is " + this.length +
			"\nThe objValue is " + this.value +
			"\nThe objState is " + this.state +
			"\nThe objSelectedIndex is " + this.index)
}
//This is an internal function not to be called by Developers.
//Used to fill in the values of radio and check boxes.
function getMultipleValues_States_Check_Radio(theForm, fObjName)
{
	objValue = "";
	objState = "";
	var comma = "";
	with(theForm)
	{
		for(var i = 0; i < elements.length;i++)
		{
			if(elements[i].name == fObjName)
			{
				objValue += comma + elements[i].value;
				if(elements[i].type == "radio" || elements[i].type == "checkbox")
				{
					if(elements[i].checked)
						objState += comma + true;
					else
						objState += comma + false;
				}
				comma = ",";
			}
		}
	}
}
function getSelectedIndexesOf_Select_Multiples(theForm,i, c)
{
	var selectedIndexArray = objArray[c].index.split(",");
	with(theForm)
	{
		elements[i].selectedIndex = -1;
		for(var b = 0; b < selectedIndexArray.length;b++)
		{
			elements[i].options[selectedIndexArray[b]].selected = true;
		}
	}
}
//This is an internal function.  Not to be called by developers.
//This is the object constructor.  It creates the objects to mirror the object in your form.
function formElement(name,type,value,index,length,state)
{
	this.name = name;
	this.type = type;
	this.value = value;
	this.index = index;
	this.length = length;
	this.state = state;
	this.printObjectValues = printObjectValues;
}
//this function is used internally by the retrieve function.
function retrieveStateOf_Radio_Checkbox_Arrays(theForm, j, fobjName)
{
	var stateArray;
	var counter = 0;
	with(theForm)
	{
		//Taking the contents of the state variable and splitting at the commas
		stateArray = objArray[j].state.split(",");
		for(var i = 0; i < elements.length; i++)
		{	
			if(elements[i].name == fobjName)
			{
				//when using split the originally save boolean was changed to a string
				//so you have to check the string then set the value to true or false.
				if(stateArray[counter] == "true")
					elements[i].checked = true;
				else
					elements[i].checked = false;
				
				counter++;
			}
		}
	}
}
