// Common JavaScript routines
// CVS ID $Id: common.js,v 1.16.2.4 2008/01/18 15:55:07 mlittle Exp $

var dateWidgetPrefix = 'd_';

function trimString(str)
{
    str = this != window? this : str;
    return str.replace(/^\s+/g, '').replace(/\s+$/g, '');
}
// add trim as a standard string function
String.prototype.trim = trimString;

function setvisibility(id, onoroff)
{
    if (document.layers)
    {
        val = (onoroff == 'on') ? 'errorpromptvisible' : 'errorprompt';
        if (document.layers[id])
            document.layers[id].visibility = val;
    }
    else if (document.all)
    {
        val = (onoroff == 'on') ? 'errorpromptvisible' : 'errorprompt';
        if (document.all[id])
            document.all[id].className = val;
    }
    else if (document.getElementById)
    {
        val = (onoroff == 'on') ? 'errorpromptvisible' : 'errorprompt';
        if (document.getElementById(id))
            document.getElementById(id).setAttribute('class', val);
    }
    return;
}

function submitformtopage(formname, topage, fromform)
{
    var submitform = true;
    if (document.getElementById)
    {
        f = document.getElementById(formname);
        if (f != null)
        {
            submitform = validateForm(f);
            if (submitform)
            {
                if (topage != null)
                {
                    f.action = topage;
                }
				if (fromform != true)
				{
					f.submit();
					return false;
				}
            }
        }
        else
        {
            document.location.href=topage;
        }
    }
    return submitform;
}

function setAllErrorsInvisible(form)
{
    var inputs = form.getElementsByTagName('input');
    for (var i=0; i < inputs.length; i++)
    {
        var input = inputs[i];
        if ((input.getAttribute('type') == 'text')
              || (input.getAttribute('type') == 'hidden'))
        {
            var inputId = input.id;
            setvisibility(inputId + '_err', 'off');
        } // end if input and hidden
    } // end for each
    var inputs = form.getElementsByTagName('textarea');
    for (var i=0; i < inputs.length; i++)
    {
        var input = inputs[i];
        var theClass = getClassNames(input);
        if (theClass)
        {
            if (theClass.match('RULE_REQUIRED'))
            {
                var inputId = input.id;
                setvisibility(inputId + '_err', 'off');
            }
        } // end if input and class
    } // end for each
    var inputs = form.getElementsByTagName('select');
    for (var i=0; i < inputs.length; i++)
    {
        var input = inputs[i];
        var theClass = getClassNames(input);
        if (theClass)
        {
            if (theClass.match('RULE_REQUIRED'))
            {
                var inputId = input.id;
                setvisibility(inputId + '_err', 'off');
            }
        } // end if input and class
    } // end for each
}

function processNode(form, node, errorElements, errorlist)
{
    var nodelist; // local scope variables for recursion
    var count;
    var i;
    nodelist = node.childNodes;
    count = nodelist.length;
    for(i = 0; i < count; i++)
    {
        if(nodelist[i].nodeType == 1)
        {
            if (nodelist[i].nodeName == "INPUT")
            {
                processInputWidget(form, node, errorElements, errorlist);
                processDateWidgets(form, node, errorElements, errorlist);
            }
            else if (nodelist[i].nodeName == "SELECT")
            {
                processDropdownWidget(form, node, errorElements, errorlist);
            }

            processNode(form, nodelist[i], errorElements, errorlist);
        }
    }
}


function validateForm(form)
{
    if (!document.getElementsByTagName)
        return true; // can't validate go for it

    setAllErrorsInvisible(form);
    var oktosubmit = true;

    var errorlist = new Array();
    var errorElements = new Array();

    for (var i = 0; i < form.elements.length ; i++)
    {
        if ((form.elements[i].nodeName == "INPUT")
              && (form.elements[i].type == "hidden"))
        {
            processDateWidget(form, form.elements[i], errorElements, errorlist);
        }
        else if ((form.elements[i].nodeName == "INPUT")
                 && (form.elements[i].type == "text"))
        {
            processInputWidget(form, form.elements[i], errorElements, errorlist);
        }
        else if (form.elements[i].nodeName == "TEXTAREA")
        {
            processTextareaWidget(form, form.elements[i], errorElements, errorlist);
        }
        else if (form.elements[i].nodeName == "SELECT")
        {
            processDropdownWidget(form, form.elements[i], errorElements, errorlist);
        }
        else
        {
        }
    }

    // check array of objects. If any then no submit.
    if (errorElements.length > 0)
    {
        oktosubmit = false;
        // use array of errorlist to display message
        var errorMessage = "The following items had errors:\n";
        for (var j=0; j < errorlist.length; j++)
        {
            errorMessage += errorlist[j] + "\n";
        }
        alert("There were errors on the form. Please check the information you have entered. " + errorMessage);

        // set focus to first element from errorelements
        errorElements[0].focus();
    }

    return oktosubmit;
} // end validateForm

function processInputWidget(form, input, errorElements, errorlist)
{
    var oktosubmit = true;

    if (input.getAttribute('type') == 'text')
    {
        var mandatory = false;
        if (getStringFromClass(input, 'RULE_REQUIRED'))
        {
			mandatory = true;
        }

        if (mandatory)
        {
            //check non-blank
            if (input.value.trim() == '')
            {
                // go find the error text and make it visible
                var inputId = input.id;
                setvisibility(inputId + '_err', 'on');
                oktosubmit = false;
                errorlist[errorlist.length] = getLabelOrPrompt(form, input);
                errorElements[errorElements.length] = input;
            }
        } // end if required

        var theType = getValueFromClass(input, 'RULE_TYPE');
        if (theType == 'N') // number
        {
            var val = input.value.trim();

            //if the value is non empty we need to check it
            if ((val != ''))
            {
                //check the content is a number
                if (val.match('^[0-9]+\.?[0-9]*$') == null)
                {
                    var inputId = input.id;
                    setvisibility(inputId + '_err', 'on');
                    oktosubmit = false;
                    errorlist[errorlist.length] = getLabelOrPrompt(form, input);
                    errorElements[errorElements.length] = input;
                }
                else // check for range
                {
                    var minVal = getValueFromClass(input, 'RULE_MIN');
                    var maxVal = getValueFromClass(input, 'RULE_MAX');
                    if (minVal != null)
                    {
                        if (Number(val) < Number(minVal))
                        {
                            var inputId = input.id;
                            setvisibility(inputId + '_err', 'on');
                            oktosubmit = false;
                            errorlist[errorlist.length] = getLabelOrPrompt(form, input);
                            errorElements[errorElements.length] = input;
                        }
                    }
                    if (maxVal != null)
                    {
                        if (Number(val) > Number(maxVal))
                        {
                            var inputId = input.id;
                            setvisibility(inputId + '_err', 'on');
                            oktosubmit = false;
                            errorlist[errorlist.length] = getLabelOrPrompt(form, input);
                            errorElements[errorElements.length] = input;
                        }
                    }
                } // end else check for range
            } // end if not empty
        } // end if number
    } // end if input and text
    return oktosubmit;
} // end processInputWidget

function processTextareaWidget(form, input, errorElements, errorlist)
{
    var oktosubmit = true;

    if (getStringFromClass(input, 'RULE_REQUIRED'))
    {
        //check non-blank
        if (input.value.trim() == '')
        {
            // go find the error text and make it visible
            var inputId = input.id;
            setvisibility(inputId + '_err', 'on');
            oktosubmit = false;
            errorlist[errorlist.length] = getLabelOrPrompt(form, input);
            errorElements[errorElements.length] = input;
        }
    } // end if required

    return oktosubmit;
} // end processTextareaWidget

function processDropdownWidget(form, dropdown, errorElements, errorlist)
{
    var oktosubmit = true;
    if (getStringFromClass(dropdown, 'RULE_REQUIRED'))
    {
        //check non-blank
        var selectedValue = dropdown.options[dropdown.selectedIndex].value;
        if (selectedValue.trim() == '')
        {
            // go find the error text and make it visible
            var dropdownId = dropdown.id;
            setvisibility(dropdownId + '_err', 'on');
            oktosubmit = false;
            errorlist[errorlist.length] = getLabelOrPrompt(form, dropdown);
            errorElements[errorElements.length] = dropdown;
        }
    } // end if input and required
    return oktosubmit;
}

function processDateWidget(form, hiddenInput, errorElements, errorlist)
{
    var required = false;
    if (getStringFromClass(hiddenInput, 'RULE_REQUIRED'))
    {
        required = true;
    }
    if (getClassNames(hiddenInput))
    {
        var type = getValueFromClass(hiddenInput, 'RULE_TYPE');
        if (type == 'DATE')
        {
            //go get the three drop downs
            var hiddenInputId = hiddenInput.id;
            var thistime = getDateFromDropDowns(form, hiddenInput, required, errorElements, errorlist);
            if (thistime == false)
            {
                oktosubmit = false;
            }
        }
    } // end if input and class
}

function processDateWidgets(form, errorElements, errorlist)
{
    var oktosubmit = true;
    // find the hidden input with RULE_TYPE_DATE in the class attribute
    var hiddenInputs = form.getElementsByTagName('input');
    for (var i = 0; i < hiddenInputs.length; i++)
    {
        var hiddenInput = hiddenInputs[i];
        oktosubmit = processDateWidget(form, hiddenInput, errorElements, errorlist);
    } // end for each input
    return oktosubmit;
}

function getLabelOrPrompt(form, formElement)
{
    //alert("getLabelOrPrompt id " + formElement.id);

    // look for a legend first
    var legend = document.getElementById(formElement.id + "_legend");
    if (legend != null) {
        return getTextFromNode(legend);
    }

    var labels = form.getElementsByTagName('label');
    for (var i = 0; i < labels.length; i++) {
        var label = labels[i];
        var f = label.getAttribute('for');
        //alert("found label for " + f);
        if (f == null)
            f = label.getAttribute('htmlFor'); // this for IE

        if (formElement.id == f) { // correct label
            return getTextFromNode(label);
        } // end if correct label
    }
}

function getTextFromNode(theNode)
{
    // ELEMENT_NODE                = 1;
    // ATTRIBUTE_NODE              = 2;
    // TEXT_NODE                   = 3;
    // CDATA_SECTION_NODE          = 4;
    // ENTITY_REFERENCE_NODE       = 5;
    // ENTITY_NODE                 = 6;
    // PROCESSING_INSTRUCTION_NODE = 7;
    // COMMENT_NODE                = 8;
    // DOCUMENT_NODE               = 9;
    // DOCUMENT_TYPE_NODE          = 10;
    // DOCUMENT_FRAGMENT_NODE      = 11;
    // NOTATION_NODE               = 12;

    var s = '';
    for (var x1 = 0; theNode.childNodes[x1]; x1++ ) {
        var node = theNode.childNodes[x1];
        //window.alert( 'child node ' + x1 + ' is of type ' + node.nodeType + ' ('+node.nodeName+'), has value ' + node.nodeValue );
        if (node.nodeType == 3) {
            s += node.nodeValue;
        } else if (node.nodeType == 1) {
            if ((node.nodeName.toLowerCase() == 'a')
                  || (node.nodeName.toLowerCase() == 'b')
                  || (node.nodeName.toLowerCase() == 'strong')
                  || (node.nodeName.toLowerCase() == 'em')
                  || (node.nodeName.toLowerCase() == 'i'))
            {
                s += node.firstChild.nodeValue;
            }
        }
    } // end for each childnode
    return s;
}

function getValueFromClass(formElement, valueName)
{
    var theClass = getClassNames(formElement);
    if (theClass == null)
        return null;
    var regex = valueName + '_([^ ]+)';
    var res = theClass.match(regex);
    if ((res != null) && (res.length > 1))
        return res[1];
    return null;
}

function getStringFromClass(formElement, name)
{
    var theClass = getClassNames(formElement);
    if (null != theClass)
    {
        var res = theClass.match('(' + name + ')');
        if ((res != null) && (res.length > 1))
        {
            return true;
        }
    }
    return null;
}

function getDateFromDropDowns(form, hiddenInput, required, errorElements, errorlist)
{
    var id = hiddenInput.id;
    var oktosubmit = true;

    var dayofmonthdropdown = getelement(dateWidgetPrefix + id + '_day');
    var daySelected = -1;

    if (dayofmonthdropdown != null)
    {
        daySelected = dayofmonthdropdown.options[dayofmonthdropdown.selectedIndex].value;
    }

    var monthdropdown = getelement(dateWidgetPrefix + id + '_month');
    var monthSelected = -1;

    if (monthdropdown != null)
    {
        monthSelected = monthdropdown.options[monthdropdown.selectedIndex].value;
    }

    var yeardropdown = getelement(dateWidgetPrefix + id + '_year');
    var yearSelected = -1;

    if (yeardropdown != null)
    {
        yearSelected = yeardropdown.options[yeardropdown.selectedIndex].value;
    }

    if (required)
    {
        if ((daySelected == -1) || (monthSelected == -1) || (yearSelected == -1)
              || (daySelected.trim() == '') || (monthSelected.trim() == '')
              || (yearSelected.trim() == ''))
        {
            setvisibility(id + '_err', 'on');
            errorlist[errorlist.length] = getLabelOrPrompt(form, hiddenInput);
            errorElements[errorElements.length] = dayofmonthdropdown;
            return false;
        }
    }


    if ((daySelected == -1) || (monthSelected == -1) || (yearSelected == -1)
		  || (daySelected.trim() == '') || (monthSelected.trim() == '')
		  || (yearSelected.trim() == ''))
    {
        if (required)
        {
            oktosubmit = false;
        }
    }
    else
    {
        // now format appropriately and set the hidden variable
        var theDate = null;
        theDate = daySelected + '-';
        var ms = new Array('JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC');

        theDate = theDate + ms[monthSelected-1] + '-' + yearSelected;
        var hiddenDate;
        if (document.layers)
        {
            hiddenDate = document.layers[id];
        }
        else if (document.all)
        {
            hiddenDate = document.all[id];
        }
        else if (document.getElementById)
        {
            hiddenDate = document.getElementById(id);
        }

        //alert("theDate="+theDate);
        if (hiddenDate != null)
        {
            hiddenDate.value = theDate;
        }
    }

    return oktosubmit;
}

function daysInFebruary (year)
{
    // February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}


function daysArray(year)
{
    for (var i = 1; i <= 12; i++)
    {
        this[i] = 31;
        if ((i == 4) || (i == 6) || (i == 9) || (i == 11))
        {
            this[i] = 30;
        }
        if (i==2)
        {
            this[i] = daysInFebruary(year);
        }
    }
    return this;
}


function validDayForMonth(year, month, day)
{
    var daysInMonth = daysArray(year)[Number(month)];
    //alert("daysinmonth("+year+"["+Number(month)+"]=" + daysInMonth);
    if (day <= daysInMonth)
        return day;
    return daysInMonth;
}

function handledatechange(id)
{
    if (id != null)
    {
        var daydropdown = getelement(dateWidgetPrefix + id + '_day');
        if (daydropdown == null)
            return;

        var dayval = daydropdown.options[daydropdown.selectedIndex].value;
        var monthdropdown = getelement(dateWidgetPrefix + id + '_month');
        var monthval = monthdropdown.options[monthdropdown.selectedIndex].value;
        var yeardropdown = getelement(dateWidgetPrefix + id + '_year');
        var yearval = yeardropdown.options[yeardropdown.selectedIndex].value;

        //alert("dayval="+dayval+", monthval="+monthval+", yearval="+yearval);
        //only check the day if we have both a month and year selected
        if ((monthval.trim() != '') && (yearval.trim() != ''))
        {
            var okday = validDayForMonth(yearval, monthval, dayval);
            if (okday != dayval)
            {
                if (daydropdown.options[0].value.trim() == '')  // we have a blank
                {
                    daydropdown.selectedIndex = okday;
                }
                else
                {
                    daydropdown.selectedIndex = (okday - 1);
                }
            }
        }
    }
}

function getClassNames(formElement) {
    var theClass = formElement.getAttribute('class');
    if (null == theClass)
        theClass = formElement.getAttribute('className'); // try for IE
    return theClass;
}

function getelement(id)
{
    var e = null;
    if (document.layers)
    {
        e = document.layers[id];
    }
    else if (document.all)
    {
        e = document.all[id];
    }
    else if (document.getElementById)
    {
        e = document.getElementById(id);
    }
    return e;
}

// end of file
