Source: managers/form-manager.js

/**
 * @module managers/form-manager
 * @description This module manages forms for email or SMS submission
 */
define([
 
], 

function ()
{

    // ---------------------------------------------------------------
    //
    // FORM MANAGER
    //
    // ---------------------------------------------------------------

    var Form = function ()
    {
        console.log(" * <form>");

        this.CLASS_IS_REQUIRED = "js-is-required";

        this.ui = {
            eventBtn    : ".js-btn-event",
            submitBtn   : ".js-btn-submit",
            input       : ".js-form-input",
            inputLabel  : ".js-input-label",
            loadingIcon : ".js-loading-icon",
            fadeOverlay : ".js-fade-overlay",
            form        : ".js-form"
        };

        this.init();
    };

    Form.prototype =
    {    
       
        // ______________________________________________________________
        //                                                           init
        /**
            * init
            * @description Initializes class
            * @fires init()
            * @memberOf module:managers/form-manager
            * @instance
        */
        init: function()
        {   
            this.assignListeners();            
        },


        // ______________________________________________________________
        //                                                assignListeners
        /** 
        * assignListeners
        * @description Assigns listeners to events used in this class.
        * @listens  EVENT_MODEL_READY
        * @memberOf module:managers/form-manager
        * @instance
        */
        assignListeners: function()
        {           
            var self = this;         

            // page is loaded, check for anchor and scroll to anchor
            if (typeof window.oModel === "undefined" || window.oModel.jConfig === -1){
                window.tEvent.addListener("EVENT_MODEL_READY", function(evt, data) {

                });                
            } else {

            }

            /*
            $("body").hammer().on("click", this.ui.submitBtn, function(e){
                var data = {
                    successEvt: $(this).attr("data-success"),
                    errorEvt: $(this).attr("data-error"),
                    $target: $(e.target)
                }
                self.onSubmitBtnClick(data);
            });
            */


        },

        


        // --------------------------------------------------------------
        // HELPERS
        // --------------------------------------------------------------
      
        // ______________________________________________________________
        //                                                prepareBodyCopy
        /** 
        * prepareBodyCopy
        * @description Returns generic copy for email and sms
        * @param {Object} formData - Form data
        * @returns {Object}
        * @example
        * {
        *    email: ""
        *    sms: ""
        * }
        * @memberOf module:managers/form-manager
        * @instance
        */
        prepareBodyCopy: function(formData) {  
            var returnObj = {};

            if (typeof window.oIha === "undefined") {
                return (returnObj);
            }

            returnObj = {
                email: "",
                sms: ""
            };

            for (var key in formData.data){
                returnObj.email += key + ": " + formData.data[key] + "<br>";
                returnObj.sms += key + ": " + formData.data[key] + "; ";
            }

            return (returnObj);
        },


        // ______________________________________________________________
        //                                                    getFormData
        /** 
        * getFormData
        * @description Collects form data from Jquery object. Lopps through inputs.
        * @param {JqueryObject} $form - Form data
        * @returns {Object} Inputs compiled into an object
        * @memberOf module:managers/form-manager
        * @instance
        */
        getFormData: function($form) {  

            var self = this;  
            var def = window.oModel.def;     
            var formObj = {
                isComplete: true,
                data: {

                }
            };
            var $this;
            var val = "";
            var incomplete = [];
            var $inputContainer;

            $(this.ui.loadingIcon).css("display", "block");
            $(this.ui.fadeOverlay).css("display", "block");

            $(this.ui.input, $form).each(function(){
                $this = $(this);
                $inputContainer = $this.parent();

                // clear incomplete
                $inputContainer.removeClass(def.CLASS_INCOMPLETE);

                switch($this[0].tagName){

                    case "INPUT":                    
                        switch($this.attr("type")){
                            case "radio":
                                var val = $(self.ui.input + "[name='" + $this.attr("name") + "']:checked", $form).val();
                                formObj.data[$this.attr("name")] = val;
                                if ($this.hasClass(self.CLASS_IS_REQUIRED) && $this.val() === "") {

                                    formObj.isComplete = false;

                                    // add color to label
                                    $inputContainer.addClass(def.CLASS_INCOMPLETE);
                                }
                                break;

                            case "checkbox":
                                var li = []; 
                                $(self.ui.input + "[name='" + $this.attr("name") + "']:checked", $form).each(function(){
                                    li.push($(this).val());
                                });
                                formObj.data[$this.attr("name")] = li;
                                if ($this.hasClass(self.CLASS_IS_REQUIRED) && $this.val() === "") {
                                    formObj.isComplete = false;
                                    // add color to label
                                    $inputContainer.addClass(def.CLASS_INCOMPLETE);
                                }
                                break;

                            default:
                                val = $this.val().trim();
                                formObj.data[$this.attr("name")] = val;
                                if ($this.hasClass(self.CLASS_IS_REQUIRED) && val === "") {
                                    formObj.isComplete = false;
                                    // add color to label
                                    $inputContainer.addClass(def.CLASS_INCOMPLETE);                                    
                                }

                        }
                        break;

                    default: 
                        val = $this.val();

                        if ($this.hasClass(self.CLASS_IS_REQUIRED) && val === "") {
                            // add color to label
                            /*
                            if ($this.hasClass("m-form-select__option")){
                                $this.parents(self.ui.inputLabel).addClass("field-incomplete");     
                            } else {
                                $this.siblings(self.ui.inputLabel).addClass("field-incomplete"); 
                            }     */
                            // add color to label
                            formObj.isComplete = false;
                            $inputContainer.addClass(def.CLASS_INCOMPLETE);   
                        }
                                                      
                        formObj.data[$this.attr("name")] = val;
                }

                /*console.log("_____", $(this)[0].tagName );
                console.log("val ->", $(this).val());*/
            });

    
            return(formObj);
        },


        

        // --------------------------------------------------------------
        // EVENTS
        // --------------------------------------------------------------
        

        // ______________________________________________________________
        //                                                   onFormSubmit  
        /** 
        * onFormSubmit
        * @description On form submit
        * @param {Object} formData - Form data
        * @param {"email"|"sms"} submissionType - Submission type
        * @fires oServices.sendEmail()
        * @fires oServices.sendSms()
        * @memberOf module:managers/form-manager
        * @instance
        */     


        onFormSubmit: function(formData, submissionType)
        {

            if (typeof window.oIha === "undefined") {
                return;
            }
            
            switch(submissionType){
                case "email":
                    window.oModel.oIha.oIhaServices.sendEmail(formData); 
                    break;

                case "sms":
                    window.oModel.oIha.oIhaServices.sendSms(formData);
                    break;
            }

        }

    };

    /** 
    * @global 
    */
    window.oForm = new Form();
   
});