/* global tinyMCE, vpEditorView */ ( function ( $, wp, vpEditorView ) { wp.mce = wp.mce || {}; if ( 'undefined' === typeof wp.mce.views ) { return; } wp.mce.videopress_wp_view_renderer = { shortcode_string: 'videopress', shortcode_data: {}, defaults: { w: '', at: '', permalink: true, hd: false, loop: false, freedom: false, autoplay: false, flashonly: false, }, coerce: wp.media.coerce, template: wp.template( 'videopress_iframe_vnext' ), getContent: function () { var urlargs = 'for=' + encodeURIComponent( vpEditorView.home_url_host ), named = this.shortcode.attrs.named, options, key, width; for ( key in named ) { switch ( key ) { case 'at': if ( parseInt( named[ key ], 10 ) ) { urlargs += '&' + key + '=' + parseInt( named[ key ], 10 ); } // Else omit, as it's the default. break; case 'permalink': if ( 'false' === named[ key ] ) { urlargs += '&' + key + '=0'; } // Else omit, as it's the default. break; case 'hd': case 'loop': case 'autoplay': if ( 'true' === named[ key ] ) { urlargs += '&' + key + '=1'; } // Else omit, as it's the default. break; default: // Unknown parameters? Ditch it! break; } } options = { width: vpEditorView.content_width, height: vpEditorView.content_width * 0.5625, guid: this.shortcode.attrs.numeric[ 0 ], urlargs: urlargs, }; if ( typeof named.w !== 'undefined' ) { width = parseInt( named.w, 10 ); if ( width >= vpEditorView.min_content_width && width < vpEditorView.content_width ) { options.width = width; options.height = parseInt( width * 0.5625, 10 ); } } options.ratio = 100 * ( options.height / options.width ); return this.template( options ); }, edit: function ( data ) { var shortcode_data = wp.shortcode.next( this.shortcode_string, data ), named = shortcode_data.shortcode.attrs.named, editor = tinyMCE.activeEditor, renderer = this, oldRenderFormItem = tinyMCE.ui.FormItem.prototype.renderHtml; /** * Override TextBox renderHtml to support html5 attrs. * @link https://github.com/tinymce/tinymce/pull/2784 * * @returns {string} */ tinyMCE.ui.TextBox.prototype.renderHtml = function () { var self = this, settings = self.settings, element = document.createElement( settings.multiline ? 'textarea' : 'input' ), extraAttrs = [ 'rows', 'spellcheck', 'maxLength', 'size', 'readonly', 'min', 'max', 'step', 'list', 'pattern', 'placeholder', 'required', 'multiple', ], i, key; for ( i = 0; i < extraAttrs.length; i++ ) { key = extraAttrs[ i ]; if ( typeof settings[ key ] !== 'undefined' ) { element.setAttribute( key, settings[ key ] ); } } if ( settings.multiline ) { element.innerText = self.state.get( 'value' ); } else { element.setAttribute( 'type', settings.subtype ? settings.subtype : 'text' ); element.setAttribute( 'value', self.state.get( 'value' ) ); } element.id = self._id; element.className = self.classes; element.setAttribute( 'hidefocus', 1 ); if ( self.disabled() ) { element.disabled = true; } return element.outerHTML; }; tinyMCE.ui.FormItem.prototype.renderHtml = function () { _.each( vpEditorView.modal_labels, function ( value, key ) { if ( value === this.settings.items.text ) { this.classes.add( 'videopress-field-' + key ); } }, this ); if ( _.contains( [ vpEditorView.modal_labels.hd, vpEditorView.modal_labels.permalink, vpEditorView.modal_labels.autoplay, vpEditorView.modal_labels.loop, vpEditorView.modal_labels.freedom, vpEditorView.modal_labels.flashonly, ], this.settings.items.text ) ) { this.classes.add( 'videopress-checkbox' ); } return oldRenderFormItem.call( this ); }; /** * Populate the defaults. */ _.each( this.defaults, function ( value, key ) { named[ key ] = this.coerce( named, key ); }, this ); /** * Declare the fields that will show in the popup when editing the shortcode. */ editor.windowManager.open( { title: vpEditorView.modal_labels.title, id: 'videopress-shortcode-settings-modal', width: 520, height: 240, body: [ { type: 'textbox', disabled: true, name: 'guid', label: vpEditorView.modal_labels.guid, value: shortcode_data.shortcode.attrs.numeric[ 0 ], }, { type: 'textbox', subtype: 'number', min: vpEditorView.min_content_width, // The `min` may supported be in the future. https://github.com/tinymce/tinymce/pull/2784 name: 'w', label: vpEditorView.modal_labels.w, value: named.w, }, { type: 'textbox', subtype: 'number', min: 0, // The `min` may supported be in the future. https://github.com/tinymce/tinymce/pull/2784 name: 'at', label: vpEditorView.modal_labels.at, value: named.at, }, { type: 'checkbox', name: 'hd', label: vpEditorView.modal_labels.hd, checked: named.hd, }, { type: 'checkbox', name: 'permalink', label: vpEditorView.modal_labels.permalink, checked: named.permalink, }, { type: 'checkbox', name: 'autoplay', label: vpEditorView.modal_labels.autoplay, checked: named.autoplay, }, { type: 'checkbox', name: 'loop', label: vpEditorView.modal_labels.loop, checked: named.loop, }, { type: 'checkbox', name: 'freedom', label: vpEditorView.modal_labels.freedom, checked: named.freedom, }, { type: 'checkbox', name: 'flashonly', label: vpEditorView.modal_labels.flashonly, checked: named.flashonly, }, ], onsubmit: function ( e ) { var args = { tag: renderer.shortcode_string, type: 'single', attrs: { named: _.pick( e.data, _.keys( renderer.defaults ) ), numeric: [ e.data.guid ], }, }; if ( '0' === args.attrs.named.at ) { args.attrs.named.at = ''; } _.each( renderer.defaults, function ( value, key ) { args.attrs.named[ key ] = this.coerce( args.attrs.named, key ); if ( value === args.attrs.named[ key ] ) { delete args.attrs.named[ key ]; } }, renderer ); editor.insertContent( wp.shortcode.string( args ) ); }, onopen: function ( e ) { var prefix = 'mce-videopress-field-'; _.each( [ 'w', 'at' ], function ( value ) { e.target.$el .find( '.' + prefix + value + ' .mce-container-body' ) .append( '<span class="' + prefix + 'unit ' + prefix + 'unit-' + value + '">' + vpEditorView.modal_labels[ value + '_unit' ] ); } ); $( 'body' ).addClass( 'modal-open' ); }, onclose: function () { $( 'body' ).removeClass( 'modal-open' ); }, } ); // Set it back to its original renderer. tinyMCE.ui.FormItem.prototype.renderHtml = oldRenderFormItem; }, }; wp.mce.views.register( 'videopress', wp.mce.videopress_wp_view_renderer ); // Extend the videopress one to also handle `wpvideo` instances. wp.mce.wpvideo_wp_view_renderer = _.extend( {}, wp.mce.videopress_wp_view_renderer, { shortcode_string: 'wpvideo', } ); wp.mce.views.register( 'wpvideo', wp.mce.wpvideo_wp_view_renderer ); } )( jQuery, wp, vpEditorView );