	function formValidator()
	{
		/*
			Usage:

			var frm = new formValidator();
			frm.addField('name', 'Name');
			frm.addField('email', 'E-mail address');
			frm.setAlert('intro', 'The following fields...');

			<form onsubmit="frm.validate(this, 1);" />
		*/

		// Properties
		this.checkFields    = [];
		this.alerts         = {intro: '', outro: '', general: ''};
		this.alerts.intro   = 'You have forgotten to enter the following information:';
		this.alerts.outro   = 'Enter the required information.';
		this.alerts.general = 'You have forgotten to enter some information\n\nEnter the required information.';

		// Methods
		this.addField = function(fieldname, fieldlabel) { this.checkFields[fieldname] = fieldlabel; }
		this.setAlert = function(type, message) { this.alerts[type] = message; }

		this.validate = function(objForm, alertType) {
			var alertMessage      = "";
			var badinputClassName = "badinput";
			var crLabelAdd        = "_label";	// Addition to id of radiobuttons label e.g.: payment_label

			var oLabels    = document.getElementsByTagName("label");
			var oInputs    = document.getElementsByTagName("input");
			var oSelects   = document.getElementsByTagName("select");
			var oTextareas = document.getElementsByTagName("textarea");

			for( var l = 0; l < oLabels.length; l++    ) oLabels[l].className    = oLabels[l].className.replace(badinputClassName, '');
			for( var i = 0; i < oInputs.length; i++    ) oInputs[i].className    = oInputs[i].className.replace(badinputClassName, '');
			for( var s = 0; s < oSelects.length; s++   ) oSelects[s].className   = oSelects[s].className.replace(badinputClassName, '');
			for( var t = 0; t < oTextareas.length; t++ ) oTextareas[t].className = oTextareas[t].className.replace(badinputClassName, '');

			for( var i in this.checkFields ) {
				var badinput = false;
				var element  = document.getElementById(i);
				if( !element ) element = document.getElementsByName(i).item(0);
				if( !element ) continue;

				if( element.selectedIndex ) { // selectbox
					if( element.selectedIndex == 0 ) badinput = true;
				}
				else if( element.type == "radio" ) { // radio button
					var checked     = false;
					var elementname = document.getElementsByName(i);

					// reset radiobutton label class
					if( document.getElementById(element.name + crLabelAdd) ) {
						document.getElementById(element.name + crLabelAdd).className = document.getElementById(element.name + crLabelAdd).className.replace(badinputClassName, '');
					}

					for( var e = 0; e < elementname.length; e++ ) {
						if( elementname[e].checked ) checked = true;
					}

					if( !checked ) badinput = true;
				}
				else if( element.type == 'checkbox' && !element.checked ) { // checkbox
					badinput = true;
				}
				else if( element.value == '' ) { // text field
					badinput = true;
				}

				// when badinput write message and change class of label/input elements
				if( badinput ) {
					var labelText      = "";
					var labelName      = "";
					var elementMsgText = "";

					if( element.type == 'radio' ) {
						elementMsgText = this.checkFields[element.name];
						labelName      = element.name;

						// change radiobutton  label class
						if( document.getElementById(element.name + crLabelAdd) ) {
							document.getElementById(element.name + crLabelAdd).className += " " + badinputClassName;
						}
					}
					else {
						elementMsgText = this.checkFields[element.id];
						labelName      = element.id
					}

					// input
					if( element.type != 'radio' && element.type != 'checkbox' && element.className.indexOf(badinputClassName) == -1 ) {
						element.className += " " + badinputClassName;

						if( !focusElement ) {
							element.focus();
							var focusElement = true;
						}
					}

					// label
					for( var l = 0; l < oLabels.length; l++ ) {
						if( element.type == 'radio' && oLabels[l].htmlFor.indexOf(labelName) != -1 ) {
							oLabels[l].htmlFor == labelName;
							if( oLabels[l].className.indexOf(badinputClassName) == -1 ) oLabels[l].className += " " + badinputClassName;
						}

						if( oLabels[l].htmlFor == labelName ) {
							if( oLabels[l].className.indexOf(badinputClassName) == -1 ) oLabels[l].className += " " + badinputClassName;
							labelText = oLabels[l].innerHTML;
						}
					}

					// message
					alertMessage += "- ";
					if( elementMsgText != "" ) { alertMessage += elementMsgText; }
					else if( labelText != "" ) {
						var less    = labelText.indexOf('<');
						var greater = labelText.indexOf('>');

						if( less < greater && less != -1 ) {
							labelText = labelText.substr(greater + 1);
							if( labelText.indexOf(' ') == 0 ) labelText = labelText.substr(1);
						}
						else if( less != -1 ) labelText = labelText.substring(0, less - 1)

						alertMessage += labelText.replace(':', '');
					}
					else alertMessage += (labelName.substring(0, 1).toUpperCase() + labelName.substr(1));

					alertMessage += "\n";
				}
			}

			if( alertMessage != "" ) {
				switch( parseInt(alertType) ) {
					case 0: break; // show no message
					case 1: alert(this.alerts.intro + '          \n\n' + alertMessage + '        \n' + this.alerts.outro); break; // show missing fields
					default : alert(this.alerts.general); break; // show general message
				}

				return false;
			}

			if( document.getElementById('checked') ) {
				document.getElementById('checked').value = '1';
			}
			
			if( document.getElementsByName('checked') ) {
				var checkfld = document.getElementsByName('checked');
				for( var f in checkfld ) checkfld[f].value = '1';
			}

			return true;
		}
	}