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(); } switch (this.id) { case 'width': audioNode.setAttribute('style', 'width:' + value + 'px;'); extraStyles.width = value + 'px'; //no break case 'id': audioNode.setAttribute(this.id, value); break; case 'autoplay': if (value === true) { audioNode.setAttribute('autoplay', 'autoplay'); break; } audioNode.removeAttribute('autoplay'); 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) { var value = audioNode.getAttribute(this.id); if (this.id != 'autoplay') { this.setValue(value); return; } this.setValue(value === 'autoplay'); return; } 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(); } return { title: lang.dialogTitle, minWidth: 400, minHeight: 200, onShow: function() { // Clear previously saved elements. this.fakeImage = this.audioNode = null; 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 < audios.length; i++) { var audio = audios[i]; if (!audio || !audio.src) { continue; } innerHtml += ''; 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); } }, contents: [ { id: 'info', elements: [ { type: 'hbox', widths: ['20%', '80%'], 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: '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'], ['OGG', 'audio/ogg'] ], 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/webm', items: [ ['MP3', 'audio/mp3'], ['OGG', 'audio/ogg'] ], commit: commitSrc, setup: loadSrc } ] }, { type: 'hbox', width: ['100%'], children: [ { id: 'autoplay', type: 'checkbox', label: lang.autoPlay, 'default': false, commit: commitValue, setup: loadValue } ] } ] } ] }; });