﻿(function ($) {
    $.fn.extend({
        FormSubmit: function (options) {
            var defaults = {
                textIdForUrlReplace: null, //ex. 'textboxid'
                submitOnEnterSelector: null, //ex. '#textboxid' or 'input[type="text"]'
                submitId: null, //ex. 'submitid'
                formId: null,
                useAjaxSubmit: false,
                validationResponseContainerSelector: null, //defaults to alert responses if not set
                validationResponseTextSelector: null,
                validationReponseErrorClass: null, //ex. 'errorclass'
                progressSelector: null,
                progressSelectorClass: null,
                mergeNames: null //to use for comma delimited merging of multiple inputs same name attribute.  Ex. 'signupCodeCsv' (as in name="signupCodeCsv")
            }
            var options = $.extend(defaults, options);
            return this.each(function () {
                var o = options;
                var hasResponseHtml = false;
                var parentId = $(this).attr('id');
                var textWithDefaults = $(this).find("input[default]");
                var required = $(this).find('input[type="text"][required="true"],textarea[required="true"]');
                var requiredSelect = $(this).find('select[required="true"]');
                var requiredRadios = $(this).find('input[type="radio"][required="true"]');
                var requiredRadioGroups = new Array();
                $(requiredRadios).each(function () {
                    var arrayIndex = 0;
                    if (requiredRadioGroups.length == 0)
                        requiredRadioGroups.push($(this));
                    else {
                        if (requiredRadioGroups[requiredRadioGroups.length - 1].attr('name') != $(this).attr('name'))
                            requiredRadioGroups.push($(this));
                    }
                });
                var requiredRadioNames = $(this).find('input[type="radio"][required="true"]');

                var inputRegEx = $(this).find('input[regexmatch]');

                if ((o.validationResponseContainerSelector != null) && (o.validationResponseTextSelector != null)) {
                    var responseContainer = $(o.validationResponseContainerSelector);
                    var responseText = $(o.validationResponseTextSelector);
                    hasResponseHtml = ((responseContainer != null) && (responseText != null));
                }

                if (o.submitId == null) {
                    var submit = $(this).find("input:submit:first");
                }
                else {
                    var submit = $('#' + o.submitId);
                }

                if (o.formId == null) {
                    var form = $(this).find("form:first");
                }
                else {
                    var form = $('#' + o.formId);
                }

                // if press enter in textbox click the button
                if (o.submitOnEnterSelector != null) {
                    $(o.submitOnEnterSelector).keypress(function (e) {
                        if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
                            $(submit).click();
                            return false;
                        } else {
                            return true;
                        }
                    });
                }

                // clear keyword text box on enter if default
                $(textWithDefaults).focus(function () {
                    if ($.trim($(this).val()) == $(this).attr("default")) {
                        $(this).val('');
                    }
                });

                // set default keyword text box if empty
                $(textWithDefaults).blur(function () {
                    if ($.trim($(this).val()) == '') {
                        $(this).val($(this).attr("default"));
                    }
                });

                $(submit).click(function () {
                    if ((o.progressSelector != null) && (o.progressSelectorClass != null)) $(o.progressSelector).addClass(o.progressSelectorClass);
                    if (o.validationReponseErrorClass != null) $('.' + o.validationReponseErrorClass).removeClass(o.validationReponseErrorClass) //clean up for each submit
                    var errorMessage = '';
                    var hasError = false;
                    var setFocus;

                    $('input[type="text"]').each(function () {
                        $(this).val($.trim($(this).val()));
                    });

                    $(required).each(function () {
                        if ($(this).val() == '' || $(this).val() == $(this).attr('default')) {
                            hasError = true;
                            var thistype = $(this).attr('default');
                            if (typeof thistype === 'undefined' || thistype === false)
                                thistype = $(this).attr('label');
                            errorMessage = errorMessage + ' - ' + thistype + ' required<br />';
                            setFocus = $(this);
                        }
                    });

                    $(requiredSelect).each(function () {
                        if ($(this)[0].selectedIndex == 0 && $(this).val() == '') {
                            setFocus = $(this);
                            hasError = true;
                            errorMessage = errorMessage + ' - Select a ' + $(this).attr("label") + '<br />';
                        }
                    });

                    $(requiredRadioGroups).each(function () {
                        var name = $(this).attr('name');
                        var selection = $("input[name='" + name + "']:checked").val();
                        if (selection == null || typeof selection === 'undefined' || selection === false || selection == '') {
                            setFocus = $(this);
                            hasError = true;
                            errorMessage = errorMessage + ' - Select a ' + $(this).attr("label") + '<br />';
                        }
                    });

                    $(inputRegEx).each(function () {
                        if (($(this).val() != '') && ($(this).val().match($(this).attr("regexmatch")) == null)) {
                            if (hasError == false) setFocus = $(this);
                            hasError = true;
                            errorMessage = errorMessage + ' - ' + $(this).attr("label") + ' is not in a valid format<br />';
                        }
                    });

                    if (hasError) {
                        errorMessage = 'Please address the following<br /><br />' + errorMessage + '<br />';
                        if ((o.progressSelector != null) && (o.progressSelectorClass != null)) $(o.progressSelector).removeClass(o.progressSelectorClass);
                        if (hasResponseHtml) {
                            $(responseContainer).addClass(o.validationReponseErrorClass);
                            $(responseText).html(errorMessage);
                        }
                        else {
                            errorMessage = errorMessage.replace(/\<br \/\>/g, "\n");
                            alert(errorMessage);
                        }
                        $(setFocus).focus();
                        return false;
                    } else {
                        var urlreplace = $(form).attr('urlreplace');
                        if (typeof urlreplace !== 'undefined' && urlreplace !== false) {
                            var url = $(form).attr('action');
                            var replaceValue = escape($(form).attr('urlreplace'));
                            var keywordValue = escape($('#' + o.textIdForUrlReplace).val()).replace(/\//g, " ");
                            url = url.replace(replaceValue, keywordValue);
                            $(form).attr('action', url);
                        }
                        //merge all values of multiple checked checkboxes with name='o.mergeNames' onto the value of first (comma delimited).  Form only submits the first element (the rest temporarily will have no 'name' attribute until after the submit)
                        if (o.mergeNames != null) {
                            $('#' + parentId + ' [name="' + o.mergeNames + '"]:checked:not(#' + parentId + ' [name="' + o.mergeNames + '"]:checked:first)').attr('tempname', o.mergeNames); //add 'tempname' to elements after first
                            $('#' + parentId + ' [name="' + o.mergeNames + '"]:checked:not(#' + parentId + ' [name="' + o.mergeNames + '"]:checked:first)').removeAttr('name'); //remove 'name' to elements after first
                            $('#' + parentId + ' [name="' + o.mergeNames + '"]:checked:first').attr('tempvalue', $('#' + parentId + ' [name="' + o.mergeNames + '"]:checked:first').attr('value')); //store first's original 'value' into 'tempvalue'

                            $('#' + parentId + ' [tempname]').each(function () {
                                var merged = $('#' + parentId + ' [name="' + o.mergeNames + '"]:checked:first').attr('value') + ',' + $(this).attr('value'); //recursively add 'value' for o.mergeName
                                $('#' + parentId + ' [name="' + o.mergeNames + '"]:checked:first').attr('value', merged);
                            });
                        }

                        if (o.useAjaxSubmit) {
                            $.post($(form).attr('action'), $(form).serialize(),
                                function (ServerResponse) {
                                    var redirectUrl = ServerResponse.RedirectUrl;
                                    if (ServerResponse.Success == true && redirectUrl != null && typeof redirectUrl !== 'undefined' && redirectUrl !== false && redirectUrl != '') {
                                        window.location = redirectUrl;
                                    }
                                    else {
                                        if ((o.progressSelector != null) && (o.progressSelectorClass != null)) $(o.progressSelector).removeClass(o.progressSelectorClass);
                                        if (hasResponseHtml) {
                                            $(responseContainer).addClass(o.validationReponseErrorClass);
                                            $(responseText).html(ServerResponse.Message);
                                        }
                                        else {
                                            alert(ServerResponse.Message);
                                        }
                                    }
                                });

                            //after submit o.mergeNames elements 'name' attributes returned from 'tempname'
                            $('#' + parentId + ' [tempname]').each(function () {
                                $(this).attr('name', $(this).attr('tempname'));
                            });
                            //first o.mergeNames element gets it's original 'value' back
                            $('#' + parentId + ' [name="' + o.mergeNames + '"]:checked:first').attr('value', $('#' + parentId + ' [name="' + o.mergeNames + '"]:checked:first').attr('tempvalue'));
                            $('#' + parentId + ' [tempname]').removeAttr('tempname');

                            return false;
                        }
                        else {
                            $(form).submit();
                        }
                    }
                });
            });
        }
    });
})(jQuery);
