/* 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( '' + 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 ));