// Function:        HasValue
// Purpose:         Check if a text-based form element has content
// Parameter(s):    string - form element id name
// Return:          TRUE if form element has content
function HasValue(elementName)
{
    return (0 != document.getElementById(elementName).value.length);
}

// Function:        GetValue
// Purpose:         Obtain value of form element
// Parameter(s):    string - form element id name
// Return:          value of form element
function GetFormValue(elementName)
{
    return document.getElementById(elementName).value;
}

// Function:        GetRadioValue
// Purpose:         Obtain value of form radio element group 
// Parameter(s):    string - form element name
// Return:          value of form element
function GetRadioValue(elementName)
{
    var element = eval("document.frm.v" + elementName);
    
    var value = false; 
    for (i=0; i < element.length; i++) 
    {
        if (element[i].checked) 
        { 
            value = element[i].value; 
            break;
        } 
    }
    return value; 
}

// Function:        ResetRadioList
// Purpose:         Unselect all radio elements
// Parameter(s):    string - form element name
// Return:          value of form element
function ResetRadioList(elementName)
{
    var element = eval("document.frm.v" + elementName);
    
    var value = false; 
    for (i=0; i < element.length; i++) 
    {
        if (element[i].checked) 
        { 
            element[i].checked = false; 
            break;
        } 
    }
    return value; 
}

// Function:        ResetFormElement
// Purpose:         Reset display attributes for element and label
// Parameter(s):    string - base name of element (v-prefix for values, l-prefix for corresponding label)
//                  string - html element type
// Return:          -nothing-
function ResetFormElement(baseName, type)
{
    var eForm = document.getElementById('v' + baseName);
    var eLabel = document.getElementById('l' + baseName);

    if ("text" == type)
    {
        eForm.style.backgroundColor = "";
    }
    eLabel.style.color = "";
    eLabel.style.fontWeight = "";
}

// Function:        SetHtmlContent
// Purpose:         Set inner html content of defined element to a given string
// Parameter(s):    string - form element id name
//                  string - new html content value
// Return:          -nothing-
function SetHtmlContent(elementName, htmlContent)
{
    document.getElementById(elementName).innerHTML = htmlContent;
}

// Function:	SetElementStyle
// Purpose:	Set element stype to fail or reset scheme
// Parameter(s):	
//		element	- element to change
//		stype	- style type: label or text
//		scheme	- reset - reset element style
//			  fail	- set element style to fail colors and font
//			  weight.
// Return:	-nothing-
function SetElementStyle(element, stype, scheme)
{
    var bgcolor;
    var fw;
    var color;

    switch(scheme)
    {
	case "reset" :
	{
	    bgcolor = "white";
	    fw = "";
	    color = "";
	    break;
	}
	case "fail" :
	{
	    bgcolor = "yellow";
	    fw = "bold";
	    color = "red";
	    break;
	}
    }

    switch(stype)
    {
	case "text" :
	{
	    element.style.background = bgcolor;
	    break;
	}
	case "label" :
	{
	    element.style.color = color;
	    element.style.fontWeight = fw;
	    break;
	}
    }
}

// Function:	IsElementEmpty()
// Purpose:	Test if element value is empty or unchecked
// Parameter(s):
//		el - element to test
// Return:	true	- if empty or not checked
//		false	- if not empty or is checked
// Note: White spaces are sstripped from the beginning and end of text type
//	 values prior to testing for empty.
function IsElementEmpty(element)
{
    var eflg = true;

    var i;
    var el;
    var arrayflg;
    // select-one has sub elements but we want top level, thus we must
    // check type as well incase type is select-one.
    if(element.length === undefined ||
	    (element.length !== undefined && element.type !== undefined))
    {
	i = 0;
	el = element;
	arrayflg = false;
    }
    else
    {
	i = element.length - 1;
	arrayflg = true;
    }

    while(eflg == true && i >= 0)
    {
	if(arrayflg)
	    el = element[i];

	switch(el.type)
	{
	    case "textarea" :
	    case "text"	:
	    case "file"	:
	    {
		var value = el.value.replace(/^\s*/, "").replace(/\*s$/,"");
		if(value.length != 0)
		    eflg = false;
		break;
	    }
	    case "select-one" :
	    {
		var value = el.value.replace(/^\s*/, "").replace(/\*s$/,"");
		if(value.length != 0 && value != '0')
		    eflg = false;
		break;
	    }
	    case "radio" :
	    case "checkbox" :
	    {
		if(el.checked == true)
		    eflg = false;
		break;
	    }
	}

	i--;
    }

    return eflg;
}

// Function:	GetFormElementList
// Purpose:	Get list of elements that have a name that starts with 'v'
//		followed by numeric characters.
// Parameter(s):
//		object: form	- form object
// Return:
//		list of elements
function GetFormElementList(form)
{
    var i;
    var len;

    var list = [];
    // Use form to create list by element name.  Only use element names that
    // begin with 'v' followed by a numeric.  The leading 'v' is removed.  In
    // addition, any trailing '[]' characters are removed as well.
    for(i = 0, len = form.elements.length; i < len; i++)
	if(form.elements[i].name.charAt(0) == 'v')
	    list.push(form.elements[i].name.replace(/[^0-9_]*/g,""));

    // Make list unique.  There may be dulplicates.
    list.sort();
    var j = 0;
    var mark = 0;
    for(i = 1, len = list.length; i < len; i++)
    {
	if(list[i] != list[mark])
	{
	    if(list[++j] != list[i])
		list[j] = list[i];
	    mark = i;
	}
    }
    list.length = j + 1;

    return list;
}

// Function:	   SetFormElementStyle
// Purpose:	   Set form style for form elements.  If a list of element
//		   names is not supplied, all elments that start with
//		   'v'numeric will be changed.  if condition is supplied, the
//		   style will only be changed if condition is true.
// Parameter(s):   object: form - form object
//		   string: scheme - Set scheme to one of the following:
//			'reset' - resets style to default scheme
//			'fail'  - set style to fail scheme
//		   string: condition - Set element to scheme based of one of
//					the following conditions:
//			force - force to scheme
//			empty - set scheme if the element value is empty or the
//				element is unchecked
//		   array: list (optional) - base name list of form elements
//					    (just numeric portion less leading
//					     'v')
//					    (v-prefix for values,
//					     l-prefix for corresponding label)
// Return:
//		true or false - base on condition
//		if condition = force:
//				always return true
//		if condition = empty:
//				if any element is empty, return true
//				if any element is not empty, return false
//		   
function SetFormElementStyle(form, scheme, condition, list)
{
    var i;
    var len;

    // If no list was given, use form to create list by element name.
    if(list === undefined)
	list = GetFormElementList(form);

    var emptyflg = false;
    for(i = 0, len = list.length; i < len; i++)
    {
	var elabel = document.getElementById('l' + list[i]);
	var el = form.elements['v' + list[i]];
	if(el  === undefined)
	    el = form.elements['v' + list[i] + '[]'];

	if(condition == "force" || (condition == "empty" && IsElementEmpty(el)))
	{
	    // checkboxes do not have labels
	    if(elabel != null)
		SetElementStyle(elabel, "label", scheme);
	    if(el.type == "text" || el.type == "textarea" || el.type == "file")
		SetElementStyle(el, "text", scheme);
	    emptyflg = true;
	}
    }

    return emptyflg;
}

// Function:        ValidateFormElement
// Purpose:         Check defined HTML element invalid value and change appearance accordingly 
// Parameter(s):    string - base name of element (v-prefix for values, l-prefix for corresponding label)
//                  string - html element type
// Return:          TRUE if field is valid
function ValidateFormElement(baseName, type)
{
    var ok = false;

    var eForm;                                              // element variable
    var eLabel = document.getElementById('l' + baseName);   // label variable

    // access checkbox element collection
    if ("checkbox" == type)
    {
	eForm = eval("document.getElementsByName('v" + baseName + "[]')");
    }
    else
    {
	eForm = eval("document.frm.v" + baseName);
    }

    if ("text" == type)
    {
	ok = CheckText(eForm);
    }
    else if ("radio" == type)
    {
	ok = CheckRadio(eForm);
    }
    else if ("checkbox" == type)
    {
	ok = CheckCheckbox(eForm);
    }
    else if ("combo" == type)
    {
	ok = CheckCombo(eForm);
    }

    // checkboxes do not have labels
    if (type != "checkbox")
    {
	// if failed validation
	//   change color of label, and
	//   color element background if text-element
	if (!ok)
	{
	    if ("text" == type)
	    {
		eForm.style.backgroundColor = "yellow";
	    }
	    eLabel.style.fontWeight = "bold";
	    eLabel.style.color = "red";
	}
	// validation ok
	//   reset element display
	else
	{
	    if ("text" == type)
            {
                eForm.style.backgroundColor = "";
            }
            eLabel.style.color = "";
            eLabel.style.fontWeight = "";
        }
    }
    return ok;
}

// TRUE if has text
function CheckText(element)
{
    return (0 != element.value.length);
}

// TRUE if value is not zero (default)
function CheckCombo(element)
{
    return (0 != element.value);
}

// TRUE one item is selected
function CheckRadio(element)
{
    var found = false; 
    for (i=0; i < element.length; i++) {
        if (true == element[i].checked) { 
            found = true;
            break;
        } 
    }
    return found; 
}

// TRUE one or more items is checked
function CheckCheckbox(element)
{
    var found = false; 
    for (var i = 0; i < element.length; i++) {
        if (true == element[i].checked) { 
            found = true;
            break;
        } 
    }

    return found; 
}

function CheckboxIdIsChecked(id_name)
{
    var e = document.getElementById(id_name);
    return e.checked;
}

function ResetCareerForm(form)
{
    document.getElementById("errMsg").innerHTML = '';
    SetFormElementStyle(form, "reset", "force");
}

var additionalErrMsg = "";
function SetCareerErrMsg()
{
    document.getElementById("errMsg").innerHTML = 'Errors on this page must be corrected before continuing.' + additionalErrMsg;
    document.getElementById("errMsg").scrollIntoView(true);
}

function validateCareerForm(form, func, button)
{
    var status = true;

    ResetCareerForm(form);
    if(button == "Next >>" || button == "Finish" || button == "Accept")
    {
	status = func(form);
	if(!status)
	    SetCareerErrMsg();
    }
    return status;
}

function SetPostElementStyle(form, style_elements)
{
    ResetCareerForm(form);
    SetFormElementStyle(form, "fail", "force", style_elements);
    SetCareerErrMsg();
}

