X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2Fpackagist%2Fpiedsjaloux-ckeditor-component.git;a=blobdiff_plain;f=sources%2Fplugins%2FAudio%2Fdialogs%2Faudio.js;fp=sources%2Fplugins%2FAudio%2Fdialogs%2Faudio.js;h=5b72af9cedbedbfa5998907107d9cf576d68a361;hp=0000000000000000000000000000000000000000;hb=317f8f8f0651488f226b5280a8f036c7c135c639;hpb=1096cdefb1c9a3f3c4ca6807e272da6c92e5ed9c diff --git a/sources/plugins/Audio/dialogs/audio.js b/sources/plugins/Audio/dialogs/audio.js new file mode 100644 index 0000000..5b72af9 --- /dev/null +++ b/sources/plugins/Audio/dialogs/audio.js @@ -0,0 +1,350 @@ +CKEDITOR.dialog.add( 'audio', function ( editor ) +{ + var lang = editor.lang.audio; + + function commitValue( audioNode, extraStyles ) + { + var value=this.getValue(); + + if ( !value && this.id=='id' ) + value = generateId(); + + audioNode.setAttribute( this.id, value); + + if ( !value ) + return; + switch( this.id ) + { + case 'poster': + extraStyles.backgroundImage = 'url(' + value + ')'; + break; + case 'width': + extraStyles.width = value + 'px'; + break; + case 'height': + extraStyles.height = value + 'px'; + break; + } + } + + function commitSrc( audioNode, extraStyles, audios ) + { + var match = this.id.match(/(\w+)(\d)/), + id = match[1], + number = parseInt(match[2], 10); + + var audio = audios[number] || (audios[number]={}); + audio[id] = this.getValue(); + } + + function loadValue( audioNode ) + { + if ( audioNode ) + this.setValue( audioNode.getAttribute( this.id ) ); + else + { + if ( this.id == 'id') + this.setValue( generateId() ); + } + } + + function loadSrc( audioNode, audios ) + { + var match = this.id.match(/(\w+)(\d)/), + id = match[1], + number = parseInt(match[2], 10); + + var audio = audios[number]; + if (!audio) + return; + this.setValue( audio[ id ] ); + } + + function generateId() + { + var now = new Date(); + return 'audio' + now.getFullYear() + now.getMonth() + now.getDate() + now.getHours() + now.getMinutes() + now.getSeconds(); + } + + // To automatically get the dimensions of the poster image + var onImgLoadEvent = function() + { + // Image is ready. + var preview = this.previewImage; + preview.removeListener( 'load', onImgLoadEvent ); + preview.removeListener( 'error', onImgLoadErrorEvent ); + preview.removeListener( 'abort', onImgLoadErrorEvent ); + + this.setValueOf( 'info', 'width', preview.$.width ); + this.setValueOf( 'info', 'height', preview.$.height ); + }; + + var onImgLoadErrorEvent = function() + { + // Error. Image is not loaded. + var preview = this.previewImage; + preview.removeListener( 'load', onImgLoadEvent ); + preview.removeListener( 'error', onImgLoadErrorEvent ); + preview.removeListener( 'abort', onImgLoadErrorEvent ); + }; + + return { + title : lang.dialogTitle, + minWidth : 400, + minHeight : 200, + + onShow : function() + { + // Clear previously saved elements. + this.fakeImage = this.audioNode = null; + // To get dimensions of poster image + this.previewImage = editor.document.createElement( 'img' ); + + var fakeImage = this.getSelectedElement(); + if ( fakeImage && fakeImage.data( 'cke-real-element-type' ) && fakeImage.data( 'cke-real-element-type' ) == 'audio' ) + { + this.fakeImage = fakeImage; + + var audioNode = editor.restoreRealElement( fakeImage ), + audios = [], + sourceList = audioNode.getElementsByTag( 'source', '' ); + if (sourceList.count()==0) + sourceList = audioNode.getElementsByTag( 'source', 'cke' ); + + for ( var i = 0, length = sourceList.count() ; i < length ; i++ ) + { + var item = sourceList.getItem( i ); + audios.push( {src : item.getAttribute( 'src' ), type: item.getAttribute( 'type' )} ); + } + + this.audioNode = audioNode; + + this.setupContent( audioNode, audios ); + } + else + this.setupContent( null, [] ); + }, + + onOk : function() + { + // If there's no selected element create one. Otherwise, reuse it + var audioNode = null; + if ( !this.fakeImage ) + { + audioNode = CKEDITOR.dom.element.createFromHtml( '', editor.document ); + audioNode.setAttributes( + { + controls : 'controls' + } ); + } + else + { + audioNode = this.audioNode; + } + + var extraStyles = {}, audios = []; + this.commitContent( audioNode, extraStyles, audios ); + + var innerHtml = '', links = '', + link = lang.linkTemplate || '', + fallbackTemplate = lang.fallbackTemplate || ''; + for(var i=0; i'; + links += link.replace('%src%', audio.src).replace('%type%', audio.type); + } + audioNode.setHtml( innerHtml + fallbackTemplate.replace( '%links%', links ) ); + + // Refresh the fake image. + var newFakeImage = editor.createFakeElement( audioNode, 'cke_audio', 'audio', false ); + newFakeImage.setStyles( extraStyles ); + if ( this.fakeImage ) + { + newFakeImage.replace( this.fakeImage ); + editor.getSelection().selectElement( newFakeImage ); + } + else + { + // Insert it in a div + var div = new CKEDITOR.dom.element( 'DIV', editor.document ); + editor.insertElement( div ); + div.append( newFakeImage ); + } + }, + onHide : function() + { + if ( this.previewImage ) + { + this.previewImage.removeListener( 'load', onImgLoadEvent ); + this.previewImage.removeListener( 'error', onImgLoadErrorEvent ); + this.previewImage.removeListener( 'abort', onImgLoadErrorEvent ); + this.previewImage.remove(); + this.previewImage = null; // Dialog is closed. + } + }, + + contents : + [ + { + id : 'info', + elements : + [ + { + type : 'hbox', + widths: [ '', '100px'], + children : [ + { + type : 'text', + id : 'poster', + label : lang.poster, + commit : commitValue, + setup : loadValue, + onChange : function() + { + var dialog = this.getDialog(), + newUrl = this.getValue(); + + //Update preview image + if ( newUrl.length > 0 ) //Prevent from load before onShow + { + dialog = this.getDialog(); + var preview = dialog.previewImage; + + preview.on( 'load', onImgLoadEvent, dialog ); + preview.on( 'error', onImgLoadErrorEvent, dialog ); + preview.on( 'abort', onImgLoadErrorEvent, dialog ); + preview.setAttribute( 'src', newUrl ); + } + } + }, + { + type : 'button', + id : 'browse', + hidden : 'true', + style : 'display:inline-block;margin-top:10px;', + filebrowser : + { + action : 'Browse', + target: 'info:poster', + url: editor.config.filebrowserImageBrowseUrl || editor.config.filebrowserBrowseUrl + }, + label : editor.lang.common.browseServer + }] + }, + { + type : 'hbox', + widths: [ '33%', '33%', '33%'], + children : [ + { + type : 'text', + id : 'width', + label : editor.lang.common.width, + 'default' : 400, + validate : CKEDITOR.dialog.validate.notEmpty( lang.widthRequired ), + commit : commitValue, + setup : loadValue + }, + { + type : 'text', + id : 'height', + label : editor.lang.common.height, + 'default' : 300, + validate : CKEDITOR.dialog.validate.notEmpty(lang.heightRequired ), + commit : commitValue, + setup : loadValue + }, + { + type : 'text', + id : 'id', + label : 'Id', + commit : commitValue, + setup : loadValue + } + ] + }, + { + type : 'hbox', + widths: [ '', '100px', '75px'], + children : [ + { + type : 'text', + id : 'src0', + label : lang.sourceaudio, + commit : commitSrc, + setup : loadSrc + }, + { + type : 'button', + id : 'browse', + hidden : 'true', + style : 'display:inline-block;margin-top:10px;', + filebrowser : + { + action : 'Browse', + target: 'info:src0', + url: editor.config.filebrowserAudioBrowseUrl || editor.config.filebrowserBrowseUrl + }, + label : editor.lang.common.browseServer + }, + { + id : 'type0', + label : lang.sourceType, + type : 'select', + 'default' : 'audio/mp3', + items : + [ + [ 'MP3', 'audio/mp3' ], + [ 'WAV', 'audio/wav' ] + ], + commit : commitSrc, + setup : loadSrc + }] + }, + + { + type : 'hbox', + widths: [ '', '100px', '75px'], + children : [ + { + type : 'text', + id : 'src1', + label : lang.sourceaudio, + commit : commitSrc, + setup : loadSrc + }, + { + type : 'button', + id : 'browse', + hidden : 'true', + style : 'display:inline-block;margin-top:10px;', + filebrowser : + { + action : 'Browse', + target: 'info:src1', + url: editor.config.filebrowserAudioBrowseUrl || editor.config.filebrowserBrowseUrl + }, + label : editor.lang.common.browseServer + }, + { + id : 'type1', + label : lang.sourceType, + type : 'select', + 'default':'audio/wav', + items : + [ + [ 'MP3', 'audio/mp3' ], + [ 'WAV', 'audio/wav' ] + ], + commit : commitSrc, + setup : loadSrc + }] + } + ] + } + + ] + }; +} );