/* globals jQuery */ //Catch Update button click and transform widgets post meta data before event is propagated. (function($){ $('#publish').click( function(event) { var data = {}; var $el = $('#siteorigin-widgets-meta-box'); // This uses the exact same code to extract the model from the view as in the admin.js so could do with some refactoring. $el.find( '*[name]' ).each( function () { var $$ = $(this); var name = /[a-zA-Z0-9\-]+\[[a-zA-Z0-9]+\]\[(.*)\]/.exec( $$.attr('name') ); if( ! name ) { return; } name = name[1]; var parts = name.split(']['); // Make sure we either have numbers or strings parts = parts.map(function(e){ if( !isNaN(parseFloat(e)) && isFinite(e) ) { return parseInt(e); } else { return e; } }); var sub = data; for(var i = 0; i < parts.length; i++) { if(i === parts.length - 1) { // This is the end, so we need to store the actual field value here if( $$.attr('type') === 'checkbox' ){ if ( $$.is(':checked') ) { sub[ parts[i] ] = $$.val() !== '' ? $$.val() : true; } else { sub[ parts[i] ] = false; } } else if( $$.attr('type') === 'radio' ){ if ( $$.is(':checked') ) { sub[ parts[i] ] = $$.val() !== '' ? $$.val() : true; } } else { sub[ parts[i] ] = $$.val(); } } else { if(typeof sub[parts[i]] === 'undefined') { sub[parts[i]] = {}; } // Go deeper into the data and continue sub = sub[parts[i]]; } } } ); $el.find('input[name="widget_post_meta"]').val( JSON.stringify( data )); } ); })(jQuery);