// ----------------------------------------------------------------------------------------------------------------------------------------------- [  Add Initial Rows ] ---------------------------
function addInitialRows(numOfRows){
    var count = $("#countValue").val();
    for ( $i = 0; $i < numOfRows; $i++ ) {
        addRow(count);
        count++;
    }
    $("#countValue").val(count);
}

// ----------------------------------------------------------------------------------------------------------------------------------------------- [  Add Row ] -------------------------------------
function addRow(number) {
    var odd = '<tr id="tr-' + number + '">';
    var even = '<tr class="even" id="tr-' + number + '">';

    var printThis = '';
    if ( number % 2 == 0 ) {
        printThis = even;
    } else {
        printThis = odd;
    }

    if ( number % 10 == 1 ) {
        $("#quoteForm tr:last").after('<tr align="center" class="bold">' +
            '<td width="20px"/>' +
            '<td width="150px">Employee Name</td>' +
            '<td width="10px">M</td>' +
            '<td width="10px">F</td>' +
            '<td width="100px">Employee DOB</td>' +
            '<td width="100px">Spouse DOB</td>' +
            '<td width="30px">EE</td>' +
            '<td width="30px">ES</td>' +
            '<td width="30px">EC</td>' +
            '<td width="30px">FAM</td>' +
            '<td width="30px">None</td>' +
            '</tr>');
    }

    $("#quoteForm tr:last").after(printThis +
        '<td align="right">' + number + '</td>' +
        '<td class="name-' + number + '"><input type="text" name="name-' + number + '" id="name-' + number + '" size="20" /></td>' +
        '<td class="gender-' + number + '"><input type="radio" name="gender-' + number + '" id="gender-M-' + number + '" value="M" /></td>' +
        '<td class="gender-' + number + '"><input type="radio" name="gender-' + number + '" id="gender-F-' + number + '" value="F" /></td>' +
        '<td class="e-dob-' + number + '"><input type="text" name="e-dob-' + number + '" id="e-dob-' + number + '" size="12" /></td>' +
        '<td class="s-dob-' + number + '"><input type="text" name="s-dob-' + number + '" id="s-dob-' + number + '" size="12" /></td>' +
        '<td class="group-' + number + '"><input type="radio" name="group-' + number + '" id="group-EE-' + number + '" value="EE" /></td>' +
        '<td class="group-' + number + '"><input type="radio" name="group-' + number + '" id="group-ES-' + number + '" value="ES" /></td>' +
        '<td class="group-' + number + '"><input type="radio" name="group-' + number + '" id="group-EC-' + number + '" value="EC" /></td>' +
        '<td class="group-' + number + '"><input type="radio" name="group-' + number + '" id="group-FAM-' + number + '" value="FAM" /></td>' +
        '<td class="group-' + number + '"><input type="radio" name="group-' + number + '" id="group-None-' + number + '" value="None" /></td>' +
        '<td><input type="button" value="Reset" id="reset-' + number + '" onclick="resetRow(' + number + ')" /></td>' +
        '<td><input type="hidden" name="status-' + number + '" id="status-' + number + '" /></td>' +
        '</tr>');
    if ( number % 5 == 0 ) {
        $("#quoteForm tr:last").after('<tr class="spacer"></td>');
    }
}

// ----------------------------------------------------------------------------------------------------------------------------------------------- [  Reset Row ] -----------------------------------
function resetRow(rowToReset) {
    // Clear all the values
    $("#name-" + rowToReset).val("");
    $("input:radio[name='gender-" + rowToReset + "']").attr('checked', false);
    $("#e-dob-" + rowToReset).val("");
    $("#s-dob-" + rowToReset).val("");
    $("input:radio[name='group-" + rowToReset + "']").attr('checked', false);

    // Remove all the errors
    if ( $("#tr-" + rowToReset).hasClass('even') ) {
        $(".name-" + rowToReset).css('background-color', '#EEE');
        $(".gender-" + rowToReset).css('background-color', '#EEE');
        $(".e-dob-" + rowToReset).css('background-color', '#EEE');
        $(".s-dob-" + rowToReset).css('background-color', '#EEE');
        $(".group-" + rowToReset).css('background-color', '#EEE');
    } else {
        $(".name-" + rowToReset).css('background-color', 'white');
        $(".gender-" + rowToReset).css('background-color', 'white');
        $(".e-dob-" + rowToReset).css('background-color', 'white');
        $(".s-dob-" + rowToReset).css('background-color', 'white');
        $(".group-" + rowToReset).css('background-color', 'white');
    }
}

// ----------------------------------------------------------------------------------------------------------------------------------------------- [  Reset Field ] ----------------------------------
function resetField(fieldToReset, rowToReset) {
    if ( $("#tr-" + rowToReset).hasClass('even') ) {
        $(fieldToReset).css('background-color', '#EEE');
    } else {
        $(fieldToReset).css('background-color', 'white');
    }
}

// ----------------------------------------------------------------------------------------------------------------------------------------------- [  Disable Row ] ----------------------------------
function disableRow(rowToDisable) {
    $("#name-" + rowToDisable).attr("disabled", "disabled");
    $("#gender-M-" + rowToDisable).attr("disabled", "disabled");
    $("#gender-F-" + rowToDisable).attr("disabled", "disabled");
    $("#e-dob-" + rowToDisable).attr("disabled", "disabled");
    $("#s-dob-" + rowToDisable).attr("disabled", "disabled");
    $("#group-EE-" + rowToDisable).attr("disabled", "disabled");
    $("#group-ES-" + rowToDisable).attr("disabled", "disabled");
    $("#group-EC-" + rowToDisable).attr("disabled", "disabled");
    $("#group-FAM-" + rowToDisable).attr("disabled", "disabled");
    $("#group-None-" + rowToDisable).attr("disabled", "disabled");
    $("#reset-" + rowToDisable).attr("disabled", "disabled");
}

// ----------------------------------------------------------------------------------------------------------------------------------------------- [  Enable Row ] ----------------------------------
function enableRow(rowToEnable) {
    $("#name-" + rowToEnable).removeAttr("disabled");
    $("#gender-M-" + rowToEnable).removeAttr("disabled");
    $("#gender-F-" + rowToEnable).removeAttr("disabled");
    $("#e-dob-" + rowToEnable).removeAttr("disabled");
    $("#s-dob-" + rowToEnable).removeAttr("disabled");
    $("#group-EE-" + rowToEnable).removeAttr("disabled");
    $("#group-ES-" + rowToEnable).removeAttr("disabled");
    $("#group-EC-" + rowToEnable).removeAttr("disabled");
    $("#group-FAM-" + rowToEnable).removeAttr("disabled");
    $("#group-None-" + rowToEnable).removeAttr("disabled");
    $("#reset-" + rowToEnable).removeAttr("disabled");
}

// ----------------------------------------------------------------------------------------------------------------------------------------------- [  Set Display ] ----------------------------------
function setDisplay(divName, visibility) {
    $(divName).css('display', visibility);
}

// ----------------------------------------------------------------------------------------------------------------------------------------------- [  Check Gender ] ----------------------------------
function checkGender(gender, currentRow) {
    if ( gender === undefined ) {
        errorList.append('<p>Please select a gender for line ' + currentRow + '</p>');
        $(".gender-" + currentRow).css('background-color', 'red');
        return 'error';
    } else {
        resetField(".gender-" + currentRow, currentRow);
        return 'ok';
    }
}

// ----------------------------------------------------------------------------------------------------------------------------------------------- [  Check Coverage ] ----------------------------------
function checkCoverage(coverage, currentRow) {
    if (coverage === undefined) {
        errorList.append('<p>Please select a coverage for line ' + currentRow + '</p>');
        $(".group-" + currentRow).css('background-color', 'red');
        return 'error';
    } else {
        resetField(".group-" + currentRow, currentRow);
        return 'ok';
    }
}

// ----------------------------------------------------------------------------------------------------------------------------------------------- [  Check Date ] -----------------------------------
function checkDate(date, type, currentRow, coverage) {
    nullError = '<p>Please enter ' + type + ' DOB for line ' + currentRow + '</p>';
    formatError = '<p>Please enter a valid ' + type + ' DOB (format mm/dd/yyyy or mm-dd-yyyy) on line ' + currentRow + '</p>';
    monthError = '<p>Invalid month on line ' + currentRow + ' in ' + type + ' DOB</p>';
    dayError = '<p>Invalid day on line ' + currentRow + ' in ' + type + ' DOB</p>';
    under18Error = '<p>Eligible ' + type + 's must be over 18.  Please correct line ' + currentRow + '</p>';
    over100Error = '<p>DOB entered on line ' + currentRow + ' makes ' + type + ' over 100 years old.  Please rechecked the date.</p>';
    typeBeginning = "";

    if ( type == "employee") {
        typeBeginning = 'e';
    } else if ( type == "spouse" ) {
        typeBeginning = 's';
    } else {
    // TODO: something here
    }

    if ( ( date == "" && typeBeginning == 'e' ) || ( date == "" && typeBeginning == 's' && ( coverage == 'ES' || coverage == 'FAM' ) ) ) {
        errorList.append(nullError);
        $("." + typeBeginning + "-dob-" + currentRow).css('background-color', 'red');
        return 'error';
    } else if ( date == "" && typeBeginning == 's' && !( coverage == 'ES' || coverage == 'FAM' ) ) {
    // we don't need to run the check in this case, its ok that its null
    } else {
        if ( !(date.indexOf("/") > 0 || date.indexOf("-") > 0 ) ) {
            errorList.append(formatError);
            $("." + typeBeginning + "-dob-" + currentRow).css('background-color', 'red');
            return 'error';
        } else {
            if ( date.indexOf("/") > 0 ) {
                DOBsplit = date.split("/");
            } else if ( date.indexOf("-") > 0 ) {
                DOBsplit = date.split("-");
            }

            if ( DOBsplit[1] === undefined || DOBsplit[2] === undefined || DOBsplit[1] == "" || DOBsplit[2] == "" || DOBsplit[2].length != 4 ) {
                errorList.append(formatError);
                $("." + typeBeginning + "-dob-" + currentRow).css('background-color', 'red');
                return 'error';
            } else if ( !( DOBsplit[0] <= 12 && DOBsplit[0] > 0)  ) {
                errorList.append(monthError);
                $("." + typeBeginning + "-dob-" + currentRow).css('background-color', 'red');
                return 'error';
            } else if ( !( DOBsplit[1] <= 31 && DOBsplit[1] > 0 ) ) {
                errorList.append(dayError);
                $("." + typeBeginning + "-dob-" + currentRow).css('background-color', 'red');
                return 'error';
            } else {  // Date is ok
                // Check for under 18
                currentYear = (new Date).getFullYear();
                if ( currentYear - DOBsplit[2] < 18 ) {
                    errorList.append(under18Error);
                    $("." + typeBeginning + "-dob-" + currentRow).css('background-color', 'red');
                    return 'error';
                } else if ( currentYear - DOBsplit[2] == 18 ) {
                    currentMonth = (new Date).getMonth() + 1;
                    if ( currentMonth - DOBsplit[0] < 0 ) {
                        errorList.append(under18Error);
                        $("." + typeBeginning + "-dob-" + currentRow).css('background-color', 'red');
                        return 'error';
                    } else if (  currentMonth - DOBsplit[0] == 0  ) {
                        currentDay = (new Date).getDate();
                        if ( currentDay - DOBsplit[1] < 0 ) {
                            errorList.append(under18Error);
                            $("." + typeBeginning + "-dob-" + currentRow).css('background-color', 'red');
                            return 'error';
                        }
                    }
                }

                // Check for over 100, just do this based on year because its only a way out of bounds check really
                if ( currentYear - DOBsplit[2] > 100 ) {
                    errorList.append(over100Error);
                    $("." + typeBeginning + "-dob-" + currentRow).css('background-color', 'red');
                    return 'error';
                }
            }
        }
    }
    resetField("." + typeBeginning + "-dob-" + currentRow, currentRow);
    return 'ok';
}

// ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//
// ----------------------------------------------------------------------------------------------------------------------------------------------- [  Document Ready Function ]
//
// ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
$(document).ready(function() {
    
    jQuery.validator.addMethod("phoneUS", function(phone_number, element) {
        phone_number = phone_number.replace(/\s+/g, "");
        return this.optional(element) || phone_number.length > 9 &&
        phone_number.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
    }, "Please specify a valid phone number (format: 000-000-0000)");

    jQuery.validator.addMethod("faxUS", function(phone_number, element) {
        phone_number = phone_number.replace(/\s+/g, "");
        return this.optional(element) || phone_number.length > 9 &&
        phone_number.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
    }, "Please specify a valid fax number (format: 000-000-0000)");

    jQuery.validator.addMethod("postalcode", function(postalcode, element) {
        return this.optional(element) || postalcode.match(/(^\d{5}(-\d{4})?$)|(^[ABCEGHJKLMNPRSTVXYabceghjklmnpstvxy]{1}\d{1}[A-Za-z]{1} ?\d{1}[A-Za-z]{1}\d{1})$/);
    }, "Please specify a valid postal/zip code");

    // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    //
    // ------------------------------------------------------------------------------------------------------------------------------------------------------ [  Application Form ]
    //
    // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    $("#applicationForm").validate({
        rules: {
            phoneUS: {
                required: true
            },
            faxUS: {
                required: true
            },
            postalcode: {
                required: true
            }
        },
        errorPlacement: function(error, element) {
            error.appendTo( element.parent("td").next("td") );
        }
    });



    // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    //
    // ----------------------------------------------------------------------------------------------------------------------------------------------------------- [  Quote Form ]
    //
    // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    $("#quoteForm").validate({
        rules: {
            phoneUS: {
                required: true
            },
            faxUS: {
                required: true
            },
            postalcode: {
                required: true
            }
        },
        errorPlacement: function(error, element) {
            error.appendTo( element.parent("td").next("td") );
        }
    });

    

    // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    //
    // ----------------------------------------------------------------------------------------------------------------------------------------------------------- [  Census Form ]
    //
    // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    $("#addSingleRowButton").click(function() {
        var count = $("#countValue").val();
        addRow(count);
        count++;
        $("#countValue").val(count);
    });

    $("#addMultipleRowsButton").click(function() {
        var count = $("#countValue").val();

        var numOfRows = $("#addMultipleNumber").val();
        if ( numOfRows == null || numOfRows == "" ) {
            numOfRows = 1;
        } else if ( numOfRows > 10 ) {
            numOfRows = 10;
        }

        for ( $i = 0; $i < numOfRows; $i++ ) {
            addRow(count);
            count++;
        }
        $("#countValue").val(count);
    });

    $("#censusSubmitButton").click(function() {
        numberOfRows = $("#countValue").val();
        hasErrors = false;
        numberOfOKs = 0;  // There needs to be at least 2 fields filled in to submit

        setDisplay('#errorCheckDiv', '');
        $('#output').empty();
        errorList = $("#output").append('<ul style="list-style-type: square;"></ul>').find('ul');


        for ( currentRow = 1; currentRow < numberOfRows; currentRow++ ) {
            skipResult = "";
            genderResult = "";
            eDOBresult = "";
            sDOBresult = "";
            coverageResult = "";

            name = $("#name-" + currentRow).val();
            gender = $("input:radio[name='gender-" + currentRow + "']:checked").val();
            empDOB = $("#e-dob-" + currentRow).val();
            sDOB = $("#s-dob-" + currentRow).val();
            coverage = $("input:radio[name='group-" + currentRow + "']:checked").val();

            if ( gender === undefined && empDOB == "" && coverage === undefined ) {
                skipResult = 'skip';
            } else {
                // Gender Check
                genderResult = checkGender(gender, currentRow);

                // DOB Check
                eDOBresult = checkDate(empDOB, 'employee', currentRow, coverage);
                sDOBresult = checkDate(sDOB, 'spouse', currentRow, coverage);

                // Coverage Check
                coverageResult = checkCoverage(coverage, currentRow);
            }
            // Assign result field
            if ( skipResult == 'skip' ) {
                $('#status-' + currentRow).val('skip');
            } else if ( ( genderResult == 'error' ) || ( eDOBresult == 'error' ) || ( sDOBresult == 'error' ) || ( coverageResult == 'error' ) ) {
                $('#status-' + currentRow).val('error');
                //errorList.append('Row ' + currentRow + ' has an error.<br />');
                hasErrors = true;
            } else {
                $('#status-' + currentRow).val('ok');
                numberOfOKs++;
            }
        } // End For-loop

        if ( hasErrors == false && numberOfOKs >= 2 ) {
            errorList.prepend('<span class="bold">Form passed error check.  Please click the "Submit Quote Form" button above to proceed or "Makes Changes Before Submitting" to edit the form.</span>');
            for ( currentRow = 1; currentRow < numberOfRows; currentRow++ ) {
                disableRow( currentRow );
            }
            setDisplay('#submitButton', '');
            setDisplay('#censusSubmitButton', 'none');
            setDisplay('#censusResetButton', 'none');
            setDisplay('#makeChangesButton', '');
            setDisplay('#moreRowsDiv', 'none');
        } else if ( numberOfOKs < 2 ) {
            errorList.prepend('<span class="bold">You must submit the form with at least two eligible employees.</span>');
            setDisplay('#submitButton', 'none');
        }
        else {
            errorList.prepend('<span class="bold">There were errors in the form.  Please correct the errors and run the check again.</span>');
            setDisplay('#submitButton', 'none');
        }

    });

    $("#quoteCancelButton").click(function() {
        confirmation = confirm('Are you sure you want to cancel your quote request?  All data will be lost and you will be returned to the home page.');
        if ( confirmation ) {
            window.location = "/index.php";
        }
    });

    $("#quoteSubmitButton").click(function() {
        // NOTE: this is needed so that the next page can read the values from the fields.  It can't read them if they're disabled
        numberOfRows = $("#countValue").val();
        for ( currentRow = 1; currentRow < numberOfRows; currentRow++ ) {
            enableRow( currentRow );
        }
        $("#quoteForm").submit();
    });

    $("#makeChangesButton").click(function() {
        numberOfRows = $("#countValue").val();
        for ( currentRow = 1; currentRow < numberOfRows; currentRow++ ) {
            enableRow( currentRow );
        }
        setDisplay('#submitButton', 'none');
        setDisplay('#censusSubmitButton', '');
        setDisplay('#censusResetButton', '');
        setDisplay('#makeChangesButton', 'none');
        setDisplay('#errorCheckDiv', 'none');
        setDisplay('#moreRowsDiv', '');
        $('#output').empty();
    });

    $("#censusResetButton").click(function() {
        confirmation = confirm('Are you sure you want to reset the census?  All data will be lost.');
        if ( confirmation ) {
            $('#quoteForm')[0].reset();
            setDisplay('#errorCheckDiv', 'none');
            numberOfRows = $("#countValue").val();
            for ( currentRow = 1; currentRow < numberOfRows; currentRow++ ) {
                resetRow( currentRow );
            }
        }
    });

    if ( $("#countValue").length != 0 ) {
        addInitialRows(20);
    }

});
