// form.js $Folder$$Date:11/13/03 12:51:12 AM$$Revision$
// Some form handling functions

function selectValue(item)
{
	var strSelections = "";
	// create a reference to the form element object
	// eval('objfrmItem = objfrmSelected.' + strElement + ';');
	var objfrmItem = item;
	if (objfrmItem.type == "select-multiple") {
		for (i=0;i<objfrmItem.length;i++) {
			if (objfrmItem.options[i].selected && objfrmItem.options[i].value != '*')
				strSelections += objfrmItem.options[i].value + ",";
		}
		if (strSelections == "") {
			return "*";
		} else {
			// remove trailing comma
			return strSelections.slice(0,-1);
		}
	}
	else {
		var i = objfrmItem.selectedIndex;
		return objfrmItem.options[i].value;
	}
}

// returns the selected value from
// a single or set of radio buttons
// or null if none is selected
function getRadioSelectedValue(objRadio)
{
	if (objRadio.value && objRadio.checked)
	{
		return objRadio.value;
	}
	else
	{
		for (var i=0; i < objRadio.length; i++)
		{
			if (objRadio[i].checked)
			{
				return objRadio[i].value;
			}
		}
	}

	return null;
}

// sets the radio with the given value to checked
function setRadioSelectedValue(objRadio, strValue, tClick)
{
	if (objRadio.value && objRadio.value == strValue)
	{
		if (tClick)
		{
			objRadio.click();
		}
		else
		{
			objRadio.checked = true;
		}
	}
	else
	{
		for (var i=0; i < objRadio.length; i++)
		{
			if (objRadio[i].value == strValue)
			{
				if (tClick)
				{
					objRadio[i].click();
				}
				else
				{
					objRadio[i].checked = true;
				}
			}
		}
	}
}

// returns number of items selected
// in a multiple choice select box
function numSelections(item)
{
	var cnt = 0;
	if (!item || !item.type == "select-multiple") return 0;
	for (i=0;i<item.length;i++) {
		if (item.options[i].selected && item.options[i].value != '*') cnt++;
	}
	return cnt;
}

// clears all selections in a form element
function resetItem(item)
{
	if(!item || !item.type) return;
	switch(item.type) {
		case "select-multiple":
			// select nothing
			//item.selectedIndex = -1;
			// with a default "no selections" option as first choice
			item.selectedIndex = 0;
			break;
		case "select-one":
			//select first item
			item.selectedIndex = 0;
			break;
		case "checkbox":
			// reset to default
			item.checked = defaultChecked;
			break;
		case "radio":
			for (var i=0;i<item.length;i++) {
				item[i].checked = defaultChecked;
			}
			break;
		case "text":
		case "textarea":
			// clear
			item.value = item.defaultValue;
			break;
	}
	// call onchange handler if it exists
	if (item.onchange) {
		item.onchange();
	}
}

function setRadio(radioElement, value)
{
	for( i = 0; i < radioElement.length; i++)
	{
		if(radioElement[i].value == value)
		{
			radioElement[i].checked = true;
			break;
		}
	}
}

function setSelect(selectElement, value)
{
	for (var i=0; i< selectElement.options.length; i++)
	{
		if (selectElement.options[i].value == value)
		{
			selectElement.selectedIndex = i;
			break;
		}
	}
}
var reWhiteSpace   = new RegExp("^\\s+$");

function isValidPhoneNumber(item)
{
	return rePhoneNumber.test(item.value);
}

function isValidPostalCode(item)
{
// javascript:alert(new RegExp("^\\d{5}((\\s|-)\\d{4})?$").test("02451"));
//	return (rePostalCodeUS.test(item.value) || rePostalCodeCA.test(item.value));
	return new RegExp().test("02451");
}

function isValidEmailAddress(item)
{
	return reEmailAddress.test(item.value);
}

// Function to perform form validation
function validateFormValues(frm, fieldData)
{
	var msg = "";
	var empty_fields = "";
	var errors = "";

	var i=0;
   	var j=0;
    var firstErrorItem = null;

	for (i=0; i < fieldData.length; i++)
	{
        var fieldInfo = fieldData[i];

        var fieldName = fieldInfo['name'];

        var item = frm[fieldName];

		var empty = false;
        var value = "";

        // if the item exists
        if (item)
        {
			if (item.type == "text")
			{
				value = item.value;
			}
			else if (item.type == "textarea")
			{
				value = item.value;
			}
			else if (item.type == "select-one")
			{
				value = item.options[item.selectedIndex].value;
			}
			else if (item.type == "select-multiple")
			{
				for (j=0; i < item.length; j++)
				{
					if (item.options[j].selected)
					{
						value +=  item.options[j].value;
					}
				}
			}
			else if (item.type == "radio")
			{
				for (var j=0; i < item.length; j++)
				{
					if (item[j].checked)
					{
						value = item[j].value;
						break;
					}
				}
			}
			else if (item.type == "checkbox")
			{
				for (var j=0; i < item.length; j++)
				{
					if (item[j].checked)
					{
						value += item[j].value;
					}
				}
			}

			if (/^\s*$/.test(value))
			{
				empty_fields += "\n - " + fieldInfo['description'];
				if (firstErrorItem == null) firstErrorItem = item;
			}
			else if (fieldInfo['minlength'] && (value.length < fieldInfo['minlength']))
			{
				errors += "\n - The field '" + fieldInfo['description'] + "' must be at least " + fieldInfo['minlength'] + " characters long";
				if (firstErrorItem == null) firstErrorItem = item;
			}
			else if (fieldInfo['special'])
			{
				var special = fieldInfo['special'];

				if (special == 'email' && !/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(value))
				{
					errors += "\n - " + fieldInfo['description'] + " is invalid";
					if (firstErrorItem == null) firstErrorItem = item;
				}

				else if (special == 'phone' && !/^(\D*\d\D*){10,}$/.test(value))
				{
					errors += "\n - " + fieldInfo['description'] + " is invalid";
					if (firstErrorItem == null) firstErrorItem = item;
				}
				else if (special == 'postalcode' && !/^\d{5}((\s|-)\d{4})?$/.test(value) &&
													!/^\w\d\w(\s|-)?\d\w\d$/.test(value))
				{
					errors += "\n - " + fieldInfo['description'] + " is invalid";
					if (firstErrorItem == null) firstErrorItem = item;
				}
			}
		}
	}

   // if errors, display the messages and return false, otherwise return true.
	if ((empty_fields == "") && (errors == ""))
	{
		return true;
	}

	if (empty_fields != "")
	{
		msg += "The following information is required:"
			+ empty_fields + "\n";
	}

	if (errors != "")
	{
		msg += "\n";
		msg += "Please correct the following errors:" + errors;
	}

	alert(msg);

	// focus on the first error, or blank field
	firstErrorItem.focus();

	return false;
}


// end of form.js
