	ns4 = (document.layers) ? true:false;
	ie4 = (document.all) ? true:false;
	ng5 = (document.getElementById) ? true:false;



	function SetProps(f, name, min, max, displayname, isnumeric, optional, allowspaces, functioncall)
	{
		//used by validateForm to set properties.
		if (f.elements[name] != undefined)
		{

			f.elements[name].min = parseInt(min);
			f.elements[name].max = parseInt(max);
			f.elements[name].displayname = displayname;
			f.elements[name].isnumeric = isnumeric;
			f.elements[name].optional = optional;

			if(allowspaces == undefined) allowspaces = true;
			if(functioncall == undefined) functioncall = "";

			f.elements[name].allowspaces = allowspaces;
			f.elements[name].functioncall = functioncall;
		}
		//else
			//alert(name);
	}

	function CheckPhone(e)
	{
		//attempts to match phone number.
		var mypattern = /^[0|\+][0-9 ]+$/;

		var result = e.value.match(mypattern);

		if(result == null)
			return "\nPhone Number must begin with + followed by Country Dialling Code (eg: +44) or a 0";
		else
			return "";
	}

	function CheckPostcode(e)
	{
		//attempts to match postcode.
		var mypattern = /^[A-Za-z]{1,2}[0-9][A-Za-z0-9]? ?[0-9]{1}[A-Za-z]{2}$/;

		var result = e.value.match(mypattern);

		if(result == null)
			return "\nInvalid postcode format";
		else
			return "";
	}

	function CheckEmail(e)
	{
		if(e.optional == true && e.value=="")
			return "";

		var mypattern = /^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9_\-\.]+\.[a-zA-Z0-9_\-\.]+$/; 

		var result = e.value.match(mypattern);
	
		if(result == null)
			return "\nEmail Address is invalid";
		else
			return "";
	}

	function CheckMailName(e)
	{
		if(e.optional == true && e.value=="")
			return "";

		var mypattern = /^[a-zA-Z0-9_\-\.]+$/;

		var result = e.value.match(mypattern);
	
		if(result == null)
			return "\nNew Email Address can only contain alphanumeric, underscores, dashes or dots";
		else
			return "";
	}


	function isBlanks(s)
	{
		//returns true if string contains any whitespace characters
		for (var i = 0; i < s.length ; i++)
		{
			var c = s.charAt(i);
			if((c == ' ') || (c == '\n') || (c == '\t')) return true;
		}
		return false;
	}

	function isNumber(s,spaceallowed)
	{
		//returns true if string contains any numbers
		for (var i = 0; i < s.length ; i++)
		{
			var c = parseInt(s.charAt(i));
			if(isNaN(c) && s.charAt(i) != "-" && s.charAt(i) != "+")
				if (!(s.charAt(i) == ' ' && spaceallowed == true))
					return true;
		}
		return false;
	}

	function isCharacter(s)
	{
		//returns false if string contains any non-character value
		for (var i = 0; i < s.length ; i++)
		{
			var c = parseInt(s.charAt(i));
			if(isNaN(c) == false) return false;
		}
		return true;
	}

	function validateForm(f)
	{
		//Author: Karen Douch, Rendili Limited

		var msg="";
		var empty_fields = "";
		var errors = "";
		var focuson = "";
		var pass1 = "";
		var pass2 = "";
		var passerror = "";
		var selecterror = "";

		for (var i = 0 ; i < f.length ; i++ )
		{
			var e = f.elements[i];
			
			if (e.type != "submit" && e.type != "button" && e.type != "hidden")
			{
				if (e.className.substring(e.className.length - 5) == "error")
					e.className = e.className.substring(0,e.className.length - 5);
		
				//alert(e.name + " " + e.displayname + "\n");
	
				if (e.displayname != undefined)
				{
					//alert(e.name + " of " + e.type + " has not been setup for validation");
	
					if(e.type == "text" || e.type == "textarea")
					{
						if(!e.optional)
						{
							if(e.value==null || e.value=="")
							{
								empty_fields += "\n         " + e.displayname;
								e.className = e.className + 'error';
							
								if(focuson=="")
									focuson=e;
		
								continue;
							}
						}
		
						if(e.allowspaces == false)
						{
							if(isBlanks(e.value) == true)
							{
								errors += "\n" + e.displayname + " cannot have spaces";
								e.classname = e.className + 'error';
								if(focuson=="")
									focuson=e;
							}
						}
		
						if(e.isnumeric != "")
						{	
							if(e.optional == true && e.value == "")
							{
							}
							else if(e.isnumeric == "disallow")
							{
								if(isCharacter(e.value) == false)
								{
									errors += "\n" + e.displayname + " cannot contain numbers\n";
									e.classname = e.className + 'error';
									if(focuson=="")
										focuson=e;
								}
							}
							else
							{
								//alert(e.displayname);
								if(isNumber(e.value,e.allowspaces) == true)
								{
									errors += "\n" + e.displayname + " must be numeric\n";
									e.classname = e.className + 'error';
									if(focuson=="")
										focuson=e;
								}
							}
						}
		
		
		
						if((e.min != null || e.max != null))
						{
							var v = e.value.length;
		
							if(e.optional &&  v == 0)
							{
							}
							else if((( e.min != null) && (v < e.min)) || ((e.max != null) && ( v > e.max )))
							{

								errors += "\n" + e.displayname + " must be ";
		
								if (e.min != null && !isNaN(e.min))
									errors += " at least " + e.min + " characters";
								if (e.max != null && !isNaN(e.max) && e.min != null && !isNaN(e.min))
									errors += " and less than " + e.max + " characters";
								else if (e.max != null && !isNaN(e.max))
									errors += " less than " + e.max + " characters";
		
								e.className=e.className + 'error';
			
								if(focuson=="")
									focuson=e;
							}
						}
						//a function has been requested.
		
						if(e.functioncall != "")
						{
							//alert(e.name + " to functioncall");
							var result = e.functioncall(e);
							
							if(result != "")
							{
								errors += result;
								e.className=e.className + 'error';
								if(focuson=="")
									focuson=e;
							}
						}
		
					}
					else if(e.type=="password")
					{
						//assumes 2 password fields on form which need to be the same!
		
						if(pass1=="")
							pass1 = e;
						else
							pass2 = e;
		
						if(pass1 && pass2)
						{
							if(pass1.value.length < pass1.min || pass1.value.length > pass1.max)
								passerror += "\n\nPassword must be between " + pass1.min + " and " + pass1.max + " characters long";
							else if(pass1.value != pass2.value)
								passerror += "\n\nPasswords do not match";
		
							if(passerror)
							{
								pass1.className=e.className + 'error';
								pass2.className=e.className + 'error';
								
								if(focuson=="")
									focuson=pass1;
							}
						}
						else
						{
							if(!e.optional)
							{
								if(e.value.length == 0)
								{

								passerror += "\n\nYou must enter a password";

								pass1.className=e.className + 'error';
								pass2.className=e.className + 'error';
								
								if(focuson=="")
									focuson=pass1;
								}
							}
						}
					}
					else if (e.type=="select-one" && !e.optional )
					{
						if(getSelectValue(e)=="")
						{
							selecterror += "\nYou must select one option from " + e.displayname;
							e.className = e.className + 'error';
							if(focuson=="")
								focuson=e;
						}
					}
				}
			}
		}


		if(empty_fields!="")
			msg = "The following required fields are empty:" + empty_fields + "\n" ;
		
		msg += errors +  passerror +  selecterror;

		if(msg!="" && msg.length != 0)
		{
			alert(msg);
			focuson.focus();
			return false;
		}
		else
			return true;

	}

	if (!self.getItemFromId)
	{
		function getItemFromId(idItem)
		{
			var item;
			if (ie4)
			{
				eval ("item = document.all." + idItem + ";");
			}
			else if (ng5)
			{
				item = document.getElementById(idItem);
			}
			else if (ns4)
			{
				item = document[idItem];
			}
			return item;
		}
	}

	if (!self.replaceText)
	{
		function replaceText(id,text)
		{
			var item = getItemFromId(id);
			item.innerHTML = text ;
		}
	}

	function strpos(str, ch)
	{
		for (var i = 0; i < str.length; i++)
		{
			if (str.substring(i, i+1) == ch)
			{
				return i; 
			}
		}
		return -1;
	}

	function formatNumber(value, decplaces)
	{
		var mult = Math.pow(10,decplaces);
		var output = Math.round(parseFloat(value) * mult) / mult ;

		if (isNaN(value))
		{
			return "";
		}
		else
		{
			output = output.toString();
			var dot = strpos(output,".");
			var repeat = decplaces - (output.length - (dot + 1)) ;
			if (dot == -1)
			{
				output = output + ".";
				repeat = decplaces;
			}
//			alert("needs " + repeat + " extra zeros ("+dot+" of "+ output.length + ")");
			for (var i=0; i<repeat; i++)
			{
				output = output + "0";
			}
			return output;
		}
	}

	function getRadioValue(radioobject)
	{
		for (var i=0; i < radioobject.length; i++)
		{
			if (radioobject[i].checked == true)
			{
				return radioobject[i].value;
			}
		}
	}

	function getSelectValue(selectobject)
	{
		return selectobject[selectobject.selectedIndex].value;
	}

	function populateSelectBox(selectbox,names,values)
	{
		selectbox.options.length = 0;
		for(i=0;i<names.length;i++)
		{
			selectbox.options[i] = new Option(names[i],values[i]);
		}
	}

