123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- CKEDITOR.dialog.add( 'video', function ( editor )
- {
- var lang = editor.lang.video;
- function commitValue( videoNode, extraStyles )
- {
- var value=this.getValue();
- if ( !value && this.id=='id' )
- value = generateId();
- if (value == '') {
- return;
- }
- videoNode.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( videoNode, extraStyles, videos )
- {
- var match = this.id.match(/(\w+)(\d)/),
- id = match[1],
- number = parseInt(match[2], 10);
- var video = videos[number] || (videos[number]={});
- video[id] = this.getValue();
- }
- function loadValue( videoNode )
- {
- if ( videoNode )
- this.setValue( videoNode.getAttribute( this.id ) );
- else
- {
- if ( this.id == 'id')
- this.setValue( generateId() );
- }
- }
- function loadSrc( videoNode, videos )
- {
- var match = this.id.match(/(\w+)(\d)/),
- id = match[1],
- number = parseInt(match[2], 10);
- var video = videos[number];
- if (!video)
- return;
- this.setValue( video[ id ] );
- }
- function generateId()
- {
- var now = new Date();
- return 'video' + 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.videoNode = 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' ) == 'video' )
- {
- this.fakeImage = fakeImage;
- var videoNode = editor.restoreRealElement( fakeImage ),
- videos = [],
- sourceList = videoNode.getElementsByTag( 'source', '' );
- if (sourceList.count()==0)
- sourceList = videoNode.getElementsByTag( 'source', 'cke' );
- for ( var i = 0, length = sourceList.count() ; i < length ; i++ )
- {
- var item = sourceList.getItem( i );
- videos.push( {src : item.getAttribute( 'src' ), type: item.getAttribute( 'type' )} );
- }
- this.videoNode = videoNode;
- this.setupContent( videoNode, videos );
- }
- else
- this.setupContent( null, [] );
- },
- onOk : function()
- {
- // If there's no selected element create one. Otherwise, reuse it
- var videoNode = null;
- if ( !this.fakeImage )
- {
- videoNode = CKEDITOR.dom.element.createFromHtml( '<cke:video></cke:video>', editor.document );
- videoNode.setAttributes(
- {
- controls : 'controls'
- } );
- }
- else
- {
- videoNode = this.videoNode;
- }
- var extraStyles = {}, videos = [];
- this.commitContent( videoNode, extraStyles, videos );
- var innerHtml = '', links = '',
- link = lang.linkTemplate || '',
- fallbackTemplate = lang.fallbackTemplate || '';
- for(var i=0; i<videos.length; i++)
- {
- var video = videos[i];
- if ( !video || !video.src ) { continue; }
- //local copy of video URL
- var mySrc = video.src;
- //Chrome is picky about the redirect, so point directly to app/courses/ if currently pointing to courses/
- //See https://support.chamilo.org/issues/8462
- var coursesPathIndex = mySrc.indexOf('courses');
- var newHtmlTag = '<cke:source src="' + mySrc + '" type="' + video.type + '" />';
- var newLinks = link.replace('%src%', mySrc).replace('%type%', video.type);
- //is video saved on courses folder ?
- if (coursesPathIndex >= 0) {
- //test if real path is not already present (in case of video edition)
- var myPath = mySrc.indexOf('app');
- if (myPath==-1) {
- //add real path (app/) to video.src...
- var myChromeSrc = mySrc.slice(0, coursesPathIndex) + "app/" + mySrc.slice(coursesPathIndex);
- //insert full path link...
- newHtmlTag = '<cke:source src="' + myChromeSrc + '" type="' + video.type + '" />';
- newLinks = link.replace('%src%', myChromeSrc).replace('%type%', video.type);
- }
- }
- innerHtml += newHtmlTag;
- links += newLinks;
- }
- videoNode.setHtml( innerHtml + fallbackTemplate.replace( '%links%', links ) );
- // Refresh the fake image.
- var newFakeImage = editor.createFakeElement( videoNode, 'cke_video', 'video', 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: [ '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.sourceVideo,
- 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.filebrowserVideoBrowseUrl || editor.config.filebrowserBrowseUrl
- },
- label : editor.lang.common.browseServer
- },
- {
- id : 'type0',
- label : lang.sourceType,
- type : 'select',
- 'default' : 'video/mp4',
- items :
- [
- [ 'MP4', 'video/mp4' ],
- [ 'WebM', 'video/webm' ]
- ],
- commit : commitSrc,
- setup : loadSrc
- }]
- },
- {
- type : 'hbox',
- widths: [ '', '100px', '75px'],
- children : [
- {
- type : 'text',
- id : 'src1',
- label : lang.sourceVideo,
- 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.filebrowserVideoBrowseUrl || editor.config.filebrowserBrowseUrl
- },
- label : editor.lang.common.browseServer
- },
- {
- id : 'type1',
- label : lang.sourceType,
- type : 'select',
- 'default':'video/webm',
- items :
- [
- [ 'MP4', 'video/mp4' ],
- [ 'WebM', 'video/webm' ]
- ],
- commit : commitSrc,
- setup : loadSrc
- }]
- },
- {
- 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
- }]
- }
- ]
- }
- ]
- };
- } );
|