app/assets/javascripts/plugins/jquerymx-3.2.custom.js

Summary

Maintainability
A
1 hr
Test Coverage

//jquery.dom.js



//jquery.dom.form_params.js

(function( $ ) {
    var radioCheck = /radio|checkbox/i,
        keyBreaker = /[^\[\]]+/g,
        numberMatcher = /^[\-+]?[0-9]*\.?[0-9]+([eE][\-+]?[0-9]+)?$/;

    var isNumber = function( value ) {
        if ( typeof value == 'number' ) {
            return true;
        }

        if ( typeof value != 'string' ) {
            return false;
        }

        return value.match(numberMatcher);
    };

    $.fn.extend({
        /**
         * @parent dom
         * @download http://jmvcsite.heroku.com/pluginify?plugins[]=jquery/dom/form_params/form_params.js
         * @plugin jquery/dom/form_params
         * @test jquery/dom/form_params/qunit.html
         * 
         * Returns an object of name-value pairs that represents values in a form.  
         * It is able to nest values whose element's name has square brackets.
         * 
         * When convert is set to true strings that represent numbers and booleans will
         * be converted and empty string will not be added to the object. 
         * 
         * Example html:
         * @codestart html
         * <form>
         *   <input name="foo[bar]" value='2'/>
         *   <input name="foo[ced]" value='4'/>
         * <form/>
         * @codeend
         * Example code:
         * 
         *     $('form').formParams() //-> { foo:{bar:'2', ced: '4'} }
         * 
         * 
         * @demo jquery/dom/form_params/form_params.html
         * 
         * @param {Object} [params] If an object is passed, the form will be repopulated
         * with the values of the object based on the name of the inputs within
         * the form
         * @param {Boolean} [convert=false] True if strings that look like numbers 
         * and booleans should be converted and if empty string should not be added 
         * to the result. Defaults to false.
         * @return {Object} An object of name-value pairs.
         */
        formParams: function( params, convert ) {

            // Quick way to determine if something is a boolean
            if ( !! params === params ) {
                convert = params;
                params = null;
            }

            if ( params ) {
                return this.setParams( params );
            } else if ( this[0].nodeName.toLowerCase() == 'form' && this[0].elements ) {
                return jQuery(jQuery.makeArray(this[0].elements)).getParams(convert);
            }
            return jQuery("input[name], textarea[name], select[name]", this[0]).getParams(convert);
        },
        setParams: function( params ) {

            // Find all the inputs
            this.find("[name]").each(function() {
                
                var value = params[ $(this).attr("name") ],
                    $this;
                
                // Don't do all this work if there's no value
                if ( value !== undefined ) {
                    $this = $(this);
                    
                    // Nested these if statements for performance
                    if ( $this.is(":radio") ) {
                        if ( $this.val() == value ) {
                            $this.attr("checked", true);
                        }
                    } else if ( $this.is(":checkbox") ) {
                        // Convert single value to an array to reduce
                        // complexity
                        value = $.isArray( value ) ? value : [value];
                        if ( $.inArray( $this.val(), value ) > -1) {
                            $this.attr("checked", true);
                        }
                    } else {
                        $this.val( value );
                    }
                }
            });
        },
        getParams: function( convert ) {
            var data = {},
                current;

            convert = convert === undefined ? false : convert;

            this.each(function() {
                var el = this,
                    type = el.type && el.type.toLowerCase();
                //if we are submit, ignore
                if ((type == 'submit') || !el.name ) {
                    return;
                }

                var key = el.name,
                    value = $.data(el, "value") || $.fn.val.call([el]),
                    isRadioCheck = radioCheck.test(el.type),
                    parts = key.match(keyBreaker),
                    write = !isRadioCheck || !! el.checked,
                    //make an array of values
                    lastPart;

        // if (key == 'filter[issue_priority_id]') debugger;

                if ( convert ) {
                    if ( isNumber(value) ) {
                        value = parseFloat(value);
                    } else if ( value === 'true') {
                        value = true;
                    } else if ( value === 'false' ) {
                        value = false;
                    }
                    if(value === '') {
                        value = undefined;
                    }
                }

                // go through and create nested objects
                current = data;
                for ( var i = 0; i < parts.length - 1; i++ ) {
                    if (!current[parts[i]] ) {
                        current[parts[i]] = {};
                    }
                    current = current[parts[i]];
                }
                lastPart = parts[parts.length - 1];

                //now we are on the last part, set the value
                if (current[lastPart]) {
                    if (!$.isArray(current[lastPart]) ) {
                        current[lastPart] = current[lastPart] === undefined ? [] : [current[lastPart]];
                    }
                    if ( write ) {
                        current[lastPart].push(value);
                    }
                } else if ( write || !current[lastPart] ) {

                    current[lastPart] = write ? value : undefined;
                }

            });

            return data;
        }
    });

})(jQuery);