var currentVisibleForm;

$(document).ready(function() {
    $('a.p101').click(function() {
        $('#pixingo101').animate({ 'margin-top': '0px' }, 600);
    });
    $('#pixingo101 a.close').click(function() {
        $('#pixingo101').animate({ 'margin-top': '-310px' }, 600);
    });
    $(".formTrigger.ice").click(function() {
        SlideDownFormsController.open_form('ice');
    });
    $(".formTrigger.card").click(function() {
        SlideDownFormsController.open_form('card');
    });
    $(".formTrigger.more").click(function() {
        SlideDownFormsController.open_form('more');
    });
    SlideDownFormsController.init();
    FreeSampleCardForm.init();
    IceBreakerForm.init();
    MoreInfoForm.init();
    initValidation();
});

function matchValidationPage(form, element) {
    return currentVisibleForm == form && $(element).parents("#" + form + "Form.slideForms").length > 0;
}

function getElementDisplayName(element) {
    cleanedUpElementName = element.name.substring(element.name.indexOf("_") + 1).replace("_", " ");
    return capWords(cleanedUpElementName);
}

function capWords(str) {
    var words = str.split(" ");
    for (var i = 0; i < words.length; i++) {
        var testwd = words[i];
        var firLet = testwd.substr(0, 1);
        var rest = testwd.substr(1, testwd.length - 1)
        words[i] = firLet.toUpperCase() + rest
    }
    return words.join(" ");
}

function initValidation() {
    $.validator.addMethod(
        "PageRequired"
        , function(value, element) {
            if (matchValidationPage("more", element) || matchValidationPage("card", element) || matchValidationPage("ice", element)) {
                if (this.optional(element)) {
                    this.settings.messages[element.name] = $.validator.format("{0} is a required field.", getElementDisplayName(element));
                    return false;
                }
            }
            return "dependancy-mismatch";
        }
    );
    $.validator.addMethod(
        "PageEmail"
        , function(value, element) {
            if (matchValidationPage("more", element) || matchValidationPage("card", element) || matchValidationPage("ice", element)) {
                if (!($.validator.methods.email.call(this, value, element))) {
                    this.settings.messages[element.name] = $.validator.format("{0} field must be an email.", getElementDisplayName(element));
                    return false;
                }
            }
            return "dependancy-mismatch";
        }
    );
    $("#aspnetForm").validate({
          onkeyup: false
        , onclick: false
        , onfocusout: false
        , onsubmit: false
        , errorPlacement: function(error, element) {
            switch (currentVisibleForm) {
                case "ice":
                    IceBreakerForm.set_message(error.html());
                    break;
                case "card":
                    FreeSampleCardForm.set_message(error.html());
                    break;
                case "more":
                    MoreInfoForm.set_message(error.html());
                    break;
            }
        }
        , invalidHandler: function(error, validator) {
            if (validator.numberOfInvalids()) {
                switch (currentVisibleForm) {
                    case "ice":
                        IceBreakerForm.show_message();
                        break;
                    case "card":
                        FreeSampleCardForm.show_message();
                        break;
                    case "more":
                        MoreInfoForm.show_message();
                        break;
                }
            }
        }
    });
}

var MoreInfoForm = {
    init: function() {
        $("#moreInfoSubmit").click(this.sendForm);
    },
    set_message: function(message) {
        $("#moreInfoErrors").append("<br/>" + message);
    },
    show_message: function() {
        $("#moreInfoErrors").slideDown(250);
    },
    hide_message: function(clear) {
        if (clear) {
            $("#moreInfoErrors").empty();
            $("#moreInfoErrors").append("Form Results:<br/>");
        }
        $("#moreInfoErrors").slideDown();
    },
    sendForm: function(event) {
        event.preventDefault();
        MoreInfoForm.hide_message(true);
        if ($("#aspnetForm").valid()) {
            dispatchAJAX(
                true,
                "ProcessMoreInfoRequestForm",
                $(".moreInfoInput").serializeObject(),
                function(successResult) {
                    MoreInfoForm.set_message(successResult.messagePayload);
                    MoreInfoForm.show_message();
                },
                function(failureResult) {
                    MoreInfoForm.set_message(failureResult.messagePayload);
                    MoreInfoForm.show_message();
                }
            );
        }
    }
};

var FreeSampleCardForm = {
    init: function() {
        $("#cardSubmit").click(this.sendForm);
    },
    set_message: function(message) {
        $("#cardFormErrors").append("<br/>" + message);
    },
    show_message: function() {
        $("#cardFormErrors").slideDown(250);
    },
    hide_message: function(clear) {
        if (clear) {
            $("#cardFormErrors").empty();
            $("#cardFormErrors").append("Form Results:<br/>");
        }
        $("#cardFormErrors").slideDown();
    },
    sendForm: function(event) {
        event.preventDefault();
        FreeSampleCardForm.hide_message(true);
        if ($("#aspnetForm").valid()) {
            dispatchAJAX(
                    true,
                    "ProcessSampleCardRequestForm",
                    $(".freeCardInput").serializeObject(),
                    function(successResult) {
                        FreeSampleCardForm.set_message(successResult.messagePayload);
                        FreeSampleCardForm.show_message();
                    },
                    function(failureResult) {
                        FreeSampleCardForm.set_message(failureResult.messagePayload);
                        FreeSampleCardForm.show_message();
                    }
                );
        }
    }
};

var IceBreakerForm = {
    init: function() {
        $("#iceSubmit").click(this.sendForm);
    },
    set_message: function(message) {
        $("#iceFormErrors").append("<br/>" + message);
    },
    show_message: function() {
        $("#iceFormErrors").slideDown(250);
    },
    hide_message: function(clear) {
        if (clear) {
            $("#iceFormErrors").empty();
            $("#iceFormErrors").append("Form Results:<br/>");
        }
        $("#iceFormErrors").slideDown();
    },
    sendForm: function(event) {
        event.preventDefault();
        IceBreakerForm.hide_message(true);
        if ($("#aspnetForm").valid()) {
            dispatchAJAX(
                    true,
                    "ProcessHostIceBreakerRequestForm",
                    $(".iceFormInput").serializeObject(),
                    function(successResult) {
                        IceBreakerForm.set_message(successResult.messagePayload);
                        IceBreakerForm.show_message();
                    },
                    function(failureResult) {
                        IceBreakerForm.set_message($.toJSON(failureResult));
                        IceBreakerForm.show_message();
                    }
                );
        }
    }
};

var SlideDownFormsController = {
    init: function() {
        $('.slideDownForm a.close').click(this.close_all_forms);
        $(".refer_no").each(function() {
            $(this).attr('checked', 'checked')
        });
        $(".refer_yes, .refer_no").change(function() {
            $(this).closest('form').find('.consultantDetail').fadeToggle()
        });
    },
    close_all_forms: function(callback) {
        if (!callback) callback = function() { }
        $('.formArrow').slideUp(250);
        $('.slideDownForm').animate({ height: 0 }, 250);
        window.setTimeout(callback, 300);
    },
    open_form: function(form) {
        currentVisibleForm = form;
        if ($('.slideDownForm.' + form).height() > 0)
            return;
        var forms = $.makeArray($('.slideDownForm'));
        var visible_forms = $.grep(forms,
            function(f, i) {
                return $(f).height() > 0;
            }
        );
        var open = function(f) {
            $('.formArrow.' + f).slideDown(350);
            $('.slideDownForm.' + f).animate({ height: 350 }, 350);
        };
        if (visible_forms.length > 0)
            this.close_all_forms(
                function() {
                    open(form);
                }
            );
        else
            open(form);
    }
};
