﻿var FormManager = {

    _PortalId: -1,
    _ModuleId: -1,
    _AppRoot: '',
    _Fields: null,
    _TemplateControlId: null,
    _RPValidated: false,

    Init: function (Opts) {
        FormManager._PortalId = Opts.PortalId;
        FormManager._ModuleId = Opts.ModuleId;
        FormManager._AppRoot = Opts.AppRoot;
        FormManager._Fields = Opts.fieldNames;
        FormManager._TemplateControlId = Opts.TemplateControlId;

        var SaveUrl = Opts.AppRoot + 'Handlers/Ajax.ashx?Action=Save&ModuleId=' + Opts.ModuleId + '&PortalId=' + Opts.PortalId;
        var LoadUrl = Opts.AppRoot + 'Handlers/Ajax.ashx?Action=Load&ModuleId=' + Opts.ModuleId + '&PortalId=' + Opts.PortalId;
        var ListUrl = Opts.AppRoot + 'Handlers/Ajax.ashx?Action=GetList&ModuleId=' + Opts.ModuleId + '&PortalId=' + Opts.PortalId;

        if (Opts.TemplateId != null && Opts.TemplateId > -1) {
            LoadUrl += "&TemplateId=" + Opts.TemplateId;
        }

        $('#FormWrapper' + Opts.ModuleId).empty();
        $('.FieldControls').empty();
        $('#FormBottomControls').empty();

        $('#FormWrapper' + Opts.ModuleId).formbuilder({
            'save_url': SaveUrl,
            'load_url': LoadUrl,
            'list_url': ListUrl,
            'cancel_url': Opts.CancelUrl,
            'fieldNames': Opts.fieldNames,
            'ListNames': Opts.ListNames
        });

        $(function () {
            $('#FormWrapper' + Opts.ModuleId + ' ul').sortable({ opacity: 0.6, cursor: 'move' });
        });

        $('.buttonsApply').unbind('click');

        $('.buttonsApply').click(function () {
            if (!confirm('Are you sure you want to apply this template? Any unsaved changes to current form will be lost.'))
                return false;

            Opts.TemplateId = $('#' + Opts.TemplateControlId).val();
            FormManager.Init(Opts);
        });

        $('.buttonsDeleteTemplate').unbind('click');
        $('.buttonsDeleteTemplate').click(function () {
            if (!confirm('Are you sure you want to delete this template? This action cannot be reversed!'))
                return false;

            var DeleteTemplateId = $('#' + Opts.TemplateControlId).val();

            if (DeleteTemplateId == -1) {
                alert('Cannot delete custom template. No changes have been made!');
                return false;
            }
            FormManager.DeleteTemplate(DeleteTemplateId);
        });

        //        $('#' + FormManager._TemplateControlId).change(function () {
        //            var NewTemplateId = $('#' + FormManager._TemplateControlId).val();
        //            FormManager.Init(FormManager._PortalId, FormManager._ModuleId, FormManager._AppRoot, NewTemplateId, FormManager._Fields, ListNames, FormManager._TemplateControlId);
        //        });
    },

    Render: function (Opts) {

        FormManager._AppRoot = Opts.AppRoot;

        var ListUrl = FormManager._AppRoot + 'Handlers/Ajax.ashx?Action=GetList&ModuleId=' + Opts.ModuleId + '&PortalId=' + Opts.PortalId;

        $('#FormWrapper' + Opts.ModuleId).formrenderer({ 'definitionId': Opts.FormDefinitionId, 'list_url': ListUrl, 'RequiresPerson': Opts.RequiresPerson });

        $('#SubmitForm', '#FormWrapper' + Opts.ModuleId).click(function (e) {
            FormManager.ValidateAndSubmit(Opts);
            e.preventDefault();
            return false;
        });

        //Removed Clear Button as per new specs 06/02/2011
        //        $('#ResetForm', '#FormWrapper' + Opts.ModuleId).click(function (e) {
        //            FormManager.Reset(Opts);
        //            e.preventDefault();
        //            return false;
        //        });

        $('#FormWrapper' + Opts.ModuleId + ' input.fwfield').after('<div class="formElementRequiredInput"></div>');
        $('#FormWrapper' + Opts.ModuleId + ' select.fwfield').after('<div class="formElementRequiredSelect"></div>');
        $('#FormWrapper' + Opts.ModuleId + ' textArea.fwfield').after('<div class="formElementRequiredTextArea"></div>');

        $('#FormWrapper' + Opts.ModuleId + ' .required').next().text('*');

        $('#FormWrapper' + Opts.ModuleId + ' .required').focus(function () {
            switch (this.tagName) {
                case 'INPUT':
                case 'SELECT':
                case 'TEXTAREA':
                    {
                        $(this).next().text('*');
                    }
            }
        });

        $('#FormWrapper' + Opts.ModuleId + ' .fwfield').blur(function () {

            var field = $(this);

            switch (this.tagName) {
                case 'INPUT':
                case 'SELECT':
                case 'TEXTAREA':
                    {
                        if (field.hasClass('required')) {
                            if (field.val() == null || field.val() == '') {
                                SetFieldError(field, '*');
                            }
                            else {
                                ClearFieldError(field, '*');
                                FormManager.ValidateNoSpecialChar(field, field.val());
                            }
                        }
                        else {
                            ClearFieldError(field);
                        }

                        break;
                    }
            }
        });

        $('#FormWrapper' + Opts.ModuleId + ' input[name="Customer.FirstName"],#FormWrapper' + Opts.ModuleId + ' input[name="Customer.LastName"]').blur(function () {
            if ($(this).val() != '') {
                FormManager.ValidateTextOnly($(this), $(this).val());
            }
        });

        $('#FormWrapper' + Opts.ModuleId + ' input[name="Customer.Email"]').blur(function () {

            if ($(this).val() != '') {
                FormManager.ValidateEmail($(this), $(this).val());
            }
        });

        $('#FormWrapper' + Opts.ModuleId + ' input[name="Customer.Phone"]').blur(function () {

            if ($(this).val() != '') {
                FormManager.ValidatePhone($(this), $(this).val());
            }
        });


        $('#FormWrapper' + Opts.ModuleId + ' input[type=text], textarea').keypress(function (e) {
            if (e.which == 13) {
//                $('#SubmitForm').click();
                  e.preventDefault();

           }
        });

        //Track Form Start Event

        if (Opts.EnableGA) {
            $('#FormWrapper' + Opts.ModuleId + ' :input, textarea, select').change(function () {
                $('#FormWrapper' + Opts.ModuleId).data('started', true);
                FormManager.GA_EventTrack_Start(Opts, '#FormWrapper' + Opts.ModuleId);
            });
        }

        $('.insideLabel').each(function () {
            var label = "";
            if ($(this).attr("label") != null) {
                label = $(this).attr("label");
                if (label != "") {
                    $(this).watermark(label);
                }
            }
        });

        //Setup RealPerson
        if (Opts.RequiresPerson) {
            $(".realperson-challenge").realperson();
            //$(".realperson-challenge").watermark("Enter Code");
        }

    },
    GA_EventTrack_Start: function (Opts, Selector) {

        if ($(Selector).data('started') == true && $(Selector).data('started_sent') != true) {
            $(Selector).data('started_sent', true);
            FormManager.GA_EventTrack('Form_Started_Event', Opts.GAAction, Opts.GAStartLabel, Opts.IsSuperUser);
        }
    },
    GA_EventTrack: function (Category, Action, Label, ShowError) {
        try
        {
            if (typeof (pageTracker) != 'undefined') {
                pageTracker._trackEvent(Category, Action, Label);
            }
            else if (typeof (_gaq) != 'undefined') {
                _gaq.push(['_trackEvent', Category, Action, Label]);
            }
            else if (ShowError) {
                alert('Google Analytics Tracking Code Not Found! Unable to send Forms Manager Tracking Events!');
            }
        }
        catch (e) { };
    },
    Submit: function (Opts) {        
        //disable Submit button
         $('#SubmitForm', '#FormWrapper' + Opts.ModuleId).attr("disabled", "disabled");

        var SubmitUrl = FormManager._AppRoot + 'Handlers/Ajax.ashx?Action=Submit&ModuleId=' + Opts.ModuleId + '&PortalId=' + Opts.PortalId + '&TabId=' + Opts.TabId;
        SubmitUrl += '&LeadUrlReferrer=' + encodeURIComponent(document.referrer);
        var JsonData = "";
        var sep = "";

        $('#FormWrapper' + Opts.ModuleId + ' .fwfield').each(function () {
            var field = {};
            switch (this.tagName) {
                case 'INPUT':
                case 'SELECT':
                case 'TEXTAREA':
                    {
                        var f = $(this);
                        field["FieldName"] = f.attr('name');
                        field["Value"] = f.val();
                        //console.log(this.tagName + ' - ' + $(this).attr('name') + ' - ' + $(this).val());
                        break;
                    }
                case 'ULTest':
                    {
                        if ($('input[type=radio]:checked', this).val() != undefined) {
                            var f = $('input[type=radio]:checked', this);
                            field["FieldName"] = f.attr('name');
                            field["Value"] = f.val();
                            //console.log(this.tagName + ' - ' + $('input[type=radio]:checked', this).attr('name') + ' - ' + $('input[type=radio]:checked', this).val());
                        }
                        if ($('input[type=checkbox]:checked', this).val() != undefined) {
                            var SelectedValues = "";
                            $('input[type=checkbox]:checked', this).each(function () {
                                SelectedValues += $(this).val() + ',';
                            });

                            SelectedValues = SelectedValues.substring(0, SelectedValues.length - 1);
                            field["FieldName"] = $('input[type=checkbox]:checked', this).attr('name');
                            field["Value"] = SelectedValues.split(',');
                            //                            console.log(this.tagName + ' - ' + $('input[type=checkbox]:checked', this).attr('name') + ' - ' + $('input[type=checkbox]:checked', this).val());
                        }
                        break;
                    }
                default:
                    {
                    }

            }
            JsonData += sep + JSON.stringify(field);
            if (sep == "") sep = ", ";
        });


        JsonData = "[" + JsonData + "]";

        $.ajax({
            type: "POST",
            url: SubmitUrl,
            data: JsonData,
            success: function (xml) {

                if (Opts.EnableGA) {
                    FormManager.GA_EventTrack('Form_Submitted_Event', Opts.GAAction, Opts.GASubmitLabel, Opts.IsSuperUser);
                }

                $('#FormWrapper' + Opts.ModuleId).data('started_sent', false);

                if (Opts.RedirectUrl != '') {
                    //Add Logic to ensure event has been sent to Google before redirecting
                    window.location = Opts.RedirectUrl;
                }
                else {

                    var Form = $('#FormWrapper' + Opts.ModuleId);
                    Form.animate({ opacity: 0 }, function (e) {

                        Form.css('height', Form.css('height')); //Keeps the form from flashing...
                        Form.empty();
                        //Form.append('<div class="ThankYou">' + Opts.ThankYou + '<div class="StartOver gmvFormBtn"><a href="#" id="StartOver"><span>' + Opts.StartOver + '</span></a></div></div>');
                        Form.append('<div class="ThankYou">' + Opts.ThankYou + '<br /><button type="submit" class="StartOver gmvFormBtn" id="StartOver">' + Opts.StartOver + '</button></div>');
                        Form.animate({ opacity: 100 });

                        $('#StartOver').unbind('click');
                        $('#StartOver').click(function (e) {
                            FormManager.Reset(Opts);                            
                            e.preventDefault();

                        });
                    });
                }
            }
        });

    },

    Reset: function (Opts) {

        var Form = $('#FormWrapper' + Opts.ModuleId);

        Form.animate({ opacity: 0 }, function (e) {

            Form.css('height', Form.css('height')); //Keeps the form from flashing...
            Form.empty();
            FormManager.Render(Opts);
            Form.animate({ opacity: 100 });
        });
    },

    ValidateAndSubmit: function (Opts) {
        if (FormManager.Validate(Opts.ModuleId)) {
            if (Opts.RequiresPerson) {
                FormManager.ValidateRP(Opts);
            }
            else {
                FormManager.Submit(Opts);
            }
        }
    },

    ValidateRP: function (Opts) {
        var rpUrl = FormManager._AppRoot + 'Handlers/Ajax.ashx?Action=ValidateRP';
        var ogHash = $('.realperson-hash').val();
        var rpInput = $('.hasRealPerson');
        var newHash = rpInput.val();
        var hashData = { hash: ogHash, value: newHash };
        var jsonData = JSON.stringify(hashData);

        if (newHash.length > 0) {
            $.ajax({
                type: "POST",
                url: rpUrl,
                data: jsonData,
                success: function (result) {
                    FormManager.RPComplete(result, Opts);
                }
            });
        }
        else {
            alert('The Code entered is invalid. Please try again.');
            rpInput.focus();
        }
    },

    RPComplete: function (result, opts) {
        if (result == 'true') {
            FormManager.Submit(opts);
        }
        else {
            var rpInput = $('.hasRealPerson');
            alert('The Code entered is invalid. Please try again.');
            $('.realperson-challenge').click();
            rpInput.val('');
            rpInput.focus();
        }
    },

    Validate: function (ModuleId) {

        var IsValid = true;

        $('#FormWrapper' + ModuleId + ' .fwfield').each(function () {

            var field = $(this);

            switch (this.tagName) {
                case 'INPUT':
                case 'SELECT':
                case 'TEXTAREA':
                    {
                        if (field.hasClass('required') && (field.val() === null || field.val() === '')) {

                            SetFieldError(field, ' Required');
                            //focus if it's the first error
                            if (IsValid)
                                field.focus();

                            IsValid = false;
                        }
                        else {
                            ClearFieldError(field);
                        }

                        if (this.name === "Customer.FirstName" || this.name === "Customer.LastName") {
                            if (field.val() != '') {
                                if (!FormManager.ValidateTextOnly(field, field.val())) {
                                    if (IsValid)
                                        field.focus();

                                    IsValid = false;
                                }
                            }

                        }
                        else if (this.name === "Customer.Email") {
                            if (field.val() != '') {
                                if (!FormManager.ValidateEmail(field, field.val())) {
                                    if (IsValid)
                                        field.focus();

                                    IsValid = false;
                                }
                            }
                        }
                        else if (this.name === "Customer.Phone") {
                            if (field.val() != '') {
                                if (!FormManager.ValidatePhone(field, field.val())) {
                                    if (IsValid)
                                        field.focus();

                                    IsValid = false;
                                }
                            }
                        }
                        else {
                            if (field.val() != '') {
                                var validChars = FormManager.ValidateNoSpecialChar(field, field.val());
                                if (!validChars) {
                                    if (IsValid)
                                        field.focus();

                                    IsValid = false;
                                }
                            }
                        }

                        break;
                    }
                case 'UL':
                    {
                        if (field.hasClass('required')) {

                            //Radio Buttons
                            if ($('input[type=radio]', field).val() != undefined) {
                                var CheckedRadio = $('input[type=radio]:checked', field).val();
                                if (CheckedRadio == undefined || CheckedRadio == '') {
                                    SetFieldError(field, ' Required');

                                    if (IsValid)
                                        field.focus();

                                    IsValid = false;
                                }
                                else {
                                    ClearFieldError(field);
                                }
                            }
                            else if ($('input[type=checkbox]', field).val() != undefined) {
                                var CheckedBox = $('input[type=checkbox]:checked', field).val();
                                if (CheckedBox == undefined || CheckedBox == '') {
                                    SetFieldError(field, ' Required');

                                    if (IsValid)
                                        field.focus();

                                    IsValid = false;
                                }
                                else {
                                    ClearFieldError(field);
                                }
                            }
                            break;
                        }
                    }
            }
        });

        if ($('#FormWrapper' + ModuleId + ' .error').length > 0)
            IsValid = false;

        return IsValid;
    },

    SaveTemplate: function () {

        //Get Template Name
        var TemplateName = $('#tbNewTemplate').val();

        //Validate Template Name

        //TODO - Check if existing template with same name exists
        if (TemplateName == '') {
            alert('Please specify a valid template name');
            return false;
        }

        //Get Form JSON
        var FormTemplate = $('#FormWrapper' + FormManager._ModuleId + ' ul').jsonifyFormList();

        if (FormTemplate != '') {
            $.ajax({
                type: "POST",
                url: FormManager._AppRoot + 'Handlers/Ajax.ashx?Action=SaveTemplate&ModuleId=' + FormManager._ModuleId + '&Template=' + TemplateName + '&PortalId=' + FormManager._ModuleId,
                data: FormTemplate,
                success: function (xml) {

                    alert(TemplateName + ' template saved');

                    $('#' + FormManager._TemplateControlId).append($("<option></option>").attr("value", xml).text(TemplateName));
                    $('#' + FormManager._TemplateControlId).val(xml);

                    //Clean Up
                    $('#tbNewTemplate').val('');
                }
            });
        }
        else
            alert('Please add one or more form elements before saving as new template.');

        return false;
    },

    DeleteTemplate: function (DeleteTemplateId) {
        $.ajax({
            type: "POST",
            url: FormManager._AppRoot + 'Handlers/Ajax.ashx?Action=DeleteTemplate&ModuleId=' + FormManager._ModuleId + '&TemplateId=' + DeleteTemplateId + '&PortalId=' + FormManager._PortalId,
            success: function (xml) {

                $('#' + FormManager._TemplateControlId + ' option[value="' + DeleteTemplateId + '"]').remove();
                $('#' + FormManager._TemplateControlId).val(-1);
            }
        });
    },


    ValidateTextOnly: function (ctl, inputValue) {
        var inputValue = ctl.val();
        var pattern = new RegExp(/^[a-zA-Z]/);
        var numPattern = new RegExp(/\d/);
        var otherPattern = new RegExp(/\W/);
        var inputIsValid = true;

        if (!pattern.test(inputValue)) {
            inputIsValid = false;
        }
        else if (numPattern.test(inputValue)) {
            inputIsValid = false;
        }
        else if (otherPattern.test(inputValue)) {
            inputIsValid = false;
        }

        if (!inputIsValid) {
            SetFieldError(ctl, ' Alphabet only');
        }
        else {
            ClearFieldError(ctl);
        }
        return inputIsValid;
    },


    ValidateEmail: function (ctl, emailValue) {
        var pattern = new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
        if (!pattern.test(emailValue)) {
            SetFieldError(ctl, '  Invalid Email');
            return false;
        }
        else {
            ClearFieldError(ctl);
            return true;
        }
    },


    ValidatePhone: function (ctl, phoneValue) {
        var pattern = new RegExp(/^\D?(\d{3})\D?\D?(\d{3})\D?(\d{4})$/);
        if (!pattern.test(phoneValue)) {
            SetFieldError(ctl, '  Invalid Phone #.');
            return false;
        }
        else {
            ClearFieldError(ctl);
            return true;
        }
    },


    ValidateNoSpecialChar: function (ctl, inputValue) {
        var valid = false;
        if (inputValue != '') {
            var pattern = new RegExp(/<[^<]+?>|&|%|<|>/);
            if (pattern.test(inputValue)) {
                SetFieldError(ctl, ' cannot contain HTML Tags or any other special characters such as <, >, &, and %');
                valid = false;
            }
            else {
                ClearFieldError(ctl);
                valid = true;
            }
        }
        return valid;
    }

}

function SetFieldError(field, errorMessage) {
    field.next().text(errorMessage);
    field.css('border', '1px solid #C00');
    //field.addClass('error');
}

function ClearFieldError(field, message) {
    if (!message)
        message = '';
    field.next().text(message);
    field.css('border', '0px');
}

