/*
WARNING! - the array.indexOf() functions on this page are dependent
on the jsforexplorer.js scripts!
*/


function BuildTowerIO()
{
	/*
	Driver	Description					Configuration
	T		Conductivity				Single or dual tower conductivity input
	IO		Current Output (4-20mA)		Single or Dual
	OP		ORP/pH						Single or Dual, dual pH or dual ORP or one of each
	CI		Current Input (4-20mA)		Dual input only	
	CR		Corrosion Rate				Dual input only
	CT		Conductivity/Temp			Dual input only
	
	
	All Possible values that can exist in the analogInputs Array: 
	analogInputs[1] = T,? 		- means a Single Tower Conductivity card is plugged into Input AB Slot
	analogInputs[2] = T,T 		- means a Dual Tower Conductivity card is plugged into Input CD Slot
	analogInputs[5] = IO,?		- means a Single Current Output card is plugged into Input IJ Slot
	analogInputs[5] = IO,IO		- means a Dual Current Output card is plugged into Input IJ Slot
	analogInputs[3] = OP,?		- means a Single ORP/pH card is plugged into Input EF Slot
	analogInputs[3] = OP,OP		- means a Dual ORP/pH card is plugged into Input EF Slot
	analogInputs[3] = CI,CI		- means a Current Input card is plugged into Input EF Slot
	analogInputs[3] = CR,CR		- means a Corrosion Rate card is plugged into Input EF Slot
	analogInputs[1] = CT,CT 	- means a Conductivity/Temp card is plugged into Input AB Slot
	*/
	
	var analogInputs = new Array();
	var digitalInputs = new Array();
	var relayOutputs = new Array();
	var modelNumber = "";
	
	analogInputs[1] = "?,?"; //Input AB
	analogInputs[2] = "?,?"; //Input CD
	analogInputs[3] = "?,?"; //Input EF
	analogInputs[4] = "?,?"; //Input GH
	analogInputs[5] = "?,?"; //Input IJ
	analogInputs[6] = "?,?"; //Input KL
	analogInputs[7] = "?,?"; //Input MN
	
	digitalInputs[1] = false; //Input O
	digitalInputs[2] = false; //Input P
	digitalInputs[3] = false; //Input Q
	digitalInputs[4] = false; //Input R
	digitalInputs[5] = false; //Input S
	digitalInputs[6] = false; //Input T
	digitalInputs[7] = false; //Input U
	digitalInputs[8] = false; //Input V
	digitalInputs[9] = false; //Input W
	digitalInputs[10] = false; //Input X
	digitalInputs[11] = false; //Input Y
	digitalInputs[12] = false; //Input Z
	
	relayOutputs[1] = false; //Output 1
	relayOutputs[2] = false; //Output 2
	relayOutputs[3] = false; //Output 3
	relayOutputs[4] = false; //Output 4
	relayOutputs[5] = false; //Output 5
	relayOutputs[6] = false; //Output 6
	relayOutputs[7] = false; //Output 7
	relayOutputs[8] = false; //Output 8
	relayOutputs[9] = false; //Output 9
	relayOutputs[10] = false; //Output 10
	
	var towerForm = document.getElementById("mtForm");
	var formFields = "";
	var modelNumber = "";
	
	//Loop thru all the Cooling Tower Form Fields and determine which options the user selected
	for(element=0; element<towerForm.elements.length; element++)
	{		
		//What is the selected Base System?
		if(towerForm.elements[element].name == "baseSystem" && towerForm.elements[element].checked)
		{
			switch(towerForm.elements[element].value)
			{
				case "CO":
					//Update the model number string
					modelNumber = "CO";
					if(analogInputs.indexOf("?,?") >= 0)
					{
						analogInputs[analogInputs.indexOf("?,?")] = "CT,CT";
					}					
					else
					{
						alert("CO Option Error!\nUnavailable inputs for the Conductivity/Temperature Driver.");
						return;
					}					
					
					//Add the bleed relay to the array of relay's
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CO Option Error!\nUnavailable relay for the Bleed Pump.");
						return;
					}
					
					//Add the inhibitor relay to the array of relay's
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CO Option Error!\nUnavailable relay for the Inhibitor Pump.");
						return;
					}	
				  	break;					    
				case "PH":
				  	//Update the model number string
					modelNumber = "PH";
					
					//Add a Single Input OP Driver
					if(analogInputs.indexOf("OP,?") >= 0)
					{
						analogInputs[analogInputs.indexOf("OP,?")] = "OP,OP";
					}
					else if(analogInputs.indexOf("?,?") >= 0)
					{
						analogInputs[analogInputs.indexOf("?,?")] = "OP,?";
					}
					else
					{
						alert("PH Option Error!\nUnavailable input for the ORP/pH Driver.");
						return;
					}
					
					//Add the Acid/Caustic Pump relay
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("PH Option Error!\nUnavailable relay for the Acid/Caustic Pump.");
						return;
					}
				  	break
				case "CP":
					//Update the model number string
					modelNumber = "CP";
					
					//Add the CT Driver
					if(analogInputs.indexOf("?,?") >= 0)
					{
						analogInputs[analogInputs.indexOf("?,?")] = "CT,CT"
					}
					else
					{
						alert("CP Option Error!\nUnavailable input for the Conductivity/Temperature Driver.");
						return;
					}
					
					//Add a Single OP Driver
					if(analogInputs.indexOf("OP,?") >= 0)
					{
						analogInputs[analogInputs.indexOf("OP,?")] = "OP,OP"
					}
					else if(analogInputs.indexOf("?,?") >= 0)
					{
						analogInputs[analogInputs.indexOf("?,?")] = "OP,?"
					}
					else
					{
						alert("CP Option Error!\nUnavailable input for the ORP/pH Driver.");
						return;
					}
					
					//Add the Bleed Pump Relay
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CP Option Error!\nUnavailable relay for the Bleed Pump.");
						return;
					}
					
					//Add the Acid Pump Relay
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CP Option Error!\nUnavailable relay for the Acid Pump.");
						return;
					}
					
					//Add the Inhibitor Pump Relay
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CP Option Error!\nUnavailable relay for the Inhibitor Pump.");
						return;
					}
				  	break
				case "PH2":
					//Update the model number string
					modelNumber = "PH2";
					
					//Add a Dual OP Driver
					if(analogInputs.indexOf("?,?") >= 0)
					{
						analogInputs[analogInputs.indexOf("?,?")] = "OP,OP"
					}
					else
					{
						alert("PH2 Option Error!\nUnavailable input for the Dual ORP/pH Driver.");
						return;
					}
					
					//Add the first Acid Pump Relay
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("PH2 Option Error!\nUnavailable relay for the first Acid Pump.");
						return;
					}
					
					//Add the second Acid Pump Relay
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("PH2 Option Error!\nUnavailable relay for the second Acid Pump.");
						return;
					}					
					break
				case "CO2":
					//Update the model number string
					modelNumber = "CO2";
					
					//Add the first CT Driver
					if(analogInputs.indexOf("?,?") >= 0)
					{
						analogInputs[analogInputs.indexOf("?,?")] = "CT,CT"
					}
					else
					{
						alert("CO2 Option Error!\nUnavailable input for the first Conductivity/Temperature Driver.");
						return;
					}
					
					//Add the second CT Driver
					if(analogInputs.indexOf("?,?") >= 0)
					{
						analogInputs[analogInputs.indexOf("?,?")] = "CT,CT"
					}
					else
					{
						alert("CO2 Option Error!\nUnavailable input for the second Conductivity/Temperature Driver.");
						return;
					}
					
					//Add the first Bleed Relay
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CO2 Option Error!\nUnavailable relay for the first Bleed Pump.");
						return;
					}
					
					//Add the second Acid Pump Relay
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CO2 Option Error!\nUnavailable relay for the second Bleed Pump.");
						return;
					}
					
					//Add the first Inhibitor Feed Relay
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CO2 Option Error!\nUnavailable relay for the first Inhibitor Pump.");
						return;
					}
					
					//Add the second Inhibitor Feed Relay
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CO2 Option Error!\nUnavailable relay for the second Inhibitor Pump.");
						return;
					}
					break
				case "CP2":
					//Update the model number string
					modelNumber = "CP2";
					
					//Add the first CT Driver
					if(analogInputs.indexOf("?,?") >= 0)
					{
						analogInputs[analogInputs.indexOf("?,?")] = "CT,CT"
					}
					else
					{
						alert("CP2 Option Error!\nUnavailable input for the first Conductivity/Temperature Driver.");
						return;
					}
					
					//Add the second CT Driver
					if(analogInputs.indexOf("?,?") >= 0)
					{
						analogInputs[analogInputs.indexOf("?,?")] = "CT,CT"
					}
					else
					{
						alert("CP2 Option Error!\nUnavailable input for the second Conductivity/Temperature Driver.");
						return;
					}
					
					//Add the Dual OP Driver
					if(analogInputs.indexOf("?,?") >= 0)
					{
						analogInputs[analogInputs.indexOf("?,?")] = "OP,OP"
					}
					else if(analogInputs.indexOf("OP,?") >= 0)
					{
						//Add the first pH driver to an existing OP slot
						analogInputs[analogInputs.indexOf("OP,?")] = "OP,OP"
						
						//Add the second pH driver to another existing OP slot
						if(analogInputs.indexOf("OP,?") >= 0)
						{
							analogInputs[analogInputs.indexOf("OP,?")] = "OP,OP"
						}
						else
						{
							alert("CP2 Option Error!\nUnavailable input for the second ORP/pH Driver.");
							return;
						}
					}
					else
					{
						alert("CP2 Option Error!\nUnavailable inputs for the ORP/pH Driver.");
						return;
					}
					
					//Add the first Bleed Relay
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CP2 Option Error!\nUnavailable relay for the first Bleed Pump.");
						return;
					}
					
					//Add the second Bleed Relay
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CP2 Option Error!\nUnavailable relay for the second Bleed Pump.");
						return;
					}
					
					//Add the first Acid Pump
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CP2 Option Error!\nUnavailable relay for the first Acid Pump.");
						return;
					}
					
					//Add the second Acid Pump
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CP2 Option Error!\nUnavailable relay for the second Acid Pump.");
						return;
					}
					
					//Add the first Inhibitor Pump
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CP2 Option Error!\nUnavailable relay for the first Inhibitor Pump.");
						return;
					}
					
					//Add the second Inhibitor Pump
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("CP2 Option Error!\nUnavailable relay for the second Inhibitor Pump.");
						return;
					}
					
					break
				case "OX":
					//Update the model number string
					modelNumber = "OX";					
					
					//Add a Single OP Driver
					if(analogInputs.indexOf("OP,?") >= 0)
					{
						analogInputs[analogInputs.indexOf("OP,?")] = "OP,OP"
					}
					else if(analogInputs.indexOf("?,?") >= 0)
					{
						analogInputs[analogInputs.indexOf("?,?")] = "OP,?"
					}
					else
					{
						alert("OX Option Error!\nUnavailable input for the OP Driver.");
						return;
					}
					
					//Add the Biocide Pump
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("OX Option Error!\nUnavailable relay for the Biocide Pump.");
						return;
					}
					break
				case "":
					modelNumber = "";
					break;
				default:
					alert("Error! A Base System was not selected.");				  
			}
		}
			
		//Biocide Timer Option
		if(towerForm.elements[element].name == "biocideTimer" && towerForm.elements[element].checked)
		{
			var timerCount = 0;
			switch(towerForm.elements[element].value)
			{
				case "T1":
					//Update the model number string
					modelNumber += "-T1";
					timerCount = 1;
					break;
				case "T2":
					//Update the model number string
					modelNumber += "-T2";
					timerCount = 2;
					break;
				case "T12":
					//Update the model number string
					modelNumber += "-T12";
					timerCount = 2;
					break;
				case "T22":
					//Update the model number string
					modelNumber += "-T22";
					timerCount = 4;
					break;
			}
			
			//Add a relay
			for(i=0; i<timerCount; i++)
			{
				if(relayOutputs.indexOf(false) >= 0)
				{
					relayOutputs[relayOutputs.indexOf(false)] = true;
				}
				else
				{
					alert("Biocide Timer Option Error!\nUnavailable relay.");
					return;
				}
			}
		}
		
		//Flow Option
		if(towerForm.elements[element].name == "flowOption")
		{
			//Update the model number string
			if(towerForm.elements[element].value > 0)
			{
				modelNumber += "-F" + towerForm.elements[element].value;
			}	
			
			//Add a digital input
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				if(digitalInputs.indexOf(false) >= 0)
				{
					digitalInputs[digitalInputs.indexOf(false)] = true;
				}
				else
				{
					alert("F Option Error!\nUnavailable Digitial Input.");
					return;
				}
			}			
		}
		
		//Thermal Flow Option
		if(towerForm.elements[element].name == "thermalFlowOption")
		{
			//Update the model number string
			if(towerForm.elements[element].value > 0)
			{
				modelNumber += "-TF" + towerForm.elements[element].value;
			}	
			
			//Add a digital input
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				if(digitalInputs.indexOf(false) >= 0)
				{
					digitalInputs[digitalInputs.indexOf(false)] = true;
				}
				else
				{
					alert("TF Option Error!\nUnavailable Digitial Input.");
					return;
				}
			}
		}
		
		//Additional Flow Option
		if(towerForm.elements[element].name == "additionalFlowOption")
		{
			//Add a digital input
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				if(digitalInputs.indexOf(false) >= 0)
				{
					digitalInputs[digitalInputs.indexOf(false)] = true;
				}
				else
				{
					alert("Flow Option Error!\nUnavailable Digitial Input.");
					return;
				}
			}
		}
		
		//ORP Option
		if(towerForm.elements[element].name == "orpOption")
		{
			//Update the model number string
			if(towerForm.elements[element].value > 0)
			{
				modelNumber += "-OR" + towerForm.elements[element].value;
			}	
			
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				//Add ORP. Find an existing OP Slot first
				if(analogInputs.indexOf("OP,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("OP,?")] = "OP,OP";
				}
				else if(analogInputs.indexOf("?,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("?,?")] = "OP,?";
				}
				else
				{
					alert("OR Option Error!\nUnavailable input for the OP Driver.");
					return;
				}
				
				//Add relay for ORP Control
				if(relayOutputs.indexOf(false) >= 0)
				{
					relayOutputs[relayOutputs.indexOf(false)] = true;
				}
				else
				{
					alert("ORP Option Error!\nUnavailable relay.\nNote: For each OR Option, a relay is needed for control.");
					return;
				}
			}
		}
		
		//ORP Monitor Only Option
		if(towerForm.elements[element].name == "orpMonitorOption")
		{
			//Update the model number string
			if(towerForm.elements[element].value > 0)
			{
				modelNumber += "-ORM" + towerForm.elements[element].value;
			}	
			
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				//Add ORP. Find an existing OP Slot first
				if(analogInputs.indexOf("OP,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("OP,?")] = "OP,OP";
				}
				else if(analogInputs.indexOf("?,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("?,?")] = "OP,?";
				}
				else
				{
					alert("OR Option Error!\nUnavailable input for the OP Driver.");
					return;
				}
			}
		}
		
		//ORP Additional Relays
		if(towerForm.elements[element].name == "orpAdditionalRelayOption")
		{
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				//Add relay for ORP Control
				if(relayOutputs.indexOf(false) >= 0)
				{
					relayOutputs[relayOutputs.indexOf(false)] = true;
				}
				else
				{
					alert("ORP Additional Relays Option Error!\nUnavailable relay.");
					return;
				}
			}
		}		
		
		//pH w/ Acid Feed Option
		if(towerForm.elements[element].name == "phAcidFeedOption")
		{
			//Update the model number string
			if(towerForm.elements[element].value > 0)
			{
				modelNumber += "-XP" + towerForm.elements[element].value;
			}			
			
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				//Add ORP. Find an existing OP Slot first
				if(analogInputs.indexOf("OP,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("OP,?")] = "OP,OP";
				}
				else if(analogInputs.indexOf("?,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("?,?")] = "OP,?";
				}
				else
				{
					alert("OR Option Error!\nUnavailable input for the OP Driver.");
					return;
				}
				
				//Add relay for pH Control
				if(relayOutputs.indexOf(false) >= 0)
				{
					relayOutputs[relayOutputs.indexOf(false)] = true;
				}
				else
				{
					alert("XP Option Error!\nUnavailable relay.\nNote: For each XP Option, a relay is needed for control.");
					return;
				}
			}
		}
		
		//pH Monitor Only Option
		if(towerForm.elements[element].name == "phMonitorOption")
		{
			//Update the model number string
			if(towerForm.elements[element].value > 0)
			{
				modelNumber += "-XPM" + towerForm.elements[element].value;
			}
			
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				//Add ORP. Find an existing OP Slot first
				if(analogInputs.indexOf("OP,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("OP,?")] = "OP,OP";
				}
				else if(analogInputs.indexOf("?,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("?,?")] = "OP,?";
				}
				else
				{
					alert("XP Option Error!\nUnavailable input for the OP Driver.");
					return;
				}
			}
		}
		
		//pH Additional Relay Only Option
		if(towerForm.elements[element].name == "phAdditionalRelayOption")
		{
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				if(relayOutputs.indexOf(false) >= 0)
				{
					relayOutputs[relayOutputs.indexOf(false)] = true;
				}
				else
				{
					alert("XP Additional Relay Option Error!\nUnavailable relay");
					return;
				}
			}
		}		
		
		//Liquid Level Option
		if(towerForm.elements[element].name == "liquidLevelOption")
		{
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				//Add CI Driver. Find an existing CI Slot first
				if(analogInputs.indexOf("CI,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("CI,?")] = "CI,CI";
				}
				else if(analogInputs.indexOf("?,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("?,?")] = "CI,?";
				}
				else
				{
					alert("L1 Option Error!\nUnavailable input for the CI Driver.");
					return;
				}
			}
			
			//Update the Model Number string
			if(towerForm.elements[element].value > 0)
			{
				modelNumber += "-L" + towerForm.elements[element].value;
			}
		}
		
		//Modem Option
		if(towerForm.elements[element].name == "modemOption" && towerForm.elements[element].checked)
		{
			switch(towerForm.elements[element].value)
			{
				case "RC":
				  	modelNumber += "-RC";
				  	break   
				default:
					//alert("Modem Option is not selected");
			}
		}
		
		//4-20mA Output Options
		if(towerForm.elements[element].name == "IC" || towerForm.elements[element].name == "IP" || towerForm.elements[element].name == "IO" || towerForm.elements[element].name == "IR")
		{
			//Add the 4-20mA Output to the array of analog inputs
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				//Add IO Driver. Find an existing IO Slot first
				if(analogInputs.indexOf("IO,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("IO,?")] = "IO,IO";
				}
				else if(analogInputs.indexOf("?,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("?,?")] = "IO,?";
				}
				else
				{
					alert("4-20mA Output Option Error!\nUnavailable analog input for the IO Driver.\nNote: 4-20mA Outputs are installed in an Analog Input.");
					return;
				}
			}
			
			//Update the Model Number string
			if(towerForm.elements[element].value > 0)
			{
				modelNumber += "-" + towerForm.elements[element].name + towerForm.elements[element].value;				
			}
		}
		
		
		//ph Upgrade Option
		if(towerForm.elements[element].name == "phUpgradeOption")
		{			
			//Update the Model Number string
			if(towerForm.elements[element].value > 0)
			{
				modelNumber += "-FFP" + towerForm.elements[element].value;				
			}
		}
		
		//ORP Upgrade Option
		if(towerForm.elements[element].name == "orpUpgradeOption")
		{
			//Update the Model Number string
			if(towerForm.elements[element].value > 0)
			{
				modelNumber += "-FFO" + towerForm.elements[element].value;				
			}
		}
		
		//Toroidal Option
		if(towerForm.elements[element].name == "TC10" || towerForm.elements[element].name == "TC100")		
		{			
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				//Remove an existing CT Driver for each Toroidal Option
				if(analogInputs.indexOf("CT,CT") >= 0)
				{
					analogInputs[analogInputs.indexOf("CT,CT")] = "CI,?";
				}
				else if(analogInputs.indexOf("CI,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("CI,?")] = "CI,CI";
				}
				else if(analogInputs.indexOf("?,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("?,?")] = "CI,?";
				}
				else
				{
					alert("Toroidal Option Error!\nUnavailable analog input for the CI Driver.");
					return;
				}				
			}
			
			//Update the Model Number string
			if(towerForm.elements[element].value > 0)
			{
				modelNumber += "-" + towerForm.elements[element].name +  towerForm.elements[element].value;				
			}
		}
		
		//Corrosion Rate Options
		if(towerForm.elements[element].name == "CR/CU" || towerForm.elements[element].name == "CR/CS" || towerForm.elements[element].name == "CR/AM" || towerForm.elements[element].name == "CR/CN")
		{
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				//Add the CR Driver to the list of analog inputs
				if(analogInputs.indexOf("CR,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("CR,?")] = "CR,CR";
				}
				else if(analogInputs.indexOf("?,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("?,?")] = "CR,?";
				}
				else
				{
					alert("Corrosion Rate Option Error!\nUnavailable analog input for the CR Driver.");
					return;
				}				
			}
			
			//Update the Model Number string
			if(towerForm.elements[element].value > 0)
			{
				modelNumber += "-" + towerForm.elements[element].name +  towerForm.elements[element].value;				
			}
		}		
		
		//Conductivity Option
		if(towerForm.elements[element].name == "conductivityOption" || towerForm.elements[element].name == "conductivityMonitorOption")
		{
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				//Add the CT Driver to the list of analog inputs
				if(analogInputs.indexOf("?,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("?,?")] = "CT,CT";
				}
				else
				{
					alert("Conductivity Option Error!\nUnavailable analog input for the CT Driver.");
					return;
				}
				
				//Add a relay 
				if(towerForm.elements[element].name == "conductivityOption")
				{
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("Conductivity Option Error!\nUnavailable relay.\nNote: Each CX option is assigned a relay output.");
						return;
					}
				}
			}
			
			//Update the Model Number string
			if(towerForm.elements[element].value > 0)
			{
				if(towerForm.elements[element].name == "conductivityOption")
				{
					modelNumber += "-CX" +  towerForm.elements[element].value;
				}
				else
				{
					modelNumber += "-CXM" +  towerForm.elements[element].value;
				}			
			}
		}
		
		//Conductivity Additional Relay Option
		if(towerForm.elements[element].name == "conductivityRelayOption")
		{
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				if(relayOutputs.indexOf(false) >= 0)
				{
					relayOutputs[relayOutputs.indexOf(false)] = true;
				}
				else
				{
					alert("Conductivity Additional Relay Option Error!\nUnavailable relay");
					return;
				}
			}
		}
		
		//4-20mA Input Option
		if(towerForm.elements[element].name == "currentInputOption" || towerForm.elements[element].name == "currentMonitorOption")
		{		
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				//Add the CI Driver to the list of analog inputs
				if(analogInputs.indexOf("CI,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("CI,?")] = "CI,CI";
				}
				else if(analogInputs.indexOf("?,?") >= 0)
				{
					analogInputs[analogInputs.indexOf("?,?")] = "CI,CI";
				}
				else
				{
					alert("4-20mA Input Option Error!\nUnavailable analog input for the CI Driver.");
					return;
				}
				
				//Add a relay 
				if(towerForm.elements[element].name == "currentInputOption")
				{
					if(relayOutputs.indexOf(false) >= 0)
					{
						relayOutputs[relayOutputs.indexOf(false)] = true;
					}
					else
					{
						alert("4-20mA Input Option Error!\nUnavailable relay.\nNote: Each II option is assigned a relay output.");
						return;
					}
				}
			}
			
			//Update the Model Number string
			if(towerForm.elements[element].value > 0)
			{
				if(towerForm.elements[element].name == "currentInputOption")
				{
					modelNumber += "-II" +  towerForm.elements[element].value;
				}
				else
				{
					modelNumber += "-IIM" +  towerForm.elements[element].value;
				}			
			}
			
		}
		
		//4-20mA Input Additional RelayOption
		if(towerForm.elements[element].name == "currentRelayOption")
		{		
			for(i=0; i<towerForm.elements[element].value; i++)
			{
				if(relayOutputs.indexOf(false) >= 0)
				{
					relayOutputs[relayOutputs.indexOf(false)] = true;
				}
				else
				{
					alert("4-20mA Input Additional Relay Option Error!\nUnavailable relay");
					return;
				}
			}
		}
		
		//Regional Option
		if(towerForm.elements[element].name == "regionOption" && towerForm.elements[element].checked)
		{
			switch(towerForm.elements[element].value)
			{
				case "EU":
				  	modelNumber += "-EU";
				  	break    
				default:
					//alert("USA Region by default (No EU option)");
			}
		}
	} //End for loop
	
	
	//Determine if the user-configured options is an M5 or M10
	//Determine if the user-configured options is an M5 or M10
	var splitVal = analogInputs[4].split(",",2);
	var splitVal2 = analogInputs[5].split(",",2);
	if(relayOutputs[6] || digitalInputs[7])
	{
		modelNumber = "M10T-" + modelNumber;
	}
	else if(splitVal[1] != "?" || splitVal2[0] != "?")
	{
		modelNumber = "M10T-" + modelNumber;
	}
	else
	{
		modelNumber = "M5T-" + modelNumber;
	}
	
	
	//***************************************************************
	//***************************************************************
	//***************************************************************
	//DISPLAY SELECTED I/O - This section is dependent on the HTML Elements on _selectedio.cfm 
	
	
	
	//Display the Model Number in All Div Tags that have a class name of "modelNumber"
	var modelNumberElements = document.getElementsByTagName("div");
	for(i=0; i<modelNumberElements.length; i++)
	{
		if(modelNumberElements[i].className == "modelNumber")
		{
			while (modelNumberElements[i].hasChildNodes())
			{
			  modelNumberElements[i].removeChild(modelNumberElements[i].firstChild);
			}	
		  	modelNumberElements[i].appendChild(document.createTextNode(modelNumber));
		}
	}
	
	//Display the selected Analog Inputs
	var selectedAnalogInputs = document.getElementsByTagName("select");
	for(a=0; a<selectedAnalogInputs.length; a++)
	{
		if(selectedAnalogInputs[a].className == "selectedAnalogInputs")
		{	
			var inputLocation = "";
			for(j=1; j<analogInputs.length; j++)
			{
				//Map the index with the Input Location
				/*
				switch(j)
				{
					case 1:
						inputLocation = "AB";
						break;
					case 2:
						inputLocation = "CD";
						break;
					case 3:
						inputLocation = "EF";
						break;
					case 4:
						inputLocation = "GH";
						break;
					case 5:
						inputLocation = "IJ";
						break;
					case 6:
						inputLocation = "KL";
						break;
					case 7:
						inputLocation = "MN";
						break;
				}
				*/
				selectedAnalogInputs[a].options[j-1] = new Option(j + ": " + analogInputs[j],'');
			}
		}
	}
	
	//Display the selected Digital Inputs
	var selectedDigitals = document.getElementsByTagName("div");
	var usedDigitals = 0;
	for(h=1; h<digitalInputs.length; h++)
	{
		if(digitalInputs[h])
		{
			usedDigitals++;
		}
	}
	for(i=0; i<selectedDigitals.length; i++)
	{
		if(selectedDigitals[i].className == "selectedDigitalInputs")
		{
			while (selectedDigitals[i].hasChildNodes())
			{
			  selectedDigitals[i].removeChild(selectedDigitals[i].firstChild);
			}	
		  	selectedDigitals[i].appendChild(document.createTextNode(usedDigitals + "/" + (digitalInputs.length-1)));
		}
	}
	
	//Display the selected Relay Outputs
	var selectedRelays = document.getElementsByTagName("div");
	var usedRelays = 0;
	for(h=1; h<relayOutputs.length; h++)
	{
		if(relayOutputs[h])
		{
			usedRelays++;
		}
	}
	for(i=0; i<selectedRelays.length; i++)
	{
		if(selectedRelays[i].className == "selectedRelayOutputs")
		{
			while (selectedRelays[i].hasChildNodes())
			{
			  selectedRelays[i].removeChild(selectedRelays[i].firstChild);
			}	
		  	selectedRelays[i].appendChild(document.createTextNode(usedRelays + "/" + (relayOutputs.length-1)));
		}
	}
} //End BuildTowerIO()


function BuildBoilerIO()
{
	/*
	Driver	Description					Configuration
	B		Boiler Conductivity			Single or dual boiler conductivity input
	IO		Current Output (4-20mA)		Single or Dual
	OP		ORP/pH						Single or Dual, dual pH or dual ORP or one of each
	CI		Current Input (4-20mA)		Dual input only	
	CR		Corrosion Rate				Dual input only
	CT		Conductivity/Temp			Dual input only
	
	
	All Possible values that can exist in the analogInputs Array: 
	analogInputs[1] = B,? 		- means a Single Boiler Conductivity card is plugged into Input AB Slot
	analogInputs[2] = B,B 		- means a Dual Boiler Conductivity card is plugged into Input CD Slot
	analogInputs[5] = IO,?		- means a Single Current Output card is plugged into Input IJ Slot
	analogInputs[5] = IO,IO		- means a Dual Current Output card is plugged into Input IJ Slot
	analogInputs[3] = OP,?		- means a Single ORP/pH card is plugged into Input EF Slot
	analogInputs[3] = OP,OP		- means a Dual ORP/pH card is plugged into Input EF Slot
	analogInputs[3] = CI,CI		- means a Current Input card is plugged into Input EF Slot
	analogInputs[3] = CR,CR		- means a Corrosion Rate card is plugged into Input EF Slot
	analogInputs[1] = CT,CT 	- means a Conductivity/Temp card is plugged into Input AB Slot
	*/
	
	var analogInputs = new Array();
	var digitalInputs = new Array();
	var relayOutputs = new Array();
	var modelNumber = "";
	
	analogInputs[1] = "?,?"; //Input AB
	analogInputs[2] = "?,?"; //Input CD
	analogInputs[3] = "?,?"; //Input EF
	analogInputs[4] = "?,?"; //Input GH
	analogInputs[5] = "?,?"; //Input IJ
	analogInputs[6] = "?,?"; //Input KL
	analogInputs[7] = "?,?"; //Input MN
	
	digitalInputs[1] = false; //Input O
	digitalInputs[2] = false; //Input P
	digitalInputs[3] = false; //Input Q
	digitalInputs[4] = false; //Input R
	digitalInputs[5] = false; //Input S
	digitalInputs[6] = false; //Input T
	digitalInputs[7] = false; //Input U
	digitalInputs[8] = false; //Input V
	digitalInputs[9] = false; //Input W
	digitalInputs[10] = false; //Input X
	digitalInputs[11] = false; //Input Y
	digitalInputs[12] = false; //Input Z
	
	relayOutputs[1] = false; //Output 1
	relayOutputs[2] = false; //Output 2
	relayOutputs[3] = false; //Output 3
	relayOutputs[4] = false; //Output 4
	relayOutputs[5] = false; //Output 5
	relayOutputs[6] = false; //Output 6
	relayOutputs[7] = false; //Output 7
	relayOutputs[8] = false; //Output 8
	relayOutputs[9] = false; //Output 9
	relayOutputs[10] = false; //Output 10
	
	
	
	//Set Base Boiler System
	var baseSystemOptions = document.getElementsByName("baseSystem_b");
	for(i=0; i<baseSystemOptions.length; i++)
	{
		if(baseSystemOptions[i].checked)
		{
			switch(baseSystemOptions[i].value)
			{
				case "B1":
					analogInputs[1] = "B,?";
					relayOutputs[1] = true;
					modelNumber = "B1";
					break;
				case "B2":
					analogInputs[1] = "B,B";
					relayOutputs[1] = true;
					relayOutputs[2] = true;
					modelNumber = "B2";
					break;
				case "B3":
					analogInputs[1] = "B,B";
					analogInputs[2] = "B,?";
					relayOutputs[1] = true;
					relayOutputs[2] = true;
					relayOutputs[3] = true;
					modelNumber = "B3";
					break;
				case "B4":
					analogInputs[1] = "B,B";
					analogInputs[2] = "B,B";
					relayOutputs[1] = true;
					relayOutputs[2] = true;
					relayOutputs[3] = true;
					relayOutputs[4] = true;
					modelNumber = "B4";
					break;
				case "B5":
					analogInputs[1] = "B,B";
					analogInputs[2] = "B,B";
					analogInputs[3] = "B,?";
					relayOutputs[1] = true;
					relayOutputs[2] = true;
					relayOutputs[3] = true;
					relayOutputs[4] = true;
					relayOutputs[5] = true;
					modelNumber = "B5";
					break;
				case "B6":
					analogInputs[1] = "B,B";
					analogInputs[2] = "B,B";
					analogInputs[3] = "B,B";
					relayOutputs[1] = true;
					relayOutputs[2] = true;
					relayOutputs[3] = true;
					relayOutputs[4] = true;
					relayOutputs[5] = true;
					relayOutputs[6] = true;
					modelNumber = "B6";
					break;
				case "B7":
					analogInputs[1] = "B,B";
					analogInputs[2] = "B,B";
					analogInputs[3] = "B,B";
					analogInputs[4] = "B,?";
					relayOutputs[1] = true;
					relayOutputs[2] = true;
					relayOutputs[3] = true;
					relayOutputs[4] = true;
					relayOutputs[5] = true;
					relayOutputs[6] = true;
					relayOutputs[7] = true;
					modelNumber = "B7";
					break;
				case "B8":
					analogInputs[1] = "B,B";
					analogInputs[2] = "B,B";
					analogInputs[3] = "B,B";
					analogInputs[4] = "B,B";
					relayOutputs[1] = true;
					relayOutputs[2] = true;
					relayOutputs[3] = true;
					relayOutputs[4] = true;
					relayOutputs[5] = true;
					relayOutputs[6] = true;
					relayOutputs[7] = true;
					relayOutputs[8] = true;
					modelNumber = "B8";
					break;
				case "":
					modelNumber = "";
					break;
						
			}
		}
		
	}
	
	//TB option	
	var tbOption = document.getElementById("TB_b");
	for(i=1; i<=tbOption.value; i++)
	{
		//Add the Relay
		if(relayOutputs.indexOf(false) >= 0)
		{
			relayOutputs[relayOutputs.indexOf(false)] = true;
		}
		else
		{
			alert("Pump Timing Option Error!\nUnavailable relay outputs");
			return;
		}			
	}
	if(tbOption.value > 0)
	{
		modelNumber += "-TB" + tbOption.value; //Update the Model Number
	}
	
	//FT option	
	var ftOption = document.getElementById("FT_b");
	for(i=1; i<=ftOption.value; i++)
	{
		//Add the Digital Input
		if(digitalInputs.indexOf(false) >= 0)
		{
			digitalInputs[digitalInputs.indexOf(false)] = true;
		}
		else
		{
			alert("Fail To Sample Option Error!\nUnavailable digital inputs");
			return;
		}			
	}
	if(ftOption.value > 0)
	{
		modelNumber += "-FT" + ftOption.value; //Update the Model Number
	}
	
	//XC option	
	var xcOption = document.getElementById("XC_b");
	for(i=1; i<=xcOption.value; i++)
	{
		//Add the Input
		if(analogInputs.indexOf("?,?") >= 0)
		{
			analogInputs[analogInputs.indexOf("?,?")] = "CT,CT";
		}
		else
		{
			alert("Condensate Conductivity Option Error!\nUnavailable analog input");
			return;
		}			
	}
	if(xcOption.value > 0)
	{
		modelNumber += "-XC" + xcOption.value; //Update the Model Number
	}
	
	//L option	
	var lOption = document.getElementById("L_b");
	for(i=1; i<=lOption.value; i++)
	{
		//Add the Input
		if(analogInputs.indexOf("CI,?") >= 0)
		{
			analogInputs[analogInputs.indexOf("CI,?")] = "CI,CI";
		}
		else if(analogInputs.indexOf("?,?") >= 0)
		{
			analogInputs[analogInputs.indexOf("?,?")] = "CI,?";
		}
		else
		{
			alert("Liquid Level Option Error!\nUnavailable analog input");
			return;
		}			
	}
	if(lOption.value > 0)
	{
		modelNumber += "-L" + lOption.value; //Update the Model Number
	}
	
	//RC option	
	var rcOption = document.getElementById("RC_b");
	if(rcOption.value && rcOption.checked)
	{
		modelNumber += "-RC"; //Update the Model Number
	}
	
	//IC Option
	var icOption = document.getElementById("IC_b");
	for(i=1; i<=icOption.value; i++)
	{
		//Add the Input
		if(analogInputs.indexOf("IO,?") >= 0)
		{
			analogInputs[analogInputs.indexOf("IO,?")] = "IO,IO";
		}
		else if(analogInputs.indexOf("?,?") >= 0)
		{
			analogInputs[analogInputs.indexOf("?,?")] = "IO,?";
		}
		else
		{
			alert("4-20mA Output Option Error!\nUnavailable analog input for the 4-20mA Output Driver\n4-20mA Output Driver's are installed on a analog input.");
			return;
		}			
	}
	if(icOption.value > 0)
	{
		modelNumber += "-IC" + icOption.value; //Update the Model Number
	}
	
	//BP Option
	var bpOption = document.getElementById("BP_b");
	for(i=1; i<=bpOption.value; i++)
	{
		//Add the Input
		if(analogInputs.indexOf("OP,?") >= 0)
		{
			analogInputs[analogInputs.indexOf("OP,?")] = "OP,OP";
		}
		else if(analogInputs.indexOf("?,?") >= 0)
		{
			analogInputs[analogInputs.indexOf("?,?")] = "OP,?";
		}
		else
		{
			alert("Condensate pH Option Error!\nUnavailable analog input");
			return;
		}			
	}
	if(bpOption.value > 0)
	{
		modelNumber += "-BP" + bpOption.value; //Update the Model Number
	}
	
	//CT Option
	var ctOption = document.getElementById("CT_b");
	for(i=0; i<ctOption.value; i++)
	{
		if(analogInputs.indexOf("B,?") >= 0)
		{
			analogInputs[analogInputs.indexOf("B,?")] = "CT,CT";
		}
		else if(analogInputs.indexOf("B,B") >= 0)
		{
			//Add the CT Driver then move the other existing B Driver to an empty input location
			analogInputs[analogInputs.indexOf("B,B")] = "CT,CT";
			
			if(analogInputs.indexOf("B,?") >= 0)
			{
				analogInputs[analogInputs.indexOf("B,?")] = "B,B";
			}
			else if(analogInputs.indexOf("?,?") >= 0)
			{
				analogInputs[analogInputs.indexOf("?,?")] = "B,?";
			}
			else
			{
				alert("CT Option Error!\n\nThe quantity of CT Options that you selected generated an orphan B Driver.\nTo resolve the error, decrease the Base System Option.");
				return;
			}
		}
		else
		{
			alert("CT Option Error!\n\nFor each CT Option, you must have an existing Boiler Conductivity Sensor. To resolve this error, increase the Boiler Base System Option or decrease the amount of CT Options.");
			return;
		}			
	}
	if(ctOption.value > 0)
	{
		modelNumber += "-CT" + ctOption.value; //Update the Model Number
	}
	
	//CM Option
	var cmOption = document.getElementById("CM_b");
	for(i=0; i<cmOption.value; i++)
	{
		if(analogInputs.indexOf("B,?") >= 0)
		{
			analogInputs[analogInputs.indexOf("B,?")] = "CT,CT";
		}
		else if(analogInputs.indexOf("B,B") >= 0)
		{
			//Add the CT Driver then move the other existing B Driver to an empty input location
			analogInputs[analogInputs.indexOf("B,B")] = "CT,CT";
			
			if(analogInputs.indexOf("B,?") >= 0)
			{
				analogInputs[analogInputs.indexOf("B,?")] = "B,B";
			}
			else if(analogInputs.indexOf("?,?") >= 0)
			{
				analogInputs[analogInputs.indexOf("?,?")] = "B,?";
			}
			else
			{
				alert("CM Option Error!\n\nThe quantity of CM Options that you selected generated an orphan B Driver.\nTo resolve the error, decrease the Base System Option.");
				return;
			}
		}
		else
		{
			alert("CM Option Error!\n\nFor each CM Option, you must have an existing Boiler Conductivity Sensor.\nTo resolve this error, increase the Boiler Base System Option or decrease the amount of CM Options.");
			return;
		}			
	}
	
	if(cmOption.value > 0)
	{
		
		modelNumber += "-CM" + cmOption.value; //Update the Model Number
	}
	
	//II Option
	var iiOption = document.getElementById("II_b");
	for(i=1; i<=iiOption.value; i++)
	{
		//Add the Input
		if(analogInputs.indexOf("CI,?") >= 0)
		{
			analogInputs[analogInputs.indexOf("CI,?")] = "CI,CI";
		}
		else if(analogInputs.indexOf("?,?") >= 0)
		{
			analogInputs[analogInputs.indexOf("?,?")] = "CI,?";
		}
		else
		{
			alert("4-20mA Input Option Error!\nUnavailable input");
			return;
		}			
	}
	if(iiOption.value > 0)
	{
		modelNumber += "-II" + iiOption.value; //Update the Model Number
	}
	
	//EU Option
	var euOption = document.getElementById("EU_b");
	if(euOption && euOption.checked)
	{
		modelNumber += "-EU"; //Update the Model Number
	}
	
	//Determine if the user-configured options is an M5 or M10
	var splitVal = analogInputs[4].split(",",2);
	var splitVal2 = analogInputs[5].split(",",2);
	if(relayOutputs[6] || digitalInputs[7])
	{
		modelNumber = "M10B-" + modelNumber;
	}
	else if(splitVal[1] != "?" || splitVal2[0] != "?")
	{
		modelNumber = "M10B-" + modelNumber;
	}
	else
	{
		modelNumber = "M5B-" + modelNumber;
	}
	
	//Display the Model Number in All Div Tags that have a class name of "modelNumberB"
	var modelNumberElements = document.getElementsByTagName("div");
	for(i=0; i<modelNumberElements.length; i++)
	{
		if(modelNumberElements[i].className == "modelNumberB")
		{
			while (modelNumberElements[i].hasChildNodes())
			{
			  modelNumberElements[i].removeChild(modelNumberElements[i].firstChild);
			}	
		  	modelNumberElements[i].appendChild(document.createTextNode(modelNumber));
		}
	}
	
	//Display the selected Analog Inputs
	var selectedAnalogInputs = document.getElementsByTagName("select");
	for(a=0; a<selectedAnalogInputs.length; a++)
	{
		if(selectedAnalogInputs[a].className == "selectedAnalogInputsB")
		{	
			var inputLocation = "";
			for(j=1; j<analogInputs.length; j++)
			{
				selectedAnalogInputs[a].options[j-1] = new Option(j + ": " + analogInputs[j],'');
			}
		}
	}
	
	//Display the selected Digital Inputs
	var selectedDigitals = document.getElementsByTagName("div");
	var usedDigitals = 0;
	for(h=1; h<digitalInputs.length; h++)
	{
		if(digitalInputs[h])
		{
			usedDigitals++;
		}
	}
	for(i=0; i<selectedDigitals.length; i++)
	{
		if(selectedDigitals[i].className == "selectedDigitalInputsB")
		{
			while (selectedDigitals[i].hasChildNodes())
			{
			  selectedDigitals[i].removeChild(selectedDigitals[i].firstChild);
			}	
		  	selectedDigitals[i].appendChild(document.createTextNode(usedDigitals + "/" + (digitalInputs.length-1)));
		}
	}
	
	//Display the selected Relay Outputs
	var selectedRelays = document.getElementsByTagName("div");
	var usedRelays = 0;
	for(h=1; h<relayOutputs.length; h++)
	{
		if(relayOutputs[h])
		{
			usedRelays++;
		}
	}
	for(i=0; i<selectedRelays.length; i++)
	{
		if(selectedRelays[i].className == "selectedRelayOutputsB")
		{
			while (selectedRelays[i].hasChildNodes())
			{
			  selectedRelays[i].removeChild(selectedRelays[i].firstChild);
			}	
		  	selectedRelays[i].appendChild(document.createTextNode(usedRelays + "/" + (relayOutputs.length-1)));
		}
	}
} //End BuildBoilerIO()
