function checkForm(frm, fields)
{
    var ok = true;
    for (var i = 0; i < fields.length; i++)
    {
        var fieldOk = checkField(frm, fields[i]);;
        ok = ok && fieldOk;
    }
    return ok;
}

function checkField(frm, field)
{
    var inputObj = getInputText(frm, field);
    if (inputObj)
    {
        return checkInputText(inputObj);
    }
    
    var radioObj = getRadio(frm, field);
    if (radioObj.length > 0)
    {
        return checkRadio(radioObj);
    }
    
    var textareaObj = getTextArea(frm, field);
    if (textareaObj)
    {
        return checkTextArea(textareaObj);
    }
    
    var selectObj = getSelect(frm, field);
    if (selectObj)
    {
        return checkSelect(selectObj);
    }
}

function getInputText(frm, field)
{
    return getByName(frm, field, "INPUT", "text");
}

function getByName(frm, field, tagName, type)
{
    var objs = frm.getElementsByTagName(tagName);
    for (var i = 0; i < objs.length; i++)
    {
        if (objs[i].name == field && (!type || objs[i].type == type)) return objs[i];
    }
}

function getRadio(frm, field)
{
    var output = new Array ();
    var inputs = frm.getElementsByTagName("INPUT");
    for (var i = 0; i < inputs.length; i++)
    {
        if (inputs[i].type == "radio" && inputs[i].name == field)
        {
            output[output.length] = inputs[i];
        }
    }
    return output;
}

function getTextArea(frm, field)
{
    return getByName(frm, field, "TEXTAREA");
}

function getSelect(frm, field)
{
    return getByName(frm, field, "SELECT");
}

function checkInputText(obj)
{
    if (obj.name.indexOf("email") == -1)
    {
        var ok = (trimString(obj.value) != "");
    }
    else
    {
        var ok = obj.value.match(new RegExp("^[a-z0-9_\-]+(\\.[a-z0-9_\-]+)*@[a-z0-9_\-]+(\\.[a-z0-9_\-]+)+$", "i"));
    }
    setTrHighlight(obj, !ok);
    return ok;
}

function checkRadio(obj)
{
    var ok = false;
    for (var i = 0; i < obj.length; i++)
    {
        if (obj[i].checked && obj[i].value)
        {
            ok = true;
            break;
        }
    }
    for (var i = 0; i < obj.length; i++)
    {
        setTrHighlight(obj[i], !ok);
    }
    return ok;
}

function checkTextArea(obj)
{
    var ok = (trimString(obj.innerText) != "");
    setTrHighlight(obj, !ok);
    return ok;
}

function checkSelect(obj)
{
    var ok = (obj.selectedIndex && obj.options[obj.selectedIndex].value);
    setTrHighlight(obj, !ok);
    return ok;
}

function trimString(str)
{
    return str.replace(new RegExp("^\\s+"), "").replace(new RegExp("\\s+$"), "");
}

function setTrHighlight(obj, highlight)
{
    var tr = getParentByTagName(obj, "TR");
    if (tr)
    {
        tr.className = highlight ? "highlight" : "normal";
    }
}

function getParentByTagName(obj, tagName)
{
    return obj.parentNode 
           ? (obj.parentNode.tagName == tagName 
              ? obj.parentNode 
              : getParentByTagName(obj.parentNode, tagName)) 
           : null;
}
