/*
This file contains javascript functions that are used globally in various
web pages throughout the web site.  NOTE: functions are ALPHABETICAL so
if you add a function to the file please place it accordingly and list it
below...

FUNCTIONS IN THIS FILE:
        CharacterLimiterCounter
        CheckboxArrayValidation
        CheckboxValidation
        ConcatDateFields
        CreateSubmitDataString
        DateValidation
        DigitValidation
        EmailAddressValidation
        EmptyValidation
        FutureDateValidation
        GoToURL
        IsActualDate
        IsValidDate
        LengthValidation
        LimitTextArea
        MembershipNumberValidation
        MinLengthValidation
        NewWindow
        RadioGroupValidation
        SelectValidation
        SpecialCharValidation
        StateValidation
        SubmitEnter
        SubmitFormOnlyOnce
        Trim
*/

// GLOBAL VARIABLES                                // USED BY FUNCTION
var submitCount = 0;                        // SubmitFormOnlyOnce
var g_aUSStates = new Array("AL","AK","AZ","AR","CA","CO","CT","DE","DC","FL","GA","HI","ID","IL","IN","IA","KS","KY","LA","ME","MD","MA","MI","MN","MS","MO","MT","NE","NV","NH","NJ","NM","NY","NC","ND","OH","OK","OR","PA","RI","SC","SD","TN","TX","UT","VT","VA","WA","WV","WI","WY","AE","AP","AA");
var g_aCanadianStates = new Array("AB","BC","MB","NB","NF","NT","NS","ON","PE","PQ","SK","YT","QC","NL");
var g_aAustralianStates = new Array("AC","NW","NO","QL","SA","TS","VC","WT","SU");
var g_strAsiaCountries = new Array("BGD","BTN","BRN","KHM","TMP","HKG","IND","IOT","IDN","JPN","KAZ","LAO","MAC","MYS","MDV","MNG","MMR","NPL","PHL","KOR","LKA","TWN","THA","UZB","VNM");


/************************************************************************
* CharacterLimiterCounter
*        limits character count and shows dynamic count of characters as user
*   is typing them in the text area
************************************************************************/
function CharacterLimiterCounter(field, maxlimit, cntfield)
{
        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;
}


/************************************************************************
* CheckboxArrayValidation
*        shows a message (alertText) and returns false if no items in checkbox
*   have been checked
************************************************************************/
function CheckboxArrayValidation(entered, alertText)
{
        var countChecked = 0;
        for (var i = 0; i < entered.length; i++)
        {
                // check to see if each is checked
                if (entered[i].checked == true)
                        // if any checked, validation passed
                        {
                                return true;
                        }
        }
        // if got to here, no checkboxes checked
        if (alertText)
        {
                alert(alertText);
        }
        return false;
}


/************************************************************************
* CheckboxValidation
*        shows a message (alertText) and returns false if checkbox has not been
*        checked
************************************************************************/
function CheckboxValidation(entered, alertText)
{
        var strValue = entered.checked;
//alert('str'+strValue);
        if (strValue == false)
        {
                if (alertText)
                {
                        alert(alertText);
                }
                entered.focus();
                entered.select();
                return false;
        }
        else
                return true;
}


/************************************************************************
* ConcatDateFields
*         takes values from month, day and year fields and concatenates
*         them into MM/DD/YY(YY) format
************************************************************************/
function ConcatDateFields(fldMonth, fldDay, fldYear)
{
        var strDate = fldMonth.options[fldMonth.selectedIndex].value + "/" + fldDay.options[fldDay.selectedIndex].value + "/" + fldYear.options[fldYear.selectedIndex].value;
        return strDate;
}


/************************************************************************
* CreateSubmitDataString
*         for the passed form returns a string of all form inputs in the
*   format [field name]: [field value][new line]
************************************************************************/
function CreateSubmitDataString(theForm)
{
        var strValues = "";
        with (theForm)
        {
                // clear any current value
                submit_data.value = "";

                for (var i = 0; i < length; i++)
                {
                        strValues = strValues + elements[i].name + ": ";
                        if (elements[i].type == "select-one")
                                strValues = strValues + elements[i].options[elements[i].selectedIndex].value + "\r\n";
                        else
                                strValues = strValues + elements[i].value + "\r\n";
                }
        }
        return strValues;
}


/************************************************************************
* DateValidation
*         Accepts numeric month, date and year and determines if the date
*         specified is actually a valid calendar date
*        (eg: no such date as February, 31...)
************************************************************************/
function DateValidation(inputDate, inputMonth, inputYear, alertText)
{
        var bValid = true;
        var i_Date = parseInt(inputDate);
        var i_Month = parseInt(inputMonth);
        var i_Year = parseInt(inputYear);

        switch(i_Month)
           {
                case 2:
        //February
                if (i_Year == Math.round(i_Year / 4) * 4)
                       //leap year
                        {
                               if (i_Date > 29)
                                       bValid = false;
                        }
                   else
                        //non-leap year
                        {
                    if (i_Date > 28)
                                        bValid = false;
                        }
                        break;
                case 4 :
        //April
                if (i_Date > 30)
                                bValid = false;
                break;
        case 6:
                //June
                if (i_Date > 30)
                            bValid = false;
                    break;
        case 9:
        //September
                if (i_Date > 30)
                            bValid = false;
                        break;
        case 11:
        //November
                if (i_Date > 30)
                                bValid = false;
                        break;
    }

        if (bValid == false)
        {
                  alert(alertText);
                return false;
        }
        else
                return true;
}


/************************************************************************
* DigitValidation
*         verifies numeric value was entered and that it's length is between
*         the passed min and max
************************************************************************/
function DigitValidation(entered, lenMin, lenMax, alertText)
{
        var strValue = Trim(entered.value);
        var checkvalue=parseFloat(strValue);
        if ( (parseFloat(lenMin)==lenMin && strValue.length<lenMin) || (parseFloat(lenMax)==lenMax && strValue.length>lenMax) || strValue!=checkvalue || (strValue.indexOf(".")>0) )
        {
                if (alertText)
                        alert(alertText);
                entered.focus();
                entered.select();
                return false;
        }
        else
                return true;
}


/************************************************************************
* EmailAddressValidation
*        shows a message (alertText) and returns false if no e-mail address
*        has been specified in the input text box (entered) or if the
*        address appears invalid due to a number of conditions checked
************************************************************************/
function EmailAddressValidation(entered, alertText)
{
        with (entered)
        {
                var len=value.length
                var apos=value.indexOf("@");
                var dotpos=value.lastIndexOf(".");
                var lastpos=value.length-1;
                // if length = 0
                // or "@" is the first character or doesn't exist
                // or "." doesn't follow "@" with at least 2 spaces between them
                // or there are more than 3 characters following the "."
                // or there are less than 2 characters following the "."
                if (len==0 || apos<1 || dotpos-apos<2 || lastpos-dotpos>4 || lastpos-dotpos<2)
                {
                        if (alertText)
                                alert(alertText);
                        entered.focus();
                        return false;
                }
                else
                        return true;
        }
}

/************************************************************************
* EmptyValidation
*        shows a message (alertText) and returns false if no data has been
*        entered in the input text box (entered)
************************************************************************/
function EmptyValidation(entered, alertText)
{
        var strValue = Trim(entered.value);
        if (strValue == null || strValue == "" || strValue == "undefined")
        {
                if (alertText)
                {
                        alert(alertText);
                }
                entered.focus();
                entered.select();
                return false;
        }
        else
                return true;
}


/************************************************************************
* FutureDateValidation
*        Accepts string in date format ("mm/dd/yyyy") and verifies that date
*   is the current day OR occurs in the future.
************************************************************************/
function FutureDateValidation(inputDate, alertText)
{
        var t_day;
        var t_month;
        var t_year;
        var t_date;
        var i_day;
        var i_month;
        var i_year;
        var i_date;
        var now = new Date();
        var compareDate = new Date(inputDate);

        // create "yyyymmdd" string out of today's date
        t_day = now.getDate();
        if (t_day < 10)
                t_day = "0" + t_day.toString();
        else
                t_day = t_day.toString();
        t_month = now.getMonth() + 1;
        if (t_month < 10)
                t_month = "0" + t_month.toString();
        else
                t_month = t_month.toString();
        t_year = now.getFullYear().toString();
        t_date = t_year + t_month + t_day;

        // create "yyyymmdd" string out of input date
        i_day = compareDate.getDate();
        if (i_day < 10)
                i_day = "0" + i_day.toString();
        else
                i_day = i_day.toString();
        i_month = compareDate.getMonth() + 1;
        if (i_month < 10)
                i_month = "0" + i_month.toString();
        else
                i_month = i_month.toString();
        i_year = compareDate.getFullYear().toString();
        i_date = i_year + i_month + i_day;

        // if input date occurs before today's date
        if (i_date < t_date)
        {
                // show alert and return false (did not pass validation)
                alert(alertText);
                return false;
        }
        // otherwise, passed validation
        else
                return true;
}


/************************************************************************
* GoToURL
*        Redirects the main frame in a frameset to page or anchor specified
*        in value property of select or option item named "dest"
************************************************************************/
function GoToURL(form) {
        var myindex=form.dest.selectedIndex
        window.open(form.dest.options[myindex].value, target="_self"); //change these both to "yes" to get the toolbar
}


/************************************************************************
* IsValidDate
*         Checks for the following valid date formats:
*         MM/DD/YYYY OR MM-DD-YYYY
************************************************************************/
function IsValidDate(dateStr) {
// Checks for the following valid date formats:
// MM/DD/YY   MM/DD/YYYY   MM-DD-YY   MM-DD-YYYY
// Also separates date into month, day, and year variables

        var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/;

        // To require a 4 digit year entry, use this line instead:
        // var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;

        var matchArray = dateStr.match(datePat); // is the format ok?
        if (matchArray == null) {
                return false;
        }
        month = matchArray[1]; // parse date into variables
        day = matchArray[3];
        year = matchArray[4];
        if (month < 1 || month > 12) { // check month range
                return false;
        }
        if (day < 1 || day > 31) {
                return false;
        }
        if ((month==4 || month==6 || month==9 || month==11) && day==31) {
                return false;
        }
        if (month == 2) { // check for february 29th
                var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
                if (day>29 || (day==29 && !isleap)) {
                        return false;
                   }
        }
        return true;  // date is valid
}


/************************************************************************
* IsValidDate - OLD DO NOT USE
*         Checks for the following valid date formats:
*         MM/DD/YYYY OR MM-DD-YYYY
*        Also separates date into month, day, and year variables
************************************************************************/
/*
function IsValidDate(dateField)
{

        var dateStr = dateField.value;

        var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;

        var matchArray = dateStr.match(datePat); // is the format ok?
        if (matchArray == null)
        {
                alert("\"Date of Birth\" must be in entered in the format mm/dd/yyyy.")
                dateField.select();
                dateField.focus();
                return false;
        }

        var month = matchArray[1]; // parse date into variables
        var day = matchArray[3];
        var year = matchArray[4];

        if (month < 1 || month > 12)
        { // check month range
                alert("\"Date of Birth\" month must be between 1 and 12.");
                dateField.select();
                dateField.focus();
                return false;
        }

        if (day < 1 || day > 31)
        { // check day range
                alert("\"Date of Birth\" day must be between 1 and 31.");
                dateField.select();
                dateField.focus();
                return false;
        }

        return true; // date is valid
}
*/

/************************************************************************
* LengthValidation
*        shows a message (alertText) and returns false if the length of
*        the input text (entered) is too short or too long
************************************************************************/
function LengthValidation(entered, lenMin, lenMax, alertText)
{
        var strValue = Trim(entered.value);
        if (strValue.length < lenMin || strValue.length > lenMax)
        {
                if (alertText)
                {
                        alert(alertText);
                }
                entered.focus();
                entered.select();
                return false;
        }
        else
                return true;
}


/************************************************************************
* LimitTextArea
*        limits number of characters entered into textarea input.
*        once character count exceeds limit, characters are trimmed
*   as they are typed
************************************************************************/
function LimitTextArea(field, maxlimit)
{
        if (field.value.length > maxlimit) // if too long...trim it!
                field.value = field.value.substring(0, maxlimit);
}


/************************************************************************
* MembershipNumberValidation
*        shows a message (alertText) and returns false if the membership
*        number (entered) does not meet the criteria set up in the function
************************************************************************/
function MembershipNumberValidation(entered, alertText)
{
        var strValue = Trim(entered.value);
        // requirements:
        //                - begin with '600663'
        //                - length of exactly 16 digits
        //                - numeric only
        if ((strValue.substring(0,6) != '600663') ||
                (strValue.length != 16) ||
                (strValue != parseFloat(value)) )
        {
                if (alertText)
                {
                        alert(alertText);
                }
                entered.focus();
                entered.select();
                return false;
        }
        else
                return true;
}

/************************************************************************
* MinLengthValidation
*        shows a message (alertText) and returns false if the length of
*        the input text (entered) is too short
************************************************************************/
function MinLengthValidation(entered, lenMin, alertText)
{
        var strValue = Trim(entered.value);
        if (strValue.length < lenMin )
        {
                if (alertText)
                {
                        alert(alertText);
                }
                entered.focus();
                entered.select();
                return false;
        }
        else
                return true;
}

/************************************************************************
* NewWindow
*        opens a new browser window with the specified url, window name
*        and other parameter specs
************************************************************************/
function NewWindow(URL, name, specs)
{
        var anon_win = window.open(URL, name, specs);
}

/************************************************************************
* RadioGroupValidation
*        shows a message (alertText) and returns false if no selection has
*        been made between the items in the radio group (groupName)
************************************************************************/
function RadioGroupValidation(groupName, alertText)
{
        var allEmpty = true;
        for (index = 0; index < groupName.length; index++)
        {
                  if (groupName[index].checked)
                  {
                           allEmpty = false; //found one to be selected
                    break;            //get out of the loop
                  }
        }
        if (allEmpty)
        {
                if (alertText)
                        alert(alertText);
                return false;
        }
        else
                return true;
}

/************************************************************************
* SelectValidation
*        shows a message (alertText) and returns false if no data has been
*        selected in the dropdown list (entered)
************************************************************************/
function SelectValidation(entered, alertText)
{
        var idx = entered.selectedIndex;

        with (entered.options[idx])
                {
                if ( (value == 0) || (value == "") || (value == null) )
                {
                        if (alertText)
                        {
                                alert(alertText);
                        }
                        entered.focus();
                        return false;
                }
                else
                        return true;
        }
}


/************************************************************************
* SpecialCharValidation
*         allows only certain characters to be entered (to prevent foreign
*   character issues)
************************************************************************/
function SpecialCharValidation(entered, alertText)
{
        var strValidate = entered.value;
        with (strValidate)
        {
                for (i = 0; i < length; i++)
                {
                        ch = charAt(i);
                        if ( !(ch >= 'a' && ch <= 'z')
                                && !(ch >= 'A' && ch <= 'Z')
                                && !(ch == ' ')
                                && !(ch == ',')
                                && !(ch == '-')
                                && !(ch == '.')
                                && !(ch == '\'')
                                && !(ch == '\/')
                                && !(ch == '(')
                                && !(ch == ')')
                                && !(ch == '@')
                                && !(ch == '_')
                                && !(ch >='0' && ch <='9'))
                        {
                                if (alertText)
                                        alert(alertText);
                                entered.focus();
                                entered.select();
                                return false;
                        }
                }
        }
        return true;
}


/************************************************************************
* StateValidation
*        shows a message and returns false if no state has been selected
*        in the state dropdown list (stateField) when the country selected
*        in the country dropdown list (countryField) is United States, Canada
*   or Australia.  if United States, Canada or Austraili is selected,
*   verify a valid State/Province/Territory is selected for the country.
*         if the country is NOT one of the afforementioned, no state may be
*   selected so an alert is shown and false is returned.
************************************************************************/
function StateValidation(countryField, stateField)
{
        var strCountry = countryField.value;
        var strState = stateField.options[stateField.selectedIndex].value;
        if ( ( (strCountry=="US") || (strCountry=="USA") ) ||
                 ( (strCountry=="CA") || (strCountry=="CAN") ) ||
                 ( (strCountry=="AU") || (strCountry=="AUS") ) )
        {
                if ( (strState == 0) || (strState=="") || (strState == null) )
                {
                        alert("Please select a State/Province/Territory for US/Canada/Australia.");
                        stateField.focus();
                        return false;
                }
                else
                {
                        switch (strCountry)
                        {
                                case "USA":
                                {
                                    for (i=0;i<g_aUSStates.length;i++) {
                                        if (strState==g_aUSStates[i]) {
                                                return(true);
                                        }
                                }
                                        alert("Please select a valid State for the United States.");
                                        stateField.focus()
                                        return false;
                                }
                                case "CAN":
                                {
                                    for (i=0;i<g_aCanadianStates.length;i++) {
                                        if (strState==g_aCanadianStates[i]) {
                                                return(true);
                                        }
                                }
                                        alert("Please select a valid Province for Canada.");
                                        stateField.focus()
                                        return false;
                                }
                                case "AUS":
                                {
                                    for (i=0;i<g_aAustralianStates.length;i++) {
                                        if (strState==g_aAustralianStates[i]) {
                                                return(true);
                                        }
                                }
                                        alert("Please select a valid Territory for Australia.");
                                        stateField.focus()
                                        return false;
                                }
                        }
                }
                return true;
        }
        else
        {
                if ( (strState != 0) && (strState != "") && (strState != null) )
                {
                        alert("Please review your State/Province/Territory and Country selections for accuracy.");
                        stateField.focus();
                        return false;
                }
                else
                        return true;
        }
}


/************************************************************************
* SubmitEnter
*        used in onkeypress event of form inputs to allow enter key to
*   kick off form submission process.  works with ie and netscape.
************************************************************************/
function SubmitEnter(myfield,e)
{
        var keycode;
        if (window.event) keycode = window.event.keyCode;
        else if (e) keycode = e.which;
        else return false;

        if (keycode == 13)
           return true;
        else
           return false;
}


/************************************************************************
* SubmitFormOnlyOnce
*        once the form's submit button is clicked, prevents the form from
*   being submitted more than once.
*   NOTE: Make sure to call this function AFTER all validation functions
************************************************************************/
function SubmitFormOnlyOnce()
{
   if (submitCount == 0)
   {
      submitCount++;
      return true;
   }
   else
   {
      alert("This form has already been submitted.  Thanks!");
      return false;
   }
}

/************************************************************************
* Trim
*        Trims leading and trailing spaces and tabs.
************************************************************************/
function Trim(sData)
{
        var sTrimmed = String(sData);
        sTrimmed = sTrimmed.replace(/(^[ |\t]+)|([ |\t]+$)/g, '');
        return sTrimmed;
}

