function validateEmail(email) {
    var valid = true;
    var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
    if (reg.test(email) === false) {
        valid = false;
    }
    return valid;
}

function replaceOneChar(s, c, n) {
    //replaceOneChar('abcde','X',3) ); // abXde
    var re = new RegExp('^(.{' + n + '}).(.*)$','');
    return s.replace(re, '$1' + c + '$2');
}


function formatPostalCode(code) {
    if (code.charAt(3) === '-') {
        code = replaceOneChar(code, ' ', 3);
    } else if (code.charAt(3) !== ' ') {
        var str = code.substr(0, 3);
        var end = code.substr(3);
        code = str + ' ' + end;
    }
    return code.toUpperCase();
}



function validatePostalCode(code) {
    if (code.match(/^[A-Z]\d[A-Z] \d[A-Z]\d+$/)) {
        return true;
    } else {
        return false;
    }
}

function validateZip(zip) {
    var reZip = new RegExp(/(^\d{5}$)|(^\d{5}-\d{4}$)/);

    if (!reZip.test(zip)) {
        return false;
    } else {
        return true;
    }
}

function statesArray() {
    var states = ['Alabama', 'AL', 'Alaska', 'AK', 'Arizona', 'AZ', 'Arkansas', 'AR', 'California', 'CA', 'Colorado', 'CO', 'Connecticut', 'CT', 'Delaware', 'DE', 'District of Columbia', 'DC', 'Florida', 'FL', 'Georgia', 'GA', 'Hawaii', 'HI', 'Idaho', 'ID', 'Illinois', 'IL', 'Indiana', 'IN', 'Iowa', 'IA', 'Kansas', 'KS', 'Kentucky', 'KY', 'Louisiana', 'LA', 'Maine', 'ME', 'Maryland', 'MD', 'Massachusetts', 'MA', 'Michigan', 'MI', 'Minnesota', 'MN', 'Mississippi', 'MS', 'Missouri', 'MO', 'Montana', 'MT', 'Nebraska', 'NE', 'Nevada', 'NV', 'New Hampshire', 'NH', 'New Jersey', 'NJ', 'New Mexico', 'NM', 'New York', 'NY', 'North Carolina', 'NC', 'North Dakota', 'ND', 'Ohio', 'OH', 'Oklahoma', 'OK', 'Oregon', 'OR', 'Pennsylvania', 'PA', 'Rhode Island', 'RI', 'South Carolina', 'SC', 'South Dakota', 'SD', 'Tennessee', 'TN', 'Texas', 'TX', 'Utah', 'UT', 'Vermont', 'VT', 'Virginia', 'VA', 'Washington', 'WA', 'West Virginia', 'WV', 'Wisconsin', 'WI', 'Wyoming', 'WY'];

    return states;
}

function provincesArray() {
    var provinces = ['Alberta', 'AB', 'British Columbia', 'BC', 'Manitoba', 'MB', 'New Brunswick', 'NB', 'Newfoundland and Labrador', 'NL', 'Northwest Territories', 'NT', 'Nova Scotia', 'NS', 'Nunavut', 'NU', 'Ontario', 'ON', 'Prince Edward Island', 'PE', 'Quebec', 'QC', 'Saskatchewan', 'SK', 'Yukon', 'YT'];

    return provinces;
}

function validateBalanceForm(theForm) {
    var validated = true;
    var messageToUser = '';

    if (theForm.email.value === '') {
        validated = false;
        messageToUser = 'You must provide an email address.';
    } else if (!validateEmail(theForm.email.value)) {
        validated = false;
        messageToUser = 'Email address is invalid.';
    }

    if (!validated) {
        alert(messageToUser + ' Fix and resubmit the the form.');
    }

    return validated;
}

function validateDiscForm(theForm){
    var validated = true;
    var messageToUser = '';

    if (theForm.discName.value === '') {
        validated = false;
        messageToUser += "- You must provide a subject.\n";
    }

    if (theForm.email.value === '') {
        validated = false;
        messageToUser += '- You must provide an email address.\n';
    } else if (!validateEmail(theForm.email.value)) {
        validated = false;
        messageToUser += '- Your email address is invalid.\n';
    }
  
    if (theForm.questionDetails.value === '') {
        validated = false;
        messageToUser += "- You must write a detailed question.\n";
    }

    if (!validated) {
        alert("Fix the following and resubmit the the form.\n\n" + messageToUser);
    }

    return validated;
}

function validateDiscReplyForm(theForm){
    var validated = true;
    var messageToUser = '';

    if (theForm.email.value === '') {
        validated = false;
        messageToUser += '- You must provide an email address.\n';
    } else if (!validateEmail(theForm.email.value)) {
        validated = false;
        messageToUser += '- Your email address is invalid.\n';
    }
  
    if (theForm.questionDetails.value === '') {
        validated = false;
        messageToUser += "- You must write a follow-up message.\n";
    }

    if (!validated) {
        alert("Fix the following and resubmit the the form.\n\n" + messageToUser);
    }

    return validated;
}


function validateGeneralContactForm(theForm) {
    var validated = true;
    var messageToUser = '';

    if (theForm.full_name.value === '') {
        validated = false;
        messageToUser += "- You must provide a name.\n";
    }

    if (theForm.email.value === '') {
        validated = false;
        messageToUser += '- You must provide an email address.\n';
    } else if (!validateEmail(theForm.email.value)) {
        validated = false;
        messageToUser += '- Your email address is invalid.\n';
    }
  
    if (theForm.message.value === '') {
        validated = false;
        messageToUser += "- You must write a message.\n";
    }

    if (!validated) {
        alert("Fix the following and resubmit the the form.\n\n" + messageToUser);
    }

    return validated;
}


function validateAddressForm(theForm) {
    var validated = true;
    var messageToUser = '';

    if (theForm['Address:Fname'].value === '') {
        validated = false;
        messageToUser += "- You must provide a first name.\n";
    }

    if (theForm['Address:Lname'].value === '') {
        validated = false;
        messageToUser += "- You must provide a last name.\n";
    }

    if (theForm['Address:Email'].value === '') {
        validated = false;
        messageToUser += '- You must provide an email address.\n';
    } else if (!validateEmail(theForm['Address:Email'].value)) {
        validated = false;
        messageToUser += '- Your email address is invalid.\n';
    }
  
    if (theForm['Address:Phone'].value === '') {
        validated = false;
        messageToUser += "- You must provide a phone number.\n";
    }
  
    if (theForm['Address:Addr'].value === '') {
        validated = false;
        messageToUser += "- You must provide a street address.\n";
    }

    if (theForm['Address:Cntry'].value === '') {
        validated = false;
        messageToUser += "- You must choose a country.\n";
    }
  
    if (theForm['Address:City'].value === '') {
        validated = false;
        messageToUser += "- You must provide a city.\n";
    }
  
    if (theForm['Address:State'].value === '') {
        validated = false;
        if (theForm['Address:Cntry'].value === 'US') {
            messageToUser += "- You must choose a state.\n";
        } else if (theForm['Address:Cntry'].value === 'CA') {
            messageToUser += "- You must choose a province.\n";
        }
    }

    if (theForm['Address:Zip'].value === '') {
        validated = false;
        if (theForm['Address:Cntry'].value === 'US') {
            messageToUser += "- You must provide a zip code.\n";
        } else if (theForm['Address:Cntry'].value === 'CA') {
            messageToUser += "- You must provide a postal code.\n";
        }
    } else if (theForm['Address:Cntry'].value === 'US') {
        if (!validateZip(theForm['Address:Zip'].value)) {
            validated = false;
            messageToUser += '- Your zip code is invalid.';
        }
    } else if (theForm['Address:Cntry'].value === 'CA') {
        theForm['Address:Zip'].value = formatPostalCode(theForm['Address:Zip'].value);
        if (!validatePostalCode(theForm['Address:Zip'].value)) {
            validated = false;
            messageToUser += '- Your postal code is invalid.';
        }
    }

    if (!validated) {
        alert("Fix the following and resubmit the the form.\n\n" + messageToUser);
    }

    return validated;
}



function changeSelectionOptions(formName, selectName, selectTitle, optionArray, chooseDefault) {
    var i = 0;
    var k = 1;

    while (i < optionArray.length - 1) {
        //option name, option value
        if (chooseDefault === optionArray[i + 1]) {
            document[formName][selectName].options[k] = new Option(optionArray[i], optionArray[i + 1], true, true);
        } else {
            document[formName][selectName].options[k] = new Option(optionArray[i], optionArray[i + 1]);
        }
        i = i + 2;
        k = k + 1;
    }

    //make sure there aren't any options left over from a previous time
    document[formName][selectName].options.length = k;

    document.getElementById(selectName + "_title").innerHTML = selectTitle;
}

function loadAddressForm(country, stateOrProvince) {
    if (country === 'US') {
        document.addressForm['Address:Cntry'].options[2].selected = true;
        changeSelectionOptions('addressForm', 'Address:State', 'State', statesArray(), stateOrProvince);
    } else if (country === 'CA') {
        document.addressForm['Address:Cntry'].options[1].selected = true;
        changeSelectionOptions('addressForm', 'Address:State', 'Province', provincesArray(), stateOrProvince);
    }
}

function onCountryChange(country) {
    if (country === 'US') {
        changeSelectionOptions('addressForm', 'Address:State', 'State', statesArray(), '');
        document.getElementById("Address:Zip_title").innerHTML = 'Zip Code';
    } else if (country === 'CA') {
        changeSelectionOptions('addressForm', 'Address:State', 'Province', provincesArray(), '');
        document.getElementById("Address:Zip_title").innerHTML = 'Postal Code';
    }
}

function onCountryChangeTest(country) {
    if (country === 'US') {
        changeSelectionOptionsTest('addressForm', 'state', 'State', statesArray(), '');
    } else if (country === 'CA') {
        changeSelectionOptionsTest('addressForm', 'state', 'Province', provincesArray(), '');
    } else {
        alert('you did not choose anything');
    }
}

function changeSelectionOptionsTest(formName, selectName, selectTitle, optionArray, chooseDefault) {
    var i = 0;
    var k = 1;

    //make sure there aren't any options left over from a previous time *this has problems in older browsers
    //document[formName][selectName].options.length = 0;

    alert('you choose '+selectName);
    while (i < optionArray.length - 1) {
        //option name, option value
        if (chooseDefault === optionArray[i + 1]) {
            document[formName][selectName].options[k] = new Option(optionArray[i], optionArray[i + 1], true, true);
        } else {
            document[formName][selectName].options[k] = new Option(optionArray[i], optionArray[i + 1]);
        }
        i = i + 2;
        k = k + 1;
    }
    document[formName][selectName].options.length = k;
}

