		function ValidateForm(frm, nextStep)
		{
			
			var errCount = 0;
			var msg = "";

			if (CountChecks(frm.race_class) == 0)
			{
				Highlight(frm.race_class)
				msg += "Please choose your class\n"
				errCount++
			}

			if (frm.boat_name.value.trim().length == 0)
			{
				Highlight(frm.boat_name);
				msg += "Boat Name is a required field\n";
				errCount++;
			}

			if (frm.hull_mfg.value.trim().length == 0)
			{
				Highlight(frm.hull_mfg);
				msg += "Hull Manufacturer is a required field\n";
				errCount++;
			}

			if (CountChecks(frm.hull_type) == 0)
			{
				Highlight(frm.hull_type);
				msg += "Please check at least one boat type\n"
				errCount++;
			}

			if (frm.engine_mfg.value.trim().length == 0)
			{
				Highlight(frm.engine_mfg)
				msg += "Engine Manufacturer is a required field\n"
				errCount++;
			}

			if (frm.cid.value.trim().length == 0)
			{
				Highlight(frm.cid)
				msg += "Engine C.I.D. is a required field\n"
				errCount++;
			}

			if (CountChecks(frm.engine_type) == 0)
			{
				Highlight(frm.engine_type);
				msg += "Please check at least one engine type\n"
				errCount++;
			}

			// *********************************************************
			// *                  Boat Owner                           *
			// *********************************************************

			if (frm.boat_owner.value.trim().length == 0)
			{
				Highlight(frm.boat_owner)
				msg += "\nBoat Owner's name must be entered\n"
				errCount++
			}

			if (frm.owner_address.value.trim().length == 0)
			{
				Highlight(frm.owner_address)
				msg += "Boat Owner's address is required\n"
				errCount++
			}

			if (frm.owner_city.value.trim().length == 0)
			{
				Highlight(frm.owner_city)
				msg += "Boat Owner's address is incomplete\n"
				errCount++
			}

			if (frm.owner_state.selectedIndex == 0)
			{
				Highlight(frm.owner_state)
				msg += "Boat Owner's address is incomplete\n"
				errCount++
			}

			if (frm.owner_zip.value.trim().length == 0)
			{
				Highlight(frm.owner_zip)
				msg += "Boat Owner's address is incomplete\n"
				errCount++
			}

			if (frm.owner_areacode.value.trim().length == 0)
			{
				Highlight(frm.owner_areacode)
				msg += "Boat Owner's telephone number is missing or incomplete\n"
				errCount++
			}

			if (frm.owner_telephone.value.trim().length == 0)
			{
				Highlight(frm.owner_telephone)
				msg += "Boat Owner's telephone number is missing or incomplete\n"
				errCount++;
			}

			if (CountChecks(frm.owner_membership) == 0)
			{
				Highlight(frm.owner_membership)
				msg += "Please mark the appropriate Boat Owner's memberships\n"
				errCount++
			}

			// *********************************************************
			// *                  Boat Driver                          *
			// *********************************************************

			if (frm.boat_driver.value.trim().length == 0)
			{
				Highlight(frm.boat_driver)
				msg += "\nBoat driver's name must be entered\n"
				errCount++;
			}

			if (frm.driver_address.value.trim().length == 0)
			{
				Highlight(frm.driver_address)
				msg += "Boat Driver's address is required\n"
				errCount++
			}

			if (frm.driver_city.value.trim().length == 0)
			{
				Highlight(frm.driver_city)
				msg += "Boat Driver's address is incomplete\n"
				errCount++
			}

			if (frm.driver_state.selectedIndex == 0)
			{
				Highlight(frm.driver_state)
				msg += "Boat Driver's address is incomplete\n"
				errCount++;
			}

			if (frm.driver_zip.value.trim().length == 0)
			{
				Highlight(frm.driver_zip)
				msg += "Boat Driver's address is incomplete\n"
				errCount++
			}

			if (frm.driver_areacode.value.trim().length == 0)
			{
				Highlight(frm.driver_areacode)
				msg += "Boat Driver's telephone number is missing or incomplete\n"
				errCount++
			}

			if (frm.driver_telephone.value.trim().length == 0)
			{
				Highlight(frm.driver_telephone)
				msg += "Boat Driver's telephone number is missing or incomplete\n"
				errCount++
			}

			if (CountChecks(frm.driver_membership) == 0)
			{
				Highlight(frm.driver_membership)
				msg += "Please mark the appropriate Boat Driver's memberships\n"
				errCount++
			}

			// *********************************************************
			// *                  Boat Driver Licensing                *
			// *********************************************************
			// Boat licensing is optional

			// *********************************************************
			// *                  In Case of Emergency                 *
			// *********************************************************
			// Items are optional


			if (frm.hotel_name.value.trim().length != 0)
			{
				if (frm.hotel_telephone.value.trim().length == 0)
				{
					Highlight(frm.hotel_telephone)
					msg += "You chose to provide the optional information, Hotel Name.  Please also include at least the telephone number.\n"
					errCount++
				}
			}

			if (errCount > 0)
			{
				if (msg.length > 300)
					msg = msg.left(300) + "...\n\nRequired fields have been highlighted in red."
				
				alert(msg)
			}
			else
			{
				if (nextStep == "print")
					window.print()
				else
					frm.submit();
			}
		}
		function Highlight(element)
		{
			var item, ndx;
			if (element["type"] == undefined)
			{
				for (ndx = 0; ndx < element.length; ndx++)
				{
					SetItemBackgroundColor(element[ndx], "#FFD0D0");
				}
			}
			else
				SetItemBackgroundColor(element, "#FFD0D0");
				
		}
		function ClearHighlight(element)
		{
			var item, ndx;
			if (element["type"] == undefined)
			{
				for (ndx = 0; ndx < element.length; ndx++)
				{
					SetItemBackgroundColor(element[ndx], "transparent");
				}
			}
			else
				SetItemBackgroundColor(element, "transparent");
		}
		function SetItemBackgroundColor(element, clr)
		{
			switch (element["type"])
			{
				case "text":
				case "select-one":
					element.style.background = clr
					break;
				case "checkbox":
				case "radio":
					element.style.background = clr
					break;
				default:
					alert("unknown element type: " + element["type"])
					
			}
		}
		function CountChecks(element)
		{
			var cnt = 0;
			for (var ndx = 0; ndx < element.length; ndx++)
			{
				if (element[ndx].checked)
					cnt++;
			}
			return cnt;
		}

		function CheckField(element)
		{
			var parent;
			var ndx;

			switch (element["type"])
			{
				case "text":
					if (element.value.trim().length != 0)
					{
						ClearHighlight(element);
						element.value = element.value.trim()
					}
					break;
				case "select-one":
					if (element.selectedIndex > 0)
						ClearHighlight(element)
					break;
				case "checkbox":
					if (element.checked)
					{
						parent = document.getElementsByName(element.name)
						ClearHighlight(parent)
					}
			}
		}
		function Enum()
		{	
			var output = "";
			var ndx;

			var elements = document.getElementsByTagName("INPUT");
			for (ndx = 0; ndx < elements.length; ndx++)
			{
				if (elements[ndx].name.trim().length != 0)
					output += elements[ndx].name + "<br>"
			}

			elements = document.getElementsByTagName("SELECT");
			for (ndx = 0; ndx < elements.length; ndx++)
			{
				if (elements[ndx].name.trim().length != 0)
				output += elements[ndx].name + "<br>"
			}

			output += "<hr><input type='button' value='Hide Debug' onclick='javascript:document.getElementById(\"debug\").style.visibility = \"hidden\";'>"

			document.getElementById("debug").innerHTML = output
			document.getElementById("debug").style.visibility = "visible"
		}

		String.prototype.ltrim = function(){return this.replace(/^\s+/,"");}
		String.prototype.rtrim = function(){return this.replace(/\s+$/,"");}
		String.prototype.trim = function(){var str = this.ltrim();return str.rtrim();}
		String.prototype.right = function(n){return this.substring(this.length - n, this.length)}
		String.prototype.left = function(n) { return this.substring(0, n); }
		function pageHeight(){return  window.innerHeight != null? window.innerHeight : document.documentElement && document.documentElement.clientHeight ?  document.documentElement.clientHeight : document.body != null? document.body.clientHeight : null;}
		function pageWidth() {return window.innerWidth != null? window.innerWidth : document.documentElement && document.documentElement.clientWidth ?       document.documentElement.clientWidth : document.body != null ? document.body.clientWidth : null;} 
		function d2h(d) {return d.toString(16);}
		function h2d(h) {return parseInt(h,16);}

