diff options
Diffstat (limited to 'plugins/jetpack/modules/contact-form/js/grunion.js')
-rw-r--r-- | plugins/jetpack/modules/contact-form/js/grunion.js | 1180 |
1 files changed, 1180 insertions, 0 deletions
diff --git a/plugins/jetpack/modules/contact-form/js/grunion.js b/plugins/jetpack/modules/contact-form/js/grunion.js new file mode 100644 index 00000000..e34fc135 --- /dev/null +++ b/plugins/jetpack/modules/contact-form/js/grunion.js @@ -0,0 +1,1180 @@ +/* jshint onevar: false, devel: true, smarttabs: true */ +/* global GrunionFB_i18n: true, FB, ajax_nonce_shortcode, ajax_nonce_json, ajaxurl, postId */ + +if ( ! window.FB ) { + window.FB = {}; +} + +GrunionFB_i18n = jQuery.extend( + { + nameLabel: 'Name', + emailLabel: 'Email', + urlLabel: 'Website', + commentLabel: 'Comment', + newLabel: 'New Field', + optionsLabel: 'Options', + optionLabel: 'Option', + firstOptionLabel: 'First option', + problemGeneratingForm: + "Oops, there was a problem generating your form. You'll likely need to try again.", + moveInstructions: 'Drag up or down\nto re-arrange', + moveLabel: 'move', + editLabel: 'edit', + savedMessage: 'Saved successfully', + requiredLabel: '(required)', + exitConfirmMessage: + 'Are you sure you want to exit the form editor without saving? Any changes you have made will be lost.', + maxNewFields: 5, + invalidEmail: ' is an invalid email address.', + }, + GrunionFB_i18n +); + +GrunionFB_i18n.moveInstructions = GrunionFB_i18n.moveInstructions.replace( '\n', '<br />' ); + +FB.span = jQuery( '<span>' ); +FB.esc_html = function( string ) { + return FB.span.text( string ).html(); +}; + +FB.esc_attr = function( string ) { + string = FB.esc_html( string ); + return string.replace( '"', '"' ).replace( "'", ''' ); +}; + +FB.ContactForm = ( function() { + var fbForm = { + // Main object that generated shortcode via AJAX call + action: 'grunion_shortcode', + _ajax_nonce: ajax_nonce_shortcode, + to: '', + subject: '', + fields: {}, + }; + var defaultFields = { + name: { + label: GrunionFB_i18n.nameLabel, + type: 'name', + required: true, + options: [], + order: '1', + }, + email: { + label: GrunionFB_i18n.emailLabel, + type: 'email', + required: true, + options: [], + order: '2', + }, + url: { + label: GrunionFB_i18n.urlLabel, + type: 'url', + required: false, + options: [], + order: '3', + }, + comment: { + label: GrunionFB_i18n.commentLabel, + type: 'textarea', + required: true, + options: [], + order: '4', + }, + }; + var debug = false; // will print errors to log if true + var grunionNewCount = 0; // increment for new fields + var maxNewFields = GrunionFB_i18n.maxNewFields; // See filter in ../grunion-form-view.php + var optionsCache = {}; + var optionsCount = 0; // increment for options + var shortcode; + + function addField() { + try { + grunionNewCount++; + if ( grunionNewCount <= maxNewFields ) { + // Add to preview + jQuery( '#fb-extra-fields' ).append( + '<div id="fb-new-field' + + grunionNewCount + + '" fieldid="' + + grunionNewCount + + '" class="fb-new-fields"><div class="fb-fields"><div id="' + + grunionNewCount + + '" class="fb-remove"></div><label fieldid="' + + grunionNewCount + + '" for="fb-field' + + grunionNewCount + + '"><span class="label-text">' + + GrunionFB_i18n.newLabel + + '</span> </label><input type="text" id="fb-field' + + grunionNewCount + + '" disabled="disabled" /></div></div>' + ); + // Add to form object + fbForm.fields[ grunionNewCount ] = { + label: GrunionFB_i18n.newLabel, + type: 'text', + required: false, + options: [], + order: '5', + }; + if ( grunionNewCount === maxNewFields ) { + jQuery( '#fb-new-field' ).hide(); + } + // Reset form for this new field + optionsCount = 0; + optionsCache = {}; + jQuery( '#fb-new-options' ).html( + '<label for="fb-option0">' + + GrunionFB_i18n.optionsLabel + + '</label><input type="text" id="fb-option0" optionid="0" value="' + + GrunionFB_i18n.firstOptionLabel + + '" class="fb-options" />' + ); + jQuery( '#fb-options' ).hide(); + jQuery( '#fb-new-label' ).val( GrunionFB_i18n.newLabel ); + jQuery( '#fb-new-type' ).val( 'text' ); + jQuery( '#fb-field-id' ).val( grunionNewCount ); + setTimeout( function() { + jQuery( '#fb-new-label' ) + .focus() + .select(); + }, 100 ); + } else { + jQuery( '#fb-new-field' ).hide(); + } + } catch ( e ) { + if ( debug ) { + console.log( 'addField(): ' + e ); + } + } + } + function addOption() { + try { + optionsCount = jQuery( '#fb-new-options .fb-options' ).length; + var thisId = jQuery( '#fb-field-id' ).val(); + var thisType = jQuery( '#fb-new-type' ).val(); + if ( thisType === 'radio' ) { + // Add to right col + jQuery( '#fb-new-options' ).append( + '<div id="fb-option-box-' + + optionsCount + + '" class="fb-new-fields"><span optionid="' + + optionsCount + + '" class="fb-remove-option"></span><label></label><input type="text" id="fb-option' + + optionsCount + + '" optionid="' + + optionsCount + + '" value="' + + GrunionFB_i18n.optionLabel + + '" class="fb-options" /><div>' + ); + // Add to preview + jQuery( '#fb-new-field' + thisId + ' .fb-fields' ).append( + '<div id="fb-radio-' + + thisId + + '-' + + optionsCount + + '"><input type="radio" disabled="disabled" id="fb-field' + + thisId + + '" name="radio-' + + thisId + + '" /><span>' + + GrunionFB_i18n.optionLabel + + '</span><div class="clear"></div></div>' + ); + } else if ( 'checkbox-multiple' === thisType ) { + // Add to right col + jQuery( '#fb-new-options' ).append( + '<div id="fb-option-box-' + + optionsCount + + '" class="fb-new-fields"><span optionid="' + + optionsCount + + '" class="fb-remove-option"></span><label></label><input type="text" id="fb-option' + + optionsCount + + '" optionid="' + + optionsCount + + '" value="' + + GrunionFB_i18n.optionLabel + + '" class="fb-options" /><div>' + ); + // Add to preview + jQuery( '#fb-new-field' + thisId + ' .fb-fields' ).append( + '<div id="fb-checkbox-multiple-' + + thisId + + '-' + + optionsCount + + '"><input type="checkbox" disabled="disabled" id="fb-field' + + thisId + + '" name="checkbox-multiple-' + + thisId + + '" /><span>' + + GrunionFB_i18n.optionLabel + + '</span><div class="clear"></div></div>' + ); + } else { + // Add to right col + jQuery( '#fb-new-options' ).append( + '<div id="fb-option-box-' + + optionsCount + + '" class="fb-new-fields"><span optionid="' + + optionsCount + + '" class="fb-remove-option"></span><label></label><input type="text" id="fb-option' + + optionsCount + + '" optionid="' + + optionsCount + + '" value="" class="fb-options" /><div>' + ); + // Add to preview + jQuery( '#fb-field' + thisId ).append( + '<option id="fb-' + + thisId + + '-' + + optionsCount + + '" value="' + + thisId + + '-' + + optionsCount + + '"></option>' + ); + } + // Add to fbForm object + fbForm.fields[ thisId ].options[ optionsCount ] = ''; + // Add focus to new field + jQuery( '#fb-option' + optionsCount ) + .focus() + .select(); + } catch ( e ) { + if ( debug ) { + console.log( 'addOption(): ' + e ); + } + } + } + function buildPreview() { + try { + if ( fbForm.to ) { + jQuery( '#fb-field-my-email' ).val( fbForm.to ); + } + if ( fbForm.subject ) { + jQuery( '#fb-field-subject' ).val( fbForm.subject ); + } + // Loop over and add fields + jQuery.each( fbForm.fields, function( index, value ) { + jQuery( '#fb-extra-fields' ).before( + '<div class="fb-new-fields ui-state-default" fieldid="' + + index + + '" id="fb-new-field' + + index + + '"><div class="fb-fields"></div></div>' + ); + jQuery( '#fb-field-id' ).val( index ); + optionsCache[ index ] = {}; + optionsCache[ index ].options = []; + if ( + 'radio' === value.type || + 'select' === value.type || + 'checkbox-multiple' === value.type + ) { + jQuery.each( value.options, function( i, value ) { + optionsCache[ index ].options[ i ] = value; + } ); + } + updateType( value.type, value.label, value.required ); + } ); + } catch ( e ) { + if ( debug ) { + console.log( 'buildPreview(): ' + e ); + } + } + } + function customOptions( id, thisType ) { + try { + var thisOptions = ''; + for ( var i = 0; i < optionsCache[ id ].options.length; i++ ) { + if ( optionsCache[ id ].options[ i ] !== undefined ) { + if ( thisType === 'radio' ) { + thisOptions = + thisOptions + + '<div id="fb-radio-' + + id + + '-' + + i + + '"><input type="radio" id="fb-field' + + id + + '" name="radio-' + + id + + '" /><span>' + + FB.esc_html( optionsCache[ id ].options[ i ] ) + + '</span><div class="clear"></div></div>'; + } else if ( 'checkbox-multiple' === thisType ) { + thisOptions = + thisOptions + + '<div id="fb-checkbox-multiple-' + + id + + '-' + + i + + '"><input type="checkbox" id="fb-field' + + id + + '" name="checkbox-multiple-' + + id + + '" /><span>' + + FB.esc_html( optionsCache[ id ].options[ i ] ) + + '</span><div class="clear"></div></div>'; + } else { + thisOptions = + thisOptions + + '<option id="fb-' + + id + + '-' + + i + + '" value="' + + id + + '-' + + i + + '">' + + FB.esc_html( optionsCache[ id ].options[ i ] ) + + '</option>'; + } + } + } + return thisOptions; + } catch ( e ) { + if ( debug ) { + console.log( 'customOptions(): ' + e ); + } + } + } + function deleteField( that ) { + try { + grunionNewCount--; + var thisId = that.attr( 'id' ); + delete fbForm.fields[ thisId ]; + jQuery( '#' + thisId ) + .parent() + .parent() + .remove(); + if ( grunionNewCount <= maxNewFields ) { + jQuery( '#fb-new-field' ).show(); + } + } catch ( e ) { + if ( debug ) { + console.log( 'deleteField(): ' + e ); + } + } + } + function editField( that ) { + try { + scroll( 0, 0 ); + setTimeout( function() { + jQuery( '#fb-new-label' ) + .focus() + .select(); + }, 100 ); + var thisId = that.parent().attr( 'fieldid' ); + loadFieldEditor( thisId ); + } catch ( e ) { + if ( debug ) { + console.log( 'editField(): ' + e ); + } + } + } + function grabShortcode() { + try { + // Takes fbForm object and returns shortcode syntax + jQuery.post( ajaxurl, fbForm, function( response ) { + shortcode = response; + } ); + } catch ( e ) { + alert( GrunionFB_i18n.problemGeneratingForm ); + if ( debug ) { + console.log( 'grabShortcode(): ' + e ); + } + } + } + function hideDesc() { + jQuery( '#fb-desc' ).hide(); + jQuery( '#fb-add-field' ).show(); + } + function hidePopup() { + try { + // copied from wp-includes/js/thickbox/thickbox.js + jQuery( '#TB_imageOff', window.parent.document ).unbind( 'click' ); + jQuery( '#TB_closeWindowButton', window.parent.document ).unbind( 'click' ); + jQuery( '#TB_window', window.parent.document ).fadeOut( 'fast' ); + jQuery( 'body', window.parent.document ).removeClass( 'modal-open' ); + jQuery( '#TB_window,#TB_overlay,#TB_HideSelect', window.parent.document ) + .trigger( 'unload' ) + .unbind() + .remove(); + jQuery( '#TB_load', window.parent.document ).remove(); + if ( typeof window.parent.document.body.style.maxHeight === 'undefined' ) { + //if IE 6 + jQuery( 'body', 'html', window.parent.document ).css( { height: 'auto', width: 'auto' } ); + jQuery( 'html', window.parent.document ).css( 'overflow', '' ); + } + window.parent.document.onkeydown = ''; + window.parent.document.onkeyup = ''; + return false; + } catch ( e ) { + if ( debug ) { + console.log( 'hidePopup(): ' + e ); + } + } + } + function hideShowEditLink( whichType, that ) { + try { + if ( whichType === 'show' ) { + // Prevents showing links twice + if ( jQuery( '.fb-edit-field' ).is( ':visible' ) ) { + jQuery( '.fb-edit-field' ).remove(); + } + that + .find( 'label' ) + .prepend( + '<span class="right fb-edit-field" style="font-weight: normal;"><a href="" class="fb-reorder"><div style="display: none;">' + + GrunionFB_i18n.moveInstructions + + '</div>' + + GrunionFB_i18n.moveLabel + + '</a> <span style="color: #C7D8DE;">|</span> <a href="" class="fb-edit">' + + GrunionFB_i18n.editLabel + + '</a></span>' + ); + } else { + jQuery( '.fb-edit-field' ).remove(); + } + } catch ( e ) { + if ( debug ) { + console.log( 'hideShowEditLink(): ' + e ); + } + } + } + function loadFieldEditor( id ) { + try { + var thisType = fbForm.fields[ id ].type; + jQuery( '#fb-options' ).hide(); + // Reset hidden field ID + jQuery( '#fb-field-id' ).val( id ); + // Load label + jQuery( '#fb-new-label' ).val( fbForm.fields[ id ].label ); + // Load type + jQuery( '#fb-new-type' ).val( fbForm.fields[ id ].type ); + // Load required + if ( fbForm.fields[ id ].required ) { + jQuery( '#fb-new-required' ).prop( 'checked', true ); + } else { + jQuery( '#fb-new-required' ).prop( 'checked', false ); + } + // Load options if there are any + if ( 'select' === thisType || 'radio' === thisType || 'checkbox-multiple' === thisType ) { + var thisOptions = fbForm.fields[ id ].options; + jQuery( '#fb-options' ).show(); + jQuery( '#fb-new-options' ).html( '' ); // Clear it all out + for ( var i = 0; i < thisOptions.length; i++ ) { + if ( thisOptions[ i ] !== undefined ) { + if ( thisType === 'radio' ) { + jQuery( '#fb-new-options' ).append( + '<div id="fb-option-box-' + + i + + '" class="fb-new-fields"><span optionid="' + + i + + '" class="fb-remove-option"></span><label></label><input type="text" id="fb-option' + + i + + '" optionid="' + + i + + '" value="' + + FB.esc_attr( fbForm.fields[ id ].options[ i ] ) + + '" class="fb-options" /><div>' + ); + } else { + jQuery( '#fb-new-options' ).append( + '<div id="fb-option-box-' + + i + + '" class="fb-new-fields"><span optionid="' + + i + + '" class="fb-remove-option"></span><label></label><input type="text" id="fb-option' + + i + + '" optionid="' + + i + + '" value="' + + FB.esc_attr( fbForm.fields[ id ].options[ i ] ) + + '" class="fb-options" /><div>' + ); + } + } + } + } + // Load editor & hide description + hideDesc(); + } catch ( e ) { + if ( debug ) { + console.log( 'loadFieldEditor(): ' + e ); + } + } + } + function parseShortcode( data ) { + try { + // Clean up fields by resetting them + fbForm.fields = {}; + // Add new fields + if ( ! data ) { + fbForm.fields = defaultFields; + } else { + jQuery.each( data.fields, function( index, value ) { + if ( 1 === parseInt( value.required, 10 ) ) { + value.required = 'true'; + } + fbForm.fields[ index ] = value; + } ); + fbForm.to = data.to; + fbForm.subject = data.subject; + } + } catch ( e ) { + if ( debug ) { + console.log( 'parseShortcode(): ' + e ); + } + } + } + function removeOption( optionId ) { + try { + var thisId = jQuery( '#fb-field-id' ).val(); + var thisVal = jQuery( '#fb-option' + optionId ).val(); + var thisType = jQuery( '#fb-new-type' ).val(); + // Remove from right + jQuery( '#fb-option-box-' + optionId ).remove(); + // Remove from preview + if ( thisType === 'radio' ) { + jQuery( '#fb-radio-' + thisId + '-' + optionId ).remove(); + } else if ( 'checkbox-multiple' === thisType ) { + jQuery( '#fb-checkbox-multiple-' + thisId + '-' + optionId ).remove(); + } else { + jQuery( '#fb-' + thisId + '-' + optionId ).remove(); + } + // Remove from fbForm object + var idx = fbForm.fields[ thisId ].options.indexOf( thisVal ); + if ( idx !== -1 ) { + fbForm.fields[ thisId ].options.splice( idx, 1 ); + } + } catch ( e ) { + if ( debug ) { + console.log( 'removeOption(): ' + e ); + } + } + } + function removeOptions() { + try { + var thisId = jQuery( '#fb-field-id' ).val(); + jQuery( '#fb-options' ).hide(); + if ( optionsCache[ thisId ] === undefined ) { + optionsCache[ thisId ] = {}; + } + optionsCache[ thisId ].options = fbForm.fields[ thisId ].options; // Save options in case they change their mind + fbForm.fields[ thisId ].options = []; // Removes all options + } catch ( e ) { + if ( debug ) { + console.log( 'removeOptions(): ' + e ); + } + } + } + function sendShortcodeToEditor() { + try { + // Serialize fields + jQuery( 'div#sortable div.fb-new-fields' ).each( function( index ) { + var thisId = jQuery( this ).attr( 'fieldid' ); + fbForm.fields[ thisId ].order = index; + } ); + // Export to WYSIWYG editor + jQuery.post( ajaxurl, fbForm, function( response ) { + var isVisual = jQuery( '#edButtonPreview', window.parent.document ).hasClass( 'active' ); + /* WP 3.3+ */ + if ( ! isVisual ) { + isVisual = jQuery( '#wp-content-wrap', window.parent.document ).hasClass( 'tmce-active' ); + } + + var win = window.dialogArguments || opener || parent || top; + var currentCode; + if ( isVisual ) { + currentCode = win.tinyMCE.activeEditor.getContent(); + } else { + currentCode = jQuery( '#editorcontainer textarea', window.parent.document ).val(); + /* WP 3.3+ */ + if ( typeof currentCode !== 'string' ) { + currentCode = jQuery( '.wp-editor-area', window.parent.document ).val(); + } + } + var regexp = new RegExp( + '\\[contact-form\\b.*?\\/?\\](?:[\\s\\S]+?\\[\\/contact-form\\])?' + ); + + // Remove new lines that cause BR tags to show up + response = response.replace( /\n/g, ' ' ); + // Convert characters to comma + response = response.replace( /%26#x002c;/g, ',' ); + + // Add new shortcode + if ( currentCode.match( regexp ) ) { + if ( isVisual ) { + win.tinyMCE.activeEditor.execCommand( + 'mceSetContent', + false, + currentCode.replace( regexp, response ) + ); + } else { + // looks like the visual editor is disabled, + // update the contents of the post directly + jQuery( '#content', window.parent.document ).val( + currentCode.replace( regexp, response ) + ); + } + } else { + try { + win.send_to_editor( response ); + } catch ( e ) { + if ( isVisual ) { + win.tinyMCE.activeEditor.execCommand( 'mceInsertContent', false, response ); + } else { + // looks like the visual editor is disabled, + // update the contents of the post directly + jQuery( '#content', window.parent.document ).val( currentCode + response ); + } + } + } + hidePopup(); + } ); + } catch ( e ) { + if ( debug ) { + console.log( 'sendShortcodeToEditor(): ' + e ); + } + } + } + function showDesc() { + jQuery( '#fb-desc' ).show(); + jQuery( '#fb-add-field' ).hide(); + } + function showAndHideMessage( message ) { + try { + var newMessage = ! message ? GrunionFB_i18n.savedMessage : message; + jQuery( '#fb-success' ).text( newMessage ); + jQuery( '#fb-success' ).slideDown( 'fast' ); + setTimeout( function() { + jQuery( '#fb-success' ).slideUp( 'fast' ); + }, 2500 ); + } catch ( e ) { + if ( debug ) { + console.log( 'showAndHideMessage(): ' + e ); + } + } + } + function switchTabs( whichType ) { + try { + if ( whichType === 'preview' ) { + if ( ! validateEmails( jQuery( '#fb-field-my-email' ).val() ) ) { + return; + } + jQuery( '#tab-preview a' ).addClass( 'current' ); + jQuery( '#tab-settings a' ).removeClass( 'current' ); + jQuery( '#fb-preview-form, #fb-desc' ).show(); + jQuery( '#fb-email-settings, #fb-email-desc' ).hide(); + showAndHideMessage( GrunionFB_i18n.savedMessage ); + } else { + jQuery( '#tab-preview a' ).removeClass( 'current' ); + jQuery( '#tab-settings a' ).addClass( 'current' ); + jQuery( '#fb-preview-form, #fb-desc, #fb-add-field' ).hide(); + jQuery( '#fb-email-settings, #fb-email-desc' ).show(); + jQuery( '#fb-field-my-email' ) + .focus() + .select(); + } + } catch ( e ) { + if ( debug ) { + console.log( 'switchTabs(): ' + e ); + } + } + } + function validateEmails( emails ) { + // Field is allowed to be empty :) + if ( 0 === emails.length ) { + return true; + } + + var $e, + emailList = emails.split( ',' ); + + for ( $e = 0; $e < emailList.length; $e++ ) { + if ( false === validateEmail( emailList[ $e ] ) ) { + alert( emailList[ $e ] + GrunionFB_i18n.invalidEmail ); + return false; + } + } + + return true; + } + /* Uses The Official Standard: RFC 5322 -- http://www.regular-expressions.info/email.html */ + function validateEmail( email ) { + var re = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/i; + return re.test( email ); + } + function updateLabel() { + try { + var thisId = jQuery( '#fb-field-id' ).val(); + var thisLabel = jQuery( '#fb-new-label' ).val(); + // Update preview + if ( thisLabel.length === 0 ) { + jQuery( '#fb-new-field' + thisId + ' label .label-text' ).text( GrunionFB_i18n.newLabel ); + } else { + jQuery( '#fb-new-field' + thisId + ' label .label-text' ).text( thisLabel ); + } + // Update fbForm object + fbForm.fields[ thisId ].label = thisLabel; + } catch ( e ) { + if ( debug ) { + console.log( 'updateLabel(): ' + e ); + } + } + } + function updateMyEmail() { + try { + var thisEmail = jQuery( '#fb-field-my-email' ).val(); + fbForm.to = thisEmail; + } catch ( e ) { + if ( debug ) { + console.log( 'updateMyEmail(): ' + e ); + } + } + } + function updateOption( that ) { + try { + var thisId = jQuery( '#fb-field-id' ).val(); + var thisOptionid = that.attr( 'optionid' ); + var thisOptionValue = that.val(); + var thisType = jQuery( '#fb-new-type' ).val(); + // Update preview + if ( thisType === 'radio' ) { + jQuery( '#fb-radio-' + thisId + '-' + thisOptionid + ' span' ).text( thisOptionValue ); + } else if ( 'checkbox-multiple' === thisType ) { + jQuery( '#fb-checkbox-multiple-' + thisId + '-' + thisOptionid + ' span' ).text( + thisOptionValue + ); + } else { + jQuery( '#fb-' + thisId + '-' + thisOptionid ).text( thisOptionValue ); + } + // Update fbForm object + fbForm.fields[ thisId ].options[ thisOptionid ] = thisOptionValue; + } catch ( e ) { + if ( debug ) { + console.log( 'updateOption(): ' + e ); + } + } + } + function updateRequired() { + try { + var thisId = jQuery( '#fb-field-id' ).val(); + var thisChecked = jQuery( '#fb-new-required' ).is( ':checked' ); + // Update object and preview + if ( thisChecked ) { + fbForm.fields[ thisId ].required = true; + jQuery( '#fb-new-field' + thisId + ' label' ).append( + '<span class="label-required">' + GrunionFB_i18n.requiredLabel + '</span>' + ); + } else { + fbForm.fields[ thisId ].required = false; + jQuery( '#fb-new-field' + thisId + ' label .label-required' ).remove(); + } + } catch ( e ) { + if ( debug ) { + console.log( 'updateRequired(): ' + e ); + } + } + } + function updateSubject() { + try { + var thisSubject = jQuery( '#fb-field-subject' ).val(); + fbForm.subject = thisSubject; + } catch ( e ) { + if ( debug ) { + console.log( 'updateSubject(): ' + e ); + } + } + } + function updateType( thisType, thisLabelText, thisRequired ) { + try { + var thisId = jQuery( '#fb-field-id' ).val(); + if ( ! thisType ) { + thisType = jQuery( '#fb-new-type' ).val(); + } + if ( ! thisLabelText ) { + thisLabelText = jQuery( '#fb-new-field' + thisId + ' .label-text' ).text(); + } + var isRequired = thisRequired + ? '<span class="label-required">' + GrunionFB_i18n.requiredLabel + '</span>' + : ''; + var thisLabel = + '<label fieldid="' + + thisId + + '" for="fb-field' + + thisId + + '"><span class="label-text">' + + FB.esc_html( thisLabelText ) + + '</span>' + + isRequired + + '</label>'; + var thisRadio = + '<input type="radio" name="radio-' + + thisId + + '" id="fb-field' + + thisId + + ' "disabled="disabled" />'; + var thisRadioLabel = + '<label fieldid="' + + thisId + + '" for="fb-field' + + thisId + + '" class="fb-radio-label"><span class="label-text">' + + FB.esc_html( thisLabelText ) + + '</span>' + + isRequired + + '</label>'; + var thisRadioRemove = '<div class="fb-remove fb-remove-small" id="' + thisId + '"></div>'; + var thisRemove = '<div class="fb-remove" id="' + thisId + '"></div>'; + var thisCheckbox = + '<input type="checkbox" id="fb-field' + thisId + '" "disabled="disabled" />'; + var thisCheckboxMultiple = + '<input type="checkbox" id="fb-field' + thisId + '" "disabled="disabled" />'; + var thisCheckboxMultipleRemove = + '<div class="fb-remove fb-remove-small" id="' + thisId + '"></div>'; + var thisText = '<input type="text" id="fb-field' + thisId + '" "disabled="disabled" />'; + var thisTextarea = '<textarea id="fb-field' + thisId + '" "disabled="disabled"></textarea>'; + var thisClear = '<div class="clear"></div>'; + var thisSelect = + '<select id="fb-field' + + thisId + + '" fieldid="' + + thisId + + '"><option id="fb-' + + thisId + + '-' + + optionsCount + + '" value="' + + thisId + + '-' + + optionsCount + + '">' + + GrunionFB_i18n.firstOptionLabel + + '</option></select>'; + switch ( thisType ) { + case 'checkbox': + removeOptions(); + jQuery( '#fb-new-field' + thisId + ' .fb-fields' ).html( + thisRadioRemove + thisCheckbox + thisRadioLabel + thisClear + ); + break; + case 'checkbox-multiple': + jQuery( '#fb-new-field' + thisId + ' .fb-fields' ).html( + thisLabel + + thisCheckboxMultipleRemove + + '<div fieldid="' + + thisId + + '" id="fb-custom-checkbox-multiple' + + thisId + + '"></div>' + ); + if ( + optionsCache[ thisId ] !== undefined && + optionsCache[ thisId ].options.length !== 0 + ) { + fbForm.fields[ thisId ].options = optionsCache[ thisId ].options; + jQuery( '#fb-custom-checkbox-multiple' + thisId ).append( + customOptions( thisId, thisType ) + ); + } else { + jQuery( '#fb-new-options' ).html( + '<label for="fb-option0">' + + GrunionFB_i18n.optionsLabel + + '</label><input type="text" id="fb-option0" optionid="0" value="' + + GrunionFB_i18n.firstOptionLabel + + '" class="fb-options" />' + ); + jQuery( '#fb-custom-checkbox-multiple' + thisId ).append( + '<div id="fb-checkbox-multiple-' + + thisId + + '-0">' + + thisCheckboxMultiple + + '<span>' + + GrunionFB_i18n.firstOptionLabel + + '</span>' + + thisClear + + '</div>' + ); + fbForm.fields[ thisId ].options[ optionsCount ] = GrunionFB_i18n.firstOptionLabel; + } + jQuery( '#fb-options' ).show(); + setTimeout( function() { + jQuery( '#fb-option0' ) + .focus() + .select(); + }, 100 ); + break; + case 'email': + removeOptions(); + jQuery( '#fb-new-field' + thisId + ' .fb-fields' ).html( + thisRemove + thisLabel + thisText + ); + break; + case 'name': + removeOptions(); + jQuery( '#fb-new-field' + thisId + ' .fb-fields' ).html( + thisRemove + thisLabel + thisText + ); + break; + case 'radio': + jQuery( '#fb-new-field' + thisId + ' .fb-fields' ).html( + thisLabel + + thisRadioRemove + + '<div fieldid="' + + thisId + + '" id="fb-custom-radio' + + thisId + + '"></div>' + ); + if ( + optionsCache[ thisId ] !== undefined && + optionsCache[ thisId ].options.length !== 0 + ) { + fbForm.fields[ thisId ].options = optionsCache[ thisId ].options; + jQuery( '#fb-custom-radio' + thisId ).append( customOptions( thisId, thisType ) ); + } else { + jQuery( '#fb-new-options' ).html( + '<label for="fb-option0">' + + GrunionFB_i18n.optionsLabel + + '</label><input type="text" id="fb-option0" optionid="0" value="' + + GrunionFB_i18n.firstOptionLabel + + '" class="fb-options" />' + ); + jQuery( '#fb-custom-radio' + thisId ).append( + '<div id="fb-radio-' + + thisId + + '-0">' + + thisRadio + + '<span>' + + GrunionFB_i18n.firstOptionLabel + + '</span>' + + thisClear + + '</div>' + ); + fbForm.fields[ thisId ].options[ optionsCount ] = GrunionFB_i18n.firstOptionLabel; + } + jQuery( '#fb-options' ).show(); + setTimeout( function() { + jQuery( '#fb-option0' ) + .focus() + .select(); + }, 100 ); + break; + case 'select': + jQuery( '#fb-new-field' + thisId + ' .fb-fields' ).html( + thisRemove + thisLabel + thisSelect + ); + if ( + optionsCache[ thisId ] !== undefined && + optionsCache[ thisId ].options.length !== 0 + ) { + fbForm.fields[ thisId ].options = optionsCache[ thisId ].options; + jQuery( '#fb-field' + thisId ).html( customOptions( thisId, thisType ) ); + } else { + jQuery( '#fb-new-options' ).html( + '<label for="fb-option0">' + + GrunionFB_i18n.optionsLabel + + '</label><input type="text" id="fb-option0" optionid="0" value="' + + GrunionFB_i18n.firstOptionLabel + + '" class="fb-options" />' + ); + fbForm.fields[ thisId ].options[ optionsCount ] = GrunionFB_i18n.firstOptionLabel; + } + jQuery( '#fb-options' ).show(); + setTimeout( function() { + jQuery( '#fb-option0' ) + .focus() + .select(); + }, 100 ); + break; + case 'text': + removeOptions(); + jQuery( '#fb-new-field' + thisId + ' .fb-fields' ).html( + thisRemove + thisLabel + thisText + ); + break; + case 'textarea': + removeOptions(); + jQuery( '#fb-new-field' + thisId + ' .fb-fields' ).html( + thisRemove + thisLabel + thisTextarea + ); + break; + case 'url': + removeOptions(); + jQuery( '#fb-new-field' + thisId + ' .fb-fields' ).html( + thisRemove + thisLabel + thisText + ); + break; + } + // update object + fbForm.fields[ thisId ].type = thisType; + } catch ( e ) { + if ( debug ) { + console.log( 'updateType(): ' + e ); + } + } + } + return { + resizePop: function() { + try { + //Thickbox won't resize for some reason, we are manually doing it here + var totalWidth = jQuery( 'body', window.parent.document ).width(); + var totalHeight = jQuery( 'body', window.parent.document ).height(); + var isIE6 = typeof document.body.style.maxHeight === 'undefined'; + + jQuery( '#TB_window, #TB_iframeContent', window.parent.document ).css( 'width', '768px' ); + jQuery( '#TB_window', window.parent.document ).css( { + left: ( totalWidth - 768 ) / 2 + 'px', + top: '23px', + position: 'absolute', + marginLeft: '0', + } ); + if ( ! isIE6 ) { + // take away IE6 + jQuery( '#TB_window, #TB_iframeContent', window.parent.document ).css( + 'height', + totalHeight - 73 + 'px' + ); + } + } catch ( e ) { + if ( debug ) { + console.log( 'resizePop(): ' + e ); + } + } + }, + init: function() { + // Scroll to top of page + window.parent.scroll( 0, 0 ); + //Check for existing form data + var contentSource; + if ( + jQuery( '#edButtonPreview', window.parent.document ).hasClass( 'active' ) || + jQuery( '#wp-content-wrap', window.parent.document ).hasClass( 'tmce-active' ) + ) { + var win = window.dialogArguments || opener || parent || top; + contentSource = win.tinyMCE.activeEditor.getContent(); + } else { + contentSource = jQuery( '#content', window.parent.document ).val(); + } + var data = { + action: 'grunion_shortcode_to_json', + _ajax_nonce: ajax_nonce_json, + post_id: postId, + content: contentSource, + }; + + var $doc = jQuery( document ); + + jQuery.post( ajaxurl, data, function( response ) { + // Setup fbForm + parseShortcode( jQuery.parseJSON( response ) ); + // Now build out the preview form + buildPreview(); + } ); + // actions + jQuery( '.fb-add-field' ).click( function() { + addField(); + hideDesc(); + return false; + } ); + jQuery( '#fb-new-label' ).keyup( function() { + updateLabel(); + } ); + jQuery( '#fb-new-type' ).change( function() { + updateType(); + } ); + jQuery( '#fb-new-required' ).click( function() { + updateRequired(); + } ); + $doc.on( 'click', '.fb-remove', function() { + showDesc(); + deleteField( jQuery( this ) ); + grabShortcode(); + } ); + jQuery( '#fb-preview' ).submit( function() { + sendShortcodeToEditor(); + return false; + } ); + jQuery( '#TB_overlay, #TB_closeWindowButton', window.parent.document ).mousedown( function() { + if ( confirm( GrunionFB_i18n.exitConfirmMessage ) ) { + hidePopup(); + } + } ); + $doc.on( 'click', '#fb-another-option', function() { + addOption(); + } ); + $doc.on( 'keyup', '.fb-options', function() { + updateOption( jQuery( this ) ); + } ); + $doc.on( 'click', '.fb-remove-option', function() { + removeOption( jQuery( this ).attr( 'optionid' ) ); + } ); + jQuery( '#tab-preview a' ).click( function() { + switchTabs( 'preview' ); + return false; + } ); + jQuery( '#fb-prev-form' ).click( function() { + switchTabs( 'preview' ); + return false; + } ); + jQuery( '#tab-settings a' ).click( function() { + switchTabs(); + return false; + } ); + jQuery( '#fb-field-my-email' ).blur( function() { + updateMyEmail(); + } ); + jQuery( '#fb-field-subject' ).blur( function() { + updateSubject(); + } ); + $doc.on( 'mouseenter', '.fb-form-case .fb-new-fields', function() { + hideShowEditLink( 'show', jQuery( this ) ); + } ); + $doc.on( 'mouseleave', '.fb-form-case .fb-new-fields', function() { + hideShowEditLink( 'hide' ); + return false; + } ); + $doc.on( 'click', '.fb-edit-field', function() { + editField( jQuery( this ) ); + return false; + } ); + $doc.on( 'click', '.fb-edit-field .fb-reorder', function() { + return false; + } ); + $doc.on( 'click', '#fb-save-field', function() { + showDesc(); + showAndHideMessage(); + return false; + } ); + jQuery( '#fb-feedback' ).click( function() { + var thisHref = jQuery( this ).attr( 'href' ); + window.parent.location = thisHref; + return false; + } ); + jQuery( '#sortable' ).sortable( { + axis: 'y', + handle: '.fb-reorder', + revert: true, + start: function() { + jQuery( '.fb-edit-field' ).hide(); + }, + } ); + jQuery( '#draggable' ).draggable( { + axis: 'y', + handle: '.fb-reorder', + connectToSortable: '#sortable', + helper: 'clone', + revert: 'invalid', + } ); + }, + }; +} )(); |