function textCounter(field,cntfield,maxlimit) {
if (field.value.length > maxlimit) // if too long...trim it!
   field.value = field.value.substring(0, maxlimit);
// otherwise, update 'characters left' counter
else 
   cntfield.value = maxlimit - field.value.length;
}

function ValidateFormCompleted (formid, formname) {
// this general use function is to check that a form has been completed
// the form ID must be identified in "formid"

// alert ('formid = ' + formid + '; no Submit starting. '); // debug
// alert ('formname = ' + formname + '; no Submit starting. '); // debug

// document.getElementById(formid).submit();  // send the id of the form

// dummy = complaintForm.elements.length; // for the form named complaintForm
// getElementById('elementID') returns the element with the id elementID as an object.

formobject = document.getElementById (formid); // a more general approach

// n_elements = formobject.elements.length; // for the form named complaintForm
// alert ('n_elements = ' + n_elements); // debug

greeting = '';
greetingx = '';

	if (formobject.FirstName.value.match (/[A-Z|a-z]+/)) {greeting += ' ' + formobject.FirstName.value;} // a missing or error message is below to keep relative order
	
	if (formobject.MiddleInitial.value.match (/[A-Z|a-z]/)) {greeting += ' ' + formobject.MiddleInitial.value;} // a missing or error message is below to keep relative order
	
	if (formobject.LastName.value.match (/[A-Z|a-z]+/)) {greeting += ' ' + formobject.LastName.value;} // a missing or error message is below to keep relative order
	
	if (formobject.ServiceRank.value.match (/[A-Z|a-z|0-9| ]/)) {greeting += ', ' + formobject.ServiceRank.value;} // a missing or error message is below to keep relative order
	
	if (formobject.Sex.value.match (/M/i)) {greetingx = 'Sir';}
	else if (formobject.Sex.value.match (/F/i)) {greetingx = 'Madame';}
	
	if (greetingx != '') { // there is an extra greeting by sex
	
		if (greeting != '') { // there is also a regular greeting by name
		greeting.replace (/^ /, ''); // replace leading space with null
		greeting += '\n\n' + greetingx +  ':\n\n'; // combine greetings
		}
		else { // there is not a regular greeting by name
		greeting += ':\n\n'; // only a greeting by sex
		}
	}
	else { // there is not an extra greeting by sex
	
		if (greeting != '') { // there is a regular greeting by name
		greeting.replace (/^ /, ''); // replace leading space with null
		greeting += ':\n\n'; // add formating only
		}
		else { // there is not a regular greeting by name either
		greeting = 'Complainer:\n\n'; // use this as a default greeting
		}
	}
	
// alert (greeting + '\n\nYou have ' + n_daggers + ' required fields missing:\n\n' + nochange + '\n\n and these:\n' + changed); // debug

missing = '';
	
	if (! formobject.LastName.value.match (/[A-Z|a-z]+/)) {
	missing += 'Last Name must be alpha (' + formobject.LastName.value + ')\n';
	}
	
	if (! formobject.FirstName.value.match (/[A-Z|a-z]+/)) {
	missing += 'First Name must be alpha (' + formobject.FirstName.value + ')\n';
	}
	
	if (! formobject.MiddleInitial.value.match (/[A-Z|a-z]/)) {
	missing += 'Middle Initial must be alpha (' + formobject.MiddleInitial.value + ')\n';
	}
	
	if ((! formobject.Sex.value.match (/M/i)) && (! formobject.Sex.value.match (/F/i))) {
	missing += 'Sex must be M(ale) or F(emale) (' + formobject.Sex.value + ')\n';
	}

	if ((! formobject.SSN.value.match (/\d{9}/)) && (! formobject.SSN.value.match (/\d{3}\-\d{2}\-\d{4}/))) { // SSN must be nnn-nn-nnnn
	missing += 'SSN must be a 9-digit number or nnn-nn-nnnn (' + formobject.SSN.value + ')\n';
	}
	if (! formobject.DOBYear.value.match (/\d{4}/)) { // DOB Year must be 4 digits
	missing += 'DOB Year must be a 4 digit number (' + formobject.DOBYear.value + ')\n';
	}
	if (! formobject.DOBMonth.value.match (/\d{1,2}/)) { // DOB Month must be 1-2 digits
	missing += 'DOB Month must be a 1-2 digit number (' + formobject.DOBMonth.value + ')\n';
	}
	if (! formobject.DOBDay.value.match (/\d{1,2}/)) { // DOB Day must be 1-2 digits
	missing += 'DOB Day must be a 1-2 digit number (' + formobject.DOBDay.value + ')\n';
	}

	if (! formobject.ServiceStartYear.value.match (/\d{4}/)) { // Service Start Year must be 4 digits
	missing += 'Service Start Year must be a 4 digit number (' + formobject.ServiceStartYear.value + ')\n';
	}
	if (! formobject.ServiceStartMonth.value.match (/\d{1,2}/)) { // Service Start Month must be 1-2 digits
	missing += 'Service Start Month must be a 1-2 digit number (' + formobject.ServiceStartMonth.value + ')\n';
	}

	if (! formobject.ServiceEndYear.value.match (/\d{4}/)) { // Service End Year must be 4 digits
	missing += 'Service End Year must be a 4 digit number (' + formobject.ServiceEndYear.value + ')\n';
	}
	if (! formobject.ServiceEndMonth.value.match (/\d{1,2}/)) { // Service End Month must be 1-2 digits
	missing += 'Service End Month must be a 1-2 digit number (' + formobject.ServiceEndMonth.value + ')\n';
	}
	if (! formobject.ServiceRank.value.match (/[A-Z|a-z|0-9| ]/)) {
	missing += 'Service Rank must be alphanumeric (' + formobject.ServiceRank.value + ')\n';}

	if (! formobject.PostalAddressStreet.value.match (/[A-Z|a-z|0-9| ]{2,}/)) { // Postal Address Street
	missing += 'Postal Address Street must be alphanumeric (' + formobject.PostalAddressStreet.value + ')\n';
	}
	if (! formobject.PostalAddressCity.value.match (/[A-Z|a-z| ]{2,}/)) { // Postal Address City
	missing += 'Postal Address City must be alpha (' + formobject.PostalAddressCity.value + ')\n';
	}
	if (! formobject.PostalAddressState.value.match (/[A-Z|a-z| ]{2,}/)) { // Postal Address State
	missing += 'Postal Address State must be alpha (' + formobject.PostalAddressState.value + ')\n';
	}
	if (! formobject.PostalAddressZipOrCode.value.match (/[A-Z|a-z|0-9|\-| ]+/)) { // Postal Address Zip Or Code
	missing += 'Postal Address Zip Or Code must be alphanumeric (' + formobject.PostalAddressZipOrCode.value + ')\n';
	}
	if (! formobject.PostalAddressCountry.value.match (/[A-Z|a-z| ]{2,}/)) { // Postal Address Country
	missing += 'Postal Address Country must be alpha (' + formobject.PostalAddressCountry.value + ')\n';
	}

	if (! formobject.EmailAddress.value.match (/[A-Z|a-z|0-9|\.]{2,}\@[A-Z|a-z|0-9|\.]{3,}/)) { // Email Address
	missing += 'Email Address must be alphanumeric (' + formobject.EmailAddress.value + ')\n';
	}
	if (! formobject.Telephone1.value.match (/[0-9|\-|\.|\(|\)]{7,}/)) { // Telephone 1
	missing += 'Telephone 1 must be numeric (' + formobject.Telephone1.value + ')\n';
	}
	if (formobject.Telephone2.value != '') { // Telephone 2 not required but if input
		if (! formobject.Telephone2.value.match (/[0-9|\-|\.|\(|\)]{7,}/)) { // Telephone 2
		missing += 'Telephone 2 must be numeric (' + formobject.Telephone2.value + ')\n';
		}
	}

thanksobject = document.getElementById ('thanks');
// missing = ''; // for debug only

	if (missing != '') {
	thanksobject.style.display = 'none'; // no display of final message because errors
	alert (greeting + 'The following required information is missing or erroneous:\n\n' + missing + '\nPlease correct your information and resubmit the form.');
	}
	else {
	thanksobject.style.display = 'block'; // display final message
	}

}

