﻿/// <reference path="jQuery/jquery-1.4.2.min.js" />
/// <reference path="jQuery/Plugin/jquery.validate.min.js" />
/// <reference path="jQuery/Plugin/jquery.metadata.min.js" />
/// <reference path="jQuery/Plugin/jquery.form.min.js" />
function SubmitFormData(parentElementID, validationErrorListID) {
    try {
        var parentForm = $("#" + parentElementID).closest("form");
        var dataInputs = $("#" + parentElementID + " :input:not(:button):not(:submit):not(:reset):not(:image):not(:file)");

        $.metadata.setType("attr", "validate");

        var validationOptions = { ignore: $($.makeArray(parentForm[0])).not(dataInputs) };

        var validationErrorList = $("#" + validationErrorListID);
        if (validationErrorList.length) {
            validationOptions["errorLabelContainer"] = validationErrorList;
            validationOptions["wrapper"] = "li";
        }

        var validator = parentForm.validate(validationOptions);
        if (!parentForm.valid()) {
            if (validationErrorList.length) {
                validationErrorList[0].scrollIntoView(true);
            }
            else {
                validator.errorList[0].element.scrollIntoView(true);
            }

            return false;
        }

        AppendHtmlMessage(parentElementID, "SubmitFormDataResult", "FormSubmissionInProgress", "One moment while your responses are submitted.");

        var formData = {};
        dataInputs.each(
            function (index, element) {
                if ((element.type == "radio" || element.type == "checkbox") && !element.checked) {
                    return;
                }

                if (element.type == "hidden" && (element.name == "ErrorMessage" || element.name == "ConfirmationMessage")) {
                    return;
                }

                switch (element.type) {
                    case "select-one":
                        formData[element.name] = $(element).find(":selected").val();
                        break;

                    case "select-multiple":
                        $(element).find(":selected").each(
                            function (selectedElementIndex, selectedElement) {
                                formData[GetUniqueElementName(formData, element.name)] = selectedElement.value;
                            }
                        );
                        break;

                    case "checkbox":
                        formData[GetUniqueElementName(formData, element.name)] = element.value;
                        break;

                    default:
                        formData[element.name] = element.value;
                        break;
                }
            }
        );

        ContentServices.FormDataHandler.SubmitData(Sys.Serialization.JavaScriptSerializer.serialize(formData), SubmitFormDataComplete, SubmitFormDataFailed,
            parentElementID);

        return true;
    }
    catch (exception) {
        SubmitFormDataFailed(exception, parentElementID, "SubmitFormData")
    }
}

function GetUniqueElementName(formData, elementName) {
    var i = 0;
    var uniqueElementName = elementName;

    while (formData[uniqueElementName] != null) {
        i++;
        uniqueElementName = elementName + i;
    }

    return uniqueElementName; 
}

function SubmitFormDataComplete(result, userContext, methodName) {
    var confirmationMessage = "Your responses have been submitted.";
    if ($("#" + userContext + " input:hidden[name='ConfirmationMessage']").length) {
        confirmationMessage = $("#" + userContext + " input:hidden[name='ConfirmationMessage']").val();
    }

    AppendHtmlMessage(userContext, "SubmitFormDataResult", "FormSubmissionComplete", confirmationMessage);

    $("#" + userContext + " :input").clearFields();
}

function SubmitFormDataFailed(exception, userContext, methodName) {
    var errorMessage;
    if ($("#" + userContext + " input:hidden[name='ErrorMessage']").length) {
        errorMessage = $("#" + userContext + " input:hidden[name='ErrorMessage']").val();
    }
    else {
        errorMessage = "An error has occured submitting your responses. Please try again. If the problem persists, please contact the website administrator.";
    }

    AppendHtmlMessage(userContext, "SubmitFormDataResult", "FormSubmissionFailed", errorMessage);
}

function AppendHtmlMessage(parentElementID, messageDivID, messageDivClass, htmlMessage) {
    var messageDiv = $("#" + messageDivID);
    if (messageDiv.length) {
        messageDiv.removeClass();
        messageDiv.addClass(messageDivClass);
        messageDiv.html(htmlMessage);
    }
    else {
        messageDiv = $("<div id=" + messageDivID + " class=" + messageDivClass + ">" + htmlMessage + "</div>");
        $("#" + parentElementID).append(messageDiv);
    }

    messageDiv[0].scrollIntoView(true);
}
