' )
- .attr( 'id', 'media-item-' + fileObj.id )
- .addClass( 'child-of-' + postid )
- .append( jQuery( '
' ).text( ' ' + fileObj.name ),
- '
' )
- .appendTo( jQuery( '#media-items' ) );
-
- // Disable submit.
- jQuery( '#insert-gallery' ).prop( 'disabled', true );
-}
-
-function uploadStart() {
- try {
- if ( typeof topWin.tb_remove != 'undefined' )
- topWin.jQuery( '#TB_overlay' ).unbind( 'click', topWin.tb_remove );
- } catch( e ){}
-
- return true;
-}
-
-function uploadProgress( up, file ) {
- var item = jQuery( '#media-item-' + file.id );
-
- jQuery( '.bar', item ).width( ( 200 * file.loaded ) / file.size );
- jQuery( '.percent', item ).html( file.percent + '%' );
-}
-
-// Check to see if a large file failed to upload.
-function fileUploading( up, file ) {
- var hundredmb = 100 * 1024 * 1024,
- max = parseInt( up.settings.max_file_size, 10 );
-
- if ( max > hundredmb && file.size > hundredmb ) {
- setTimeout( function() {
- if ( file.status < 3 && file.loaded === 0 ) { // Not uploading.
- wpFileError( file, pluploadL10n.big_upload_failed.replace( '%1$s', '
' ).replace( '%2$s', ' ' ) );
- up.stop(); // Stop the whole queue.
- up.removeFile( file );
- up.start(); // Restart the queue.
- }
- }, 10000 ); // Wait for 10 seconds for the file to start uploading.
- }
-}
-
-function updateMediaForm() {
- var items = jQuery( '#media-items' ).children();
-
- // Just one file, no need for collapsible part.
- if ( items.length == 1 ) {
- items.addClass( 'open' ).find( '.slidetoggle' ).show();
- jQuery( '.insert-gallery' ).hide();
- } else if ( items.length > 1 ) {
- items.removeClass( 'open' );
- // Only show Gallery/Playlist buttons when there are at least two files.
- jQuery( '.insert-gallery' ).show();
- }
-
- // Only show Save buttons when there is at least one file.
- if ( items.not( '.media-blank' ).length > 0 )
- jQuery( '.savebutton' ).show();
- else
- jQuery( '.savebutton' ).hide();
-}
-
-function uploadSuccess( fileObj, serverData ) {
- var item = jQuery( '#media-item-' + fileObj.id );
-
- // On success serverData should be numeric,
- // fix bug in html4 runtime returning the serverData wrapped in a
tag.
- if ( typeof serverData === 'string' ) {
- serverData = serverData.replace( /^(\d+)<\/pre>$/, '$1' );
-
- // If async-upload returned an error message, place it in the media item div and return.
- if ( /media-upload-error|error-div/.test( serverData ) ) {
- item.html( serverData );
- return;
- }
- }
-
- item.find( '.percent' ).html( pluploadL10n.crunching );
-
- prepareMediaItem( fileObj, serverData );
- updateMediaForm();
-
- // Increment the counter.
- if ( post_id && item.hasClass( 'child-of-' + post_id ) ) {
- jQuery( '#attachments-count' ).text( 1 * jQuery( '#attachments-count' ).text() + 1 );
- }
-}
-
-function setResize( arg ) {
- if ( arg ) {
- if ( window.resize_width && window.resize_height ) {
- uploader.settings.resize = {
- enabled: true,
- width: window.resize_width,
- height: window.resize_height,
- quality: 100
- };
- } else {
- uploader.settings.multipart_params.image_resize = true;
- }
- } else {
- delete( uploader.settings.multipart_params.image_resize );
- }
-}
-
-function prepareMediaItem( fileObj, serverData ) {
- var f = ( typeof shortform == 'undefined' ) ? 1 : 2, item = jQuery( '#media-item-' + fileObj.id );
- if ( f == 2 && shortform > 2 )
- f = shortform;
-
- try {
- if ( typeof topWin.tb_remove != 'undefined' )
- topWin.jQuery( '#TB_overlay' ).click( topWin.tb_remove );
- } catch( e ){}
-
- if ( isNaN( serverData ) || !serverData ) {
- // Old style: Append the HTML returned by the server -- thumbnail and form inputs.
- item.append( serverData );
- prepareMediaItemInit( fileObj );
- } else {
- // New style: server data is just the attachment ID, fetch the thumbnail and form html from the server.
- item.load( 'async-upload.php', {attachment_id:serverData, fetch:f}, function(){prepareMediaItemInit( fileObj );updateMediaForm();});
- }
-}
-
-function prepareMediaItemInit( fileObj ) {
- var item = jQuery( '#media-item-' + fileObj.id );
- // Clone the thumbnail as a "pinkynail" -- a tiny image to the left of the filename.
- jQuery( '.thumbnail', item ).clone().attr( 'class', 'pinkynail toggle' ).prependTo( item );
-
- // Replace the original filename with the new (unique) one assigned during upload.
- jQuery( '.filename.original', item ).replaceWith( jQuery( '.filename.new', item ) );
-
- // Bind Ajax to the new Delete button.
- jQuery( 'a.delete', item ).on( 'click', function(){
- // Tell the server to delete it. TODO: Handle exceptions.
- jQuery.ajax({
- url: ajaxurl,
- type: 'post',
- success: deleteSuccess,
- error: deleteError,
- id: fileObj.id,
- data: {
- id : this.id.replace(/[^0-9]/g, '' ),
- action : 'trash-post',
- _ajax_nonce : this.href.replace(/^.*wpnonce=/,'' )
- }
- });
- return false;
- });
-
- // Bind Ajax to the new Undo button.
- jQuery( 'a.undo', item ).on( 'click', function(){
- // Tell the server to untrash it. TODO: Handle exceptions.
- jQuery.ajax({
- url: ajaxurl,
- type: 'post',
- id: fileObj.id,
- data: {
- id : this.id.replace(/[^0-9]/g,'' ),
- action: 'untrash-post',
- _ajax_nonce: this.href.replace(/^.*wpnonce=/,'' )
- },
- success: function( ){
- var type,
- item = jQuery( '#media-item-' + fileObj.id );
-
- if ( type = jQuery( '#type-of-' + fileObj.id ).val() )
- jQuery( '#' + type + '-counter' ).text( jQuery( '#' + type + '-counter' ).text()-0+1 );
-
- if ( post_id && item.hasClass( 'child-of-'+post_id ) )
- jQuery( '#attachments-count' ).text( jQuery( '#attachments-count' ).text()-0+1 );
-
- jQuery( '.filename .trashnotice', item ).remove();
- jQuery( '.filename .title', item ).css( 'font-weight','normal' );
- jQuery( 'a.undo', item ).addClass( 'hidden' );
- jQuery( '.menu_order_input', item ).show();
- item.css( {backgroundColor:'#ceb'} ).animate( {backgroundColor: '#fff'}, { queue: false, duration: 500, complete: function(){ jQuery( this ).css({backgroundColor:''}); } }).removeClass( 'undo' );
- }
- });
- return false;
- });
-
- // Open this item if it says to start open (e.g. to display an error).
- jQuery( '#media-item-' + fileObj.id + '.startopen' ).removeClass( 'startopen' ).addClass( 'open' ).find( 'slidetoggle' ).fadeIn();
-}
-
-// Generic error message.
-function wpQueueError( message ) {
- jQuery( '#media-upload-error' ).show().html( '' );
-}
-
-// File-specific error messages.
-function wpFileError( fileObj, message ) {
- itemAjaxError( fileObj.id, message );
-}
-
-function itemAjaxError( id, message ) {
- var item = jQuery( '#media-item-' + id ), filename = item.find( '.filename' ).text(), last_err = item.data( 'last-err' );
-
- if ( last_err == id ) // Prevent firing an error for the same file twice.
- return;
-
- item.html( '' ).data( 'last-err', id );
-}
-
-function deleteSuccess( data ) {
- var type, id, item;
- if ( data == '-1' )
- return itemAjaxError( this.id, 'You do not have permission. Has your session expired?' );
-
- if ( data == '0' )
- return itemAjaxError( this.id, 'Could not be deleted. Has it been deleted already?' );
-
- id = this.id;
- item = jQuery( '#media-item-' + id );
-
- // Decrement the counters.
- if ( type = jQuery( '#type-of-' + id ).val() )
- jQuery( '#' + type + '-counter' ).text( jQuery( '#' + type + '-counter' ).text() - 1 );
-
- if ( post_id && item.hasClass( 'child-of-'+post_id ) )
- jQuery( '#attachments-count' ).text( jQuery( '#attachments-count' ).text() - 1 );
-
- if ( jQuery( 'form.type-form #media-items' ).children().length == 1 && jQuery( '.hidden', '#media-items' ).length > 0 ) {
- jQuery( '.toggle' ).toggle();
- jQuery( '.slidetoggle' ).slideUp( 200 ).siblings().removeClass( 'hidden' );
- }
-
- // Vanish it.
- jQuery( '.toggle', item ).toggle();
- jQuery( '.slidetoggle', item ).slideUp( 200 ).siblings().removeClass( 'hidden' );
- item.css( {backgroundColor:'#faa'} ).animate( {backgroundColor:'#f4f4f4'}, {queue:false, duration:500} ).addClass( 'undo' );
-
- jQuery( '.filename:empty', item ).remove();
- jQuery( '.filename .title', item ).css( 'font-weight','bold' );
- jQuery( '.filename', item ).append( ' ' + pluploadL10n.deleted + ' ' ).siblings( 'a.toggle' ).hide();
- jQuery( '.filename', item ).append( jQuery( 'a.undo', item ).removeClass( 'hidden' ) );
- jQuery( '.menu_order_input', item ).hide();
-
- return;
-}
-
-function deleteError() {
-}
-
-function uploadComplete() {
- jQuery( '#insert-gallery' ).prop( 'disabled', false );
-}
-
-function switchUploader( s ) {
- if ( s ) {
- deleteUserSetting( 'uploader' );
- jQuery( '.media-upload-form' ).removeClass( 'html-uploader' );
-
- if ( typeof( uploader ) == 'object' )
- uploader.refresh();
-
- jQuery( '#plupload-browse-button' ).trigger( 'focus' );
- } else {
- setUserSetting( 'uploader', '1' ); // 1 == html uploader.
- jQuery( '.media-upload-form' ).addClass( 'html-uploader' );
- jQuery( '#async-upload' ).trigger( 'focus' );
- }
-}
-
-function uploadError( fileObj, errorCode, message, up ) {
- var hundredmb = 100 * 1024 * 1024, max;
-
- switch ( errorCode ) {
- case plupload.FAILED:
- wpFileError( fileObj, pluploadL10n.upload_failed );
- break;
- case plupload.FILE_EXTENSION_ERROR:
- wpFileExtensionError( up, fileObj, pluploadL10n.invalid_filetype );
- break;
- case plupload.FILE_SIZE_ERROR:
- uploadSizeError( up, fileObj );
- break;
- case plupload.IMAGE_FORMAT_ERROR:
- wpFileError( fileObj, pluploadL10n.not_an_image );
- break;
- case plupload.IMAGE_MEMORY_ERROR:
- wpFileError( fileObj, pluploadL10n.image_memory_exceeded );
- break;
- case plupload.IMAGE_DIMENSIONS_ERROR:
- wpFileError( fileObj, pluploadL10n.image_dimensions_exceeded );
- break;
- case plupload.GENERIC_ERROR:
- wpQueueError( pluploadL10n.upload_failed );
- break;
- case plupload.IO_ERROR:
- max = parseInt( up.settings.filters.max_file_size, 10 );
-
- if ( max > hundredmb && fileObj.size > hundredmb ) {
- wpFileError( fileObj, pluploadL10n.big_upload_failed.replace( '%1$s', '' ).replace( '%2$s', ' ' ) );
- } else {
- wpQueueError( pluploadL10n.io_error );
- }
-
- break;
- case plupload.HTTP_ERROR:
- wpQueueError( pluploadL10n.http_error );
- break;
- case plupload.INIT_ERROR:
- jQuery( '.media-upload-form' ).addClass( 'html-uploader' );
- break;
- case plupload.SECURITY_ERROR:
- wpQueueError( pluploadL10n.security_error );
- break;
-/* case plupload.UPLOAD_ERROR.UPLOAD_STOPPED:
- case plupload.UPLOAD_ERROR.FILE_CANCELLED:
- jQuery( '#media-item-' + fileObj.id ).remove();
- break;*/
- default:
- wpFileError( fileObj, pluploadL10n.default_error );
- }
-}
-
-function uploadSizeError( up, file ) {
- var message, errorDiv;
-
- message = pluploadL10n.file_exceeds_size_limit.replace( '%s', file.name );
-
- // Construct the error div.
- errorDiv = jQuery( '
' )
- .attr( {
- 'id': 'media-item-' + file.id,
- 'class': 'media-item error'
- } )
- .append(
- jQuery( '
' )
- .text( message )
- );
-
- // Append the error.
- jQuery( '#media-items' ).append( errorDiv );
- up.removeFile( file );
-}
-
-function wpFileExtensionError( up, file, message ) {
- jQuery( '#media-items' ).append( '' );
- up.removeFile( file );
-}
-
-/**
- * Copies the attachment URL to the clipboard.
- *
- * @since 5.8.0
- *
- * @param {MouseEvent} event A click event.
- *
- * @return {void}
- */
-function copyAttachmentUploadURLClipboard() {
- var clipboard = new ClipboardJS( '.copy-attachment-url' ),
- successTimeout;
-
- clipboard.on( 'success', function( event ) {
- var triggerElement = jQuery( event.trigger ),
- successElement = jQuery( '.success', triggerElement.closest( '.copy-to-clipboard-container' ) );
-
- // Clear the selection and move focus back to the trigger.
- event.clearSelection();
- // Show success visual feedback.
- clearTimeout( successTimeout );
- successElement.removeClass( 'hidden' );
- // Hide success visual feedback after 3 seconds since last success.
- successTimeout = setTimeout( function() {
- successElement.addClass( 'hidden' );
- }, 3000 );
- // Handle success audible feedback.
- wp.a11y.speak( pluploadL10n.file_url_copied );
- } );
-}
-
-jQuery( document ).ready( function( $ ) {
- copyAttachmentUploadURLClipboard();
- var tryAgainCount = {};
- var tryAgain;
-
- $( '.media-upload-form' ).on( 'click.uploader', function( e ) {
- var target = $( e.target ), tr, c;
-
- if ( target.is( 'input[type="radio"]' ) ) { // Remember the last used image size and alignment.
- tr = target.closest( 'tr' );
-
- if ( tr.hasClass( 'align' ) )
- setUserSetting( 'align', target.val() );
- else if ( tr.hasClass( 'image-size' ) )
- setUserSetting( 'imgsize', target.val() );
-
- } else if ( target.is( 'button.button' ) ) { // Remember the last used image link url.
- c = e.target.className || '';
- c = c.match( /url([^ '"]+)/ );
-
- if ( c && c[1] ) {
- setUserSetting( 'urlbutton', c[1] );
- target.siblings( '.urlfield' ).val( target.data( 'link-url' ) );
- }
- } else if ( target.is( 'a.dismiss' ) ) {
- target.parents( '.media-item' ).fadeOut( 200, function() {
- $( this ).remove();
- } );
- } else if ( target.is( '.upload-flash-bypass button' ) || target.is( 'a.uploader-html' ) ) { // Switch uploader to html4.
- $( '#media-items, p.submit, span.big-file-warning' ).css( 'display', 'none' );
- switchUploader( 0 );
- e.preventDefault();
- } else if ( target.is( '.upload-html-bypass button' ) ) { // Switch uploader to multi-file.
- $( '#media-items, p.submit, span.big-file-warning' ).css( 'display', '' );
- switchUploader( 1 );
- e.preventDefault();
- } else if ( target.is( 'a.describe-toggle-on' ) ) { // Show.
- target.parent().addClass( 'open' );
- target.siblings( '.slidetoggle' ).fadeIn( 250, function() {
- var S = $( window ).scrollTop(),
- H = $( window ).height(),
- top = $( this ).offset().top,
- h = $( this ).height(),
- b,
- B;
-
- if ( H && top && h ) {
- b = top + h;
- B = S + H;
-
- if ( b > B ) {
- if ( b - B < top - S )
- window.scrollBy( 0, ( b - B ) + 10 );
- else
- window.scrollBy( 0, top - S - 40 );
- }
- }
- } );
-
- e.preventDefault();
- } else if ( target.is( 'a.describe-toggle-off' ) ) { // Hide.
- target.siblings( '.slidetoggle' ).fadeOut( 250, function() {
- target.parent().removeClass( 'open' );
- } );
-
- e.preventDefault();
- }
- });
-
- // Attempt to create image sub-sizes when an image was uploaded successfully
- // but the server responded with an HTTP 5xx error.
- tryAgain = function( up, error ) {
- var file = error.file;
- var times;
- var id;
-
- if ( ! error || ! error.responseHeaders ) {
- wpQueueError( pluploadL10n.http_error_image );
- return;
- }
-
- id = error.responseHeaders.match( /x-wp-upload-attachment-id:\s*(\d+)/i );
-
- if ( id && id[1] ) {
- id = id[1];
- } else {
- wpQueueError( pluploadL10n.http_error_image );
- return;
- }
-
- times = tryAgainCount[ file.id ];
-
- if ( times && times > 4 ) {
- /*
- * The file may have been uploaded and attachment post created,
- * but post-processing and resizing failed...
- * Do a cleanup then tell the user to scale down the image and upload it again.
- */
- $.ajax({
- type: 'post',
- url: ajaxurl,
- dataType: 'json',
- data: {
- action: 'media-create-image-subsizes',
- _wpnonce: wpUploaderInit.multipart_params._wpnonce,
- attachment_id: id,
- _wp_upload_failed_cleanup: true,
- }
- });
-
- if ( error.message && ( error.status < 500 || error.status >= 600 ) ) {
- wpQueueError( error.message );
- } else {
- wpQueueError( pluploadL10n.http_error_image );
- }
-
- return;
- }
-
- if ( ! times ) {
- tryAgainCount[ file.id ] = 1;
- } else {
- tryAgainCount[ file.id ] = ++times;
- }
-
- // Try to create the missing image sizes.
- $.ajax({
- type: 'post',
- url: ajaxurl,
- dataType: 'json',
- data: {
- action: 'media-create-image-subsizes',
- _wpnonce: wpUploaderInit.multipart_params._wpnonce,
- attachment_id: id,
- _legacy_support: 'true',
- }
- }).done( function( response ) {
- var message;
-
- if ( response.success ) {
- uploadSuccess( file, response.data.id );
- } else {
- if ( response.data && response.data.message ) {
- message = response.data.message;
- }
-
- wpQueueError( message || pluploadL10n.http_error_image );
- }
- }).fail( function( jqXHR ) {
- // If another HTTP 5xx error, try try again...
- if ( jqXHR.status >= 500 && jqXHR.status < 600 ) {
- tryAgain( up, error );
- return;
- }
-
- wpQueueError( pluploadL10n.http_error_image );
- });
- }
-
- // Init and set the uploader.
- uploader_init = function() {
- uploader = new plupload.Uploader( wpUploaderInit );
-
- $( '#image_resize' ).on( 'change', function() {
- var arg = $( this ).prop( 'checked' );
-
- setResize( arg );
-
- if ( arg )
- setUserSetting( 'upload_resize', '1' );
- else
- deleteUserSetting( 'upload_resize' );
- });
-
- uploader.bind( 'Init', function( up ) {
- var uploaddiv = $( '#plupload-upload-ui' );
-
- setResize( getUserSetting( 'upload_resize', false ) );
-
- if ( up.features.dragdrop && ! $( document.body ).hasClass( 'mobile' ) ) {
- uploaddiv.addClass( 'drag-drop' );
-
- $( '#drag-drop-area' ).on( 'dragover.wp-uploader', function() { // dragenter doesn't fire right :(
- uploaddiv.addClass( 'drag-over' );
- }).on( 'dragleave.wp-uploader, drop.wp-uploader', function() {
- uploaddiv.removeClass( 'drag-over' );
- });
- } else {
- uploaddiv.removeClass( 'drag-drop' );
- $( '#drag-drop-area' ).off( '.wp-uploader' );
- }
-
- if ( up.runtime === 'html4' ) {
- $( '.upload-flash-bypass' ).hide();
- }
- });
-
- uploader.bind( 'postinit', function( up ) {
- up.refresh();
- });
-
- uploader.init();
-
- uploader.bind( 'FilesAdded', function( up, files ) {
- $( '#media-upload-error' ).empty();
- uploadStart();
-
- plupload.each( files, function( file ) {
- if ( file.type === 'image/heic' && up.settings.heic_upload_error ) {
- // Show error but do not block uploading.
- wpQueueError( pluploadL10n.unsupported_image );
- } else if ( file.type === 'image/webp' && up.settings.webp_upload_error ) {
- // Disallow uploading of WebP images if the server cannot edit them.
- wpQueueError( pluploadL10n.noneditable_image );
- up.removeFile( file );
- return;
- } else if ( file.type === 'image/avif' && up.settings.avif_upload_error ) {
- // Disallow uploading of AVIF images if the server cannot edit them.
- wpQueueError( pluploadL10n.noneditable_image );
- up.removeFile( file );
- return;
- }
-
- fileQueued( file );
- });
-
- up.refresh();
- up.start();
- });
-
- uploader.bind( 'UploadFile', function( up, file ) {
- fileUploading( up, file );
- });
-
- uploader.bind( 'UploadProgress', function( up, file ) {
- uploadProgress( up, file );
- });
-
- uploader.bind( 'Error', function( up, error ) {
- var isImage = error.file && error.file.type && error.file.type.indexOf( 'image/' ) === 0;
- var status = error && error.status;
-
- // If the file is an image and the error is HTTP 5xx try to create sub-sizes again.
- if ( isImage && status >= 500 && status < 600 ) {
- tryAgain( up, error );
- return;
- }
-
- uploadError( error.file, error.code, error.message, up );
- up.refresh();
- });
-
- uploader.bind( 'FileUploaded', function( up, file, response ) {
- uploadSuccess( file, response.response );
- });
-
- uploader.bind( 'UploadComplete', function() {
- uploadComplete();
- });
- };
-
- if ( typeof( wpUploaderInit ) == 'object' ) {
- uploader_init();
- }
-
-});
diff --git a/src/js/_enqueues/vendor/plupload/moxie.js b/src/js/_enqueues/vendor/plupload/moxie.js
index dbf635f41cf17..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/plupload/moxie.js
+++ b/src/js/_enqueues/vendor/plupload/moxie.js
@@ -1,9904 +0,0 @@
-;var MXI_DEBUG = false;
-/**
- * mOxie - multi-runtime File API & XMLHttpRequest L2 Polyfill
- * v1.3.5.1
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- *
- * Date: 2016-05-15
- */
-/**
- * Compiled inline version. (Library mode)
- */
-
-/**
- * Modified for WordPress.
- * - Silverlight and Flash runtimes support was removed. See https://core.trac.wordpress.org/ticket/41755.
- * - A stray Unicode character has been removed. See https://core.trac.wordpress.org/ticket/59329.
- *
- * This is a de-facto fork of the mOxie library that will be maintained by WordPress due to upstream license changes
- * that are incompatible with the GPL.
- */
-
-/*jshint smarttabs:true, undef:true, latedef:true, curly:true, bitwise:true, camelcase:true */
-/*globals $code */
-
-(function(exports, undefined) {
- "use strict";
-
- var modules = {};
-
- function require(ids, callback) {
- var module, defs = [];
-
- for (var i = 0; i < ids.length; ++i) {
- module = modules[ids[i]] || resolve(ids[i]);
- if (!module) {
- throw 'module definition dependecy not found: ' + ids[i];
- }
-
- defs.push(module);
- }
-
- callback.apply(null, defs);
- }
-
- function define(id, dependencies, definition) {
- if (typeof id !== 'string') {
- throw 'invalid module definition, module id must be defined and be a string';
- }
-
- if (dependencies === undefined) {
- throw 'invalid module definition, dependencies must be specified';
- }
-
- if (definition === undefined) {
- throw 'invalid module definition, definition function must be specified';
- }
-
- require(dependencies, function() {
- modules[id] = definition.apply(null, arguments);
- });
- }
-
- function defined(id) {
- return !!modules[id];
- }
-
- function resolve(id) {
- var target = exports;
- var fragments = id.split(/[.\/]/);
-
- for (var fi = 0; fi < fragments.length; ++fi) {
- if (!target[fragments[fi]]) {
- return;
- }
-
- target = target[fragments[fi]];
- }
-
- return target;
- }
-
- function expose(ids) {
- for (var i = 0; i < ids.length; i++) {
- var target = exports;
- var id = ids[i];
- var fragments = id.split(/[.\/]/);
-
- for (var fi = 0; fi < fragments.length - 1; ++fi) {
- if (target[fragments[fi]] === undefined) {
- target[fragments[fi]] = {};
- }
-
- target = target[fragments[fi]];
- }
-
- target[fragments[fragments.length - 1]] = modules[id];
- }
- }
-
-// Included from: src/javascript/core/utils/Basic.js
-
-/**
- * Basic.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/core/utils/Basic', [], function() {
- /**
- Gets the true type of the built-in object (better version of typeof).
- @author Angus Croll (http://javascriptweblog.wordpress.com/)
-
- @method typeOf
- @for Utils
- @static
- @param {Object} o Object to check.
- @return {String} Object [[Class]]
- */
- var typeOf = function(o) {
- var undef;
-
- if (o === undef) {
- return 'undefined';
- } else if (o === null) {
- return 'null';
- } else if (o.nodeType) {
- return 'node';
- }
-
- // the snippet below is awesome, however it fails to detect null, undefined and arguments types in IE lte 8
- return ({}).toString.call(o).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();
- };
-
- /**
- Extends the specified object with another object.
-
- @method extend
- @static
- @param {Object} target Object to extend.
- @param {Object} [obj]* Multiple objects to extend with.
- @return {Object} Same as target, the extended object.
- */
- var extend = function(target) {
- var undef;
-
- each(arguments, function(arg, i) {
- if (i > 0) {
- each(arg, function(value, key) {
- if (value !== undef) {
- if (typeOf(target[key]) === typeOf(value) && !!~inArray(typeOf(value), ['array', 'object'])) {
- extend(target[key], value);
- } else {
- target[key] = value;
- }
- }
- });
- }
- });
- return target;
- };
-
- /**
- Executes the callback function for each item in array/object. If you return false in the
- callback it will break the loop.
-
- @method each
- @static
- @param {Object} obj Object to iterate.
- @param {function} callback Callback function to execute for each item.
- */
- var each = function(obj, callback) {
- var length, key, i, undef;
-
- if (obj) {
- if (typeOf(obj.length) === 'number') { // it might be Array, FileList or even arguments object
- // Loop array items
- for (i = 0, length = obj.length; i < length; i++) {
- if (callback(obj[i], i) === false) {
- return;
- }
- }
- } else if (typeOf(obj) === 'object') {
- // Loop object items
- for (key in obj) {
- if (obj.hasOwnProperty(key)) {
- if (callback(obj[key], key) === false) {
- return;
- }
- }
- }
- }
- }
- };
-
- /**
- Checks if object is empty.
-
- @method isEmptyObj
- @static
- @param {Object} o Object to check.
- @return {Boolean}
- */
- var isEmptyObj = function(obj) {
- var prop;
-
- if (!obj || typeOf(obj) !== 'object') {
- return true;
- }
-
- for (prop in obj) {
- return false;
- }
-
- return true;
- };
-
- /**
- Recieve an array of functions (usually async) to call in sequence, each function
- receives a callback as first argument that it should call, when it completes. Finally,
- after everything is complete, main callback is called. Passing truthy value to the
- callback as a first argument will interrupt the sequence and invoke main callback
- immediately.
-
- @method inSeries
- @static
- @param {Array} queue Array of functions to call in sequence
- @param {Function} cb Main callback that is called in the end, or in case of error
- */
- var inSeries = function(queue, cb) {
- var i = 0, length = queue.length;
-
- if (typeOf(cb) !== 'function') {
- cb = function() {};
- }
-
- if (!queue || !queue.length) {
- cb();
- }
-
- function callNext(i) {
- if (typeOf(queue[i]) === 'function') {
- queue[i](function(error) {
- /*jshint expr:true */
- ++i < length && !error ? callNext(i) : cb(error);
- });
- }
- }
- callNext(i);
- };
-
-
- /**
- Recieve an array of functions (usually async) to call in parallel, each function
- receives a callback as first argument that it should call, when it completes. After
- everything is complete, main callback is called. Passing truthy value to the
- callback as a first argument will interrupt the process and invoke main callback
- immediately.
-
- @method inParallel
- @static
- @param {Array} queue Array of functions to call in sequence
- @param {Function} cb Main callback that is called in the end, or in case of error
- */
- var inParallel = function(queue, cb) {
- var count = 0, num = queue.length, cbArgs = new Array(num);
-
- each(queue, function(fn, i) {
- fn(function(error) {
- if (error) {
- return cb(error);
- }
-
- var args = [].slice.call(arguments);
- args.shift(); // strip error - undefined or not
-
- cbArgs[i] = args;
- count++;
-
- if (count === num) {
- cbArgs.unshift(null);
- cb.apply(this, cbArgs);
- }
- });
- });
- };
-
-
- /**
- Find an element in array and return it's index if present, otherwise return -1.
-
- @method inArray
- @static
- @param {Mixed} needle Element to find
- @param {Array} array
- @return {Int} Index of the element, or -1 if not found
- */
- var inArray = function(needle, array) {
- if (array) {
- if (Array.prototype.indexOf) {
- return Array.prototype.indexOf.call(array, needle);
- }
-
- for (var i = 0, length = array.length; i < length; i++) {
- if (array[i] === needle) {
- return i;
- }
- }
- }
- return -1;
- };
-
-
- /**
- Returns elements of first array if they are not present in second. And false - otherwise.
-
- @private
- @method arrayDiff
- @param {Array} needles
- @param {Array} array
- @return {Array|Boolean}
- */
- var arrayDiff = function(needles, array) {
- var diff = [];
-
- if (typeOf(needles) !== 'array') {
- needles = [needles];
- }
-
- if (typeOf(array) !== 'array') {
- array = [array];
- }
-
- for (var i in needles) {
- if (inArray(needles[i], array) === -1) {
- diff.push(needles[i]);
- }
- }
- return diff.length ? diff : false;
- };
-
-
- /**
- Find intersection of two arrays.
-
- @private
- @method arrayIntersect
- @param {Array} array1
- @param {Array} array2
- @return {Array} Intersection of two arrays or null if there is none
- */
- var arrayIntersect = function(array1, array2) {
- var result = [];
- each(array1, function(item) {
- if (inArray(item, array2) !== -1) {
- result.push(item);
- }
- });
- return result.length ? result : null;
- };
-
-
- /**
- Forces anything into an array.
-
- @method toArray
- @static
- @param {Object} obj Object with length field.
- @return {Array} Array object containing all items.
- */
- var toArray = function(obj) {
- var i, arr = [];
-
- for (i = 0; i < obj.length; i++) {
- arr[i] = obj[i];
- }
-
- return arr;
- };
-
-
- /**
- Generates an unique ID. The only way a user would be able to get the same ID is if the two persons
- at the same exact millisecond manage to get the same 5 random numbers between 0-65535; it also uses
- a counter so each ID is guaranteed to be unique for the given page. It is more probable for the earth
- to be hit with an asteroid.
-
- @method guid
- @static
- @param {String} prefix to prepend (by default 'o' will be prepended).
- @method guid
- @return {String} Virtually unique id.
- */
- var guid = (function() {
- var counter = 0;
-
- return function(prefix) {
- var guid = new Date().getTime().toString(32), i;
-
- for (i = 0; i < 5; i++) {
- guid += Math.floor(Math.random() * 65535).toString(32);
- }
-
- return (prefix || 'o_') + guid + (counter++).toString(32);
- };
- }());
-
-
- /**
- Trims white spaces around the string
-
- @method trim
- @static
- @param {String} str
- @return {String}
- */
- var trim = function(str) {
- if (!str) {
- return str;
- }
- return String.prototype.trim ? String.prototype.trim.call(str) : str.toString().replace(/^\s*/, '').replace(/\s*$/, '');
- };
-
-
- /**
- Parses the specified size string into a byte value. For example 10kb becomes 10240.
-
- @method parseSizeStr
- @static
- @param {String/Number} size String to parse or number to just pass through.
- @return {Number} Size in bytes.
- */
- var parseSizeStr = function(size) {
- if (typeof(size) !== 'string') {
- return size;
- }
-
- var muls = {
- t: 1099511627776,
- g: 1073741824,
- m: 1048576,
- k: 1024
- },
- mul;
-
-
- size = /^([0-9\.]+)([tmgk]?)$/.exec(size.toLowerCase().replace(/[^0-9\.tmkg]/g, ''));
- mul = size[2];
- size = +size[1];
-
- if (muls.hasOwnProperty(mul)) {
- size *= muls[mul];
- }
- return Math.floor(size);
- };
-
-
- /**
- * Pseudo sprintf implementation - simple way to replace tokens with specified values.
- *
- * @param {String} str String with tokens
- * @return {String} String with replaced tokens
- */
- var sprintf = function(str) {
- var args = [].slice.call(arguments, 1);
-
- return str.replace(/%[a-z]/g, function() {
- var value = args.shift();
- return typeOf(value) !== 'undefined' ? value : '';
- });
- };
-
-
- return {
- guid: guid,
- typeOf: typeOf,
- extend: extend,
- each: each,
- isEmptyObj: isEmptyObj,
- inSeries: inSeries,
- inParallel: inParallel,
- inArray: inArray,
- arrayDiff: arrayDiff,
- arrayIntersect: arrayIntersect,
- toArray: toArray,
- trim: trim,
- sprintf: sprintf,
- parseSizeStr: parseSizeStr
- };
-});
-
-// Included from: src/javascript/core/utils/Env.js
-
-/**
- * Env.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define("moxie/core/utils/Env", [
- "moxie/core/utils/Basic"
-], function(Basic) {
-
- /**
- * UAParser.js v0.7.7
- * Lightweight JavaScript-based User-Agent string parser
- * https://github.com/faisalman/ua-parser-js
- *
- * Copyright © 2012-2015 Faisal Salman
- * Dual licensed under GPLv2 & MIT
- */
- var UAParser = (function (undefined) {
-
- //////////////
- // Constants
- /////////////
-
-
- var EMPTY = '',
- UNKNOWN = '?',
- FUNC_TYPE = 'function',
- UNDEF_TYPE = 'undefined',
- OBJ_TYPE = 'object',
- MAJOR = 'major',
- MODEL = 'model',
- NAME = 'name',
- TYPE = 'type',
- VENDOR = 'vendor',
- VERSION = 'version',
- ARCHITECTURE= 'architecture',
- CONSOLE = 'console',
- MOBILE = 'mobile',
- TABLET = 'tablet';
-
-
- ///////////
- // Helper
- //////////
-
-
- var util = {
- has : function (str1, str2) {
- return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1;
- },
- lowerize : function (str) {
- return str.toLowerCase();
- }
- };
-
-
- ///////////////
- // Map helper
- //////////////
-
-
- var mapper = {
-
- rgx : function () {
-
- // loop through all regexes maps
- for (var result, i = 0, j, k, p, q, matches, match, args = arguments; i < args.length; i += 2) {
-
- var regex = args[i], // even sequence (0,2,4,..)
- props = args[i + 1]; // odd sequence (1,3,5,..)
-
- // construct object barebones
- if (typeof(result) === UNDEF_TYPE) {
- result = {};
- for (p in props) {
- q = props[p];
- if (typeof(q) === OBJ_TYPE) {
- result[q[0]] = undefined;
- } else {
- result[q] = undefined;
- }
- }
- }
-
- // try matching uastring with regexes
- for (j = k = 0; j < regex.length; j++) {
- matches = regex[j].exec(this.getUA());
- if (!!matches) {
- for (p = 0; p < props.length; p++) {
- match = matches[++k];
- q = props[p];
- // check if given property is actually array
- if (typeof(q) === OBJ_TYPE && q.length > 0) {
- if (q.length == 2) {
- if (typeof(q[1]) == FUNC_TYPE) {
- // assign modified match
- result[q[0]] = q[1].call(this, match);
- } else {
- // assign given value, ignore regex match
- result[q[0]] = q[1];
- }
- } else if (q.length == 3) {
- // check whether function or regex
- if (typeof(q[1]) === FUNC_TYPE && !(q[1].exec && q[1].test)) {
- // call function (usually string mapper)
- result[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
- } else {
- // sanitize match using given regex
- result[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
- }
- } else if (q.length == 4) {
- result[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
- }
- } else {
- result[q] = match ? match : undefined;
- }
- }
- break;
- }
- }
-
- if(!!matches) break; // break the loop immediately if match found
- }
- return result;
- },
-
- str : function (str, map) {
-
- for (var i in map) {
- // check if array
- if (typeof(map[i]) === OBJ_TYPE && map[i].length > 0) {
- for (var j = 0; j < map[i].length; j++) {
- if (util.has(map[i][j], str)) {
- return (i === UNKNOWN) ? undefined : i;
- }
- }
- } else if (util.has(map[i], str)) {
- return (i === UNKNOWN) ? undefined : i;
- }
- }
- return str;
- }
- };
-
-
- ///////////////
- // String map
- //////////////
-
-
- var maps = {
-
- browser : {
- oldsafari : {
- major : {
- '1' : ['/8', '/1', '/3'],
- '2' : '/4',
- '?' : '/'
- },
- version : {
- '1.0' : '/8',
- '1.2' : '/1',
- '1.3' : '/3',
- '2.0' : '/412',
- '2.0.2' : '/416',
- '2.0.3' : '/417',
- '2.0.4' : '/419',
- '?' : '/'
- }
- }
- },
-
- device : {
- sprint : {
- model : {
- 'Evo Shift 4G' : '7373KT'
- },
- vendor : {
- 'HTC' : 'APA',
- 'Sprint' : 'Sprint'
- }
- }
- },
-
- os : {
- windows : {
- version : {
- 'ME' : '4.90',
- 'NT 3.11' : 'NT3.51',
- 'NT 4.0' : 'NT4.0',
- '2000' : 'NT 5.0',
- 'XP' : ['NT 5.1', 'NT 5.2'],
- 'Vista' : 'NT 6.0',
- '7' : 'NT 6.1',
- '8' : 'NT 6.2',
- '8.1' : 'NT 6.3',
- 'RT' : 'ARM'
- }
- }
- }
- };
-
-
- //////////////
- // Regex map
- /////////////
-
-
- var regexes = {
-
- browser : [[
-
- // Presto based
- /(opera\smini)\/([\w\.-]+)/i, // Opera Mini
- /(opera\s[mobiletab]+).+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
- /(opera).+version\/([\w\.]+)/i, // Opera > 9.80
- /(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80
-
- ], [NAME, VERSION], [
-
- /\s(opr)\/([\w\.]+)/i // Opera Webkit
- ], [[NAME, 'Opera'], VERSION], [
-
- // Mixed
- /(kindle)\/([\w\.]+)/i, // Kindle
- /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,
- // Lunascape/Maxthon/Netfront/Jasmine/Blazer
-
- // Trident based
- /(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,
- // Avant/IEMobile/SlimBrowser/Baidu
- /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
-
- // Webkit/KHTML based
- /(rekonq)\/([\w\.]+)*/i, // Rekonq
- /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi)\/([\w\.-]+)/i
- // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron
- ], [NAME, VERSION], [
-
- /(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
- ], [[NAME, 'IE'], VERSION], [
-
- /(edge)\/((\d+)?[\w\.]+)/i // Microsoft Edge
- ], [NAME, VERSION], [
-
- /(yabrowser)\/([\w\.]+)/i // Yandex
- ], [[NAME, 'Yandex'], VERSION], [
-
- /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
- ], [[NAME, /_/g, ' '], VERSION], [
-
- /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,
- // Chrome/OmniWeb/Arora/Tizen/Nokia
- /(uc\s?browser|qqbrowser)[\/\s]?([\w\.]+)/i
- // UCBrowser/QQBrowser
- ], [NAME, VERSION], [
-
- /(dolfin)\/([\w\.]+)/i // Dolphin
- ], [[NAME, 'Dolphin'], VERSION], [
-
- /((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
- ], [[NAME, 'Chrome'], VERSION], [
-
- /XiaoMi\/MiuiBrowser\/([\w\.]+)/i // MIUI Browser
- ], [VERSION, [NAME, 'MIUI Browser']], [
-
- /android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)/i // Android Browser
- ], [VERSION, [NAME, 'Android Browser']], [
-
- /FBAV\/([\w\.]+);/i // Facebook App for iOS
- ], [VERSION, [NAME, 'Facebook']], [
-
- /version\/([\w\.]+).+?mobile\/\w+\s(safari)/i // Mobile Safari
- ], [VERSION, [NAME, 'Mobile Safari']], [
-
- /version\/([\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
- ], [VERSION, NAME], [
-
- /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
- ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
-
- /(konqueror)\/([\w\.]+)/i, // Konqueror
- /(webkit|khtml)\/([\w\.]+)/i
- ], [NAME, VERSION], [
-
- // Gecko based
- /(navigator|netscape)\/([\w\.-]+)/i // Netscape
- ], [[NAME, 'Netscape'], VERSION], [
- /(swiftfox)/i, // Swiftfox
- /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
- // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
- /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,
- // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
- /(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla
-
- // Other
- /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf)[\/\s]?([\w\.]+)/i,
- // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf
- /(links)\s\(([\w\.]+)/i, // Links
- /(gobrowser)\/?([\w\.]+)*/i, // GoBrowser
- /(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser
- /(mosaic)[\/\s]([\w\.]+)/i // Mosaic
- ], [NAME, VERSION]
- ],
-
- engine : [[
-
- /windows.+\sedge\/([\w\.]+)/i // EdgeHTML
- ], [VERSION, [NAME, 'EdgeHTML']], [
-
- /(presto)\/([\w\.]+)/i, // Presto
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m
- /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
- /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
- ], [NAME, VERSION], [
-
- /rv\:([\w\.]+).*(gecko)/i // Gecko
- ], [VERSION, NAME]
- ],
-
- os : [[
-
- // Windows based
- /microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
- ], [NAME, VERSION], [
- /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
- /(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
- ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
- /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
- ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
-
- // Mobile/Embedded OS
- /\((bb)(10);/i // BlackBerry 10
- ], [[NAME, 'BlackBerry'], VERSION], [
- /(blackberry)\w*\/?([\w\.]+)*/i, // Blackberry
- /(tizen)[\/\s]([\w\.]+)/i, // Tizen
- /(android|webos|palm\os|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,
- // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki
- /linux;.+(sailfish);/i // Sailfish OS
- ], [NAME, VERSION], [
- /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i // Symbian
- ], [[NAME, 'Symbian'], VERSION], [
- /\((series40);/i // Series 40
- ], [NAME], [
- /mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
- ], [[NAME, 'Firefox OS'], VERSION], [
-
- // Console
- /(nintendo|playstation)\s([wids3portablevu]+)/i, // Nintendo/Playstation
-
- // GNU/Linux based
- /(mint)[\/\s\(]?(\w+)*/i, // Mint
- /(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
- /(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?([\w\.-]+)*/i,
- // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
- // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
- /(hurd|linux)\s?([\w\.]+)*/i, // Hurd/Linux
- /(gnu)\s?([\w\.]+)*/i // GNU
- ], [NAME, VERSION], [
-
- /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
- ], [[NAME, 'Chromium OS'], VERSION],[
-
- // Solaris
- /(sunos)\s?([\w\.]+\d)*/i // Solaris
- ], [[NAME, 'Solaris'], VERSION], [
-
- // BSD based
- /\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
- ], [NAME, VERSION],[
-
- /(ip[honead]+)(?:.*os\s*([\w]+)*\slike\smac|;\sopera)/i // iOS
- ], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [
-
- /(mac\sos\sx)\s?([\w\s\.]+\w)*/i,
- /(macintosh|mac(?=_powerpc)\s)/i // Mac OS
- ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
-
- // Other
- /((?:open)?solaris)[\/\s-]?([\w\.]+)*/i, // Solaris
- /(haiku)\s(\w+)/i, // Haiku
- /(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, // AIX
- /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,
- // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS
- /(unix)\s?([\w\.]+)*/i // UNIX
- ], [NAME, VERSION]
- ]
- };
-
-
- /////////////////
- // Constructor
- ////////////////
-
-
- var UAParser = function (uastring) {
-
- var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
-
- this.getBrowser = function () {
- return mapper.rgx.apply(this, regexes.browser);
- };
- this.getEngine = function () {
- return mapper.rgx.apply(this, regexes.engine);
- };
- this.getOS = function () {
- return mapper.rgx.apply(this, regexes.os);
- };
- this.getResult = function() {
- return {
- ua : this.getUA(),
- browser : this.getBrowser(),
- engine : this.getEngine(),
- os : this.getOS()
- };
- };
- this.getUA = function () {
- return ua;
- };
- this.setUA = function (uastring) {
- ua = uastring;
- return this;
- };
- this.setUA(ua);
- };
-
- return UAParser;
- })();
-
-
- function version_compare(v1, v2, operator) {
- // From: http://phpjs.org/functions
- // + original by: Philippe Jausions (http://pear.php.net/user/jausions)
- // + original by: Aidan Lister (http://aidanlister.com/)
- // + reimplemented by: Kankrelune (http://www.webfaktory.info/)
- // + improved by: Brett Zamir (http://brett-zamir.me)
- // + improved by: Scott Baker
- // + improved by: Theriault
- // * example 1: version_compare('8.2.5rc', '8.2.5a');
- // * returns 1: 1
- // * example 2: version_compare('8.2.50', '8.2.52', '<');
- // * returns 2: true
- // * example 3: version_compare('5.3.0-dev', '5.3.0');
- // * returns 3: -1
- // * example 4: version_compare('4.1.0.52','4.01.0.51');
- // * returns 4: 1
-
- // Important: compare must be initialized at 0.
- var i = 0,
- x = 0,
- compare = 0,
- // vm maps textual PHP versions to negatives so they're less than 0.
- // PHP currently defines these as CASE-SENSITIVE. It is important to
- // leave these as negatives so that they can come before numerical versions
- // and as if no letters were there to begin with.
- // (1alpha is < 1 and < 1.1 but > 1dev1)
- // If a non-numerical value can't be mapped to this table, it receives
- // -7 as its value.
- vm = {
- 'dev': -6,
- 'alpha': -5,
- 'a': -5,
- 'beta': -4,
- 'b': -4,
- 'RC': -3,
- 'rc': -3,
- '#': -2,
- 'p': 1,
- 'pl': 1
- },
- // This function will be called to prepare each version argument.
- // It replaces every _, -, and + with a dot.
- // It surrounds any nonsequence of numbers/dots with dots.
- // It replaces sequences of dots with a single dot.
- // version_compare('4..0', '4.0') == 0
- // Important: A string of 0 length needs to be converted into a value
- // even less than an unexisting value in vm (-7), hence [-8].
- // It's also important to not strip spaces because of this.
- // version_compare('', ' ') == 1
- prepVersion = function (v) {
- v = ('' + v).replace(/[_\-+]/g, '.');
- v = v.replace(/([^.\d]+)/g, '.$1.').replace(/\.{2,}/g, '.');
- return (!v.length ? [-8] : v.split('.'));
- },
- // This converts a version component to a number.
- // Empty component becomes 0.
- // Non-numerical component becomes a negative number.
- // Numerical component becomes itself as an integer.
- numVersion = function (v) {
- return !v ? 0 : (isNaN(v) ? vm[v] || -7 : parseInt(v, 10));
- };
-
- v1 = prepVersion(v1);
- v2 = prepVersion(v2);
- x = Math.max(v1.length, v2.length);
- for (i = 0; i < x; i++) {
- if (v1[i] == v2[i]) {
- continue;
- }
- v1[i] = numVersion(v1[i]);
- v2[i] = numVersion(v2[i]);
- if (v1[i] < v2[i]) {
- compare = -1;
- break;
- } else if (v1[i] > v2[i]) {
- compare = 1;
- break;
- }
- }
- if (!operator) {
- return compare;
- }
-
- // Important: operator is CASE-SENSITIVE.
- // "No operator" seems to be treated as "<."
- // Any other values seem to make the function return null.
- switch (operator) {
- case '>':
- case 'gt':
- return (compare > 0);
- case '>=':
- case 'ge':
- return (compare >= 0);
- case '<=':
- case 'le':
- return (compare <= 0);
- case '==':
- case '=':
- case 'eq':
- return (compare === 0);
- case '<>':
- case '!=':
- case 'ne':
- return (compare !== 0);
- case '':
- case '<':
- case 'lt':
- return (compare < 0);
- default:
- return null;
- }
- }
-
-
- var can = (function() {
- var caps = {
- define_property: (function() {
- /* // currently too much extra code required, not exactly worth it
- try { // as of IE8, getters/setters are supported only on DOM elements
- var obj = {};
- if (Object.defineProperty) {
- Object.defineProperty(obj, 'prop', {
- enumerable: true,
- configurable: true
- });
- return true;
- }
- } catch(ex) {}
-
- if (Object.prototype.__defineGetter__ && Object.prototype.__defineSetter__) {
- return true;
- }*/
- return false;
- }()),
-
- create_canvas: (function() {
- // On the S60 and BB Storm, getContext exists, but always returns undefined
- // so we actually have to call getContext() to verify
- // github.com/Modernizr/Modernizr/issues/issue/97/
- var el = document.createElement('canvas');
- return !!(el.getContext && el.getContext('2d'));
- }()),
-
- return_response_type: function(responseType) {
- try {
- if (Basic.inArray(responseType, ['', 'text', 'document']) !== -1) {
- return true;
- } else if (window.XMLHttpRequest) {
- var xhr = new XMLHttpRequest();
- xhr.open('get', '/'); // otherwise Gecko throws an exception
- if ('responseType' in xhr) {
- xhr.responseType = responseType;
- // as of 23.0.1271.64, Chrome switched from throwing exception to merely logging it to the console (why? o why?)
- if (xhr.responseType !== responseType) {
- return false;
- }
- return true;
- }
- }
- } catch (ex) {}
- return false;
- },
-
- // ideas for this heavily come from Modernizr (http://modernizr.com/)
- use_data_uri: (function() {
- var du = new Image();
-
- du.onload = function() {
- caps.use_data_uri = (du.width === 1 && du.height === 1);
- };
-
- setTimeout(function() {
- du.src = "data:image/gif;base64,R0lGODlhAQABAIAAAP8AAAAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==";
- }, 1);
- return false;
- }()),
-
- use_data_uri_over32kb: function() { // IE8
- return caps.use_data_uri && (Env.browser !== 'IE' || Env.version >= 9);
- },
-
- use_data_uri_of: function(bytes) {
- return (caps.use_data_uri && bytes < 33000 || caps.use_data_uri_over32kb());
- },
-
- use_fileinput: function() {
- if (navigator.userAgent.match(/(Android (1.0|1.1|1.5|1.6|2.0|2.1))|(Windows Phone (OS 7|8.0))|(XBLWP)|(ZuneWP)|(w(eb)?OSBrowser)|(webOS)|(Kindle\/(1.0|2.0|2.5|3.0))/)) {
- return false;
- }
-
- var el = document.createElement('input');
- el.setAttribute('type', 'file');
- return !el.disabled;
- }
- };
-
- return function(cap) {
- var args = [].slice.call(arguments);
- args.shift(); // shift of cap
- return Basic.typeOf(caps[cap]) === 'function' ? caps[cap].apply(this, args) : !!caps[cap];
- };
- }());
-
-
- var uaResult = new UAParser().getResult();
-
-
- var Env = {
- can: can,
-
- uaParser: UAParser,
-
- browser: uaResult.browser.name,
- version: uaResult.browser.version,
- os: uaResult.os.name, // everybody intuitively types it in a lowercase for some reason
- osVersion: uaResult.os.version,
-
- verComp: version_compare,
-
- global_event_dispatcher: "moxie.core.EventTarget.instance.dispatchEvent"
- };
-
- // for backward compatibility
- // @deprecated Use `Env.os` instead
- Env.OS = Env.os;
-
- if (MXI_DEBUG) {
- Env.debug = {
- runtime: true,
- events: false
- };
-
- Env.log = function() {
-
- function logObj(data) {
- // TODO: this should recursively print out the object in a pretty way
- console.appendChild(document.createTextNode(data + "\n"));
- }
-
- var data = arguments[0];
-
- if (Basic.typeOf(data) === 'string') {
- data = Basic.sprintf.apply(this, arguments);
- }
-
- if (window && window.console && window.console.log) {
- window.console.log(data);
- } else if (document) {
- var console = document.getElementById('moxie-console');
- if (!console) {
- console = document.createElement('pre');
- console.id = 'moxie-console';
- //console.style.display = 'none';
- document.body.appendChild(console);
- }
-
- if (Basic.inArray(Basic.typeOf(data), ['object', 'array']) !== -1) {
- logObj(data);
- } else {
- console.appendChild(document.createTextNode(data + "\n"));
- }
- }
- };
- }
-
- return Env;
-});
-
-// Included from: src/javascript/core/I18n.js
-
-/**
- * I18n.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define("moxie/core/I18n", [
- "moxie/core/utils/Basic"
-], function(Basic) {
- var i18n = {};
-
- return {
- /**
- * Extends the language pack object with new items.
- *
- * @param {Object} pack Language pack items to add.
- * @return {Object} Extended language pack object.
- */
- addI18n: function(pack) {
- return Basic.extend(i18n, pack);
- },
-
- /**
- * Translates the specified string by checking for the english string in the language pack lookup.
- *
- * @param {String} str String to look for.
- * @return {String} Translated string or the input string if it wasn't found.
- */
- translate: function(str) {
- return i18n[str] || str;
- },
-
- /**
- * Shortcut for translate function
- *
- * @param {String} str String to look for.
- * @return {String} Translated string or the input string if it wasn't found.
- */
- _: function(str) {
- return this.translate(str);
- },
-
- /**
- * Pseudo sprintf implementation - simple way to replace tokens with specified values.
- *
- * @param {String} str String with tokens
- * @return {String} String with replaced tokens
- */
- sprintf: function(str) {
- var args = [].slice.call(arguments, 1);
-
- return str.replace(/%[a-z]/g, function() {
- var value = args.shift();
- return Basic.typeOf(value) !== 'undefined' ? value : '';
- });
- }
- };
-});
-
-// Included from: src/javascript/core/utils/Mime.js
-
-/**
- * Mime.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define("moxie/core/utils/Mime", [
- "moxie/core/utils/Basic",
- "moxie/core/I18n"
-], function(Basic, I18n) {
-
- var mimeData = "" +
- "application/msword,doc dot," +
- "application/pdf,pdf," +
- "application/pgp-signature,pgp," +
- "application/postscript,ps ai eps," +
- "application/rtf,rtf," +
- "application/vnd.ms-excel,xls xlb," +
- "application/vnd.ms-powerpoint,ppt pps pot," +
- "application/zip,zip," +
- "application/x-shockwave-flash,swf swfl," +
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document,docx," +
- "application/vnd.openxmlformats-officedocument.wordprocessingml.template,dotx," +
- "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlsx," +
- "application/vnd.openxmlformats-officedocument.presentationml.presentation,pptx," +
- "application/vnd.openxmlformats-officedocument.presentationml.template,potx," +
- "application/vnd.openxmlformats-officedocument.presentationml.slideshow,ppsx," +
- "application/x-javascript,js," +
- "application/json,json," +
- "audio/mpeg,mp3 mpga mpega mp2," +
- "audio/x-wav,wav," +
- "audio/x-m4a,m4a," +
- "audio/ogg,oga ogg," +
- "audio/aiff,aiff aif," +
- "audio/flac,flac," +
- "audio/aac,aac," +
- "audio/ac3,ac3," +
- "audio/x-ms-wma,wma," +
- "image/bmp,bmp," +
- "image/gif,gif," +
- "image/jpeg,jpg jpeg jpe," +
- "image/photoshop,psd," +
- "image/png,png," +
- "image/svg+xml,svg svgz," +
- "image/tiff,tiff tif," +
- "text/plain,asc txt text diff log," +
- "text/html,htm html xhtml," +
- "text/css,css," +
- "text/csv,csv," +
- "text/rtf,rtf," +
- "video/mpeg,mpeg mpg mpe m2v," +
- "video/quicktime,qt mov," +
- "video/mp4,mp4," +
- "video/x-m4v,m4v," +
- "video/x-flv,flv," +
- "video/x-ms-wmv,wmv," +
- "video/avi,avi," +
- "video/webm,webm," +
- "video/3gpp,3gpp 3gp," +
- "video/3gpp2,3g2," +
- "video/vnd.rn-realvideo,rv," +
- "video/ogg,ogv," +
- "video/x-matroska,mkv," +
- "application/vnd.oasis.opendocument.formula-template,otf," +
- "application/octet-stream,exe";
-
-
- var Mime = {
-
- mimes: {},
-
- extensions: {},
-
- // Parses the default mime types string into a mimes and extensions lookup maps
- addMimeType: function (mimeData) {
- var items = mimeData.split(/,/), i, ii, ext;
-
- for (i = 0; i < items.length; i += 2) {
- ext = items[i + 1].split(/ /);
-
- // extension to mime lookup
- for (ii = 0; ii < ext.length; ii++) {
- this.mimes[ext[ii]] = items[i];
- }
- // mime to extension lookup
- this.extensions[items[i]] = ext;
- }
- },
-
-
- extList2mimes: function (filters, addMissingExtensions) {
- var self = this, ext, i, ii, type, mimes = [];
-
- // convert extensions to mime types list
- for (i = 0; i < filters.length; i++) {
- ext = filters[i].extensions.split(/\s*,\s*/);
-
- for (ii = 0; ii < ext.length; ii++) {
-
- // if there's an asterisk in the list, then accept attribute is not required
- if (ext[ii] === '*') {
- return [];
- }
-
- type = self.mimes[ext[ii]];
- if (type && Basic.inArray(type, mimes) === -1) {
- mimes.push(type);
- }
-
- // future browsers should filter by extension, finally
- if (addMissingExtensions && /^\w+$/.test(ext[ii])) {
- mimes.push('.' + ext[ii]);
- } else if (!type) {
- // if we have no type in our map, then accept all
- return [];
- }
- }
- }
- return mimes;
- },
-
-
- mimes2exts: function(mimes) {
- var self = this, exts = [];
-
- Basic.each(mimes, function(mime) {
- if (mime === '*') {
- exts = [];
- return false;
- }
-
- // check if this thing looks like mime type
- var m = mime.match(/^(\w+)\/(\*|\w+)$/);
- if (m) {
- if (m[2] === '*') {
- // wildcard mime type detected
- Basic.each(self.extensions, function(arr, mime) {
- if ((new RegExp('^' + m[1] + '/')).test(mime)) {
- [].push.apply(exts, self.extensions[mime]);
- }
- });
- } else if (self.extensions[mime]) {
- [].push.apply(exts, self.extensions[mime]);
- }
- }
- });
- return exts;
- },
-
-
- mimes2extList: function(mimes) {
- var accept = [], exts = [];
-
- if (Basic.typeOf(mimes) === 'string') {
- mimes = Basic.trim(mimes).split(/\s*,\s*/);
- }
-
- exts = this.mimes2exts(mimes);
-
- accept.push({
- title: I18n.translate('Files'),
- extensions: exts.length ? exts.join(',') : '*'
- });
-
- // save original mimes string
- accept.mimes = mimes;
-
- return accept;
- },
-
-
- getFileExtension: function(fileName) {
- var matches = fileName && fileName.match(/\.([^.]+)$/);
- if (matches) {
- return matches[1].toLowerCase();
- }
- return '';
- },
-
- getFileMime: function(fileName) {
- return this.mimes[this.getFileExtension(fileName)] || '';
- }
- };
-
- Mime.addMimeType(mimeData);
-
- return Mime;
-});
-
-// Included from: src/javascript/core/utils/Dom.js
-
-/**
- * Dom.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/core/utils/Dom', ['moxie/core/utils/Env'], function(Env) {
-
- /**
- Get DOM Element by it's id.
-
- @method get
- @for Utils
- @param {String} id Identifier of the DOM Element
- @return {DOMElement}
- */
- var get = function(id) {
- if (typeof id !== 'string') {
- return id;
- }
- return document.getElementById(id);
- };
-
- /**
- Checks if specified DOM element has specified class.
-
- @method hasClass
- @static
- @param {Object} obj DOM element like object to add handler to.
- @param {String} name Class name
- */
- var hasClass = function(obj, name) {
- if (!obj.className) {
- return false;
- }
-
- var regExp = new RegExp("(^|\\s+)"+name+"(\\s+|$)");
- return regExp.test(obj.className);
- };
-
- /**
- Adds specified className to specified DOM element.
-
- @method addClass
- @static
- @param {Object} obj DOM element like object to add handler to.
- @param {String} name Class name
- */
- var addClass = function(obj, name) {
- if (!hasClass(obj, name)) {
- obj.className = !obj.className ? name : obj.className.replace(/\s+$/, '') + ' ' + name;
- }
- };
-
- /**
- Removes specified className from specified DOM element.
-
- @method removeClass
- @static
- @param {Object} obj DOM element like object to add handler to.
- @param {String} name Class name
- */
- var removeClass = function(obj, name) {
- if (obj.className) {
- var regExp = new RegExp("(^|\\s+)"+name+"(\\s+|$)");
- obj.className = obj.className.replace(regExp, function($0, $1, $2) {
- return $1 === ' ' && $2 === ' ' ? ' ' : '';
- });
- }
- };
-
- /**
- Returns a given computed style of a DOM element.
-
- @method getStyle
- @static
- @param {Object} obj DOM element like object.
- @param {String} name Style you want to get from the DOM element
- */
- var getStyle = function(obj, name) {
- if (obj.currentStyle) {
- return obj.currentStyle[name];
- } else if (window.getComputedStyle) {
- return window.getComputedStyle(obj, null)[name];
- }
- };
-
-
- /**
- Returns the absolute x, y position of an Element. The position will be returned in a object with x, y fields.
-
- @method getPos
- @static
- @param {Element} node HTML element or element id to get x, y position from.
- @param {Element} root Optional root element to stop calculations at.
- @return {object} Absolute position of the specified element object with x, y fields.
- */
- var getPos = function(node, root) {
- var x = 0, y = 0, parent, doc = document, nodeRect, rootRect;
-
- node = node;
- root = root || doc.body;
-
- // Returns the x, y cordinate for an element on IE 6 and IE 7
- function getIEPos(node) {
- var bodyElm, rect, x = 0, y = 0;
-
- if (node) {
- rect = node.getBoundingClientRect();
- bodyElm = doc.compatMode === "CSS1Compat" ? doc.documentElement : doc.body;
- x = rect.left + bodyElm.scrollLeft;
- y = rect.top + bodyElm.scrollTop;
- }
-
- return {
- x : x,
- y : y
- };
- }
-
- // Use getBoundingClientRect on IE 6 and IE 7 but not on IE 8 in standards mode
- if (node && node.getBoundingClientRect && Env.browser === 'IE' && (!doc.documentMode || doc.documentMode < 8)) {
- nodeRect = getIEPos(node);
- rootRect = getIEPos(root);
-
- return {
- x : nodeRect.x - rootRect.x,
- y : nodeRect.y - rootRect.y
- };
- }
-
- parent = node;
- while (parent && parent != root && parent.nodeType) {
- x += parent.offsetLeft || 0;
- y += parent.offsetTop || 0;
- parent = parent.offsetParent;
- }
-
- parent = node.parentNode;
- while (parent && parent != root && parent.nodeType) {
- x -= parent.scrollLeft || 0;
- y -= parent.scrollTop || 0;
- parent = parent.parentNode;
- }
-
- return {
- x : x,
- y : y
- };
- };
-
- /**
- Returns the size of the specified node in pixels.
-
- @method getSize
- @static
- @param {Node} node Node to get the size of.
- @return {Object} Object with a w and h property.
- */
- var getSize = function(node) {
- return {
- w : node.offsetWidth || node.clientWidth,
- h : node.offsetHeight || node.clientHeight
- };
- };
-
- return {
- get: get,
- hasClass: hasClass,
- addClass: addClass,
- removeClass: removeClass,
- getStyle: getStyle,
- getPos: getPos,
- getSize: getSize
- };
-});
-
-// Included from: src/javascript/core/Exceptions.js
-
-/**
- * Exceptions.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/core/Exceptions', [
- 'moxie/core/utils/Basic'
-], function(Basic) {
- function _findKey(obj, value) {
- var key;
- for (key in obj) {
- if (obj[key] === value) {
- return key;
- }
- }
- return null;
- }
-
- return {
- RuntimeError: (function() {
- var namecodes = {
- NOT_INIT_ERR: 1,
- NOT_SUPPORTED_ERR: 9,
- JS_ERR: 4
- };
-
- function RuntimeError(code) {
- this.code = code;
- this.name = _findKey(namecodes, code);
- this.message = this.name + ": RuntimeError " + this.code;
- }
-
- Basic.extend(RuntimeError, namecodes);
- RuntimeError.prototype = Error.prototype;
- return RuntimeError;
- }()),
-
- OperationNotAllowedException: (function() {
-
- function OperationNotAllowedException(code) {
- this.code = code;
- this.name = 'OperationNotAllowedException';
- }
-
- Basic.extend(OperationNotAllowedException, {
- NOT_ALLOWED_ERR: 1
- });
-
- OperationNotAllowedException.prototype = Error.prototype;
-
- return OperationNotAllowedException;
- }()),
-
- ImageError: (function() {
- var namecodes = {
- WRONG_FORMAT: 1,
- MAX_RESOLUTION_ERR: 2,
- INVALID_META_ERR: 3
- };
-
- function ImageError(code) {
- this.code = code;
- this.name = _findKey(namecodes, code);
- this.message = this.name + ": ImageError " + this.code;
- }
-
- Basic.extend(ImageError, namecodes);
- ImageError.prototype = Error.prototype;
-
- return ImageError;
- }()),
-
- FileException: (function() {
- var namecodes = {
- NOT_FOUND_ERR: 1,
- SECURITY_ERR: 2,
- ABORT_ERR: 3,
- NOT_READABLE_ERR: 4,
- ENCODING_ERR: 5,
- NO_MODIFICATION_ALLOWED_ERR: 6,
- INVALID_STATE_ERR: 7,
- SYNTAX_ERR: 8
- };
-
- function FileException(code) {
- this.code = code;
- this.name = _findKey(namecodes, code);
- this.message = this.name + ": FileException " + this.code;
- }
-
- Basic.extend(FileException, namecodes);
- FileException.prototype = Error.prototype;
- return FileException;
- }()),
-
- DOMException: (function() {
- var namecodes = {
- INDEX_SIZE_ERR: 1,
- DOMSTRING_SIZE_ERR: 2,
- HIERARCHY_REQUEST_ERR: 3,
- WRONG_DOCUMENT_ERR: 4,
- INVALID_CHARACTER_ERR: 5,
- NO_DATA_ALLOWED_ERR: 6,
- NO_MODIFICATION_ALLOWED_ERR: 7,
- NOT_FOUND_ERR: 8,
- NOT_SUPPORTED_ERR: 9,
- INUSE_ATTRIBUTE_ERR: 10,
- INVALID_STATE_ERR: 11,
- SYNTAX_ERR: 12,
- INVALID_MODIFICATION_ERR: 13,
- NAMESPACE_ERR: 14,
- INVALID_ACCESS_ERR: 15,
- VALIDATION_ERR: 16,
- TYPE_MISMATCH_ERR: 17,
- SECURITY_ERR: 18,
- NETWORK_ERR: 19,
- ABORT_ERR: 20,
- URL_MISMATCH_ERR: 21,
- QUOTA_EXCEEDED_ERR: 22,
- TIMEOUT_ERR: 23,
- INVALID_NODE_TYPE_ERR: 24,
- DATA_CLONE_ERR: 25
- };
-
- function DOMException(code) {
- this.code = code;
- this.name = _findKey(namecodes, code);
- this.message = this.name + ": DOMException " + this.code;
- }
-
- Basic.extend(DOMException, namecodes);
- DOMException.prototype = Error.prototype;
- return DOMException;
- }()),
-
- EventException: (function() {
- function EventException(code) {
- this.code = code;
- this.name = 'EventException';
- }
-
- Basic.extend(EventException, {
- UNSPECIFIED_EVENT_TYPE_ERR: 0
- });
-
- EventException.prototype = Error.prototype;
-
- return EventException;
- }())
- };
-});
-
-// Included from: src/javascript/core/EventTarget.js
-
-/**
- * EventTarget.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/core/EventTarget', [
- 'moxie/core/utils/Env',
- 'moxie/core/Exceptions',
- 'moxie/core/utils/Basic'
-], function(Env, x, Basic) {
- /**
- Parent object for all event dispatching components and objects
-
- @class EventTarget
- @constructor EventTarget
- */
- function EventTarget() {
- // hash of event listeners by object uid
- var eventpool = {};
-
- Basic.extend(this, {
-
- /**
- Unique id of the event dispatcher, usually overriden by children
-
- @property uid
- @type String
- */
- uid: null,
-
- /**
- Can be called from within a child in order to acquire uniqie id in automated manner
-
- @method init
- */
- init: function() {
- if (!this.uid) {
- this.uid = Basic.guid('uid_');
- }
- },
-
- /**
- Register a handler to a specific event dispatched by the object
-
- @method addEventListener
- @param {String} type Type or basically a name of the event to subscribe to
- @param {Function} fn Callback function that will be called when event happens
- @param {Number} [priority=0] Priority of the event handler - handlers with higher priorities will be called first
- @param {Object} [scope=this] A scope to invoke event handler in
- */
- addEventListener: function(type, fn, priority, scope) {
- var self = this, list;
-
- // without uid no event handlers can be added, so make sure we got one
- if (!this.hasOwnProperty('uid')) {
- this.uid = Basic.guid('uid_');
- }
-
- type = Basic.trim(type);
-
- if (/\s/.test(type)) {
- // multiple event types were passed for one handler
- Basic.each(type.split(/\s+/), function(type) {
- self.addEventListener(type, fn, priority, scope);
- });
- return;
- }
-
- type = type.toLowerCase();
- priority = parseInt(priority, 10) || 0;
-
- list = eventpool[this.uid] && eventpool[this.uid][type] || [];
- list.push({fn : fn, priority : priority, scope : scope || this});
-
- if (!eventpool[this.uid]) {
- eventpool[this.uid] = {};
- }
- eventpool[this.uid][type] = list;
- },
-
- /**
- Check if any handlers were registered to the specified event
-
- @method hasEventListener
- @param {String} type Type or basically a name of the event to check
- @return {Mixed} Returns a handler if it was found and false, if - not
- */
- hasEventListener: function(type) {
- var list = type ? eventpool[this.uid] && eventpool[this.uid][type] : eventpool[this.uid];
- return list ? list : false;
- },
-
- /**
- Unregister the handler from the event, or if former was not specified - unregister all handlers
-
- @method removeEventListener
- @param {String} type Type or basically a name of the event
- @param {Function} [fn] Handler to unregister
- */
- removeEventListener: function(type, fn) {
- type = type.toLowerCase();
-
- var list = eventpool[this.uid] && eventpool[this.uid][type], i;
-
- if (list) {
- if (fn) {
- for (i = list.length - 1; i >= 0; i--) {
- if (list[i].fn === fn) {
- list.splice(i, 1);
- break;
- }
- }
- } else {
- list = [];
- }
-
- // delete event list if it has become empty
- if (!list.length) {
- delete eventpool[this.uid][type];
-
- // and object specific entry in a hash if it has no more listeners attached
- if (Basic.isEmptyObj(eventpool[this.uid])) {
- delete eventpool[this.uid];
- }
- }
- }
- },
-
- /**
- Remove all event handlers from the object
-
- @method removeAllEventListeners
- */
- removeAllEventListeners: function() {
- if (eventpool[this.uid]) {
- delete eventpool[this.uid];
- }
- },
-
- /**
- Dispatch the event
-
- @method dispatchEvent
- @param {String/Object} Type of event or event object to dispatch
- @param {Mixed} [...] Variable number of arguments to be passed to a handlers
- @return {Boolean} true by default and false if any handler returned false
- */
- dispatchEvent: function(type) {
- var uid, list, args, tmpEvt, evt = {}, result = true, undef;
-
- if (Basic.typeOf(type) !== 'string') {
- // we can't use original object directly (because of Silverlight)
- tmpEvt = type;
-
- if (Basic.typeOf(tmpEvt.type) === 'string') {
- type = tmpEvt.type;
-
- if (tmpEvt.total !== undef && tmpEvt.loaded !== undef) { // progress event
- evt.total = tmpEvt.total;
- evt.loaded = tmpEvt.loaded;
- }
- evt.async = tmpEvt.async || false;
- } else {
- throw new x.EventException(x.EventException.UNSPECIFIED_EVENT_TYPE_ERR);
- }
- }
-
- // check if event is meant to be dispatched on an object having specific uid
- if (type.indexOf('::') !== -1) {
- (function(arr) {
- uid = arr[0];
- type = arr[1];
- }(type.split('::')));
- } else {
- uid = this.uid;
- }
-
- type = type.toLowerCase();
-
- list = eventpool[uid] && eventpool[uid][type];
-
- if (list) {
- // sort event list by prority
- list.sort(function(a, b) { return b.priority - a.priority; });
-
- args = [].slice.call(arguments);
-
- // first argument will be pseudo-event object
- args.shift();
- evt.type = type;
- args.unshift(evt);
-
- if (MXI_DEBUG && Env.debug.events) {
- Env.log("Event '%s' fired on %u", evt.type, uid);
- }
-
- // Dispatch event to all listeners
- var queue = [];
- Basic.each(list, function(handler) {
- // explicitly set the target, otherwise events fired from shims do not get it
- args[0].target = handler.scope;
- // if event is marked as async, detach the handler
- if (evt.async) {
- queue.push(function(cb) {
- setTimeout(function() {
- cb(handler.fn.apply(handler.scope, args) === false);
- }, 1);
- });
- } else {
- queue.push(function(cb) {
- cb(handler.fn.apply(handler.scope, args) === false); // if handler returns false stop propagation
- });
- }
- });
- if (queue.length) {
- Basic.inSeries(queue, function(err) {
- result = !err;
- });
- }
- }
- return result;
- },
-
- /**
- Alias for addEventListener
-
- @method bind
- @protected
- */
- bind: function() {
- this.addEventListener.apply(this, arguments);
- },
-
- /**
- Alias for removeEventListener
-
- @method unbind
- @protected
- */
- unbind: function() {
- this.removeEventListener.apply(this, arguments);
- },
-
- /**
- Alias for removeAllEventListeners
-
- @method unbindAll
- @protected
- */
- unbindAll: function() {
- this.removeAllEventListeners.apply(this, arguments);
- },
-
- /**
- Alias for dispatchEvent
-
- @method trigger
- @protected
- */
- trigger: function() {
- return this.dispatchEvent.apply(this, arguments);
- },
-
-
- /**
- Handle properties of on[event] type.
-
- @method handleEventProps
- @private
- */
- handleEventProps: function(dispatches) {
- var self = this;
-
- this.bind(dispatches.join(' '), function(e) {
- var prop = 'on' + e.type.toLowerCase();
- if (Basic.typeOf(this[prop]) === 'function') {
- this[prop].apply(this, arguments);
- }
- });
-
- // object must have defined event properties, even if it doesn't make use of them
- Basic.each(dispatches, function(prop) {
- prop = 'on' + prop.toLowerCase(prop);
- if (Basic.typeOf(self[prop]) === 'undefined') {
- self[prop] = null;
- }
- });
- }
-
- });
- }
-
- EventTarget.instance = new EventTarget();
-
- return EventTarget;
-});
-
-// Included from: src/javascript/runtime/Runtime.js
-
-/**
- * Runtime.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/runtime/Runtime', [
- "moxie/core/utils/Env",
- "moxie/core/utils/Basic",
- "moxie/core/utils/Dom",
- "moxie/core/EventTarget"
-], function(Env, Basic, Dom, EventTarget) {
- var runtimeConstructors = {}, runtimes = {};
-
- /**
- Common set of methods and properties for every runtime instance
-
- @class Runtime
-
- @param {Object} options
- @param {String} type Sanitized name of the runtime
- @param {Object} [caps] Set of capabilities that differentiate specified runtime
- @param {Object} [modeCaps] Set of capabilities that do require specific operational mode
- @param {String} [preferredMode='browser'] Preferred operational mode to choose if no required capabilities were requested
- */
- function Runtime(options, type, caps, modeCaps, preferredMode) {
- /**
- Dispatched when runtime is initialized and ready.
- Results in RuntimeInit on a connected component.
-
- @event Init
- */
-
- /**
- Dispatched when runtime fails to initialize.
- Results in RuntimeError on a connected component.
-
- @event Error
- */
-
- var self = this
- , _shim
- , _uid = Basic.guid(type + '_')
- , defaultMode = preferredMode || 'browser'
- ;
-
- options = options || {};
-
- // register runtime in private hash
- runtimes[_uid] = this;
-
- /**
- Default set of capabilities, which can be redifined later by specific runtime
-
- @private
- @property caps
- @type Object
- */
- caps = Basic.extend({
- // Runtime can:
- // provide access to raw binary data of the file
- access_binary: false,
- // provide access to raw binary data of the image (image extension is optional)
- access_image_binary: false,
- // display binary data as thumbs for example
- display_media: false,
- // make cross-domain requests
- do_cors: false,
- // accept files dragged and dropped from the desktop
- drag_and_drop: false,
- // filter files in selection dialog by their extensions
- filter_by_extension: true,
- // resize image (and manipulate it raw data of any file in general)
- resize_image: false,
- // periodically report how many bytes of total in the file were uploaded (loaded)
- report_upload_progress: false,
- // provide access to the headers of http response
- return_response_headers: false,
- // support response of specific type, which should be passed as an argument
- // e.g. runtime.can('return_response_type', 'blob')
- return_response_type: false,
- // return http status code of the response
- return_status_code: true,
- // send custom http header with the request
- send_custom_headers: false,
- // pick up the files from a dialog
- select_file: false,
- // select whole folder in file browse dialog
- select_folder: false,
- // select multiple files at once in file browse dialog
- select_multiple: true,
- // send raw binary data, that is generated after image resizing or manipulation of other kind
- send_binary_string: false,
- // send cookies with http request and therefore retain session
- send_browser_cookies: true,
- // send data formatted as multipart/form-data
- send_multipart: true,
- // slice the file or blob to smaller parts
- slice_blob: false,
- // upload file without preloading it to memory, stream it out directly from disk
- stream_upload: false,
- // programmatically trigger file browse dialog
- summon_file_dialog: false,
- // upload file of specific size, size should be passed as argument
- // e.g. runtime.can('upload_filesize', '500mb')
- upload_filesize: true,
- // initiate http request with specific http method, method should be passed as argument
- // e.g. runtime.can('use_http_method', 'put')
- use_http_method: true
- }, caps);
-
-
- // default to the mode that is compatible with preferred caps
- if (options.preferred_caps) {
- defaultMode = Runtime.getMode(modeCaps, options.preferred_caps, defaultMode);
- }
-
- if (MXI_DEBUG && Env.debug.runtime) {
- Env.log("\tdefault mode: %s", defaultMode);
- }
-
- // small extension factory here (is meant to be extended with actual extensions constructors)
- _shim = (function() {
- var objpool = {};
- return {
- exec: function(uid, comp, fn, args) {
- if (_shim[comp]) {
- if (!objpool[uid]) {
- objpool[uid] = {
- context: this,
- instance: new _shim[comp]()
- };
- }
- if (objpool[uid].instance[fn]) {
- return objpool[uid].instance[fn].apply(this, args);
- }
- }
- },
-
- removeInstance: function(uid) {
- delete objpool[uid];
- },
-
- removeAllInstances: function() {
- var self = this;
- Basic.each(objpool, function(obj, uid) {
- if (Basic.typeOf(obj.instance.destroy) === 'function') {
- obj.instance.destroy.call(obj.context);
- }
- self.removeInstance(uid);
- });
- }
- };
- }());
-
-
- // public methods
- Basic.extend(this, {
- /**
- Specifies whether runtime instance was initialized or not
-
- @property initialized
- @type {Boolean}
- @default false
- */
- initialized: false, // shims require this flag to stop initialization retries
-
- /**
- Unique ID of the runtime
-
- @property uid
- @type {String}
- */
- uid: _uid,
-
- /**
- Runtime type (e.g. flash, html5, etc)
-
- @property type
- @type {String}
- */
- type: type,
-
- /**
- Runtime (not native one) may operate in browser or client mode.
-
- @property mode
- @private
- @type {String|Boolean} current mode or false, if none possible
- */
- mode: Runtime.getMode(modeCaps, (options.required_caps), defaultMode),
-
- /**
- id of the DOM container for the runtime (if available)
-
- @property shimid
- @type {String}
- */
- shimid: _uid + '_container',
-
- /**
- Number of connected clients. If equal to zero, runtime can be destroyed
-
- @property clients
- @type {Number}
- */
- clients: 0,
-
- /**
- Runtime initialization options
-
- @property options
- @type {Object}
- */
- options: options,
-
- /**
- Checks if the runtime has specific capability
-
- @method can
- @param {String} cap Name of capability to check
- @param {Mixed} [value] If passed, capability should somehow correlate to the value
- @param {Object} [refCaps] Set of capabilities to check the specified cap against (defaults to internal set)
- @return {Boolean} true if runtime has such capability and false, if - not
- */
- can: function(cap, value) {
- var refCaps = arguments[2] || caps;
-
- // if cap var is a comma-separated list of caps, convert it to object (key/value)
- if (Basic.typeOf(cap) === 'string' && Basic.typeOf(value) === 'undefined') {
- cap = Runtime.parseCaps(cap);
- }
-
- if (Basic.typeOf(cap) === 'object') {
- for (var key in cap) {
- if (!this.can(key, cap[key], refCaps)) {
- return false;
- }
- }
- return true;
- }
-
- // check the individual cap
- if (Basic.typeOf(refCaps[cap]) === 'function') {
- return refCaps[cap].call(this, value);
- } else {
- return (value === refCaps[cap]);
- }
- },
-
- /**
- Returns container for the runtime as DOM element
-
- @method getShimContainer
- @return {DOMElement}
- */
- getShimContainer: function() {
- var container, shimContainer = Dom.get(this.shimid);
-
- // if no container for shim, create one
- if (!shimContainer) {
- container = this.options.container ? Dom.get(this.options.container) : document.body;
-
- // create shim container and insert it at an absolute position into the outer container
- shimContainer = document.createElement('div');
- shimContainer.id = this.shimid;
- shimContainer.className = 'moxie-shim moxie-shim-' + this.type;
-
- Basic.extend(shimContainer.style, {
- position: 'absolute',
- top: '0px',
- left: '0px',
- width: '1px',
- height: '1px',
- overflow: 'hidden'
- });
-
- container.appendChild(shimContainer);
- container = null;
- }
-
- return shimContainer;
- },
-
- /**
- Returns runtime as DOM element (if appropriate)
-
- @method getShim
- @return {DOMElement}
- */
- getShim: function() {
- return _shim;
- },
-
- /**
- Invokes a method within the runtime itself (might differ across the runtimes)
-
- @method shimExec
- @param {Mixed} []
- @protected
- @return {Mixed} Depends on the action and component
- */
- shimExec: function(component, action) {
- var args = [].slice.call(arguments, 2);
- return self.getShim().exec.call(this, this.uid, component, action, args);
- },
-
- /**
- Operaional interface that is used by components to invoke specific actions on the runtime
- (is invoked in the scope of component)
-
- @method exec
- @param {Mixed} []*
- @protected
- @return {Mixed} Depends on the action and component
- */
- exec: function(component, action) { // this is called in the context of component, not runtime
- var args = [].slice.call(arguments, 2);
-
- if (self[component] && self[component][action]) {
- return self[component][action].apply(this, args);
- }
- return self.shimExec.apply(this, arguments);
- },
-
- /**
- Destroys the runtime (removes all events and deletes DOM structures)
-
- @method destroy
- */
- destroy: function() {
- if (!self) {
- return; // obviously already destroyed
- }
-
- var shimContainer = Dom.get(this.shimid);
- if (shimContainer) {
- shimContainer.parentNode.removeChild(shimContainer);
- }
-
- if (_shim) {
- _shim.removeAllInstances();
- }
-
- this.unbindAll();
- delete runtimes[this.uid];
- this.uid = null; // mark this runtime as destroyed
- _uid = self = _shim = shimContainer = null;
- }
- });
-
- // once we got the mode, test against all caps
- if (this.mode && options.required_caps && !this.can(options.required_caps)) {
- this.mode = false;
- }
- }
-
-
- /**
- Default order to try different runtime types
-
- @property order
- @type String
- @static
- */
- Runtime.order = 'html5,html4';
-
-
- /**
- Retrieves runtime from private hash by it's uid
-
- @method getRuntime
- @private
- @static
- @param {String} uid Unique identifier of the runtime
- @return {Runtime|Boolean} Returns runtime, if it exists and false, if - not
- */
- Runtime.getRuntime = function(uid) {
- return runtimes[uid] ? runtimes[uid] : false;
- };
-
-
- /**
- Register constructor for the Runtime of new (or perhaps modified) type
-
- @method addConstructor
- @static
- @param {String} type Runtime type (e.g. flash, html5, etc)
- @param {Function} construct Constructor for the Runtime type
- */
- Runtime.addConstructor = function(type, constructor) {
- constructor.prototype = EventTarget.instance;
- runtimeConstructors[type] = constructor;
- };
-
-
- /**
- Get the constructor for the specified type.
-
- method getConstructor
- @static
- @param {String} type Runtime type (e.g. flash, html5, etc)
- @return {Function} Constructor for the Runtime type
- */
- Runtime.getConstructor = function(type) {
- return runtimeConstructors[type] || null;
- };
-
-
- /**
- Get info about the runtime (uid, type, capabilities)
-
- @method getInfo
- @static
- @param {String} uid Unique identifier of the runtime
- @return {Mixed} Info object or null if runtime doesn't exist
- */
- Runtime.getInfo = function(uid) {
- var runtime = Runtime.getRuntime(uid);
-
- if (runtime) {
- return {
- uid: runtime.uid,
- type: runtime.type,
- mode: runtime.mode,
- can: function() {
- return runtime.can.apply(runtime, arguments);
- }
- };
- }
- return null;
- };
-
-
- /**
- Convert caps represented by a comma-separated string to the object representation.
-
- @method parseCaps
- @static
- @param {String} capStr Comma-separated list of capabilities
- @return {Object}
- */
- Runtime.parseCaps = function(capStr) {
- var capObj = {};
-
- if (Basic.typeOf(capStr) !== 'string') {
- return capStr || {};
- }
-
- Basic.each(capStr.split(','), function(key) {
- capObj[key] = true; // we assume it to be - true
- });
-
- return capObj;
- };
-
- /**
- Test the specified runtime for specific capabilities.
-
- @method can
- @static
- @param {String} type Runtime type (e.g. flash, html5, etc)
- @param {String|Object} caps Set of capabilities to check
- @return {Boolean} Result of the test
- */
- Runtime.can = function(type, caps) {
- var runtime
- , constructor = Runtime.getConstructor(type)
- , mode
- ;
- if (constructor) {
- runtime = new constructor({
- required_caps: caps
- });
- mode = runtime.mode;
- runtime.destroy();
- return !!mode;
- }
- return false;
- };
-
-
- /**
- Figure out a runtime that supports specified capabilities.
-
- @method thatCan
- @static
- @param {String|Object} caps Set of capabilities to check
- @param {String} [runtimeOrder] Comma-separated list of runtimes to check against
- @return {String} Usable runtime identifier or null
- */
- Runtime.thatCan = function(caps, runtimeOrder) {
- var types = (runtimeOrder || Runtime.order).split(/\s*,\s*/);
- for (var i in types) {
- if (Runtime.can(types[i], caps)) {
- return types[i];
- }
- }
- return null;
- };
-
-
- /**
- Figure out an operational mode for the specified set of capabilities.
-
- @method getMode
- @static
- @param {Object} modeCaps Set of capabilities that depend on particular runtime mode
- @param {Object} [requiredCaps] Supplied set of capabilities to find operational mode for
- @param {String|Boolean} [defaultMode='browser'] Default mode to use
- @return {String|Boolean} Compatible operational mode
- */
- Runtime.getMode = function(modeCaps, requiredCaps, defaultMode) {
- var mode = null;
-
- if (Basic.typeOf(defaultMode) === 'undefined') { // only if not specified
- defaultMode = 'browser';
- }
-
- if (requiredCaps && !Basic.isEmptyObj(modeCaps)) {
- // loop over required caps and check if they do require the same mode
- Basic.each(requiredCaps, function(value, cap) {
- if (modeCaps.hasOwnProperty(cap)) {
- var capMode = modeCaps[cap](value);
-
- // make sure we always have an array
- if (typeof(capMode) === 'string') {
- capMode = [capMode];
- }
-
- if (!mode) {
- mode = capMode;
- } else if (!(mode = Basic.arrayIntersect(mode, capMode))) {
- // if cap requires conflicting mode - runtime cannot fulfill required caps
-
- if (MXI_DEBUG && Env.debug.runtime) {
- Env.log("\t\t%c: %v (conflicting mode requested: %s)", cap, value, capMode);
- }
-
- return (mode = false);
- }
- }
-
- if (MXI_DEBUG && Env.debug.runtime) {
- Env.log("\t\t%c: %v (compatible modes: %s)", cap, value, mode);
- }
- });
-
- if (mode) {
- return Basic.inArray(defaultMode, mode) !== -1 ? defaultMode : mode[0];
- } else if (mode === false) {
- return false;
- }
- }
- return defaultMode;
- };
-
-
- /**
- Capability check that always returns true
-
- @private
- @static
- @return {True}
- */
- Runtime.capTrue = function() {
- return true;
- };
-
- /**
- Capability check that always returns false
-
- @private
- @static
- @return {False}
- */
- Runtime.capFalse = function() {
- return false;
- };
-
- /**
- Evaluate the expression to boolean value and create a function that always returns it.
-
- @private
- @static
- @param {Mixed} expr Expression to evaluate
- @return {Function} Function returning the result of evaluation
- */
- Runtime.capTest = function(expr) {
- return function() {
- return !!expr;
- };
- };
-
- return Runtime;
-});
-
-// Included from: src/javascript/runtime/RuntimeClient.js
-
-/**
- * RuntimeClient.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/runtime/RuntimeClient', [
- 'moxie/core/utils/Env',
- 'moxie/core/Exceptions',
- 'moxie/core/utils/Basic',
- 'moxie/runtime/Runtime'
-], function(Env, x, Basic, Runtime) {
- /**
- Set of methods and properties, required by a component to acquire ability to connect to a runtime
-
- @class RuntimeClient
- */
- return function RuntimeClient() {
- var runtime;
-
- Basic.extend(this, {
- /**
- Connects to the runtime specified by the options. Will either connect to existing runtime or create a new one.
- Increments number of clients connected to the specified runtime.
-
- @private
- @method connectRuntime
- @param {Mixed} options Can be a runtme uid or a set of key-value pairs defining requirements and pre-requisites
- */
- connectRuntime: function(options) {
- var comp = this, ruid;
-
- function initialize(items) {
- var type, constructor;
-
- // if we ran out of runtimes
- if (!items.length) {
- comp.trigger('RuntimeError', new x.RuntimeError(x.RuntimeError.NOT_INIT_ERR));
- runtime = null;
- return;
- }
-
- type = items.shift().toLowerCase();
- constructor = Runtime.getConstructor(type);
- if (!constructor) {
- initialize(items);
- return;
- }
-
- if (MXI_DEBUG && Env.debug.runtime) {
- Env.log("Trying runtime: %s", type);
- Env.log(options);
- }
-
- // try initializing the runtime
- runtime = new constructor(options);
-
- runtime.bind('Init', function() {
- // mark runtime as initialized
- runtime.initialized = true;
-
- if (MXI_DEBUG && Env.debug.runtime) {
- Env.log("Runtime '%s' initialized", runtime.type);
- }
-
- // jailbreak ...
- setTimeout(function() {
- runtime.clients++;
- // this will be triggered on component
- comp.trigger('RuntimeInit', runtime);
- }, 1);
- });
-
- runtime.bind('Error', function() {
- if (MXI_DEBUG && Env.debug.runtime) {
- Env.log("Runtime '%s' failed to initialize", runtime.type);
- }
-
- runtime.destroy(); // runtime cannot destroy itself from inside at a right moment, thus we do it here
- initialize(items);
- });
-
- /*runtime.bind('Exception', function() { });*/
-
- if (MXI_DEBUG && Env.debug.runtime) {
- Env.log("\tselected mode: %s", runtime.mode);
- }
-
- // check if runtime managed to pick-up operational mode
- if (!runtime.mode) {
- runtime.trigger('Error');
- return;
- }
-
- runtime.init();
- }
-
- // check if a particular runtime was requested
- if (Basic.typeOf(options) === 'string') {
- ruid = options;
- } else if (Basic.typeOf(options.ruid) === 'string') {
- ruid = options.ruid;
- }
-
- if (ruid) {
- runtime = Runtime.getRuntime(ruid);
- if (runtime) {
- runtime.clients++;
- return runtime;
- } else {
- // there should be a runtime and there's none - weird case
- throw new x.RuntimeError(x.RuntimeError.NOT_INIT_ERR);
- }
- }
-
- // initialize a fresh one, that fits runtime list and required features best
- initialize((options.runtime_order || Runtime.order).split(/\s*,\s*/));
- },
-
-
- /**
- Disconnects from the runtime. Decrements number of clients connected to the specified runtime.
-
- @private
- @method disconnectRuntime
- */
- disconnectRuntime: function() {
- if (runtime && --runtime.clients <= 0) {
- runtime.destroy();
- }
-
- // once the component is disconnected, it shouldn't have access to the runtime
- runtime = null;
- },
-
-
- /**
- Returns the runtime to which the client is currently connected.
-
- @method getRuntime
- @return {Runtime} Runtime or null if client is not connected
- */
- getRuntime: function() {
- if (runtime && runtime.uid) {
- return runtime;
- }
- return runtime = null; // make sure we do not leave zombies rambling around
- },
-
-
- /**
- Handy shortcut to safely invoke runtime extension methods.
-
- @private
- @method exec
- @return {Mixed} Whatever runtime extension method returns
- */
- exec: function() {
- if (runtime) {
- return runtime.exec.apply(this, arguments);
- }
- return null;
- }
-
- });
- };
-
-
-});
-
-// Included from: src/javascript/file/FileInput.js
-
-/**
- * FileInput.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/file/FileInput', [
- 'moxie/core/utils/Basic',
- 'moxie/core/utils/Env',
- 'moxie/core/utils/Mime',
- 'moxie/core/utils/Dom',
- 'moxie/core/Exceptions',
- 'moxie/core/EventTarget',
- 'moxie/core/I18n',
- 'moxie/runtime/Runtime',
- 'moxie/runtime/RuntimeClient'
-], function(Basic, Env, Mime, Dom, x, EventTarget, I18n, Runtime, RuntimeClient) {
- /**
- Provides a convenient way to create cross-browser file-picker. Generates file selection dialog on click,
- converts selected files to _File_ objects, to be used in conjunction with _Image_, preloaded in memory
- with _FileReader_ or uploaded to a server through _XMLHttpRequest_.
-
- @class FileInput
- @constructor
- @extends EventTarget
- @uses RuntimeClient
- @param {Object|String|DOMElement} options If options is string or node, argument is considered as _browse\_button_.
- @param {String|DOMElement} options.browse_button DOM Element to turn into file picker.
- @param {Array} [options.accept] Array of mime types to accept. By default accepts all.
- @param {String} [options.file='file'] Name of the file field (not the filename).
- @param {Boolean} [options.multiple=false] Enable selection of multiple files.
- @param {Boolean} [options.directory=false] Turn file input into the folder input (cannot be both at the same time).
- @param {String|DOMElement} [options.container] DOM Element to use as a container for file-picker. Defaults to parentNode
- for _browse\_button_.
- @param {Object|String} [options.required_caps] Set of required capabilities, that chosen runtime must support.
-
- @example
-
-
-
- */
- var dispatches = [
- /**
- Dispatched when runtime is connected and file-picker is ready to be used.
-
- @event ready
- @param {Object} event
- */
- 'ready',
-
- /**
- Dispatched right after [ready](#event_ready) event, and whenever [refresh()](#method_refresh) is invoked.
- Check [corresponding documentation entry](#method_refresh) for more info.
-
- @event refresh
- @param {Object} event
- */
-
- /**
- Dispatched when selection of files in the dialog is complete.
-
- @event change
- @param {Object} event
- */
- 'change',
-
- 'cancel', // TODO: might be useful
-
- /**
- Dispatched when mouse cursor enters file-picker area. Can be used to style element
- accordingly.
-
- @event mouseenter
- @param {Object} event
- */
- 'mouseenter',
-
- /**
- Dispatched when mouse cursor leaves file-picker area. Can be used to style element
- accordingly.
-
- @event mouseleave
- @param {Object} event
- */
- 'mouseleave',
-
- /**
- Dispatched when functional mouse button is pressed on top of file-picker area.
-
- @event mousedown
- @param {Object} event
- */
- 'mousedown',
-
- /**
- Dispatched when functional mouse button is released on top of file-picker area.
-
- @event mouseup
- @param {Object} event
- */
- 'mouseup'
- ];
-
- function FileInput(options) {
- if (MXI_DEBUG) {
- Env.log("Instantiating FileInput...");
- }
-
- var self = this,
- container, browseButton, defaults;
-
- // if flat argument passed it should be browse_button id
- if (Basic.inArray(Basic.typeOf(options), ['string', 'node']) !== -1) {
- options = { browse_button : options };
- }
-
- // this will help us to find proper default container
- browseButton = Dom.get(options.browse_button);
- if (!browseButton) {
- // browse button is required
- throw new x.DOMException(x.DOMException.NOT_FOUND_ERR);
- }
-
- // figure out the options
- defaults = {
- accept: [{
- title: I18n.translate('All Files'),
- extensions: '*'
- }],
- name: 'file',
- multiple: false,
- required_caps: false,
- container: browseButton.parentNode || document.body
- };
-
- options = Basic.extend({}, defaults, options);
-
- // convert to object representation
- if (typeof(options.required_caps) === 'string') {
- options.required_caps = Runtime.parseCaps(options.required_caps);
- }
-
- // normalize accept option (could be list of mime types or array of title/extensions pairs)
- if (typeof(options.accept) === 'string') {
- options.accept = Mime.mimes2extList(options.accept);
- }
-
- container = Dom.get(options.container);
- // make sure we have container
- if (!container) {
- container = document.body;
- }
-
- // make container relative, if it's not
- if (Dom.getStyle(container, 'position') === 'static') {
- container.style.position = 'relative';
- }
-
- container = browseButton = null; // IE
-
- RuntimeClient.call(self);
-
- Basic.extend(self, {
- /**
- Unique id of the component
-
- @property uid
- @protected
- @readOnly
- @type {String}
- @default UID
- */
- uid: Basic.guid('uid_'),
-
- /**
- Unique id of the connected runtime, if any.
-
- @property ruid
- @protected
- @type {String}
- */
- ruid: null,
-
- /**
- Unique id of the runtime container. Useful to get hold of it for various manipulations.
-
- @property shimid
- @protected
- @type {String}
- */
- shimid: null,
-
- /**
- Array of selected mOxie.File objects
-
- @property files
- @type {Array}
- @default null
- */
- files: null,
-
- /**
- Initializes the file-picker, connects it to runtime and dispatches event ready when done.
-
- @method init
- */
- init: function() {
- self.bind('RuntimeInit', function(e, runtime) {
- self.ruid = runtime.uid;
- self.shimid = runtime.shimid;
-
- self.bind("Ready", function() {
- self.trigger("Refresh");
- }, 999);
-
- // re-position and resize shim container
- self.bind('Refresh', function() {
- var pos, size, browseButton, shimContainer;
-
- browseButton = Dom.get(options.browse_button);
- shimContainer = Dom.get(runtime.shimid); // do not use runtime.getShimContainer(), since it will create container if it doesn't exist
-
- if (browseButton) {
- pos = Dom.getPos(browseButton, Dom.get(options.container));
- size = Dom.getSize(browseButton);
-
- if (shimContainer) {
- Basic.extend(shimContainer.style, {
- top : pos.y + 'px',
- left : pos.x + 'px',
- width : size.w + 'px',
- height : size.h + 'px'
- });
- }
- }
- shimContainer = browseButton = null;
- });
-
- runtime.exec.call(self, 'FileInput', 'init', options);
- });
-
- // runtime needs: options.required_features, options.runtime_order and options.container
- self.connectRuntime(Basic.extend({}, options, {
- required_caps: {
- select_file: true
- }
- }));
- },
-
- /**
- Disables file-picker element, so that it doesn't react to mouse clicks.
-
- @method disable
- @param {Boolean} [state=true] Disable component if - true, enable if - false
- */
- disable: function(state) {
- var runtime = this.getRuntime();
- if (runtime) {
- runtime.exec.call(this, 'FileInput', 'disable', Basic.typeOf(state) === 'undefined' ? true : state);
- }
- },
-
-
- /**
- Reposition and resize dialog trigger to match the position and size of browse_button element.
-
- @method refresh
- */
- refresh: function() {
- self.trigger("Refresh");
- },
-
-
- /**
- Destroy component.
-
- @method destroy
- */
- destroy: function() {
- var runtime = this.getRuntime();
- if (runtime) {
- runtime.exec.call(this, 'FileInput', 'destroy');
- this.disconnectRuntime();
- }
-
- if (Basic.typeOf(this.files) === 'array') {
- // no sense in leaving associated files behind
- Basic.each(this.files, function(file) {
- file.destroy();
- });
- }
- this.files = null;
-
- this.unbindAll();
- }
- });
-
- this.handleEventProps(dispatches);
- }
-
- FileInput.prototype = EventTarget.instance;
-
- return FileInput;
-});
-
-// Included from: src/javascript/core/utils/Encode.js
-
-/**
- * Encode.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/core/utils/Encode', [], function() {
-
- /**
- Encode string with UTF-8
-
- @method utf8_encode
- @for Utils
- @static
- @param {String} str String to encode
- @return {String} UTF-8 encoded string
- */
- var utf8_encode = function(str) {
- return unescape(encodeURIComponent(str));
- };
-
- /**
- Decode UTF-8 encoded string
-
- @method utf8_decode
- @static
- @param {String} str String to decode
- @return {String} Decoded string
- */
- var utf8_decode = function(str_data) {
- return decodeURIComponent(escape(str_data));
- };
-
- /**
- Decode Base64 encoded string (uses browser's default method if available),
- from: https://raw.github.com/kvz/phpjs/master/functions/url/base64_decode.js
-
- @method atob
- @static
- @param {String} data String to decode
- @return {String} Decoded string
- */
- var atob = function(data, utf8) {
- if (typeof(window.atob) === 'function') {
- return utf8 ? utf8_decode(window.atob(data)) : window.atob(data);
- }
-
- // http://kevin.vanzonneveld.net
- // + original by: Tyler Akins (http://rumkin.com)
- // + improved by: Thunder.m
- // + input by: Aman Gupta
- // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // + bugfixed by: Onno Marsman
- // + bugfixed by: Pellentesque Malesuada
- // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // + input by: Brett Zamir (http://brett-zamir.me)
- // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // * example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
- // * returns 1: 'Kevin van Zonneveld'
- // mozilla has this native
- // - but breaks in 2.0.0.12!
- //if (typeof this.window.atob == 'function') {
- // return atob(data);
- //}
- var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
- ac = 0,
- dec = "",
- tmp_arr = [];
-
- if (!data) {
- return data;
- }
-
- data += '';
-
- do { // unpack four hexets into three octets using index points in b64
- h1 = b64.indexOf(data.charAt(i++));
- h2 = b64.indexOf(data.charAt(i++));
- h3 = b64.indexOf(data.charAt(i++));
- h4 = b64.indexOf(data.charAt(i++));
-
- bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
-
- o1 = bits >> 16 & 0xff;
- o2 = bits >> 8 & 0xff;
- o3 = bits & 0xff;
-
- if (h3 == 64) {
- tmp_arr[ac++] = String.fromCharCode(o1);
- } else if (h4 == 64) {
- tmp_arr[ac++] = String.fromCharCode(o1, o2);
- } else {
- tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
- }
- } while (i < data.length);
-
- dec = tmp_arr.join('');
-
- return utf8 ? utf8_decode(dec) : dec;
- };
-
- /**
- Base64 encode string (uses browser's default method if available),
- from: https://raw.github.com/kvz/phpjs/master/functions/url/base64_encode.js
-
- @method btoa
- @static
- @param {String} data String to encode
- @return {String} Base64 encoded string
- */
- var btoa = function(data, utf8) {
- if (utf8) {
- data = utf8_encode(data);
- }
-
- if (typeof(window.btoa) === 'function') {
- return window.btoa(data);
- }
-
- // http://kevin.vanzonneveld.net
- // + original by: Tyler Akins (http://rumkin.com)
- // + improved by: Bayron Guevara
- // + improved by: Thunder.m
- // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // + bugfixed by: Pellentesque Malesuada
- // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // + improved by: Rafał Kukawski (http://kukawski.pl)
- // * example 1: base64_encode('Kevin van Zonneveld');
- // * returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
- // mozilla has this native
- // - but breaks in 2.0.0.12!
- var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
- ac = 0,
- enc = "",
- tmp_arr = [];
-
- if (!data) {
- return data;
- }
-
- do { // pack three octets into four hexets
- o1 = data.charCodeAt(i++);
- o2 = data.charCodeAt(i++);
- o3 = data.charCodeAt(i++);
-
- bits = o1 << 16 | o2 << 8 | o3;
-
- h1 = bits >> 18 & 0x3f;
- h2 = bits >> 12 & 0x3f;
- h3 = bits >> 6 & 0x3f;
- h4 = bits & 0x3f;
-
- // use hexets to index into b64, and append result to encoded string
- tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
- } while (i < data.length);
-
- enc = tmp_arr.join('');
-
- var r = data.length % 3;
-
- return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
- };
-
-
- return {
- utf8_encode: utf8_encode,
- utf8_decode: utf8_decode,
- atob: atob,
- btoa: btoa
- };
-});
-
-// Included from: src/javascript/file/Blob.js
-
-/**
- * Blob.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/file/Blob', [
- 'moxie/core/utils/Basic',
- 'moxie/core/utils/Encode',
- 'moxie/runtime/RuntimeClient'
-], function(Basic, Encode, RuntimeClient) {
-
- var blobpool = {};
-
- /**
- @class Blob
- @constructor
- @param {String} ruid Unique id of the runtime, to which this blob belongs to
- @param {Object} blob Object "Native" blob object, as it is represented in the runtime
- */
- function Blob(ruid, blob) {
-
- function _sliceDetached(start, end, type) {
- var blob, data = blobpool[this.uid];
-
- if (Basic.typeOf(data) !== 'string' || !data.length) {
- return null; // or throw exception
- }
-
- blob = new Blob(null, {
- type: type,
- size: end - start
- });
- blob.detach(data.substr(start, blob.size));
-
- return blob;
- }
-
- RuntimeClient.call(this);
-
- if (ruid) {
- this.connectRuntime(ruid);
- }
-
- if (!blob) {
- blob = {};
- } else if (Basic.typeOf(blob) === 'string') { // dataUrl or binary string
- blob = { data: blob };
- }
-
- Basic.extend(this, {
-
- /**
- Unique id of the component
-
- @property uid
- @type {String}
- */
- uid: blob.uid || Basic.guid('uid_'),
-
- /**
- Unique id of the connected runtime, if falsy, then runtime will have to be initialized
- before this Blob can be used, modified or sent
-
- @property ruid
- @type {String}
- */
- ruid: ruid,
-
- /**
- Size of blob
-
- @property size
- @type {Number}
- @default 0
- */
- size: blob.size || 0,
-
- /**
- Mime type of blob
-
- @property type
- @type {String}
- @default ''
- */
- type: blob.type || '',
-
- /**
- @method slice
- @param {Number} [start=0]
- */
- slice: function(start, end, type) {
- if (this.isDetached()) {
- return _sliceDetached.apply(this, arguments);
- }
- return this.getRuntime().exec.call(this, 'Blob', 'slice', this.getSource(), start, end, type);
- },
-
- /**
- Returns "native" blob object (as it is represented in connected runtime) or null if not found
-
- @method getSource
- @return {Blob} Returns "native" blob object or null if not found
- */
- getSource: function() {
- if (!blobpool[this.uid]) {
- return null;
- }
- return blobpool[this.uid];
- },
-
- /**
- Detaches blob from any runtime that it depends on and initialize with standalone value
-
- @method detach
- @protected
- @param {DOMString} [data=''] Standalone value
- */
- detach: function(data) {
- if (this.ruid) {
- this.getRuntime().exec.call(this, 'Blob', 'destroy');
- this.disconnectRuntime();
- this.ruid = null;
- }
-
- data = data || '';
-
- // if dataUrl, convert to binary string
- if (data.substr(0, 5) == 'data:') {
- var base64Offset = data.indexOf(';base64,');
- this.type = data.substring(5, base64Offset);
- data = Encode.atob(data.substring(base64Offset + 8));
- }
-
- this.size = data.length;
-
- blobpool[this.uid] = data;
- },
-
- /**
- Checks if blob is standalone (detached of any runtime)
-
- @method isDetached
- @protected
- @return {Boolean}
- */
- isDetached: function() {
- return !this.ruid && Basic.typeOf(blobpool[this.uid]) === 'string';
- },
-
- /**
- Destroy Blob and free any resources it was using
-
- @method destroy
- */
- destroy: function() {
- this.detach();
- delete blobpool[this.uid];
- }
- });
-
-
- if (blob.data) {
- this.detach(blob.data); // auto-detach if payload has been passed
- } else {
- blobpool[this.uid] = blob;
- }
- }
-
- return Blob;
-});
-
-// Included from: src/javascript/file/File.js
-
-/**
- * File.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/file/File', [
- 'moxie/core/utils/Basic',
- 'moxie/core/utils/Mime',
- 'moxie/file/Blob'
-], function(Basic, Mime, Blob) {
- /**
- @class File
- @extends Blob
- @constructor
- @param {String} ruid Unique id of the runtime, to which this blob belongs to
- @param {Object} file Object "Native" file object, as it is represented in the runtime
- */
- function File(ruid, file) {
- if (!file) { // avoid extra errors in case we overlooked something
- file = {};
- }
-
- Blob.apply(this, arguments);
-
- if (!this.type) {
- this.type = Mime.getFileMime(file.name);
- }
-
- // sanitize file name or generate new one
- var name;
- if (file.name) {
- name = file.name.replace(/\\/g, '/');
- name = name.substr(name.lastIndexOf('/') + 1);
- } else if (this.type) {
- var prefix = this.type.split('/')[0];
- name = Basic.guid((prefix !== '' ? prefix : 'file') + '_');
-
- if (Mime.extensions[this.type]) {
- name += '.' + Mime.extensions[this.type][0]; // append proper extension if possible
- }
- }
-
-
- Basic.extend(this, {
- /**
- File name
-
- @property name
- @type {String}
- @default UID
- */
- name: name || Basic.guid('file_'),
-
- /**
- Relative path to the file inside a directory
-
- @property relativePath
- @type {String}
- @default ''
- */
- relativePath: '',
-
- /**
- Date of last modification
-
- @property lastModifiedDate
- @type {String}
- @default now
- */
- lastModifiedDate: file.lastModifiedDate || (new Date()).toLocaleString() // Thu Aug 23 2012 19:40:00 GMT+0400 (GET)
- });
- }
-
- File.prototype = Blob.prototype;
-
- return File;
-});
-
-// Included from: src/javascript/file/FileDrop.js
-
-/**
- * FileDrop.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/file/FileDrop', [
- 'moxie/core/I18n',
- 'moxie/core/utils/Dom',
- 'moxie/core/Exceptions',
- 'moxie/core/utils/Basic',
- 'moxie/core/utils/Env',
- 'moxie/file/File',
- 'moxie/runtime/RuntimeClient',
- 'moxie/core/EventTarget',
- 'moxie/core/utils/Mime'
-], function(I18n, Dom, x, Basic, Env, File, RuntimeClient, EventTarget, Mime) {
- /**
- Turn arbitrary DOM element to a drop zone accepting files. Converts selected files to _File_ objects, to be used
- in conjunction with _Image_, preloaded in memory with _FileReader_ or uploaded to a server through
- _XMLHttpRequest_.
-
- @example
-
- Drop files here
-
-
-
-
-
-
- @class FileDrop
- @constructor
- @extends EventTarget
- @uses RuntimeClient
- @param {Object|String} options If options has typeof string, argument is considered as options.drop_zone
- @param {String|DOMElement} options.drop_zone DOM Element to turn into a drop zone
- @param {Array} [options.accept] Array of mime types to accept. By default accepts all
- @param {Object|String} [options.required_caps] Set of required capabilities, that chosen runtime must support
- */
- var dispatches = [
- /**
- Dispatched when runtime is connected and drop zone is ready to accept files.
-
- @event ready
- @param {Object} event
- */
- 'ready',
-
- /**
- Dispatched when dragging cursor enters the drop zone.
-
- @event dragenter
- @param {Object} event
- */
- 'dragenter',
-
- /**
- Dispatched when dragging cursor leaves the drop zone.
-
- @event dragleave
- @param {Object} event
- */
- 'dragleave',
-
- /**
- Dispatched when file is dropped onto the drop zone.
-
- @event drop
- @param {Object} event
- */
- 'drop',
-
- /**
- Dispatched if error occurs.
-
- @event error
- @param {Object} event
- */
- 'error'
- ];
-
- function FileDrop(options) {
- if (MXI_DEBUG) {
- Env.log("Instantiating FileDrop...");
- }
-
- var self = this, defaults;
-
- // if flat argument passed it should be drop_zone id
- if (typeof(options) === 'string') {
- options = { drop_zone : options };
- }
-
- // figure out the options
- defaults = {
- accept: [{
- title: I18n.translate('All Files'),
- extensions: '*'
- }],
- required_caps: {
- drag_and_drop: true
- }
- };
-
- options = typeof(options) === 'object' ? Basic.extend({}, defaults, options) : defaults;
-
- // this will help us to find proper default container
- options.container = Dom.get(options.drop_zone) || document.body;
-
- // make container relative, if it is not
- if (Dom.getStyle(options.container, 'position') === 'static') {
- options.container.style.position = 'relative';
- }
-
- // normalize accept option (could be list of mime types or array of title/extensions pairs)
- if (typeof(options.accept) === 'string') {
- options.accept = Mime.mimes2extList(options.accept);
- }
-
- RuntimeClient.call(self);
-
- Basic.extend(self, {
- uid: Basic.guid('uid_'),
-
- ruid: null,
-
- files: null,
-
- init: function() {
- self.bind('RuntimeInit', function(e, runtime) {
- self.ruid = runtime.uid;
- runtime.exec.call(self, 'FileDrop', 'init', options);
- self.dispatchEvent('ready');
- });
-
- // runtime needs: options.required_features, options.runtime_order and options.container
- self.connectRuntime(options); // throws RuntimeError
- },
-
- destroy: function() {
- var runtime = this.getRuntime();
- if (runtime) {
- runtime.exec.call(this, 'FileDrop', 'destroy');
- this.disconnectRuntime();
- }
- this.files = null;
-
- this.unbindAll();
- }
- });
-
- this.handleEventProps(dispatches);
- }
-
- FileDrop.prototype = EventTarget.instance;
-
- return FileDrop;
-});
-
-// Included from: src/javascript/file/FileReader.js
-
-/**
- * FileReader.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/file/FileReader', [
- 'moxie/core/utils/Basic',
- 'moxie/core/utils/Encode',
- 'moxie/core/Exceptions',
- 'moxie/core/EventTarget',
- 'moxie/file/Blob',
- 'moxie/runtime/RuntimeClient'
-], function(Basic, Encode, x, EventTarget, Blob, RuntimeClient) {
- /**
- Utility for preloading o.Blob/o.File objects in memory. By design closely follows [W3C FileReader](http://www.w3.org/TR/FileAPI/#dfn-filereader)
- interface. Where possible uses native FileReader, where - not falls back to shims.
-
- @class FileReader
- @constructor FileReader
- @extends EventTarget
- @uses RuntimeClient
- */
- var dispatches = [
-
- /**
- Dispatched when the read starts.
-
- @event loadstart
- @param {Object} event
- */
- 'loadstart',
-
- /**
- Dispatched while reading (and decoding) blob, and reporting partial Blob data (progess.loaded/progress.total).
-
- @event progress
- @param {Object} event
- */
- 'progress',
-
- /**
- Dispatched when the read has successfully completed.
-
- @event load
- @param {Object} event
- */
- 'load',
-
- /**
- Dispatched when the read has been aborted. For instance, by invoking the abort() method.
-
- @event abort
- @param {Object} event
- */
- 'abort',
-
- /**
- Dispatched when the read has failed.
-
- @event error
- @param {Object} event
- */
- 'error',
-
- /**
- Dispatched when the request has completed (either in success or failure).
-
- @event loadend
- @param {Object} event
- */
- 'loadend'
- ];
-
- function FileReader() {
-
- RuntimeClient.call(this);
-
- Basic.extend(this, {
- /**
- UID of the component instance.
-
- @property uid
- @type {String}
- */
- uid: Basic.guid('uid_'),
-
- /**
- Contains current state of FileReader object. Can take values of FileReader.EMPTY, FileReader.LOADING
- and FileReader.DONE.
-
- @property readyState
- @type {Number}
- @default FileReader.EMPTY
- */
- readyState: FileReader.EMPTY,
-
- /**
- Result of the successful read operation.
-
- @property result
- @type {String}
- */
- result: null,
-
- /**
- Stores the error of failed asynchronous read operation.
-
- @property error
- @type {DOMError}
- */
- error: null,
-
- /**
- Initiates reading of File/Blob object contents to binary string.
-
- @method readAsBinaryString
- @param {Blob|File} blob Object to preload
- */
- readAsBinaryString: function(blob) {
- _read.call(this, 'readAsBinaryString', blob);
- },
-
- /**
- Initiates reading of File/Blob object contents to dataURL string.
-
- @method readAsDataURL
- @param {Blob|File} blob Object to preload
- */
- readAsDataURL: function(blob) {
- _read.call(this, 'readAsDataURL', blob);
- },
-
- /**
- Initiates reading of File/Blob object contents to string.
-
- @method readAsText
- @param {Blob|File} blob Object to preload
- */
- readAsText: function(blob) {
- _read.call(this, 'readAsText', blob);
- },
-
- /**
- Aborts preloading process.
-
- @method abort
- */
- abort: function() {
- this.result = null;
-
- if (Basic.inArray(this.readyState, [FileReader.EMPTY, FileReader.DONE]) !== -1) {
- return;
- } else if (this.readyState === FileReader.LOADING) {
- this.readyState = FileReader.DONE;
- }
-
- this.exec('FileReader', 'abort');
-
- this.trigger('abort');
- this.trigger('loadend');
- },
-
- /**
- Destroy component and release resources.
-
- @method destroy
- */
- destroy: function() {
- this.abort();
- this.exec('FileReader', 'destroy');
- this.disconnectRuntime();
- this.unbindAll();
- }
- });
-
- // uid must already be assigned
- this.handleEventProps(dispatches);
-
- this.bind('Error', function(e, err) {
- this.readyState = FileReader.DONE;
- this.error = err;
- }, 999);
-
- this.bind('Load', function(e) {
- this.readyState = FileReader.DONE;
- }, 999);
-
-
- function _read(op, blob) {
- var self = this;
-
- this.trigger('loadstart');
-
- if (this.readyState === FileReader.LOADING) {
- this.trigger('error', new x.DOMException(x.DOMException.INVALID_STATE_ERR));
- this.trigger('loadend');
- return;
- }
-
- // if source is not o.Blob/o.File
- if (!(blob instanceof Blob)) {
- this.trigger('error', new x.DOMException(x.DOMException.NOT_FOUND_ERR));
- this.trigger('loadend');
- return;
- }
-
- this.result = null;
- this.readyState = FileReader.LOADING;
-
- if (blob.isDetached()) {
- var src = blob.getSource();
- switch (op) {
- case 'readAsText':
- case 'readAsBinaryString':
- this.result = src;
- break;
- case 'readAsDataURL':
- this.result = 'data:' + blob.type + ';base64,' + Encode.btoa(src);
- break;
- }
- this.readyState = FileReader.DONE;
- this.trigger('load');
- this.trigger('loadend');
- } else {
- this.connectRuntime(blob.ruid);
- this.exec('FileReader', 'read', op, blob);
- }
- }
- }
-
- /**
- Initial FileReader state
-
- @property EMPTY
- @type {Number}
- @final
- @static
- @default 0
- */
- FileReader.EMPTY = 0;
-
- /**
- FileReader switches to this state when it is preloading the source
-
- @property LOADING
- @type {Number}
- @final
- @static
- @default 1
- */
- FileReader.LOADING = 1;
-
- /**
- Preloading is complete, this is a final state
-
- @property DONE
- @type {Number}
- @final
- @static
- @default 2
- */
- FileReader.DONE = 2;
-
- FileReader.prototype = EventTarget.instance;
-
- return FileReader;
-});
-
-// Included from: src/javascript/core/utils/Url.js
-
-/**
- * Url.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/core/utils/Url', [], function() {
- /**
- Parse url into separate components and fill in absent parts with parts from current url,
- based on https://raw.github.com/kvz/phpjs/master/functions/url/parse_url.js
-
- @method parseUrl
- @for Utils
- @static
- @param {String} url Url to parse (defaults to empty string if undefined)
- @return {Object} Hash containing extracted uri components
- */
- var parseUrl = function(url, currentUrl) {
- var key = ['source', 'scheme', 'authority', 'userInfo', 'user', 'pass', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'fragment']
- , i = key.length
- , ports = {
- http: 80,
- https: 443
- }
- , uri = {}
- , regex = /^(?:([^:\/?#]+):)?(?:\/\/()(?:(?:()(?:([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?))?()(?:(()(?:(?:[^?#\/]*\/)*)()(?:[^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/
- , m = regex.exec(url || '')
- ;
-
- while (i--) {
- if (m[i]) {
- uri[key[i]] = m[i];
- }
- }
-
- // when url is relative, we set the origin and the path ourselves
- if (!uri.scheme) {
- // come up with defaults
- if (!currentUrl || typeof(currentUrl) === 'string') {
- currentUrl = parseUrl(currentUrl || document.location.href);
- }
-
- uri.scheme = currentUrl.scheme;
- uri.host = currentUrl.host;
- uri.port = currentUrl.port;
-
- var path = '';
- // for urls without trailing slash we need to figure out the path
- if (/^[^\/]/.test(uri.path)) {
- path = currentUrl.path;
- // if path ends with a filename, strip it
- if (/\/[^\/]*\.[^\/]*$/.test(path)) {
- path = path.replace(/\/[^\/]+$/, '/');
- } else {
- // avoid double slash at the end (see #127)
- path = path.replace(/\/?$/, '/');
- }
- }
- uri.path = path + (uri.path || ''); // site may reside at domain.com or domain.com/subdir
- }
-
- if (!uri.port) {
- uri.port = ports[uri.scheme] || 80;
- }
-
- uri.port = parseInt(uri.port, 10);
-
- if (!uri.path) {
- uri.path = "/";
- }
-
- delete uri.source;
-
- return uri;
- };
-
- /**
- Resolve url - among other things will turn relative url to absolute
-
- @method resolveUrl
- @static
- @param {String|Object} url Either absolute or relative, or a result of parseUrl call
- @return {String} Resolved, absolute url
- */
- var resolveUrl = function(url) {
- var ports = { // we ignore default ports
- http: 80,
- https: 443
- }
- , urlp = typeof(url) === 'object' ? url : parseUrl(url);
- ;
-
- return urlp.scheme + '://' + urlp.host + (urlp.port !== ports[urlp.scheme] ? ':' + urlp.port : '') + urlp.path + (urlp.query ? urlp.query : '');
- };
-
- /**
- Check if specified url has the same origin as the current document
-
- @method hasSameOrigin
- @param {String|Object} url
- @return {Boolean}
- */
- var hasSameOrigin = function(url) {
- function origin(url) {
- return [url.scheme, url.host, url.port].join('/');
- }
-
- if (typeof url === 'string') {
- url = parseUrl(url);
- }
-
- return origin(parseUrl()) === origin(url);
- };
-
- return {
- parseUrl: parseUrl,
- resolveUrl: resolveUrl,
- hasSameOrigin: hasSameOrigin
- };
-});
-
-// Included from: src/javascript/runtime/RuntimeTarget.js
-
-/**
- * RuntimeTarget.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/runtime/RuntimeTarget', [
- 'moxie/core/utils/Basic',
- 'moxie/runtime/RuntimeClient',
- "moxie/core/EventTarget"
-], function(Basic, RuntimeClient, EventTarget) {
- /**
- Instance of this class can be used as a target for the events dispatched by shims,
- when allowing them onto components is for either reason inappropriate
-
- @class RuntimeTarget
- @constructor
- @protected
- @extends EventTarget
- */
- function RuntimeTarget() {
- this.uid = Basic.guid('uid_');
-
- RuntimeClient.call(this);
-
- this.destroy = function() {
- this.disconnectRuntime();
- this.unbindAll();
- };
- }
-
- RuntimeTarget.prototype = EventTarget.instance;
-
- return RuntimeTarget;
-});
-
-// Included from: src/javascript/file/FileReaderSync.js
-
-/**
- * FileReaderSync.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/file/FileReaderSync', [
- 'moxie/core/utils/Basic',
- 'moxie/runtime/RuntimeClient',
- 'moxie/core/utils/Encode'
-], function(Basic, RuntimeClient, Encode) {
- /**
- Synchronous FileReader implementation. Something like this is available in WebWorkers environment, here
- it can be used to read only preloaded blobs/files and only below certain size (not yet sure what that'd be,
- but probably < 1mb). Not meant to be used directly by user.
-
- @class FileReaderSync
- @private
- @constructor
- */
- return function() {
- RuntimeClient.call(this);
-
- Basic.extend(this, {
- uid: Basic.guid('uid_'),
-
- readAsBinaryString: function(blob) {
- return _read.call(this, 'readAsBinaryString', blob);
- },
-
- readAsDataURL: function(blob) {
- return _read.call(this, 'readAsDataURL', blob);
- },
-
- /*readAsArrayBuffer: function(blob) {
- return _read.call(this, 'readAsArrayBuffer', blob);
- },*/
-
- readAsText: function(blob) {
- return _read.call(this, 'readAsText', blob);
- }
- });
-
- function _read(op, blob) {
- if (blob.isDetached()) {
- var src = blob.getSource();
- switch (op) {
- case 'readAsBinaryString':
- return src;
- case 'readAsDataURL':
- return 'data:' + blob.type + ';base64,' + Encode.btoa(src);
- case 'readAsText':
- var txt = '';
- for (var i = 0, length = src.length; i < length; i++) {
- txt += String.fromCharCode(src[i]);
- }
- return txt;
- }
- } else {
- var result = this.connectRuntime(blob.ruid).exec.call(this, 'FileReaderSync', 'read', op, blob);
- this.disconnectRuntime();
- return result;
- }
- }
- };
-});
-
-// Included from: src/javascript/xhr/FormData.js
-
-/**
- * FormData.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define("moxie/xhr/FormData", [
- "moxie/core/Exceptions",
- "moxie/core/utils/Basic",
- "moxie/file/Blob"
-], function(x, Basic, Blob) {
- /**
- FormData
-
- @class FormData
- @constructor
- */
- function FormData() {
- var _blob, _fields = [];
-
- Basic.extend(this, {
- /**
- Append another key-value pair to the FormData object
-
- @method append
- @param {String} name Name for the new field
- @param {String|Blob|Array|Object} value Value for the field
- */
- append: function(name, value) {
- var self = this, valueType = Basic.typeOf(value);
-
- // according to specs value might be either Blob or String
- if (value instanceof Blob) {
- _blob = {
- name: name,
- value: value // unfortunately we can only send single Blob in one FormData
- };
- } else if ('array' === valueType) {
- name += '[]';
-
- Basic.each(value, function(value) {
- self.append(name, value);
- });
- } else if ('object' === valueType) {
- Basic.each(value, function(value, key) {
- self.append(name + '[' + key + ']', value);
- });
- } else if ('null' === valueType || 'undefined' === valueType || 'number' === valueType && isNaN(value)) {
- self.append(name, "false");
- } else {
- _fields.push({
- name: name,
- value: value.toString()
- });
- }
- },
-
- /**
- Checks if FormData contains Blob.
-
- @method hasBlob
- @return {Boolean}
- */
- hasBlob: function() {
- return !!this.getBlob();
- },
-
- /**
- Retrieves blob.
-
- @method getBlob
- @return {Object} Either Blob if found or null
- */
- getBlob: function() {
- return _blob && _blob.value || null;
- },
-
- /**
- Retrieves blob field name.
-
- @method getBlobName
- @return {String} Either Blob field name or null
- */
- getBlobName: function() {
- return _blob && _blob.name || null;
- },
-
- /**
- Loop over the fields in FormData and invoke the callback for each of them.
-
- @method each
- @param {Function} cb Callback to call for each field
- */
- each: function(cb) {
- Basic.each(_fields, function(field) {
- cb(field.value, field.name);
- });
-
- if (_blob) {
- cb(_blob.value, _blob.name);
- }
- },
-
- destroy: function() {
- _blob = null;
- _fields = [];
- }
- });
- }
-
- return FormData;
-});
-
-// Included from: src/javascript/xhr/XMLHttpRequest.js
-
-/**
- * XMLHttpRequest.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define("moxie/xhr/XMLHttpRequest", [
- "moxie/core/utils/Basic",
- "moxie/core/Exceptions",
- "moxie/core/EventTarget",
- "moxie/core/utils/Encode",
- "moxie/core/utils/Url",
- "moxie/runtime/Runtime",
- "moxie/runtime/RuntimeTarget",
- "moxie/file/Blob",
- "moxie/file/FileReaderSync",
- "moxie/xhr/FormData",
- "moxie/core/utils/Env",
- "moxie/core/utils/Mime"
-], function(Basic, x, EventTarget, Encode, Url, Runtime, RuntimeTarget, Blob, FileReaderSync, FormData, Env, Mime) {
-
- var httpCode = {
- 100: 'Continue',
- 101: 'Switching Protocols',
- 102: 'Processing',
-
- 200: 'OK',
- 201: 'Created',
- 202: 'Accepted',
- 203: 'Non-Authoritative Information',
- 204: 'No Content',
- 205: 'Reset Content',
- 206: 'Partial Content',
- 207: 'Multi-Status',
- 226: 'IM Used',
-
- 300: 'Multiple Choices',
- 301: 'Moved Permanently',
- 302: 'Found',
- 303: 'See Other',
- 304: 'Not Modified',
- 305: 'Use Proxy',
- 306: 'Reserved',
- 307: 'Temporary Redirect',
-
- 400: 'Bad Request',
- 401: 'Unauthorized',
- 402: 'Payment Required',
- 403: 'Forbidden',
- 404: 'Not Found',
- 405: 'Method Not Allowed',
- 406: 'Not Acceptable',
- 407: 'Proxy Authentication Required',
- 408: 'Request Timeout',
- 409: 'Conflict',
- 410: 'Gone',
- 411: 'Length Required',
- 412: 'Precondition Failed',
- 413: 'Request Entity Too Large',
- 414: 'Request-URI Too Long',
- 415: 'Unsupported Media Type',
- 416: 'Requested Range Not Satisfiable',
- 417: 'Expectation Failed',
- 422: 'Unprocessable Entity',
- 423: 'Locked',
- 424: 'Failed Dependency',
- 426: 'Upgrade Required',
-
- 500: 'Internal Server Error',
- 501: 'Not Implemented',
- 502: 'Bad Gateway',
- 503: 'Service Unavailable',
- 504: 'Gateway Timeout',
- 505: 'HTTP Version Not Supported',
- 506: 'Variant Also Negotiates',
- 507: 'Insufficient Storage',
- 510: 'Not Extended'
- };
-
- function XMLHttpRequestUpload() {
- this.uid = Basic.guid('uid_');
- }
-
- XMLHttpRequestUpload.prototype = EventTarget.instance;
-
- /**
- Implementation of XMLHttpRequest
-
- @class XMLHttpRequest
- @constructor
- @uses RuntimeClient
- @extends EventTarget
- */
- var dispatches = [
- 'loadstart',
-
- 'progress',
-
- 'abort',
-
- 'error',
-
- 'load',
-
- 'timeout',
-
- 'loadend'
-
- // readystatechange (for historical reasons)
- ];
-
- var NATIVE = 1, RUNTIME = 2;
-
- function XMLHttpRequest() {
- var self = this,
- // this (together with _p() @see below) is here to gracefully upgrade to setter/getter syntax where possible
- props = {
- /**
- The amount of milliseconds a request can take before being terminated. Initially zero. Zero means there is no timeout.
-
- @property timeout
- @type Number
- @default 0
- */
- timeout: 0,
-
- /**
- Current state, can take following values:
- UNSENT (numeric value 0)
- The object has been constructed.
-
- OPENED (numeric value 1)
- The open() method has been successfully invoked. During this state request headers can be set using setRequestHeader() and the request can be made using the send() method.
-
- HEADERS_RECEIVED (numeric value 2)
- All redirects (if any) have been followed and all HTTP headers of the final response have been received. Several response members of the object are now available.
-
- LOADING (numeric value 3)
- The response entity body is being received.
-
- DONE (numeric value 4)
-
- @property readyState
- @type Number
- @default 0 (UNSENT)
- */
- readyState: XMLHttpRequest.UNSENT,
-
- /**
- True when user credentials are to be included in a cross-origin request. False when they are to be excluded
- in a cross-origin request and when cookies are to be ignored in its response. Initially false.
-
- @property withCredentials
- @type Boolean
- @default false
- */
- withCredentials: false,
-
- /**
- Returns the HTTP status code.
-
- @property status
- @type Number
- @default 0
- */
- status: 0,
-
- /**
- Returns the HTTP status text.
-
- @property statusText
- @type String
- */
- statusText: "",
-
- /**
- Returns the response type. Can be set to change the response type. Values are:
- the empty string (default), "arraybuffer", "blob", "document", "json", and "text".
-
- @property responseType
- @type String
- */
- responseType: "",
-
- /**
- Returns the document response entity body.
-
- Throws an "InvalidStateError" exception if responseType is not the empty string or "document".
-
- @property responseXML
- @type Document
- */
- responseXML: null,
-
- /**
- Returns the text response entity body.
-
- Throws an "InvalidStateError" exception if responseType is not the empty string or "text".
-
- @property responseText
- @type String
- */
- responseText: null,
-
- /**
- Returns the response entity body (http://www.w3.org/TR/XMLHttpRequest/#response-entity-body).
- Can become: ArrayBuffer, Blob, Document, JSON, Text
-
- @property response
- @type Mixed
- */
- response: null
- },
-
- _async = true,
- _url,
- _method,
- _headers = {},
- _user,
- _password,
- _encoding = null,
- _mimeType = null,
-
- // flags
- _sync_flag = false,
- _send_flag = false,
- _upload_events_flag = false,
- _upload_complete_flag = false,
- _error_flag = false,
- _same_origin_flag = false,
-
- // times
- _start_time,
- _timeoutset_time,
-
- _finalMime = null,
- _finalCharset = null,
-
- _options = {},
- _xhr,
- _responseHeaders = '',
- _responseHeadersBag
- ;
-
-
- Basic.extend(this, props, {
- /**
- Unique id of the component
-
- @property uid
- @type String
- */
- uid: Basic.guid('uid_'),
-
- /**
- Target for Upload events
-
- @property upload
- @type XMLHttpRequestUpload
- */
- upload: new XMLHttpRequestUpload(),
-
-
- /**
- Sets the request method, request URL, synchronous flag, request username, and request password.
-
- Throws a "SyntaxError" exception if one of the following is true:
-
- method is not a valid HTTP method.
- url cannot be resolved.
- url contains the "user:password" format in the userinfo production.
- Throws a "SecurityError" exception if method is a case-insensitive match for CONNECT, TRACE or TRACK.
-
- Throws an "InvalidAccessError" exception if one of the following is true:
-
- Either user or password is passed as argument and the origin of url does not match the XMLHttpRequest origin.
- There is an associated XMLHttpRequest document and either the timeout attribute is not zero,
- the withCredentials attribute is true, or the responseType attribute is not the empty string.
-
-
- @method open
- @param {String} method HTTP method to use on request
- @param {String} url URL to request
- @param {Boolean} [async=true] If false request will be done in synchronous manner. Asynchronous by default.
- @param {String} [user] Username to use in HTTP authentication process on server-side
- @param {String} [password] Password to use in HTTP authentication process on server-side
- */
- open: function(method, url, async, user, password) {
- var urlp;
-
- // first two arguments are required
- if (!method || !url) {
- throw new x.DOMException(x.DOMException.SYNTAX_ERR);
- }
-
- // 2 - check if any code point in method is higher than U+00FF or after deflating method it does not match the method
- if (/[\u0100-\uffff]/.test(method) || Encode.utf8_encode(method) !== method) {
- throw new x.DOMException(x.DOMException.SYNTAX_ERR);
- }
-
- // 3
- if (!!~Basic.inArray(method.toUpperCase(), ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT', 'TRACE', 'TRACK'])) {
- _method = method.toUpperCase();
- }
-
-
- // 4 - allowing these methods poses a security risk
- if (!!~Basic.inArray(_method, ['CONNECT', 'TRACE', 'TRACK'])) {
- throw new x.DOMException(x.DOMException.SECURITY_ERR);
- }
-
- // 5
- url = Encode.utf8_encode(url);
-
- // 6 - Resolve url relative to the XMLHttpRequest base URL. If the algorithm returns an error, throw a "SyntaxError".
- urlp = Url.parseUrl(url);
-
- _same_origin_flag = Url.hasSameOrigin(urlp);
-
- // 7 - manually build up absolute url
- _url = Url.resolveUrl(url);
-
- // 9-10, 12-13
- if ((user || password) && !_same_origin_flag) {
- throw new x.DOMException(x.DOMException.INVALID_ACCESS_ERR);
- }
-
- _user = user || urlp.user;
- _password = password || urlp.pass;
-
- // 11
- _async = async || true;
-
- if (_async === false && (_p('timeout') || _p('withCredentials') || _p('responseType') !== "")) {
- throw new x.DOMException(x.DOMException.INVALID_ACCESS_ERR);
- }
-
- // 14 - terminate abort()
-
- // 15 - terminate send()
-
- // 18
- _sync_flag = !_async;
- _send_flag = false;
- _headers = {};
- _reset.call(this);
-
- // 19
- _p('readyState', XMLHttpRequest.OPENED);
-
- // 20
- this.dispatchEvent('readystatechange');
- },
-
- /**
- Appends an header to the list of author request headers, or if header is already
- in the list of author request headers, combines its value with value.
-
- Throws an "InvalidStateError" exception if the state is not OPENED or if the send() flag is set.
- Throws a "SyntaxError" exception if header is not a valid HTTP header field name or if value
- is not a valid HTTP header field value.
-
- @method setRequestHeader
- @param {String} header
- @param {String|Number} value
- */
- setRequestHeader: function(header, value) {
- var uaHeaders = [ // these headers are controlled by the user agent
- "accept-charset",
- "accept-encoding",
- "access-control-request-headers",
- "access-control-request-method",
- "connection",
- "content-length",
- "cookie",
- "cookie2",
- "content-transfer-encoding",
- "date",
- "expect",
- "host",
- "keep-alive",
- "origin",
- "referer",
- "te",
- "trailer",
- "transfer-encoding",
- "upgrade",
- "user-agent",
- "via"
- ];
-
- // 1-2
- if (_p('readyState') !== XMLHttpRequest.OPENED || _send_flag) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // 3
- if (/[\u0100-\uffff]/.test(header) || Encode.utf8_encode(header) !== header) {
- throw new x.DOMException(x.DOMException.SYNTAX_ERR);
- }
-
- // 4
- /* this step is seemingly bypassed in browsers, probably to allow various unicode characters in header values
- if (/[\u0100-\uffff]/.test(value) || Encode.utf8_encode(value) !== value) {
- throw new x.DOMException(x.DOMException.SYNTAX_ERR);
- }*/
-
- header = Basic.trim(header).toLowerCase();
-
- // setting of proxy-* and sec-* headers is prohibited by spec
- if (!!~Basic.inArray(header, uaHeaders) || /^(proxy\-|sec\-)/.test(header)) {
- return false;
- }
-
- // camelize
- // browsers lowercase header names (at least for custom ones)
- // header = header.replace(/\b\w/g, function($1) { return $1.toUpperCase(); });
-
- if (!_headers[header]) {
- _headers[header] = value;
- } else {
- // http://tools.ietf.org/html/rfc2616#section-4.2 (last paragraph)
- _headers[header] += ', ' + value;
- }
- return true;
- },
-
- /**
- Returns all headers from the response, with the exception of those whose field name is Set-Cookie or Set-Cookie2.
-
- @method getAllResponseHeaders
- @return {String} reponse headers or empty string
- */
- getAllResponseHeaders: function() {
- return _responseHeaders || '';
- },
-
- /**
- Returns the header field value from the response of which the field name matches header,
- unless the field name is Set-Cookie or Set-Cookie2.
-
- @method getResponseHeader
- @param {String} header
- @return {String} value(s) for the specified header or null
- */
- getResponseHeader: function(header) {
- header = header.toLowerCase();
-
- if (_error_flag || !!~Basic.inArray(header, ['set-cookie', 'set-cookie2'])) {
- return null;
- }
-
- if (_responseHeaders && _responseHeaders !== '') {
- // if we didn't parse response headers until now, do it and keep for later
- if (!_responseHeadersBag) {
- _responseHeadersBag = {};
- Basic.each(_responseHeaders.split(/\r\n/), function(line) {
- var pair = line.split(/:\s+/);
- if (pair.length === 2) { // last line might be empty, omit
- pair[0] = Basic.trim(pair[0]); // just in case
- _responseHeadersBag[pair[0].toLowerCase()] = { // simply to retain header name in original form
- header: pair[0],
- value: Basic.trim(pair[1])
- };
- }
- });
- }
- if (_responseHeadersBag.hasOwnProperty(header)) {
- return _responseHeadersBag[header].header + ': ' + _responseHeadersBag[header].value;
- }
- }
- return null;
- },
-
- /**
- Sets the Content-Type header for the response to mime.
- Throws an "InvalidStateError" exception if the state is LOADING or DONE.
- Throws a "SyntaxError" exception if mime is not a valid media type.
-
- @method overrideMimeType
- @param String mime Mime type to set
- */
- overrideMimeType: function(mime) {
- var matches, charset;
-
- // 1
- if (!!~Basic.inArray(_p('readyState'), [XMLHttpRequest.LOADING, XMLHttpRequest.DONE])) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // 2
- mime = Basic.trim(mime.toLowerCase());
-
- if (/;/.test(mime) && (matches = mime.match(/^([^;]+)(?:;\scharset\=)?(.*)$/))) {
- mime = matches[1];
- if (matches[2]) {
- charset = matches[2];
- }
- }
-
- if (!Mime.mimes[mime]) {
- throw new x.DOMException(x.DOMException.SYNTAX_ERR);
- }
-
- // 3-4
- _finalMime = mime;
- _finalCharset = charset;
- },
-
- /**
- Initiates the request. The optional argument provides the request entity body.
- The argument is ignored if request method is GET or HEAD.
-
- Throws an "InvalidStateError" exception if the state is not OPENED or if the send() flag is set.
-
- @method send
- @param {Blob|Document|String|FormData} [data] Request entity body
- @param {Object} [options] Set of requirements and pre-requisities for runtime initialization
- */
- send: function(data, options) {
- if (Basic.typeOf(options) === 'string') {
- _options = { ruid: options };
- } else if (!options) {
- _options = {};
- } else {
- _options = options;
- }
-
- // 1-2
- if (this.readyState !== XMLHttpRequest.OPENED || _send_flag) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // 3
- // sending Blob
- if (data instanceof Blob) {
- _options.ruid = data.ruid;
- _mimeType = data.type || 'application/octet-stream';
- }
-
- // FormData
- else if (data instanceof FormData) {
- if (data.hasBlob()) {
- var blob = data.getBlob();
- _options.ruid = blob.ruid;
- _mimeType = blob.type || 'application/octet-stream';
- }
- }
-
- // DOMString
- else if (typeof data === 'string') {
- _encoding = 'UTF-8';
- _mimeType = 'text/plain;charset=UTF-8';
-
- // data should be converted to Unicode and encoded as UTF-8
- data = Encode.utf8_encode(data);
- }
-
- // if withCredentials not set, but requested, set it automatically
- if (!this.withCredentials) {
- this.withCredentials = (_options.required_caps && _options.required_caps.send_browser_cookies) && !_same_origin_flag;
- }
-
- // 4 - storage mutex
- // 5
- _upload_events_flag = (!_sync_flag && this.upload.hasEventListener()); // DSAP
- // 6
- _error_flag = false;
- // 7
- _upload_complete_flag = !data;
- // 8 - Asynchronous steps
- if (!_sync_flag) {
- // 8.1
- _send_flag = true;
- // 8.2
- // this.dispatchEvent('loadstart'); // will be dispatched either by native or runtime xhr
- // 8.3
- //if (!_upload_complete_flag) {
- // this.upload.dispatchEvent('loadstart'); // will be dispatched either by native or runtime xhr
- //}
- }
- // 8.5 - Return the send() method call, but continue running the steps in this algorithm.
- _doXHR.call(this, data);
- },
-
- /**
- Cancels any network activity.
-
- @method abort
- */
- abort: function() {
- _error_flag = true;
- _sync_flag = false;
-
- if (!~Basic.inArray(_p('readyState'), [XMLHttpRequest.UNSENT, XMLHttpRequest.OPENED, XMLHttpRequest.DONE])) {
- _p('readyState', XMLHttpRequest.DONE);
- _send_flag = false;
-
- if (_xhr) {
- _xhr.getRuntime().exec.call(_xhr, 'XMLHttpRequest', 'abort', _upload_complete_flag);
- } else {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- _upload_complete_flag = true;
- } else {
- _p('readyState', XMLHttpRequest.UNSENT);
- }
- },
-
- destroy: function() {
- if (_xhr) {
- if (Basic.typeOf(_xhr.destroy) === 'function') {
- _xhr.destroy();
- }
- _xhr = null;
- }
-
- this.unbindAll();
-
- if (this.upload) {
- this.upload.unbindAll();
- this.upload = null;
- }
- }
- });
-
- this.handleEventProps(dispatches.concat(['readystatechange'])); // for historical reasons
- this.upload.handleEventProps(dispatches);
-
- /* this is nice, but maybe too lengthy
-
- // if supported by JS version, set getters/setters for specific properties
- o.defineProperty(this, 'readyState', {
- configurable: false,
-
- get: function() {
- return _p('readyState');
- }
- });
-
- o.defineProperty(this, 'timeout', {
- configurable: false,
-
- get: function() {
- return _p('timeout');
- },
-
- set: function(value) {
-
- if (_sync_flag) {
- throw new x.DOMException(x.DOMException.INVALID_ACCESS_ERR);
- }
-
- // timeout still should be measured relative to the start time of request
- _timeoutset_time = (new Date).getTime();
-
- _p('timeout', value);
- }
- });
-
- // the withCredentials attribute has no effect when fetching same-origin resources
- o.defineProperty(this, 'withCredentials', {
- configurable: false,
-
- get: function() {
- return _p('withCredentials');
- },
-
- set: function(value) {
- // 1-2
- if (!~o.inArray(_p('readyState'), [XMLHttpRequest.UNSENT, XMLHttpRequest.OPENED]) || _send_flag) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // 3-4
- if (_anonymous_flag || _sync_flag) {
- throw new x.DOMException(x.DOMException.INVALID_ACCESS_ERR);
- }
-
- // 5
- _p('withCredentials', value);
- }
- });
-
- o.defineProperty(this, 'status', {
- configurable: false,
-
- get: function() {
- return _p('status');
- }
- });
-
- o.defineProperty(this, 'statusText', {
- configurable: false,
-
- get: function() {
- return _p('statusText');
- }
- });
-
- o.defineProperty(this, 'responseType', {
- configurable: false,
-
- get: function() {
- return _p('responseType');
- },
-
- set: function(value) {
- // 1
- if (!!~o.inArray(_p('readyState'), [XMLHttpRequest.LOADING, XMLHttpRequest.DONE])) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // 2
- if (_sync_flag) {
- throw new x.DOMException(x.DOMException.INVALID_ACCESS_ERR);
- }
-
- // 3
- _p('responseType', value.toLowerCase());
- }
- });
-
- o.defineProperty(this, 'responseText', {
- configurable: false,
-
- get: function() {
- // 1
- if (!~o.inArray(_p('responseType'), ['', 'text'])) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // 2-3
- if (_p('readyState') !== XMLHttpRequest.DONE && _p('readyState') !== XMLHttpRequest.LOADING || _error_flag) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- return _p('responseText');
- }
- });
-
- o.defineProperty(this, 'responseXML', {
- configurable: false,
-
- get: function() {
- // 1
- if (!~o.inArray(_p('responseType'), ['', 'document'])) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // 2-3
- if (_p('readyState') !== XMLHttpRequest.DONE || _error_flag) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- return _p('responseXML');
- }
- });
-
- o.defineProperty(this, 'response', {
- configurable: false,
-
- get: function() {
- if (!!~o.inArray(_p('responseType'), ['', 'text'])) {
- if (_p('readyState') !== XMLHttpRequest.DONE && _p('readyState') !== XMLHttpRequest.LOADING || _error_flag) {
- return '';
- }
- }
-
- if (_p('readyState') !== XMLHttpRequest.DONE || _error_flag) {
- return null;
- }
-
- return _p('response');
- }
- });
-
- */
-
- function _p(prop, value) {
- if (!props.hasOwnProperty(prop)) {
- return;
- }
- if (arguments.length === 1) { // get
- return Env.can('define_property') ? props[prop] : self[prop];
- } else { // set
- if (Env.can('define_property')) {
- props[prop] = value;
- } else {
- self[prop] = value;
- }
- }
- }
-
- /*
- function _toASCII(str, AllowUnassigned, UseSTD3ASCIIRules) {
- // TODO: http://tools.ietf.org/html/rfc3490#section-4.1
- return str.toLowerCase();
- }
- */
-
-
- function _doXHR(data) {
- var self = this;
-
- _start_time = new Date().getTime();
-
- _xhr = new RuntimeTarget();
-
- function loadEnd() {
- if (_xhr) { // it could have been destroyed by now
- _xhr.destroy();
- _xhr = null;
- }
- self.dispatchEvent('loadend');
- self = null;
- }
-
- function exec(runtime) {
- _xhr.bind('LoadStart', function(e) {
- _p('readyState', XMLHttpRequest.LOADING);
- self.dispatchEvent('readystatechange');
-
- self.dispatchEvent(e);
-
- if (_upload_events_flag) {
- self.upload.dispatchEvent(e);
- }
- });
-
- _xhr.bind('Progress', function(e) {
- if (_p('readyState') !== XMLHttpRequest.LOADING) {
- _p('readyState', XMLHttpRequest.LOADING); // LoadStart unreliable (in Flash for example)
- self.dispatchEvent('readystatechange');
- }
- self.dispatchEvent(e);
- });
-
- _xhr.bind('UploadProgress', function(e) {
- if (_upload_events_flag) {
- self.upload.dispatchEvent({
- type: 'progress',
- lengthComputable: false,
- total: e.total,
- loaded: e.loaded
- });
- }
- });
-
- _xhr.bind('Load', function(e) {
- _p('readyState', XMLHttpRequest.DONE);
- _p('status', Number(runtime.exec.call(_xhr, 'XMLHttpRequest', 'getStatus') || 0));
- _p('statusText', httpCode[_p('status')] || "");
-
- _p('response', runtime.exec.call(_xhr, 'XMLHttpRequest', 'getResponse', _p('responseType')));
-
- if (!!~Basic.inArray(_p('responseType'), ['text', ''])) {
- _p('responseText', _p('response'));
- } else if (_p('responseType') === 'document') {
- _p('responseXML', _p('response'));
- }
-
- _responseHeaders = runtime.exec.call(_xhr, 'XMLHttpRequest', 'getAllResponseHeaders');
-
- self.dispatchEvent('readystatechange');
-
- if (_p('status') > 0) { // status 0 usually means that server is unreachable
- if (_upload_events_flag) {
- self.upload.dispatchEvent(e);
- }
- self.dispatchEvent(e);
- } else {
- _error_flag = true;
- self.dispatchEvent('error');
- }
- loadEnd();
- });
-
- _xhr.bind('Abort', function(e) {
- self.dispatchEvent(e);
- loadEnd();
- });
-
- _xhr.bind('Error', function(e) {
- _error_flag = true;
- _p('readyState', XMLHttpRequest.DONE);
- self.dispatchEvent('readystatechange');
- _upload_complete_flag = true;
- self.dispatchEvent(e);
- loadEnd();
- });
-
- runtime.exec.call(_xhr, 'XMLHttpRequest', 'send', {
- url: _url,
- method: _method,
- async: _async,
- user: _user,
- password: _password,
- headers: _headers,
- mimeType: _mimeType,
- encoding: _encoding,
- responseType: self.responseType,
- withCredentials: self.withCredentials,
- options: _options
- }, data);
- }
-
- // clarify our requirements
- if (typeof(_options.required_caps) === 'string') {
- _options.required_caps = Runtime.parseCaps(_options.required_caps);
- }
-
- _options.required_caps = Basic.extend({}, _options.required_caps, {
- return_response_type: self.responseType
- });
-
- if (data instanceof FormData) {
- _options.required_caps.send_multipart = true;
- }
-
- if (!Basic.isEmptyObj(_headers)) {
- _options.required_caps.send_custom_headers = true;
- }
-
- if (!_same_origin_flag) {
- _options.required_caps.do_cors = true;
- }
-
-
- if (_options.ruid) { // we do not need to wait if we can connect directly
- exec(_xhr.connectRuntime(_options));
- } else {
- _xhr.bind('RuntimeInit', function(e, runtime) {
- exec(runtime);
- });
- _xhr.bind('RuntimeError', function(e, err) {
- self.dispatchEvent('RuntimeError', err);
- });
- _xhr.connectRuntime(_options);
- }
- }
-
-
- function _reset() {
- _p('responseText', "");
- _p('responseXML', null);
- _p('response', null);
- _p('status', 0);
- _p('statusText', "");
- _start_time = _timeoutset_time = null;
- }
- }
-
- XMLHttpRequest.UNSENT = 0;
- XMLHttpRequest.OPENED = 1;
- XMLHttpRequest.HEADERS_RECEIVED = 2;
- XMLHttpRequest.LOADING = 3;
- XMLHttpRequest.DONE = 4;
-
- XMLHttpRequest.prototype = EventTarget.instance;
-
- return XMLHttpRequest;
-});
-
-// Included from: src/javascript/runtime/Transporter.js
-
-/**
- * Transporter.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define("moxie/runtime/Transporter", [
- "moxie/core/utils/Basic",
- "moxie/core/utils/Encode",
- "moxie/runtime/RuntimeClient",
- "moxie/core/EventTarget"
-], function(Basic, Encode, RuntimeClient, EventTarget) {
- function Transporter() {
- var mod, _runtime, _data, _size, _pos, _chunk_size;
-
- RuntimeClient.call(this);
-
- Basic.extend(this, {
- uid: Basic.guid('uid_'),
-
- state: Transporter.IDLE,
-
- result: null,
-
- transport: function(data, type, options) {
- var self = this;
-
- options = Basic.extend({
- chunk_size: 204798
- }, options);
-
- // should divide by three, base64 requires this
- if ((mod = options.chunk_size % 3)) {
- options.chunk_size += 3 - mod;
- }
-
- _chunk_size = options.chunk_size;
-
- _reset.call(this);
- _data = data;
- _size = data.length;
-
- if (Basic.typeOf(options) === 'string' || options.ruid) {
- _run.call(self, type, this.connectRuntime(options));
- } else {
- // we require this to run only once
- var cb = function(e, runtime) {
- self.unbind("RuntimeInit", cb);
- _run.call(self, type, runtime);
- };
- this.bind("RuntimeInit", cb);
- this.connectRuntime(options);
- }
- },
-
- abort: function() {
- var self = this;
-
- self.state = Transporter.IDLE;
- if (_runtime) {
- _runtime.exec.call(self, 'Transporter', 'clear');
- self.trigger("TransportingAborted");
- }
-
- _reset.call(self);
- },
-
-
- destroy: function() {
- this.unbindAll();
- _runtime = null;
- this.disconnectRuntime();
- _reset.call(this);
- }
- });
-
- function _reset() {
- _size = _pos = 0;
- _data = this.result = null;
- }
-
- function _run(type, runtime) {
- var self = this;
-
- _runtime = runtime;
-
- //self.unbind("RuntimeInit");
-
- self.bind("TransportingProgress", function(e) {
- _pos = e.loaded;
-
- if (_pos < _size && Basic.inArray(self.state, [Transporter.IDLE, Transporter.DONE]) === -1) {
- _transport.call(self);
- }
- }, 999);
-
- self.bind("TransportingComplete", function() {
- _pos = _size;
- self.state = Transporter.DONE;
- _data = null; // clean a bit
- self.result = _runtime.exec.call(self, 'Transporter', 'getAsBlob', type || '');
- }, 999);
-
- self.state = Transporter.BUSY;
- self.trigger("TransportingStarted");
- _transport.call(self);
- }
-
- function _transport() {
- var self = this,
- chunk,
- bytesLeft = _size - _pos;
-
- if (_chunk_size > bytesLeft) {
- _chunk_size = bytesLeft;
- }
-
- chunk = Encode.btoa(_data.substr(_pos, _chunk_size));
- _runtime.exec.call(self, 'Transporter', 'receive', chunk, _size);
- }
- }
-
- Transporter.IDLE = 0;
- Transporter.BUSY = 1;
- Transporter.DONE = 2;
-
- Transporter.prototype = EventTarget.instance;
-
- return Transporter;
-});
-
-// Included from: src/javascript/image/Image.js
-
-/**
- * Image.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define("moxie/image/Image", [
- "moxie/core/utils/Basic",
- "moxie/core/utils/Dom",
- "moxie/core/Exceptions",
- "moxie/file/FileReaderSync",
- "moxie/xhr/XMLHttpRequest",
- "moxie/runtime/Runtime",
- "moxie/runtime/RuntimeClient",
- "moxie/runtime/Transporter",
- "moxie/core/utils/Env",
- "moxie/core/EventTarget",
- "moxie/file/Blob",
- "moxie/file/File",
- "moxie/core/utils/Encode"
-], function(Basic, Dom, x, FileReaderSync, XMLHttpRequest, Runtime, RuntimeClient, Transporter, Env, EventTarget, Blob, File, Encode) {
- /**
- Image preloading and manipulation utility. Additionally it provides access to image meta info (Exif, GPS) and raw binary data.
-
- @class Image
- @constructor
- @extends EventTarget
- */
- var dispatches = [
- 'progress',
-
- /**
- Dispatched when loading is complete.
-
- @event load
- @param {Object} event
- */
- 'load',
-
- 'error',
-
- /**
- Dispatched when resize operation is complete.
-
- @event resize
- @param {Object} event
- */
- 'resize',
-
- /**
- Dispatched when visual representation of the image is successfully embedded
- into the corresponsing container.
-
- @event embedded
- @param {Object} event
- */
- 'embedded'
- ];
-
- function Image() {
-
- RuntimeClient.call(this);
-
- Basic.extend(this, {
- /**
- Unique id of the component
-
- @property uid
- @type {String}
- */
- uid: Basic.guid('uid_'),
-
- /**
- Unique id of the connected runtime, if any.
-
- @property ruid
- @type {String}
- */
- ruid: null,
-
- /**
- Name of the file, that was used to create an image, if available. If not equals to empty string.
-
- @property name
- @type {String}
- @default ""
- */
- name: "",
-
- /**
- Size of the image in bytes. Actual value is set only after image is preloaded.
-
- @property size
- @type {Number}
- @default 0
- */
- size: 0,
-
- /**
- Width of the image. Actual value is set only after image is preloaded.
-
- @property width
- @type {Number}
- @default 0
- */
- width: 0,
-
- /**
- Height of the image. Actual value is set only after image is preloaded.
-
- @property height
- @type {Number}
- @default 0
- */
- height: 0,
-
- /**
- Mime type of the image. Currently only image/jpeg and image/png are supported. Actual value is set only after image is preloaded.
-
- @property type
- @type {String}
- @default ""
- */
- type: "",
-
- /**
- Holds meta info (Exif, GPS). Is populated only for image/jpeg. Actual value is set only after image is preloaded.
-
- @property meta
- @type {Object}
- @default {}
- */
- meta: {},
-
- /**
- Alias for load method, that takes another mOxie.Image object as a source (see load).
-
- @method clone
- @param {Image} src Source for the image
- @param {Boolean} [exact=false] Whether to activate in-depth clone mode
- */
- clone: function() {
- this.load.apply(this, arguments);
- },
-
- /**
- Loads image from various sources. Currently the source for new image can be: mOxie.Image, mOxie.Blob/mOxie.File,
- native Blob/File, dataUrl or URL. Depending on the type of the source, arguments - differ. When source is URL,
- Image will be downloaded from remote destination and loaded in memory.
-
- @example
- var img = new mOxie.Image();
- img.onload = function() {
- var blob = img.getAsBlob();
-
- var formData = new mOxie.FormData();
- formData.append('file', blob);
-
- var xhr = new mOxie.XMLHttpRequest();
- xhr.onload = function() {
- // upload complete
- };
- xhr.open('post', 'upload.php');
- xhr.send(formData);
- };
- img.load("http://www.moxiecode.com/images/mox-logo.jpg"); // notice file extension (.jpg)
-
-
- @method load
- @param {Image|Blob|File|String} src Source for the image
- @param {Boolean|Object} [mixed]
- */
- load: function() {
- _load.apply(this, arguments);
- },
-
- /**
- Downsizes the image to fit the specified width/height. If crop is supplied, image will be cropped to exact dimensions.
-
- @method downsize
- @param {Object} opts
- @param {Number} opts.width Resulting width
- @param {Number} [opts.height=width] Resulting height (optional, if not supplied will default to width)
- @param {Boolean} [opts.crop=false] Whether to crop the image to exact dimensions
- @param {Boolean} [opts.preserveHeaders=true] Whether to preserve meta headers (on JPEGs after resize)
- @param {String} [opts.resample=false] Resampling algorithm to use for resizing
- */
- downsize: function(opts) {
- var defaults = {
- width: this.width,
- height: this.height,
- type: this.type || 'image/jpeg',
- quality: 90,
- crop: false,
- preserveHeaders: true,
- resample: false
- };
-
- if (typeof(opts) === 'object') {
- opts = Basic.extend(defaults, opts);
- } else {
- // for backward compatibility
- opts = Basic.extend(defaults, {
- width: arguments[0],
- height: arguments[1],
- crop: arguments[2],
- preserveHeaders: arguments[3]
- });
- }
-
- try {
- if (!this.size) { // only preloaded image objects can be used as source
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // no way to reliably intercept the crash due to high resolution, so we simply avoid it
- if (this.width > Image.MAX_RESIZE_WIDTH || this.height > Image.MAX_RESIZE_HEIGHT) {
- throw new x.ImageError(x.ImageError.MAX_RESOLUTION_ERR);
- }
-
- this.exec('Image', 'downsize', opts.width, opts.height, opts.crop, opts.preserveHeaders);
- } catch(ex) {
- // for now simply trigger error event
- this.trigger('error', ex.code);
- }
- },
-
- /**
- Alias for downsize(width, height, true). (see downsize)
-
- @method crop
- @param {Number} width Resulting width
- @param {Number} [height=width] Resulting height (optional, if not supplied will default to width)
- @param {Boolean} [preserveHeaders=true] Whether to preserve meta headers (on JPEGs after resize)
- */
- crop: function(width, height, preserveHeaders) {
- this.downsize(width, height, true, preserveHeaders);
- },
-
- getAsCanvas: function() {
- if (!Env.can('create_canvas')) {
- throw new x.RuntimeError(x.RuntimeError.NOT_SUPPORTED_ERR);
- }
-
- var runtime = this.connectRuntime(this.ruid);
- return runtime.exec.call(this, 'Image', 'getAsCanvas');
- },
-
- /**
- Retrieves image in it's current state as mOxie.Blob object. Cannot be run on empty or image in progress (throws
- DOMException.INVALID_STATE_ERR).
-
- @method getAsBlob
- @param {String} [type="image/jpeg"] Mime type of resulting blob. Can either be image/jpeg or image/png
- @param {Number} [quality=90] Applicable only together with mime type image/jpeg
- @return {Blob} Image as Blob
- */
- getAsBlob: function(type, quality) {
- if (!this.size) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
- return this.exec('Image', 'getAsBlob', type || 'image/jpeg', quality || 90);
- },
-
- /**
- Retrieves image in it's current state as dataURL string. Cannot be run on empty or image in progress (throws
- DOMException.INVALID_STATE_ERR).
-
- @method getAsDataURL
- @param {String} [type="image/jpeg"] Mime type of resulting blob. Can either be image/jpeg or image/png
- @param {Number} [quality=90] Applicable only together with mime type image/jpeg
- @return {String} Image as dataURL string
- */
- getAsDataURL: function(type, quality) {
- if (!this.size) {
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
- return this.exec('Image', 'getAsDataURL', type || 'image/jpeg', quality || 90);
- },
-
- /**
- Retrieves image in it's current state as binary string. Cannot be run on empty or image in progress (throws
- DOMException.INVALID_STATE_ERR).
-
- @method getAsBinaryString
- @param {String} [type="image/jpeg"] Mime type of resulting blob. Can either be image/jpeg or image/png
- @param {Number} [quality=90] Applicable only together with mime type image/jpeg
- @return {String} Image as binary string
- */
- getAsBinaryString: function(type, quality) {
- var dataUrl = this.getAsDataURL(type, quality);
- return Encode.atob(dataUrl.substring(dataUrl.indexOf('base64,') + 7));
- },
-
- /**
- Embeds a visual representation of the image into the specified node. Depending on the runtime,
- it might be a canvas, an img node or a thrid party shim object (Flash or SilverLight - very rare,
- can be used in legacy browsers that do not have canvas or proper dataURI support).
-
- @method embed
- @param {DOMElement} el DOM element to insert the image object into
- @param {Object} [opts]
- @param {Number} [opts.width] The width of an embed (defaults to the image width)
- @param {Number} [opts.height] The height of an embed (defaults to the image height)
- @param {String} [type="image/jpeg"] Mime type
- @param {Number} [quality=90] Quality of an embed, if mime type is image/jpeg
- @param {Boolean} [crop=false] Whether to crop an embed to the specified dimensions
- */
- embed: function(el, opts) {
- var self = this
- , runtime // this has to be outside of all the closures to contain proper runtime
- ;
-
- opts = Basic.extend({
- width: this.width,
- height: this.height,
- type: this.type || 'image/jpeg',
- quality: 90
- }, opts || {});
-
-
- function render(type, quality) {
- var img = this;
-
- // if possible, embed a canvas element directly
- if (Env.can('create_canvas')) {
- var canvas = img.getAsCanvas();
- if (canvas) {
- el.appendChild(canvas);
- canvas = null;
- img.destroy();
- self.trigger('embedded');
- return;
- }
- }
-
- var dataUrl = img.getAsDataURL(type, quality);
- if (!dataUrl) {
- throw new x.ImageError(x.ImageError.WRONG_FORMAT);
- }
-
- if (Env.can('use_data_uri_of', dataUrl.length)) {
- el.innerHTML = ' ';
- img.destroy();
- self.trigger('embedded');
- } else {
- var tr = new Transporter();
-
- tr.bind("TransportingComplete", function() {
- runtime = self.connectRuntime(this.result.ruid);
-
- self.bind("Embedded", function() {
- // position and size properly
- Basic.extend(runtime.getShimContainer().style, {
- //position: 'relative',
- top: '0px',
- left: '0px',
- width: img.width + 'px',
- height: img.height + 'px'
- });
-
- // some shims (Flash/SilverLight) reinitialize, if parent element is hidden, reordered or it's
- // position type changes (in Gecko), but since we basically need this only in IEs 6/7 and
- // sometimes 8 and they do not have this problem, we can comment this for now
- /*tr.bind("RuntimeInit", function(e, runtime) {
- tr.destroy();
- runtime.destroy();
- onResize.call(self); // re-feed our image data
- });*/
-
- runtime = null; // release
- }, 999);
-
- runtime.exec.call(self, "ImageView", "display", this.result.uid, width, height);
- img.destroy();
- });
-
- tr.transport(Encode.atob(dataUrl.substring(dataUrl.indexOf('base64,') + 7)), type, {
- required_caps: {
- display_media: true
- },
- runtime_order: 'flash,silverlight',
- container: el
- });
- }
- }
-
- try {
- if (!(el = Dom.get(el))) {
- throw new x.DOMException(x.DOMException.INVALID_NODE_TYPE_ERR);
- }
-
- if (!this.size) { // only preloaded image objects can be used as source
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
-
- // high-resolution images cannot be consistently handled across the runtimes
- if (this.width > Image.MAX_RESIZE_WIDTH || this.height > Image.MAX_RESIZE_HEIGHT) {
- //throw new x.ImageError(x.ImageError.MAX_RESOLUTION_ERR);
- }
-
- var imgCopy = new Image();
-
- imgCopy.bind("Resize", function() {
- render.call(this, opts.type, opts.quality);
- });
-
- imgCopy.bind("Load", function() {
- imgCopy.downsize(opts);
- });
-
- // if embedded thumb data is available and dimensions are big enough, use it
- if (this.meta.thumb && this.meta.thumb.width >= opts.width && this.meta.thumb.height >= opts.height) {
- imgCopy.load(this.meta.thumb.data);
- } else {
- imgCopy.clone(this, false);
- }
-
- return imgCopy;
- } catch(ex) {
- // for now simply trigger error event
- this.trigger('error', ex.code);
- }
- },
-
- /**
- Properly destroys the image and frees resources in use. If any. Recommended way to dispose mOxie.Image object.
-
- @method destroy
- */
- destroy: function() {
- if (this.ruid) {
- this.getRuntime().exec.call(this, 'Image', 'destroy');
- this.disconnectRuntime();
- }
- this.unbindAll();
- }
- });
-
-
- // this is here, because in order to bind properly, we need uid, which is created above
- this.handleEventProps(dispatches);
-
- this.bind('Load Resize', function() {
- _updateInfo.call(this);
- }, 999);
-
-
- function _updateInfo(info) {
- if (!info) {
- info = this.exec('Image', 'getInfo');
- }
-
- this.size = info.size;
- this.width = info.width;
- this.height = info.height;
- this.type = info.type;
- this.meta = info.meta;
-
- // update file name, only if empty
- if (this.name === '') {
- this.name = info.name;
- }
- }
-
-
- function _load(src) {
- var srcType = Basic.typeOf(src);
-
- try {
- // if source is Image
- if (src instanceof Image) {
- if (!src.size) { // only preloaded image objects can be used as source
- throw new x.DOMException(x.DOMException.INVALID_STATE_ERR);
- }
- _loadFromImage.apply(this, arguments);
- }
- // if source is o.Blob/o.File
- else if (src instanceof Blob) {
- if (!~Basic.inArray(src.type, ['image/jpeg', 'image/png'])) {
- throw new x.ImageError(x.ImageError.WRONG_FORMAT);
- }
- _loadFromBlob.apply(this, arguments);
- }
- // if native blob/file
- else if (Basic.inArray(srcType, ['blob', 'file']) !== -1) {
- _load.call(this, new File(null, src), arguments[1]);
- }
- // if String
- else if (srcType === 'string') {
- // if dataUrl String
- if (src.substr(0, 5) === 'data:') {
- _load.call(this, new Blob(null, { data: src }), arguments[1]);
- }
- // else assume Url, either relative or absolute
- else {
- _loadFromUrl.apply(this, arguments);
- }
- }
- // if source seems to be an img node
- else if (srcType === 'node' && src.nodeName.toLowerCase() === 'img') {
- _load.call(this, src.src, arguments[1]);
- }
- else {
- throw new x.DOMException(x.DOMException.TYPE_MISMATCH_ERR);
- }
- } catch(ex) {
- // for now simply trigger error event
- this.trigger('error', ex.code);
- }
- }
-
-
- function _loadFromImage(img, exact) {
- var runtime = this.connectRuntime(img.ruid);
- this.ruid = runtime.uid;
- runtime.exec.call(this, 'Image', 'loadFromImage', img, (Basic.typeOf(exact) === 'undefined' ? true : exact));
- }
-
-
- function _loadFromBlob(blob, options) {
- var self = this;
-
- self.name = blob.name || '';
-
- function exec(runtime) {
- self.ruid = runtime.uid;
- runtime.exec.call(self, 'Image', 'loadFromBlob', blob);
- }
-
- if (blob.isDetached()) {
- this.bind('RuntimeInit', function(e, runtime) {
- exec(runtime);
- });
-
- // convert to object representation
- if (options && typeof(options.required_caps) === 'string') {
- options.required_caps = Runtime.parseCaps(options.required_caps);
- }
-
- this.connectRuntime(Basic.extend({
- required_caps: {
- access_image_binary: true,
- resize_image: true
- }
- }, options));
- } else {
- exec(this.connectRuntime(blob.ruid));
- }
- }
-
-
- function _loadFromUrl(url, options) {
- var self = this, xhr;
-
- xhr = new XMLHttpRequest();
-
- xhr.open('get', url);
- xhr.responseType = 'blob';
-
- xhr.onprogress = function(e) {
- self.trigger(e);
- };
-
- xhr.onload = function() {
- _loadFromBlob.call(self, xhr.response, true);
- };
-
- xhr.onerror = function(e) {
- self.trigger(e);
- };
-
- xhr.onloadend = function() {
- xhr.destroy();
- };
-
- xhr.bind('RuntimeError', function(e, err) {
- self.trigger('RuntimeError', err);
- });
-
- xhr.send(null, options);
- }
- }
-
- // virtual world will crash on you if image has a resolution higher than this:
- Image.MAX_RESIZE_WIDTH = 8192;
- Image.MAX_RESIZE_HEIGHT = 8192;
-
- Image.prototype = EventTarget.instance;
-
- return Image;
-});
-
-// Included from: src/javascript/runtime/html5/Runtime.js
-
-/**
- * Runtime.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/*global File:true */
-
-/**
-Defines constructor for HTML5 runtime.
-
-@class moxie/runtime/html5/Runtime
-@private
-*/
-define("moxie/runtime/html5/Runtime", [
- "moxie/core/utils/Basic",
- "moxie/core/Exceptions",
- "moxie/runtime/Runtime",
- "moxie/core/utils/Env"
-], function(Basic, x, Runtime, Env) {
-
- var type = "html5", extensions = {};
-
- function Html5Runtime(options) {
- var I = this
- , Test = Runtime.capTest
- , True = Runtime.capTrue
- ;
-
- var caps = Basic.extend({
- access_binary: Test(window.FileReader || window.File && window.File.getAsDataURL),
- access_image_binary: function() {
- return I.can('access_binary') && !!extensions.Image;
- },
- display_media: Test(Env.can('create_canvas') || Env.can('use_data_uri_over32kb')),
- do_cors: Test(window.XMLHttpRequest && 'withCredentials' in new XMLHttpRequest()),
- drag_and_drop: Test(function() {
- // this comes directly from Modernizr: http://www.modernizr.com/
- var div = document.createElement('div');
- // IE has support for drag and drop since version 5, but doesn't support dropping files from desktop
- return (('draggable' in div) || ('ondragstart' in div && 'ondrop' in div)) &&
- (Env.browser !== 'IE' || Env.verComp(Env.version, 9, '>'));
- }()),
- filter_by_extension: Test(function() { // if you know how to feature-detect this, please suggest
- return (Env.browser === 'Chrome' && Env.verComp(Env.version, 28, '>=')) ||
- (Env.browser === 'IE' && Env.verComp(Env.version, 10, '>=')) ||
- (Env.browser === 'Safari' && Env.verComp(Env.version, 7, '>='));
- }()),
- return_response_headers: True,
- return_response_type: function(responseType) {
- if (responseType === 'json' && !!window.JSON) { // we can fake this one even if it's not supported
- return true;
- }
- return Env.can('return_response_type', responseType);
- },
- return_status_code: True,
- report_upload_progress: Test(window.XMLHttpRequest && new XMLHttpRequest().upload),
- resize_image: function() {
- return I.can('access_binary') && Env.can('create_canvas');
- },
- select_file: function() {
- return Env.can('use_fileinput') && window.File;
- },
- select_folder: function() {
- return I.can('select_file') && Env.browser === 'Chrome' && Env.verComp(Env.version, 21, '>=');
- },
- select_multiple: function() {
- // it is buggy on Safari Windows and iOS
- return I.can('select_file') &&
- !(Env.browser === 'Safari' && Env.os === 'Windows') &&
- !(Env.os === 'iOS' && Env.verComp(Env.osVersion, "7.0.0", '>') && Env.verComp(Env.osVersion, "8.0.0", '<'));
- },
- send_binary_string: Test(window.XMLHttpRequest && (new XMLHttpRequest().sendAsBinary || (window.Uint8Array && window.ArrayBuffer))),
- send_custom_headers: Test(window.XMLHttpRequest),
- send_multipart: function() {
- return !!(window.XMLHttpRequest && new XMLHttpRequest().upload && window.FormData) || I.can('send_binary_string');
- },
- slice_blob: Test(window.File && (File.prototype.mozSlice || File.prototype.webkitSlice || File.prototype.slice)),
- stream_upload: function(){
- return I.can('slice_blob') && I.can('send_multipart');
- },
- summon_file_dialog: function() { // yeah... some dirty sniffing here...
- return I.can('select_file') && (
- (Env.browser === 'Firefox' && Env.verComp(Env.version, 4, '>=')) ||
- (Env.browser === 'Opera' && Env.verComp(Env.version, 12, '>=')) ||
- (Env.browser === 'IE' && Env.verComp(Env.version, 10, '>=')) ||
- !!~Basic.inArray(Env.browser, ['Chrome', 'Safari'])
- );
- },
- upload_filesize: True
- },
- arguments[2]
- );
-
- Runtime.call(this, options, (arguments[1] || type), caps);
-
-
- Basic.extend(this, {
-
- init : function() {
- this.trigger("Init");
- },
-
- destroy: (function(destroy) { // extend default destroy method
- return function() {
- destroy.call(I);
- destroy = I = null;
- };
- }(this.destroy))
- });
-
- Basic.extend(this.getShim(), extensions);
- }
-
- Runtime.addConstructor(type, Html5Runtime);
-
- return extensions;
-});
-
-// Included from: src/javascript/core/utils/Events.js
-
-/**
- * Events.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-define('moxie/core/utils/Events', [
- 'moxie/core/utils/Basic'
-], function(Basic) {
- var eventhash = {}, uid = 'moxie_' + Basic.guid();
-
- // IE W3C like event funcs
- function preventDefault() {
- this.returnValue = false;
- }
-
- function stopPropagation() {
- this.cancelBubble = true;
- }
-
- /**
- Adds an event handler to the specified object and store reference to the handler
- in objects internal Plupload registry (@see removeEvent).
-
- @method addEvent
- @for Utils
- @static
- @param {Object} obj DOM element like object to add handler to.
- @param {String} name Name to add event listener to.
- @param {Function} callback Function to call when event occurs.
- @param {String} [key] that might be used to add specifity to the event record.
- */
- var addEvent = function(obj, name, callback, key) {
- var func, events;
-
- name = name.toLowerCase();
-
- // Add event listener
- if (obj.addEventListener) {
- func = callback;
-
- obj.addEventListener(name, func, false);
- } else if (obj.attachEvent) {
- func = function() {
- var evt = window.event;
-
- if (!evt.target) {
- evt.target = evt.srcElement;
- }
-
- evt.preventDefault = preventDefault;
- evt.stopPropagation = stopPropagation;
-
- callback(evt);
- };
-
- obj.attachEvent('on' + name, func);
- }
-
- // Log event handler to objects internal mOxie registry
- if (!obj[uid]) {
- obj[uid] = Basic.guid();
- }
-
- if (!eventhash.hasOwnProperty(obj[uid])) {
- eventhash[obj[uid]] = {};
- }
-
- events = eventhash[obj[uid]];
-
- if (!events.hasOwnProperty(name)) {
- events[name] = [];
- }
-
- events[name].push({
- func: func,
- orig: callback, // store original callback for IE
- key: key
- });
- };
-
-
- /**
- Remove event handler from the specified object. If third argument (callback)
- is not specified remove all events with the specified name.
-
- @method removeEvent
- @static
- @param {Object} obj DOM element to remove event listener(s) from.
- @param {String} name Name of event listener to remove.
- @param {Function|String} [callback] might be a callback or unique key to match.
- */
- var removeEvent = function(obj, name, callback) {
- var type, undef;
-
- name = name.toLowerCase();
-
- if (obj[uid] && eventhash[obj[uid]] && eventhash[obj[uid]][name]) {
- type = eventhash[obj[uid]][name];
- } else {
- return;
- }
-
- for (var i = type.length - 1; i >= 0; i--) {
- // undefined or not, key should match
- if (type[i].orig === callback || type[i].key === callback) {
- if (obj.removeEventListener) {
- obj.removeEventListener(name, type[i].func, false);
- } else if (obj.detachEvent) {
- obj.detachEvent('on'+name, type[i].func);
- }
-
- type[i].orig = null;
- type[i].func = null;
- type.splice(i, 1);
-
- // If callback was passed we are done here, otherwise proceed
- if (callback !== undef) {
- break;
- }
- }
- }
-
- // If event array got empty, remove it
- if (!type.length) {
- delete eventhash[obj[uid]][name];
- }
-
- // If mOxie registry has become empty, remove it
- if (Basic.isEmptyObj(eventhash[obj[uid]])) {
- delete eventhash[obj[uid]];
-
- // IE doesn't let you remove DOM object property with - delete
- try {
- delete obj[uid];
- } catch(e) {
- obj[uid] = undef;
- }
- }
- };
-
-
- /**
- Remove all kind of events from the specified object
-
- @method removeAllEvents
- @static
- @param {Object} obj DOM element to remove event listeners from.
- @param {String} [key] unique key to match, when removing events.
- */
- var removeAllEvents = function(obj, key) {
- if (!obj || !obj[uid]) {
- return;
- }
-
- Basic.each(eventhash[obj[uid]], function(events, name) {
- removeEvent(obj, name, key);
- });
- };
-
- return {
- addEvent: addEvent,
- removeEvent: removeEvent,
- removeAllEvents: removeAllEvents
- };
-});
-
-// Included from: src/javascript/runtime/html5/file/FileInput.js
-
-/**
- * FileInput.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/file/FileInput
-@private
-*/
-define("moxie/runtime/html5/file/FileInput", [
- "moxie/runtime/html5/Runtime",
- "moxie/file/File",
- "moxie/core/utils/Basic",
- "moxie/core/utils/Dom",
- "moxie/core/utils/Events",
- "moxie/core/utils/Mime",
- "moxie/core/utils/Env"
-], function(extensions, File, Basic, Dom, Events, Mime, Env) {
-
- function FileInput() {
- var _options;
-
- Basic.extend(this, {
- init: function(options) {
- var comp = this, I = comp.getRuntime(), input, shimContainer, mimes, browseButton, zIndex, top;
-
- _options = options;
-
- // figure out accept string
- mimes = _options.accept.mimes || Mime.extList2mimes(_options.accept, I.can('filter_by_extension'));
-
- shimContainer = I.getShimContainer();
-
- shimContainer.innerHTML = ' ';
-
- input = Dom.get(I.uid);
-
- // prepare file input to be placed underneath the browse_button element
- Basic.extend(input.style, {
- position: 'absolute',
- top: 0,
- left: 0,
- width: '100%',
- height: '100%'
- });
-
-
- browseButton = Dom.get(_options.browse_button);
-
- // Route click event to the input[type=file] element for browsers that support such behavior
- if (I.can('summon_file_dialog')) {
- if (Dom.getStyle(browseButton, 'position') === 'static') {
- browseButton.style.position = 'relative';
- }
-
- zIndex = parseInt(Dom.getStyle(browseButton, 'z-index'), 10) || 1;
-
- browseButton.style.zIndex = zIndex;
- shimContainer.style.zIndex = zIndex - 1;
-
- Events.addEvent(browseButton, 'click', function(e) {
- var input = Dom.get(I.uid);
- if (input && !input.disabled) { // for some reason FF (up to 8.0.1 so far) lets to click disabled input[type=file]
- input.click();
- }
- e.preventDefault();
- }, comp.uid);
- }
-
- /* Since we have to place input[type=file] on top of the browse_button for some browsers,
- browse_button loses interactivity, so we restore it here */
- top = I.can('summon_file_dialog') ? browseButton : shimContainer;
-
- Events.addEvent(top, 'mouseover', function() {
- comp.trigger('mouseenter');
- }, comp.uid);
-
- Events.addEvent(top, 'mouseout', function() {
- comp.trigger('mouseleave');
- }, comp.uid);
-
- Events.addEvent(top, 'mousedown', function() {
- comp.trigger('mousedown');
- }, comp.uid);
-
- Events.addEvent(Dom.get(_options.container), 'mouseup', function() {
- comp.trigger('mouseup');
- }, comp.uid);
-
-
- input.onchange = function onChange(e) { // there should be only one handler for this
- comp.files = [];
-
- Basic.each(this.files, function(file) {
- var relativePath = '';
-
- if (_options.directory) {
- // folders are represented by dots, filter them out (Chrome 11+)
- if (file.name == ".") {
- // if it looks like a folder...
- return true;
- }
- }
-
- if (file.webkitRelativePath) {
- relativePath = '/' + file.webkitRelativePath.replace(/^\//, '');
- }
-
- file = new File(I.uid, file);
- file.relativePath = relativePath;
-
- comp.files.push(file);
- });
-
- // clearing the value enables the user to select the same file again if they want to
- if (Env.browser !== 'IE' && Env.browser !== 'IEMobile') {
- this.value = '';
- } else {
- // in IE input[type="file"] is read-only so the only way to reset it is to re-insert it
- var clone = this.cloneNode(true);
- this.parentNode.replaceChild(clone, this);
- clone.onchange = onChange;
- }
-
- if (comp.files.length) {
- comp.trigger('change');
- }
- };
-
- // ready event is perfectly asynchronous
- comp.trigger({
- type: 'ready',
- async: true
- });
-
- shimContainer = null;
- },
-
-
- disable: function(state) {
- var I = this.getRuntime(), input;
-
- if ((input = Dom.get(I.uid))) {
- input.disabled = !!state;
- }
- },
-
- destroy: function() {
- var I = this.getRuntime()
- , shim = I.getShim()
- , shimContainer = I.getShimContainer()
- ;
-
- Events.removeAllEvents(shimContainer, this.uid);
- Events.removeAllEvents(_options && Dom.get(_options.container), this.uid);
- Events.removeAllEvents(_options && Dom.get(_options.browse_button), this.uid);
-
- if (shimContainer) {
- shimContainer.innerHTML = '';
- }
-
- shim.removeInstance(this.uid);
-
- _options = shimContainer = shim = null;
- }
- });
- }
-
- return (extensions.FileInput = FileInput);
-});
-
-// Included from: src/javascript/runtime/html5/file/Blob.js
-
-/**
- * Blob.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/file/Blob
-@private
-*/
-define("moxie/runtime/html5/file/Blob", [
- "moxie/runtime/html5/Runtime",
- "moxie/file/Blob"
-], function(extensions, Blob) {
-
- function HTML5Blob() {
- function w3cBlobSlice(blob, start, end) {
- var blobSlice;
-
- if (window.File.prototype.slice) {
- try {
- blob.slice(); // depricated version will throw WRONG_ARGUMENTS_ERR exception
- return blob.slice(start, end);
- } catch (e) {
- // depricated slice method
- return blob.slice(start, end - start);
- }
- // slice method got prefixed: https://bugzilla.mozilla.org/show_bug.cgi?id=649672
- } else if ((blobSlice = window.File.prototype.webkitSlice || window.File.prototype.mozSlice)) {
- return blobSlice.call(blob, start, end);
- } else {
- return null; // or throw some exception
- }
- }
-
- this.slice = function() {
- return new Blob(this.getRuntime().uid, w3cBlobSlice.apply(this, arguments));
- };
- }
-
- return (extensions.Blob = HTML5Blob);
-});
-
-// Included from: src/javascript/runtime/html5/file/FileDrop.js
-
-/**
- * FileDrop.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/file/FileDrop
-@private
-*/
-define("moxie/runtime/html5/file/FileDrop", [
- "moxie/runtime/html5/Runtime",
- 'moxie/file/File',
- "moxie/core/utils/Basic",
- "moxie/core/utils/Dom",
- "moxie/core/utils/Events",
- "moxie/core/utils/Mime"
-], function(extensions, File, Basic, Dom, Events, Mime) {
-
- function FileDrop() {
- var _files = [], _allowedExts = [], _options, _ruid;
-
- Basic.extend(this, {
- init: function(options) {
- var comp = this, dropZone;
-
- _options = options;
- _ruid = comp.ruid; // every dropped-in file should have a reference to the runtime
- _allowedExts = _extractExts(_options.accept);
- dropZone = _options.container;
-
- Events.addEvent(dropZone, 'dragover', function(e) {
- if (!_hasFiles(e)) {
- return;
- }
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
- }, comp.uid);
-
- Events.addEvent(dropZone, 'drop', function(e) {
- if (!_hasFiles(e)) {
- return;
- }
- e.preventDefault();
-
- _files = [];
-
- // Chrome 21+ accepts folders via Drag'n'Drop
- if (e.dataTransfer.items && e.dataTransfer.items[0].webkitGetAsEntry) {
- _readItems(e.dataTransfer.items, function() {
- comp.files = _files;
- comp.trigger("drop");
- });
- } else {
- Basic.each(e.dataTransfer.files, function(file) {
- _addFile(file);
- });
- comp.files = _files;
- comp.trigger("drop");
- }
- }, comp.uid);
-
- Events.addEvent(dropZone, 'dragenter', function(e) {
- comp.trigger("dragenter");
- }, comp.uid);
-
- Events.addEvent(dropZone, 'dragleave', function(e) {
- comp.trigger("dragleave");
- }, comp.uid);
- },
-
- destroy: function() {
- Events.removeAllEvents(_options && Dom.get(_options.container), this.uid);
- _ruid = _files = _allowedExts = _options = null;
- }
- });
-
-
- function _hasFiles(e) {
- if (!e.dataTransfer || !e.dataTransfer.types) { // e.dataTransfer.files is not available in Gecko during dragover
- return false;
- }
-
- var types = Basic.toArray(e.dataTransfer.types || []);
-
- return Basic.inArray("Files", types) !== -1 ||
- Basic.inArray("public.file-url", types) !== -1 || // Safari < 5
- Basic.inArray("application/x-moz-file", types) !== -1 // Gecko < 1.9.2 (< Firefox 3.6)
- ;
- }
-
-
- function _addFile(file, relativePath) {
- if (_isAcceptable(file)) {
- var fileObj = new File(_ruid, file);
- fileObj.relativePath = relativePath || '';
- _files.push(fileObj);
- }
- }
-
-
- function _extractExts(accept) {
- var exts = [];
- for (var i = 0; i < accept.length; i++) {
- [].push.apply(exts, accept[i].extensions.split(/\s*,\s*/));
- }
- return Basic.inArray('*', exts) === -1 ? exts : [];
- }
-
-
- function _isAcceptable(file) {
- if (!_allowedExts.length) {
- return true;
- }
- var ext = Mime.getFileExtension(file.name);
- return !ext || Basic.inArray(ext, _allowedExts) !== -1;
- }
-
-
- function _readItems(items, cb) {
- var entries = [];
- Basic.each(items, function(item) {
- var entry = item.webkitGetAsEntry();
- // Address #998 (https://code.google.com/p/chromium/issues/detail?id=332579)
- if (entry) {
- // file() fails on OSX when the filename contains a special character (e.g. umlaut): see #61
- if (entry.isFile) {
- _addFile(item.getAsFile(), entry.fullPath);
- } else {
- entries.push(entry);
- }
- }
- });
-
- if (entries.length) {
- _readEntries(entries, cb);
- } else {
- cb();
- }
- }
-
-
- function _readEntries(entries, cb) {
- var queue = [];
- Basic.each(entries, function(entry) {
- queue.push(function(cbcb) {
- _readEntry(entry, cbcb);
- });
- });
- Basic.inSeries(queue, function() {
- cb();
- });
- }
-
-
- function _readEntry(entry, cb) {
- if (entry.isFile) {
- entry.file(function(file) {
- _addFile(file, entry.fullPath);
- cb();
- }, function() {
- // fire an error event maybe
- cb();
- });
- } else if (entry.isDirectory) {
- _readDirEntry(entry, cb);
- } else {
- cb(); // not file, not directory? what then?..
- }
- }
-
-
- function _readDirEntry(dirEntry, cb) {
- var entries = [], dirReader = dirEntry.createReader();
-
- // keep quering recursively till no more entries
- function getEntries(cbcb) {
- dirReader.readEntries(function(moreEntries) {
- if (moreEntries.length) {
- [].push.apply(entries, moreEntries);
- getEntries(cbcb);
- } else {
- cbcb();
- }
- }, cbcb);
- }
-
- // ...and you thought FileReader was crazy...
- getEntries(function() {
- _readEntries(entries, cb);
- });
- }
- }
-
- return (extensions.FileDrop = FileDrop);
-});
-
-// Included from: src/javascript/runtime/html5/file/FileReader.js
-
-/**
- * FileReader.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/file/FileReader
-@private
-*/
-define("moxie/runtime/html5/file/FileReader", [
- "moxie/runtime/html5/Runtime",
- "moxie/core/utils/Encode",
- "moxie/core/utils/Basic"
-], function(extensions, Encode, Basic) {
-
- function FileReader() {
- var _fr, _convertToBinary = false;
-
- Basic.extend(this, {
-
- read: function(op, blob) {
- var comp = this;
-
- comp.result = '';
-
- _fr = new window.FileReader();
-
- _fr.addEventListener('progress', function(e) {
- comp.trigger(e);
- });
-
- _fr.addEventListener('load', function(e) {
- comp.result = _convertToBinary ? _toBinary(_fr.result) : _fr.result;
- comp.trigger(e);
- });
-
- _fr.addEventListener('error', function(e) {
- comp.trigger(e, _fr.error);
- });
-
- _fr.addEventListener('loadend', function(e) {
- _fr = null;
- comp.trigger(e);
- });
-
- if (Basic.typeOf(_fr[op]) === 'function') {
- _convertToBinary = false;
- _fr[op](blob.getSource());
- } else if (op === 'readAsBinaryString') { // readAsBinaryString is depricated in general and never existed in IE10+
- _convertToBinary = true;
- _fr.readAsDataURL(blob.getSource());
- }
- },
-
- abort: function() {
- if (_fr) {
- _fr.abort();
- }
- },
-
- destroy: function() {
- _fr = null;
- }
- });
-
- function _toBinary(str) {
- return Encode.atob(str.substring(str.indexOf('base64,') + 7));
- }
- }
-
- return (extensions.FileReader = FileReader);
-});
-
-// Included from: src/javascript/runtime/html5/xhr/XMLHttpRequest.js
-
-/**
- * XMLHttpRequest.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/*global ActiveXObject:true */
-
-/**
-@class moxie/runtime/html5/xhr/XMLHttpRequest
-@private
-*/
-define("moxie/runtime/html5/xhr/XMLHttpRequest", [
- "moxie/runtime/html5/Runtime",
- "moxie/core/utils/Basic",
- "moxie/core/utils/Mime",
- "moxie/core/utils/Url",
- "moxie/file/File",
- "moxie/file/Blob",
- "moxie/xhr/FormData",
- "moxie/core/Exceptions",
- "moxie/core/utils/Env"
-], function(extensions, Basic, Mime, Url, File, Blob, FormData, x, Env) {
-
- function XMLHttpRequest() {
- var self = this
- , _xhr
- , _filename
- ;
-
- Basic.extend(this, {
- send: function(meta, data) {
- var target = this
- , isGecko2_5_6 = (Env.browser === 'Mozilla' && Env.verComp(Env.version, 4, '>=') && Env.verComp(Env.version, 7, '<'))
- , isAndroidBrowser = Env.browser === 'Android Browser'
- , mustSendAsBinary = false
- ;
-
- // extract file name
- _filename = meta.url.replace(/^.+?\/([\w\-\.]+)$/, '$1').toLowerCase();
-
- _xhr = _getNativeXHR();
- _xhr.open(meta.method, meta.url, meta.async, meta.user, meta.password);
-
-
- // prepare data to be sent
- if (data instanceof Blob) {
- if (data.isDetached()) {
- mustSendAsBinary = true;
- }
- data = data.getSource();
- } else if (data instanceof FormData) {
-
- if (data.hasBlob()) {
- if (data.getBlob().isDetached()) {
- data = _prepareMultipart.call(target, data); // _xhr must be instantiated and be in OPENED state
- mustSendAsBinary = true;
- } else if ((isGecko2_5_6 || isAndroidBrowser) && Basic.typeOf(data.getBlob().getSource()) === 'blob' && window.FileReader) {
- // Gecko 2/5/6 can't send blob in FormData: https://bugzilla.mozilla.org/show_bug.cgi?id=649150
- // Android browsers (default one and Dolphin) seem to have the same issue, see: #613
- _preloadAndSend.call(target, meta, data);
- return; // _preloadAndSend will reinvoke send() with transmutated FormData =%D
- }
- }
-
- // transfer fields to real FormData
- if (data instanceof FormData) { // if still a FormData, e.g. not mangled by _prepareMultipart()
- var fd = new window.FormData();
- data.each(function(value, name) {
- if (value instanceof Blob) {
- fd.append(name, value.getSource());
- } else {
- fd.append(name, value);
- }
- });
- data = fd;
- }
- }
-
-
- // if XHR L2
- if (_xhr.upload) {
- if (meta.withCredentials) {
- _xhr.withCredentials = true;
- }
-
- _xhr.addEventListener('load', function(e) {
- target.trigger(e);
- });
-
- _xhr.addEventListener('error', function(e) {
- target.trigger(e);
- });
-
- // additionally listen to progress events
- _xhr.addEventListener('progress', function(e) {
- target.trigger(e);
- });
-
- _xhr.upload.addEventListener('progress', function(e) {
- target.trigger({
- type: 'UploadProgress',
- loaded: e.loaded,
- total: e.total
- });
- });
- // ... otherwise simulate XHR L2
- } else {
- _xhr.onreadystatechange = function onReadyStateChange() {
-
- // fake Level 2 events
- switch (_xhr.readyState) {
-
- case 1: // XMLHttpRequest.OPENED
- // readystatechanged is fired twice for OPENED state (in IE and Mozilla) - neu
- break;
-
- // looks like HEADERS_RECEIVED (state 2) is not reported in Opera (or it's old versions) - neu
- case 2: // XMLHttpRequest.HEADERS_RECEIVED
- break;
-
- case 3: // XMLHttpRequest.LOADING
- // try to fire progress event for not XHR L2
- var total, loaded;
-
- try {
- if (Url.hasSameOrigin(meta.url)) { // Content-Length not accessible for cross-domain on some browsers
- total = _xhr.getResponseHeader('Content-Length') || 0; // old Safari throws an exception here
- }
-
- if (_xhr.responseText) { // responseText was introduced in IE7
- loaded = _xhr.responseText.length;
- }
- } catch(ex) {
- total = loaded = 0;
- }
-
- target.trigger({
- type: 'progress',
- lengthComputable: !!total,
- total: parseInt(total, 10),
- loaded: loaded
- });
- break;
-
- case 4: // XMLHttpRequest.DONE
- // release readystatechange handler (mostly for IE)
- _xhr.onreadystatechange = function() {};
-
- // usually status 0 is returned when server is unreachable, but FF also fails to status 0 for 408 timeout
- if (_xhr.status === 0) {
- target.trigger('error');
- } else {
- target.trigger('load');
- }
- break;
- }
- };
- }
-
-
- // set request headers
- if (!Basic.isEmptyObj(meta.headers)) {
- Basic.each(meta.headers, function(value, header) {
- _xhr.setRequestHeader(header, value);
- });
- }
-
- // request response type
- if ("" !== meta.responseType && 'responseType' in _xhr) {
- if ('json' === meta.responseType && !Env.can('return_response_type', 'json')) { // we can fake this one
- _xhr.responseType = 'text';
- } else {
- _xhr.responseType = meta.responseType;
- }
- }
-
- // send ...
- if (!mustSendAsBinary) {
- _xhr.send(data);
- } else {
- if (_xhr.sendAsBinary) { // Gecko
- _xhr.sendAsBinary(data);
- } else { // other browsers having support for typed arrays
- (function() {
- // mimic Gecko's sendAsBinary
- var ui8a = new Uint8Array(data.length);
- for (var i = 0; i < data.length; i++) {
- ui8a[i] = (data.charCodeAt(i) & 0xff);
- }
- _xhr.send(ui8a.buffer);
- }());
- }
- }
-
- target.trigger('loadstart');
- },
-
- getStatus: function() {
- // according to W3C spec it should return 0 for readyState < 3, but instead it throws an exception
- try {
- if (_xhr) {
- return _xhr.status;
- }
- } catch(ex) {}
- return 0;
- },
-
- getResponse: function(responseType) {
- var I = this.getRuntime();
-
- try {
- switch (responseType) {
- case 'blob':
- var file = new File(I.uid, _xhr.response);
-
- // try to extract file name from content-disposition if possible (might be - not, if CORS for example)
- var disposition = _xhr.getResponseHeader('Content-Disposition');
- if (disposition) {
- // extract filename from response header if available
- var match = disposition.match(/filename=([\'\"'])([^\1]+)\1/);
- if (match) {
- _filename = match[2];
- }
- }
- file.name = _filename;
-
- // pre-webkit Opera doesn't set type property on the blob response
- if (!file.type) {
- file.type = Mime.getFileMime(_filename);
- }
- return file;
-
- case 'json':
- if (!Env.can('return_response_type', 'json')) {
- return _xhr.status === 200 && !!window.JSON ? JSON.parse(_xhr.responseText) : null;
- }
- return _xhr.response;
-
- case 'document':
- return _getDocument(_xhr);
-
- default:
- return _xhr.responseText !== '' ? _xhr.responseText : null; // against the specs, but for consistency across the runtimes
- }
- } catch(ex) {
- return null;
- }
- },
-
- getAllResponseHeaders: function() {
- try {
- return _xhr.getAllResponseHeaders();
- } catch(ex) {}
- return '';
- },
-
- abort: function() {
- if (_xhr) {
- _xhr.abort();
- }
- },
-
- destroy: function() {
- self = _filename = null;
- }
- });
-
-
- // here we go... ugly fix for ugly bug
- function _preloadAndSend(meta, data) {
- var target = this, blob, fr;
-
- // get original blob
- blob = data.getBlob().getSource();
-
- // preload blob in memory to be sent as binary string
- fr = new window.FileReader();
- fr.onload = function() {
- // overwrite original blob
- data.append(data.getBlobName(), new Blob(null, {
- type: blob.type,
- data: fr.result
- }));
- // invoke send operation again
- self.send.call(target, meta, data);
- };
- fr.readAsBinaryString(blob);
- }
-
-
- function _getNativeXHR() {
- if (window.XMLHttpRequest && !(Env.browser === 'IE' && Env.verComp(Env.version, 8, '<'))) { // IE7 has native XHR but it's buggy
- return new window.XMLHttpRequest();
- } else {
- return (function() {
- var progIDs = ['Msxml2.XMLHTTP.6.0', 'Microsoft.XMLHTTP']; // if 6.0 available, use it, otherwise failback to default 3.0
- for (var i = 0; i < progIDs.length; i++) {
- try {
- return new ActiveXObject(progIDs[i]);
- } catch (ex) {}
- }
- })();
- }
- }
-
- // @credits Sergey Ilinsky (http://www.ilinsky.com/)
- function _getDocument(xhr) {
- var rXML = xhr.responseXML;
- var rText = xhr.responseText;
-
- // Try parsing responseText (@see: http://www.ilinsky.com/articles/XMLHttpRequest/#bugs-ie-responseXML-content-type)
- if (Env.browser === 'IE' && rText && rXML && !rXML.documentElement && /[^\/]+\/[^\+]+\+xml/.test(xhr.getResponseHeader("Content-Type"))) {
- rXML = new window.ActiveXObject("Microsoft.XMLDOM");
- rXML.async = false;
- rXML.validateOnParse = false;
- rXML.loadXML(rText);
- }
-
- // Check if there is no error in document
- if (rXML) {
- if ((Env.browser === 'IE' && rXML.parseError !== 0) || !rXML.documentElement || rXML.documentElement.tagName === "parsererror") {
- return null;
- }
- }
- return rXML;
- }
-
-
- function _prepareMultipart(fd) {
- var boundary = '----moxieboundary' + new Date().getTime()
- , dashdash = '--'
- , crlf = '\r\n'
- , multipart = ''
- , I = this.getRuntime()
- ;
-
- if (!I.can('send_binary_string')) {
- throw new x.RuntimeError(x.RuntimeError.NOT_SUPPORTED_ERR);
- }
-
- _xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
-
- // append multipart parameters
- fd.each(function(value, name) {
- // Firefox 3.6 failed to convert multibyte characters to UTF-8 in sendAsBinary(),
- // so we try it here ourselves with: unescape(encodeURIComponent(value))
- if (value instanceof Blob) {
- // Build RFC2388 blob
- multipart += dashdash + boundary + crlf +
- 'Content-Disposition: form-data; name="' + name + '"; filename="' + unescape(encodeURIComponent(value.name || 'blob')) + '"' + crlf +
- 'Content-Type: ' + (value.type || 'application/octet-stream') + crlf + crlf +
- value.getSource() + crlf;
- } else {
- multipart += dashdash + boundary + crlf +
- 'Content-Disposition: form-data; name="' + name + '"' + crlf + crlf +
- unescape(encodeURIComponent(value)) + crlf;
- }
- });
-
- multipart += dashdash + boundary + dashdash + crlf;
-
- return multipart;
- }
- }
-
- return (extensions.XMLHttpRequest = XMLHttpRequest);
-});
-
-// Included from: src/javascript/runtime/html5/utils/BinaryReader.js
-
-/**
- * BinaryReader.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/utils/BinaryReader
-@private
-*/
-define("moxie/runtime/html5/utils/BinaryReader", [
- "moxie/core/utils/Basic"
-], function(Basic) {
-
-
- function BinaryReader(data) {
- if (data instanceof ArrayBuffer) {
- ArrayBufferReader.apply(this, arguments);
- } else {
- UTF16StringReader.apply(this, arguments);
- }
- }
-
- Basic.extend(BinaryReader.prototype, {
-
- littleEndian: false,
-
-
- read: function(idx, size) {
- var sum, mv, i;
-
- if (idx + size > this.length()) {
- throw new Error("You are trying to read outside the source boundaries.");
- }
-
- mv = this.littleEndian
- ? 0
- : -8 * (size - 1)
- ;
-
- for (i = 0, sum = 0; i < size; i++) {
- sum |= (this.readByteAt(idx + i) << Math.abs(mv + i*8));
- }
- return sum;
- },
-
-
- write: function(idx, num, size) {
- var mv, i, str = '';
-
- if (idx > this.length()) {
- throw new Error("You are trying to write outside the source boundaries.");
- }
-
- mv = this.littleEndian
- ? 0
- : -8 * (size - 1)
- ;
-
- for (i = 0; i < size; i++) {
- this.writeByteAt(idx + i, (num >> Math.abs(mv + i*8)) & 255);
- }
- },
-
-
- BYTE: function(idx) {
- return this.read(idx, 1);
- },
-
-
- SHORT: function(idx) {
- return this.read(idx, 2);
- },
-
-
- LONG: function(idx) {
- return this.read(idx, 4);
- },
-
-
- SLONG: function(idx) { // 2's complement notation
- var num = this.read(idx, 4);
- return (num > 2147483647 ? num - 4294967296 : num);
- },
-
-
- CHAR: function(idx) {
- return String.fromCharCode(this.read(idx, 1));
- },
-
-
- STRING: function(idx, count) {
- return this.asArray('CHAR', idx, count).join('');
- },
-
-
- asArray: function(type, idx, count) {
- var values = [];
-
- for (var i = 0; i < count; i++) {
- values[i] = this[type](idx + i);
- }
- return values;
- }
- });
-
-
- function ArrayBufferReader(data) {
- var _dv = new DataView(data);
-
- Basic.extend(this, {
-
- readByteAt: function(idx) {
- return _dv.getUint8(idx);
- },
-
-
- writeByteAt: function(idx, value) {
- _dv.setUint8(idx, value);
- },
-
-
- SEGMENT: function(idx, size, value) {
- switch (arguments.length) {
- case 2:
- return data.slice(idx, idx + size);
-
- case 1:
- return data.slice(idx);
-
- case 3:
- if (value === null) {
- value = new ArrayBuffer();
- }
-
- if (value instanceof ArrayBuffer) {
- var arr = new Uint8Array(this.length() - size + value.byteLength);
- if (idx > 0) {
- arr.set(new Uint8Array(data.slice(0, idx)), 0);
- }
- arr.set(new Uint8Array(value), idx);
- arr.set(new Uint8Array(data.slice(idx + size)), idx + value.byteLength);
-
- this.clear();
- data = arr.buffer;
- _dv = new DataView(data);
- break;
- }
-
- default: return data;
- }
- },
-
-
- length: function() {
- return data ? data.byteLength : 0;
- },
-
-
- clear: function() {
- _dv = data = null;
- }
- });
- }
-
-
- function UTF16StringReader(data) {
- Basic.extend(this, {
-
- readByteAt: function(idx) {
- return data.charCodeAt(idx);
- },
-
-
- writeByteAt: function(idx, value) {
- putstr(String.fromCharCode(value), idx, 1);
- },
-
-
- SEGMENT: function(idx, length, segment) {
- switch (arguments.length) {
- case 1:
- return data.substr(idx);
- case 2:
- return data.substr(idx, length);
- case 3:
- putstr(segment !== null ? segment : '', idx, length);
- break;
- default: return data;
- }
- },
-
-
- length: function() {
- return data ? data.length : 0;
- },
-
- clear: function() {
- data = null;
- }
- });
-
-
- function putstr(segment, idx, length) {
- length = arguments.length === 3 ? length : data.length - idx - 1;
- data = data.substr(0, idx) + segment + data.substr(length + idx);
- }
- }
-
-
- return BinaryReader;
-});
-
-// Included from: src/javascript/runtime/html5/image/JPEGHeaders.js
-
-/**
- * JPEGHeaders.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/image/JPEGHeaders
-@private
-*/
-define("moxie/runtime/html5/image/JPEGHeaders", [
- "moxie/runtime/html5/utils/BinaryReader",
- "moxie/core/Exceptions"
-], function(BinaryReader, x) {
-
- return function JPEGHeaders(data) {
- var headers = [], _br, idx, marker, length = 0;
-
- _br = new BinaryReader(data);
-
- // Check if data is jpeg
- if (_br.SHORT(0) !== 0xFFD8) {
- _br.clear();
- throw new x.ImageError(x.ImageError.WRONG_FORMAT);
- }
-
- idx = 2;
-
- while (idx <= _br.length()) {
- marker = _br.SHORT(idx);
-
- // omit RST (restart) markers
- if (marker >= 0xFFD0 && marker <= 0xFFD7) {
- idx += 2;
- continue;
- }
-
- // no headers allowed after SOS marker
- if (marker === 0xFFDA || marker === 0xFFD9) {
- break;
- }
-
- length = _br.SHORT(idx + 2) + 2;
-
- // APPn marker detected
- if (marker >= 0xFFE1 && marker <= 0xFFEF) {
- headers.push({
- hex: marker,
- name: 'APP' + (marker & 0x000F),
- start: idx,
- length: length,
- segment: _br.SEGMENT(idx, length)
- });
- }
-
- idx += length;
- }
-
- _br.clear();
-
- return {
- headers: headers,
-
- restore: function(data) {
- var max, i, br;
-
- br = new BinaryReader(data);
-
- idx = br.SHORT(2) == 0xFFE0 ? 4 + br.SHORT(4) : 2;
-
- for (i = 0, max = headers.length; i < max; i++) {
- br.SEGMENT(idx, 0, headers[i].segment);
- idx += headers[i].length;
- }
-
- data = br.SEGMENT();
- br.clear();
- return data;
- },
-
- strip: function(data) {
- var br, headers, jpegHeaders, i;
-
- jpegHeaders = new JPEGHeaders(data);
- headers = jpegHeaders.headers;
- jpegHeaders.purge();
-
- br = new BinaryReader(data);
-
- i = headers.length;
- while (i--) {
- br.SEGMENT(headers[i].start, headers[i].length, '');
- }
-
- data = br.SEGMENT();
- br.clear();
- return data;
- },
-
- get: function(name) {
- var array = [];
-
- for (var i = 0, max = headers.length; i < max; i++) {
- if (headers[i].name === name.toUpperCase()) {
- array.push(headers[i].segment);
- }
- }
- return array;
- },
-
- set: function(name, segment) {
- var array = [], i, ii, max;
-
- if (typeof(segment) === 'string') {
- array.push(segment);
- } else {
- array = segment;
- }
-
- for (i = ii = 0, max = headers.length; i < max; i++) {
- if (headers[i].name === name.toUpperCase()) {
- headers[i].segment = array[ii];
- headers[i].length = array[ii].length;
- ii++;
- }
- if (ii >= array.length) {
- break;
- }
- }
- },
-
- purge: function() {
- this.headers = headers = [];
- }
- };
- };
-});
-
-// Included from: src/javascript/runtime/html5/image/ExifParser.js
-
-/**
- * ExifParser.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/image/ExifParser
-@private
-*/
-define("moxie/runtime/html5/image/ExifParser", [
- "moxie/core/utils/Basic",
- "moxie/runtime/html5/utils/BinaryReader",
- "moxie/core/Exceptions"
-], function(Basic, BinaryReader, x) {
-
- function ExifParser(data) {
- var __super__, tags, tagDescs, offsets, idx, Tiff;
-
- BinaryReader.call(this, data);
-
- tags = {
- tiff: {
- /*
- The image orientation viewed in terms of rows and columns.
-
- 1 = The 0th row is at the visual top of the image, and the 0th column is the visual left-hand side.
- 2 = The 0th row is at the visual top of the image, and the 0th column is the visual right-hand side.
- 3 = The 0th row is at the visual bottom of the image, and the 0th column is the visual right-hand side.
- 4 = The 0th row is at the visual bottom of the image, and the 0th column is the visual left-hand side.
- 5 = The 0th row is the visual left-hand side of the image, and the 0th column is the visual top.
- 6 = The 0th row is the visual right-hand side of the image, and the 0th column is the visual top.
- 7 = The 0th row is the visual right-hand side of the image, and the 0th column is the visual bottom.
- 8 = The 0th row is the visual left-hand side of the image, and the 0th column is the visual bottom.
- */
- 0x0112: 'Orientation',
- 0x010E: 'ImageDescription',
- 0x010F: 'Make',
- 0x0110: 'Model',
- 0x0131: 'Software',
- 0x8769: 'ExifIFDPointer',
- 0x8825: 'GPSInfoIFDPointer'
- },
- exif: {
- 0x9000: 'ExifVersion',
- 0xA001: 'ColorSpace',
- 0xA002: 'PixelXDimension',
- 0xA003: 'PixelYDimension',
- 0x9003: 'DateTimeOriginal',
- 0x829A: 'ExposureTime',
- 0x829D: 'FNumber',
- 0x8827: 'ISOSpeedRatings',
- 0x9201: 'ShutterSpeedValue',
- 0x9202: 'ApertureValue' ,
- 0x9207: 'MeteringMode',
- 0x9208: 'LightSource',
- 0x9209: 'Flash',
- 0x920A: 'FocalLength',
- 0xA402: 'ExposureMode',
- 0xA403: 'WhiteBalance',
- 0xA406: 'SceneCaptureType',
- 0xA404: 'DigitalZoomRatio',
- 0xA408: 'Contrast',
- 0xA409: 'Saturation',
- 0xA40A: 'Sharpness'
- },
- gps: {
- 0x0000: 'GPSVersionID',
- 0x0001: 'GPSLatitudeRef',
- 0x0002: 'GPSLatitude',
- 0x0003: 'GPSLongitudeRef',
- 0x0004: 'GPSLongitude'
- },
-
- thumb: {
- 0x0201: 'JPEGInterchangeFormat',
- 0x0202: 'JPEGInterchangeFormatLength'
- }
- };
-
- tagDescs = {
- 'ColorSpace': {
- 1: 'sRGB',
- 0: 'Uncalibrated'
- },
-
- 'MeteringMode': {
- 0: 'Unknown',
- 1: 'Average',
- 2: 'CenterWeightedAverage',
- 3: 'Spot',
- 4: 'MultiSpot',
- 5: 'Pattern',
- 6: 'Partial',
- 255: 'Other'
- },
-
- 'LightSource': {
- 1: 'Daylight',
- 2: 'Fliorescent',
- 3: 'Tungsten',
- 4: 'Flash',
- 9: 'Fine weather',
- 10: 'Cloudy weather',
- 11: 'Shade',
- 12: 'Daylight fluorescent (D 5700 - 7100K)',
- 13: 'Day white fluorescent (N 4600 -5400K)',
- 14: 'Cool white fluorescent (W 3900 - 4500K)',
- 15: 'White fluorescent (WW 3200 - 3700K)',
- 17: 'Standard light A',
- 18: 'Standard light B',
- 19: 'Standard light C',
- 20: 'D55',
- 21: 'D65',
- 22: 'D75',
- 23: 'D50',
- 24: 'ISO studio tungsten',
- 255: 'Other'
- },
-
- 'Flash': {
- 0x0000: 'Flash did not fire',
- 0x0001: 'Flash fired',
- 0x0005: 'Strobe return light not detected',
- 0x0007: 'Strobe return light detected',
- 0x0009: 'Flash fired, compulsory flash mode',
- 0x000D: 'Flash fired, compulsory flash mode, return light not detected',
- 0x000F: 'Flash fired, compulsory flash mode, return light detected',
- 0x0010: 'Flash did not fire, compulsory flash mode',
- 0x0018: 'Flash did not fire, auto mode',
- 0x0019: 'Flash fired, auto mode',
- 0x001D: 'Flash fired, auto mode, return light not detected',
- 0x001F: 'Flash fired, auto mode, return light detected',
- 0x0020: 'No flash function',
- 0x0041: 'Flash fired, red-eye reduction mode',
- 0x0045: 'Flash fired, red-eye reduction mode, return light not detected',
- 0x0047: 'Flash fired, red-eye reduction mode, return light detected',
- 0x0049: 'Flash fired, compulsory flash mode, red-eye reduction mode',
- 0x004D: 'Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected',
- 0x004F: 'Flash fired, compulsory flash mode, red-eye reduction mode, return light detected',
- 0x0059: 'Flash fired, auto mode, red-eye reduction mode',
- 0x005D: 'Flash fired, auto mode, return light not detected, red-eye reduction mode',
- 0x005F: 'Flash fired, auto mode, return light detected, red-eye reduction mode'
- },
-
- 'ExposureMode': {
- 0: 'Auto exposure',
- 1: 'Manual exposure',
- 2: 'Auto bracket'
- },
-
- 'WhiteBalance': {
- 0: 'Auto white balance',
- 1: 'Manual white balance'
- },
-
- 'SceneCaptureType': {
- 0: 'Standard',
- 1: 'Landscape',
- 2: 'Portrait',
- 3: 'Night scene'
- },
-
- 'Contrast': {
- 0: 'Normal',
- 1: 'Soft',
- 2: 'Hard'
- },
-
- 'Saturation': {
- 0: 'Normal',
- 1: 'Low saturation',
- 2: 'High saturation'
- },
-
- 'Sharpness': {
- 0: 'Normal',
- 1: 'Soft',
- 2: 'Hard'
- },
-
- // GPS related
- 'GPSLatitudeRef': {
- N: 'North latitude',
- S: 'South latitude'
- },
-
- 'GPSLongitudeRef': {
- E: 'East longitude',
- W: 'West longitude'
- }
- };
-
- offsets = {
- tiffHeader: 10
- };
-
- idx = offsets.tiffHeader;
-
- __super__ = {
- clear: this.clear
- };
-
- // Public functions
- Basic.extend(this, {
-
- read: function() {
- try {
- return ExifParser.prototype.read.apply(this, arguments);
- } catch (ex) {
- throw new x.ImageError(x.ImageError.INVALID_META_ERR);
- }
- },
-
-
- write: function() {
- try {
- return ExifParser.prototype.write.apply(this, arguments);
- } catch (ex) {
- throw new x.ImageError(x.ImageError.INVALID_META_ERR);
- }
- },
-
-
- UNDEFINED: function() {
- return this.BYTE.apply(this, arguments);
- },
-
-
- RATIONAL: function(idx) {
- return this.LONG(idx) / this.LONG(idx + 4)
- },
-
-
- SRATIONAL: function(idx) {
- return this.SLONG(idx) / this.SLONG(idx + 4)
- },
-
- ASCII: function(idx) {
- return this.CHAR(idx);
- },
-
- TIFF: function() {
- return Tiff || null;
- },
-
-
- EXIF: function() {
- var Exif = null;
-
- if (offsets.exifIFD) {
- try {
- Exif = extractTags.call(this, offsets.exifIFD, tags.exif);
- } catch(ex) {
- return null;
- }
-
- // Fix formatting of some tags
- if (Exif.ExifVersion && Basic.typeOf(Exif.ExifVersion) === 'array') {
- for (var i = 0, exifVersion = ''; i < Exif.ExifVersion.length; i++) {
- exifVersion += String.fromCharCode(Exif.ExifVersion[i]);
- }
- Exif.ExifVersion = exifVersion;
- }
- }
-
- return Exif;
- },
-
-
- GPS: function() {
- var GPS = null;
-
- if (offsets.gpsIFD) {
- try {
- GPS = extractTags.call(this, offsets.gpsIFD, tags.gps);
- } catch (ex) {
- return null;
- }
-
- // iOS devices (and probably some others) do not put in GPSVersionID tag (why?..)
- if (GPS.GPSVersionID && Basic.typeOf(GPS.GPSVersionID) === 'array') {
- GPS.GPSVersionID = GPS.GPSVersionID.join('.');
- }
- }
-
- return GPS;
- },
-
-
- thumb: function() {
- if (offsets.IFD1) {
- try {
- var IFD1Tags = extractTags.call(this, offsets.IFD1, tags.thumb);
-
- if ('JPEGInterchangeFormat' in IFD1Tags) {
- return this.SEGMENT(offsets.tiffHeader + IFD1Tags.JPEGInterchangeFormat, IFD1Tags.JPEGInterchangeFormatLength);
- }
- } catch (ex) {}
- }
- return null;
- },
-
-
- setExif: function(tag, value) {
- // Right now only setting of width/height is possible
- if (tag !== 'PixelXDimension' && tag !== 'PixelYDimension') { return false; }
-
- return setTag.call(this, 'exif', tag, value);
- },
-
-
- clear: function() {
- __super__.clear();
- data = tags = tagDescs = Tiff = offsets = __super__ = null;
- }
- });
-
-
- // Check if that's APP1 and that it has EXIF
- if (this.SHORT(0) !== 0xFFE1 || this.STRING(4, 5).toUpperCase() !== "EXIF\0") {
- throw new x.ImageError(x.ImageError.INVALID_META_ERR);
- }
-
- // Set read order of multi-byte data
- this.littleEndian = (this.SHORT(idx) == 0x4949);
-
- // Check if always present bytes are indeed present
- if (this.SHORT(idx+=2) !== 0x002A) {
- throw new x.ImageError(x.ImageError.INVALID_META_ERR);
- }
-
- offsets.IFD0 = offsets.tiffHeader + this.LONG(idx += 2);
- Tiff = extractTags.call(this, offsets.IFD0, tags.tiff);
-
- if ('ExifIFDPointer' in Tiff) {
- offsets.exifIFD = offsets.tiffHeader + Tiff.ExifIFDPointer;
- delete Tiff.ExifIFDPointer;
- }
-
- if ('GPSInfoIFDPointer' in Tiff) {
- offsets.gpsIFD = offsets.tiffHeader + Tiff.GPSInfoIFDPointer;
- delete Tiff.GPSInfoIFDPointer;
- }
-
- if (Basic.isEmptyObj(Tiff)) {
- Tiff = null;
- }
-
- // check if we have a thumb as well
- var IFD1Offset = this.LONG(offsets.IFD0 + this.SHORT(offsets.IFD0) * 12 + 2);
- if (IFD1Offset) {
- offsets.IFD1 = offsets.tiffHeader + IFD1Offset;
- }
-
-
- function extractTags(IFD_offset, tags2extract) {
- var data = this;
- var length, i, tag, type, count, size, offset, value, values = [], hash = {};
-
- var types = {
- 1 : 'BYTE',
- 7 : 'UNDEFINED',
- 2 : 'ASCII',
- 3 : 'SHORT',
- 4 : 'LONG',
- 5 : 'RATIONAL',
- 9 : 'SLONG',
- 10: 'SRATIONAL'
- };
-
- var sizes = {
- 'BYTE' : 1,
- 'UNDEFINED' : 1,
- 'ASCII' : 1,
- 'SHORT' : 2,
- 'LONG' : 4,
- 'RATIONAL' : 8,
- 'SLONG' : 4,
- 'SRATIONAL' : 8
- };
-
- length = data.SHORT(IFD_offset);
-
- // The size of APP1 including all these elements shall not exceed the 64 Kbytes specified in the JPEG standard.
-
- for (i = 0; i < length; i++) {
- values = [];
-
- // Set binary reader pointer to beginning of the next tag
- offset = IFD_offset + 2 + i*12;
-
- tag = tags2extract[data.SHORT(offset)];
-
- if (tag === undefined) {
- continue; // Not the tag we requested
- }
-
- type = types[data.SHORT(offset+=2)];
- count = data.LONG(offset+=2);
- size = sizes[type];
-
- if (!size) {
- throw new x.ImageError(x.ImageError.INVALID_META_ERR);
- }
-
- offset += 4;
-
- // tag can only fit 4 bytes of data, if data is larger we should look outside
- if (size * count > 4) {
- // instead of data tag contains an offset of the data
- offset = data.LONG(offset) + offsets.tiffHeader;
- }
-
- // in case we left the boundaries of data throw an early exception
- if (offset + size * count >= this.length()) {
- throw new x.ImageError(x.ImageError.INVALID_META_ERR);
- }
-
- // special care for the string
- if (type === 'ASCII') {
- hash[tag] = Basic.trim(data.STRING(offset, count).replace(/\0$/, '')); // strip trailing NULL
- continue;
- } else {
- values = data.asArray(type, offset, count);
- value = (count == 1 ? values[0] : values);
-
- if (tagDescs.hasOwnProperty(tag) && typeof value != 'object') {
- hash[tag] = tagDescs[tag][value];
- } else {
- hash[tag] = value;
- }
- }
- }
-
- return hash;
- }
-
- // At the moment only setting of simple (LONG) values, that do not require offset recalculation, is supported
- function setTag(ifd, tag, value) {
- var offset, length, tagOffset, valueOffset = 0;
-
- // If tag name passed translate into hex key
- if (typeof(tag) === 'string') {
- var tmpTags = tags[ifd.toLowerCase()];
- for (var hex in tmpTags) {
- if (tmpTags[hex] === tag) {
- tag = hex;
- break;
- }
- }
- }
- offset = offsets[ifd.toLowerCase() + 'IFD'];
- length = this.SHORT(offset);
-
- for (var i = 0; i < length; i++) {
- tagOffset = offset + 12 * i + 2;
-
- if (this.SHORT(tagOffset) == tag) {
- valueOffset = tagOffset + 8;
- break;
- }
- }
-
- if (!valueOffset) {
- return false;
- }
-
- try {
- this.write(valueOffset, value, 4);
- } catch(ex) {
- return false;
- }
-
- return true;
- }
- }
-
- ExifParser.prototype = BinaryReader.prototype;
-
- return ExifParser;
-});
-
-// Included from: src/javascript/runtime/html5/image/JPEG.js
-
-/**
- * JPEG.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/image/JPEG
-@private
-*/
-define("moxie/runtime/html5/image/JPEG", [
- "moxie/core/utils/Basic",
- "moxie/core/Exceptions",
- "moxie/runtime/html5/image/JPEGHeaders",
- "moxie/runtime/html5/utils/BinaryReader",
- "moxie/runtime/html5/image/ExifParser"
-], function(Basic, x, JPEGHeaders, BinaryReader, ExifParser) {
-
- function JPEG(data) {
- var _br, _hm, _ep, _info;
-
- _br = new BinaryReader(data);
-
- // check if it is jpeg
- if (_br.SHORT(0) !== 0xFFD8) {
- throw new x.ImageError(x.ImageError.WRONG_FORMAT);
- }
-
- // backup headers
- _hm = new JPEGHeaders(data);
-
- // extract exif info
- try {
- _ep = new ExifParser(_hm.get('app1')[0]);
- } catch(ex) {}
-
- // get dimensions
- _info = _getDimensions.call(this);
-
- Basic.extend(this, {
- type: 'image/jpeg',
-
- size: _br.length(),
-
- width: _info && _info.width || 0,
-
- height: _info && _info.height || 0,
-
- setExif: function(tag, value) {
- if (!_ep) {
- return false; // or throw an exception
- }
-
- if (Basic.typeOf(tag) === 'object') {
- Basic.each(tag, function(value, tag) {
- _ep.setExif(tag, value);
- });
- } else {
- _ep.setExif(tag, value);
- }
-
- // update internal headers
- _hm.set('app1', _ep.SEGMENT());
- },
-
- writeHeaders: function() {
- if (!arguments.length) {
- // if no arguments passed, update headers internally
- return _hm.restore(data);
- }
- return _hm.restore(arguments[0]);
- },
-
- stripHeaders: function(data) {
- return _hm.strip(data);
- },
-
- purge: function() {
- _purge.call(this);
- }
- });
-
- if (_ep) {
- this.meta = {
- tiff: _ep.TIFF(),
- exif: _ep.EXIF(),
- gps: _ep.GPS(),
- thumb: _getThumb()
- };
- }
-
-
- function _getDimensions(br) {
- var idx = 0
- , marker
- , length
- ;
-
- if (!br) {
- br = _br;
- }
-
- // examine all through the end, since some images might have very large APP segments
- while (idx <= br.length()) {
- marker = br.SHORT(idx += 2);
-
- if (marker >= 0xFFC0 && marker <= 0xFFC3) { // SOFn
- idx += 5; // marker (2 bytes) + length (2 bytes) + Sample precision (1 byte)
- return {
- height: br.SHORT(idx),
- width: br.SHORT(idx += 2)
- };
- }
- length = br.SHORT(idx += 2);
- idx += length - 2;
- }
- return null;
- }
-
-
- function _getThumb() {
- var data = _ep.thumb()
- , br
- , info
- ;
-
- if (data) {
- br = new BinaryReader(data);
- info = _getDimensions(br);
- br.clear();
-
- if (info) {
- info.data = data;
- return info;
- }
- }
- return null;
- }
-
-
- function _purge() {
- if (!_ep || !_hm || !_br) {
- return; // ignore any repeating purge requests
- }
- _ep.clear();
- _hm.purge();
- _br.clear();
- _info = _hm = _ep = _br = null;
- }
- }
-
- return JPEG;
-});
-
-// Included from: src/javascript/runtime/html5/image/PNG.js
-
-/**
- * PNG.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/image/PNG
-@private
-*/
-define("moxie/runtime/html5/image/PNG", [
- "moxie/core/Exceptions",
- "moxie/core/utils/Basic",
- "moxie/runtime/html5/utils/BinaryReader"
-], function(x, Basic, BinaryReader) {
-
- function PNG(data) {
- var _br, _hm, _ep, _info;
-
- _br = new BinaryReader(data);
-
- // check if it's png
- (function() {
- var idx = 0, i = 0
- , signature = [0x8950, 0x4E47, 0x0D0A, 0x1A0A]
- ;
-
- for (i = 0; i < signature.length; i++, idx += 2) {
- if (signature[i] != _br.SHORT(idx)) {
- throw new x.ImageError(x.ImageError.WRONG_FORMAT);
- }
- }
- }());
-
- function _getDimensions() {
- var chunk, idx;
-
- chunk = _getChunkAt.call(this, 8);
-
- if (chunk.type == 'IHDR') {
- idx = chunk.start;
- return {
- width: _br.LONG(idx),
- height: _br.LONG(idx += 4)
- };
- }
- return null;
- }
-
- function _purge() {
- if (!_br) {
- return; // ignore any repeating purge requests
- }
- _br.clear();
- data = _info = _hm = _ep = _br = null;
- }
-
- _info = _getDimensions.call(this);
-
- Basic.extend(this, {
- type: 'image/png',
-
- size: _br.length(),
-
- width: _info.width,
-
- height: _info.height,
-
- purge: function() {
- _purge.call(this);
- }
- });
-
- // for PNG we can safely trigger purge automatically, as we do not keep any data for later
- _purge.call(this);
-
- function _getChunkAt(idx) {
- var length, type, start, CRC;
-
- length = _br.LONG(idx);
- type = _br.STRING(idx += 4, 4);
- start = idx += 4;
- CRC = _br.LONG(idx + length);
-
- return {
- length: length,
- type: type,
- start: start,
- CRC: CRC
- };
- }
- }
-
- return PNG;
-});
-
-// Included from: src/javascript/runtime/html5/image/ImageInfo.js
-
-/**
- * ImageInfo.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/image/ImageInfo
-@private
-*/
-define("moxie/runtime/html5/image/ImageInfo", [
- "moxie/core/utils/Basic",
- "moxie/core/Exceptions",
- "moxie/runtime/html5/image/JPEG",
- "moxie/runtime/html5/image/PNG"
-], function(Basic, x, JPEG, PNG) {
- /**
- Optional image investigation tool for HTML5 runtime. Provides the following features:
- - ability to distinguish image type (JPEG or PNG) by signature
- - ability to extract image width/height directly from it's internals, without preloading in memory (fast)
- - ability to extract APP headers from JPEGs (Exif, GPS, etc)
- - ability to replace width/height tags in extracted JPEG headers
- - ability to restore APP headers, that were for example stripped during image manipulation
-
- @class ImageInfo
- @constructor
- @param {String} data Image source as binary string
- */
- return function(data) {
- var _cs = [JPEG, PNG], _img;
-
- // figure out the format, throw: ImageError.WRONG_FORMAT if not supported
- _img = (function() {
- for (var i = 0; i < _cs.length; i++) {
- try {
- return new _cs[i](data);
- } catch (ex) {
- // console.info(ex);
- }
- }
- throw new x.ImageError(x.ImageError.WRONG_FORMAT);
- }());
-
- Basic.extend(this, {
- /**
- Image Mime Type extracted from it's depths
-
- @property type
- @type {String}
- @default ''
- */
- type: '',
-
- /**
- Image size in bytes
-
- @property size
- @type {Number}
- @default 0
- */
- size: 0,
-
- /**
- Image width extracted from image source
-
- @property width
- @type {Number}
- @default 0
- */
- width: 0,
-
- /**
- Image height extracted from image source
-
- @property height
- @type {Number}
- @default 0
- */
- height: 0,
-
- /**
- Sets Exif tag. Currently applicable only for width and height tags. Obviously works only with JPEGs.
-
- @method setExif
- @param {String} tag Tag to set
- @param {Mixed} value Value to assign to the tag
- */
- setExif: function() {},
-
- /**
- Restores headers to the source.
-
- @method writeHeaders
- @param {String} data Image source as binary string
- @return {String} Updated binary string
- */
- writeHeaders: function(data) {
- return data;
- },
-
- /**
- Strip all headers from the source.
-
- @method stripHeaders
- @param {String} data Image source as binary string
- @return {String} Updated binary string
- */
- stripHeaders: function(data) {
- return data;
- },
-
- /**
- Dispose resources.
-
- @method purge
- */
- purge: function() {
- data = null;
- }
- });
-
- Basic.extend(this, _img);
-
- this.purge = function() {
- _img.purge();
- _img = null;
- };
- };
-});
-
-// Included from: src/javascript/runtime/html5/image/MegaPixel.js
-
-/**
-(The MIT License)
-
-Copyright (c) 2012 Shinichi Tomita ;
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-/**
- * Mega pixel image rendering library for iOS6 Safari
- *
- * Fixes iOS6 Safari's image file rendering issue for large size image (over mega-pixel),
- * which causes unexpected subsampling when drawing it in canvas.
- * By using this library, you can safely render the image with proper stretching.
- *
- * Copyright (c) 2012 Shinichi Tomita
- * Released under the MIT license
- */
-
-/**
-@class moxie/runtime/html5/image/MegaPixel
-@private
-*/
-define("moxie/runtime/html5/image/MegaPixel", [], function() {
-
- /**
- * Rendering image element (with resizing) into the canvas element
- */
- function renderImageToCanvas(img, canvas, options) {
- var iw = img.naturalWidth, ih = img.naturalHeight;
- var width = options.width, height = options.height;
- var x = options.x || 0, y = options.y || 0;
- var ctx = canvas.getContext('2d');
- if (detectSubsampling(img)) {
- iw /= 2;
- ih /= 2;
- }
- var d = 1024; // size of tiling canvas
- var tmpCanvas = document.createElement('canvas');
- tmpCanvas.width = tmpCanvas.height = d;
- var tmpCtx = tmpCanvas.getContext('2d');
- var vertSquashRatio = detectVerticalSquash(img, iw, ih);
- var sy = 0;
- while (sy < ih) {
- var sh = sy + d > ih ? ih - sy : d;
- var sx = 0;
- while (sx < iw) {
- var sw = sx + d > iw ? iw - sx : d;
- tmpCtx.clearRect(0, 0, d, d);
- tmpCtx.drawImage(img, -sx, -sy);
- var dx = (sx * width / iw + x) << 0;
- var dw = Math.ceil(sw * width / iw);
- var dy = (sy * height / ih / vertSquashRatio + y) << 0;
- var dh = Math.ceil(sh * height / ih / vertSquashRatio);
- ctx.drawImage(tmpCanvas, 0, 0, sw, sh, dx, dy, dw, dh);
- sx += d;
- }
- sy += d;
- }
- tmpCanvas = tmpCtx = null;
- }
-
- /**
- * Detect subsampling in loaded image.
- * In iOS, larger images than 2M pixels may be subsampled in rendering.
- */
- function detectSubsampling(img) {
- var iw = img.naturalWidth, ih = img.naturalHeight;
- if (iw * ih > 1024 * 1024) { // subsampling may happen over megapixel image
- var canvas = document.createElement('canvas');
- canvas.width = canvas.height = 1;
- var ctx = canvas.getContext('2d');
- ctx.drawImage(img, -iw + 1, 0);
- // subsampled image becomes half smaller in rendering size.
- // check alpha channel value to confirm image is covering edge pixel or not.
- // if alpha value is 0 image is not covering, hence subsampled.
- return ctx.getImageData(0, 0, 1, 1).data[3] === 0;
- } else {
- return false;
- }
- }
-
-
- /**
- * Detecting vertical squash in loaded image.
- * Fixes a bug which squash image vertically while drawing into canvas for some images.
- */
- function detectVerticalSquash(img, iw, ih) {
- var canvas = document.createElement('canvas');
- canvas.width = 1;
- canvas.height = ih;
- var ctx = canvas.getContext('2d');
- ctx.drawImage(img, 0, 0);
- var data = ctx.getImageData(0, 0, 1, ih).data;
- // search image edge pixel position in case it is squashed vertically.
- var sy = 0;
- var ey = ih;
- var py = ih;
- while (py > sy) {
- var alpha = data[(py - 1) * 4 + 3];
- if (alpha === 0) {
- ey = py;
- } else {
- sy = py;
- }
- py = (ey + sy) >> 1;
- }
- canvas = null;
- var ratio = (py / ih);
- return (ratio === 0) ? 1 : ratio;
- }
-
- return {
- isSubsampled: detectSubsampling,
- renderTo: renderImageToCanvas
- };
-});
-
-// Included from: src/javascript/runtime/html5/image/Image.js
-
-/**
- * Image.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html5/image/Image
-@private
-*/
-define("moxie/runtime/html5/image/Image", [
- "moxie/runtime/html5/Runtime",
- "moxie/core/utils/Basic",
- "moxie/core/Exceptions",
- "moxie/core/utils/Encode",
- "moxie/file/Blob",
- "moxie/file/File",
- "moxie/runtime/html5/image/ImageInfo",
- "moxie/runtime/html5/image/MegaPixel",
- "moxie/core/utils/Mime",
- "moxie/core/utils/Env"
-], function(extensions, Basic, x, Encode, Blob, File, ImageInfo, MegaPixel, Mime, Env) {
-
- function HTML5Image() {
- var me = this
- , _img, _imgInfo, _canvas, _binStr, _blob
- , _modified = false // is set true whenever image is modified
- , _preserveHeaders = true
- ;
-
- Basic.extend(this, {
- loadFromBlob: function(blob) {
- var comp = this, I = comp.getRuntime()
- , asBinary = arguments.length > 1 ? arguments[1] : true
- ;
-
- if (!I.can('access_binary')) {
- throw new x.RuntimeError(x.RuntimeError.NOT_SUPPORTED_ERR);
- }
-
- _blob = blob;
-
- if (blob.isDetached()) {
- _binStr = blob.getSource();
- _preload.call(this, _binStr);
- return;
- } else {
- _readAsDataUrl.call(this, blob.getSource(), function(dataUrl) {
- if (asBinary) {
- _binStr = _toBinary(dataUrl);
- }
- _preload.call(comp, dataUrl);
- });
- }
- },
-
- loadFromImage: function(img, exact) {
- this.meta = img.meta;
-
- _blob = new File(null, {
- name: img.name,
- size: img.size,
- type: img.type
- });
-
- _preload.call(this, exact ? (_binStr = img.getAsBinaryString()) : img.getAsDataURL());
- },
-
- getInfo: function() {
- var I = this.getRuntime(), info;
-
- if (!_imgInfo && _binStr && I.can('access_image_binary')) {
- _imgInfo = new ImageInfo(_binStr);
- }
-
- info = {
- width: _getImg().width || 0,
- height: _getImg().height || 0,
- type: _blob.type || Mime.getFileMime(_blob.name),
- size: _binStr && _binStr.length || _blob.size || 0,
- name: _blob.name || '',
- meta: _imgInfo && _imgInfo.meta || this.meta || {}
- };
-
- // store thumbnail data as blob
- if (info.meta && info.meta.thumb && !(info.meta.thumb.data instanceof Blob)) {
- info.meta.thumb.data = new Blob(null, {
- type: 'image/jpeg',
- data: info.meta.thumb.data
- });
- }
-
- return info;
- },
-
- downsize: function() {
- _downsize.apply(this, arguments);
- },
-
- getAsCanvas: function() {
- if (_canvas) {
- _canvas.id = this.uid + '_canvas';
- }
- return _canvas;
- },
-
- getAsBlob: function(type, quality) {
- if (type !== this.type) {
- // if different mime type requested prepare image for conversion
- _downsize.call(this, this.width, this.height, false);
- }
- return new File(null, {
- name: _blob.name || '',
- type: type,
- data: me.getAsBinaryString.call(this, type, quality)
- });
- },
-
- getAsDataURL: function(type) {
- var quality = arguments[1] || 90;
-
- // if image has not been modified, return the source right away
- if (!_modified) {
- return _img.src;
- }
-
- if ('image/jpeg' !== type) {
- return _canvas.toDataURL('image/png');
- } else {
- try {
- // older Geckos used to result in an exception on quality argument
- return _canvas.toDataURL('image/jpeg', quality/100);
- } catch (ex) {
- return _canvas.toDataURL('image/jpeg');
- }
- }
- },
-
- getAsBinaryString: function(type, quality) {
- // if image has not been modified, return the source right away
- if (!_modified) {
- // if image was not loaded from binary string
- if (!_binStr) {
- _binStr = _toBinary(me.getAsDataURL(type, quality));
- }
- return _binStr;
- }
-
- if ('image/jpeg' !== type) {
- _binStr = _toBinary(me.getAsDataURL(type, quality));
- } else {
- var dataUrl;
-
- // if jpeg
- if (!quality) {
- quality = 90;
- }
-
- try {
- // older Geckos used to result in an exception on quality argument
- dataUrl = _canvas.toDataURL('image/jpeg', quality/100);
- } catch (ex) {
- dataUrl = _canvas.toDataURL('image/jpeg');
- }
-
- _binStr = _toBinary(dataUrl);
-
- if (_imgInfo) {
- _binStr = _imgInfo.stripHeaders(_binStr);
-
- if (_preserveHeaders) {
- // update dimensions info in exif
- if (_imgInfo.meta && _imgInfo.meta.exif) {
- _imgInfo.setExif({
- PixelXDimension: this.width,
- PixelYDimension: this.height
- });
- }
-
- // re-inject the headers
- _binStr = _imgInfo.writeHeaders(_binStr);
- }
-
- // will be re-created from fresh on next getInfo call
- _imgInfo.purge();
- _imgInfo = null;
- }
- }
-
- _modified = false;
-
- return _binStr;
- },
-
- destroy: function() {
- me = null;
- _purge.call(this);
- this.getRuntime().getShim().removeInstance(this.uid);
- }
- });
-
-
- function _getImg() {
- if (!_canvas && !_img) {
- throw new x.ImageError(x.DOMException.INVALID_STATE_ERR);
- }
- return _canvas || _img;
- }
-
-
- function _toBinary(str) {
- return Encode.atob(str.substring(str.indexOf('base64,') + 7));
- }
-
-
- function _toDataUrl(str, type) {
- return 'data:' + (type || '') + ';base64,' + Encode.btoa(str);
- }
-
-
- function _preload(str) {
- var comp = this;
-
- _img = new Image();
- _img.onerror = function() {
- _purge.call(this);
- comp.trigger('error', x.ImageError.WRONG_FORMAT);
- };
- _img.onload = function() {
- comp.trigger('load');
- };
-
- _img.src = str.substr(0, 5) == 'data:' ? str : _toDataUrl(str, _blob.type);
- }
-
-
- function _readAsDataUrl(file, callback) {
- var comp = this, fr;
-
- // use FileReader if it's available
- if (window.FileReader) {
- fr = new FileReader();
- fr.onload = function() {
- callback(this.result);
- };
- fr.onerror = function() {
- comp.trigger('error', x.ImageError.WRONG_FORMAT);
- };
- fr.readAsDataURL(file);
- } else {
- return callback(file.getAsDataURL());
- }
- }
-
- function _downsize(width, height, crop, preserveHeaders) {
- var self = this
- , scale
- , mathFn
- , x = 0
- , y = 0
- , img
- , destWidth
- , destHeight
- , orientation
- ;
-
- _preserveHeaders = preserveHeaders; // we will need to check this on export (see getAsBinaryString())
-
- // take into account orientation tag
- orientation = (this.meta && this.meta.tiff && this.meta.tiff.Orientation) || 1;
-
- if (Basic.inArray(orientation, [5,6,7,8]) !== -1) { // values that require 90 degree rotation
- // swap dimensions
- var tmp = width;
- width = height;
- height = tmp;
- }
-
- img = _getImg();
-
- // unify dimensions
- if (!crop) {
- scale = Math.min(width/img.width, height/img.height);
- } else {
- // one of the dimensions may exceed the actual image dimensions - we need to take the smallest value
- width = Math.min(width, img.width);
- height = Math.min(height, img.height);
-
- scale = Math.max(width/img.width, height/img.height);
- }
-
- // we only downsize here
- if (scale > 1 && !crop && preserveHeaders) {
- this.trigger('Resize');
- return;
- }
-
- // prepare canvas if necessary
- if (!_canvas) {
- _canvas = document.createElement("canvas");
- }
-
- // calculate dimensions of proportionally resized image
- destWidth = Math.round(img.width * scale);
- destHeight = Math.round(img.height * scale);
-
- // scale image and canvas
- if (crop) {
- _canvas.width = width;
- _canvas.height = height;
-
- // if dimensions of the resulting image still larger than canvas, center it
- if (destWidth > width) {
- x = Math.round((destWidth - width) / 2);
- }
-
- if (destHeight > height) {
- y = Math.round((destHeight - height) / 2);
- }
- } else {
- _canvas.width = destWidth;
- _canvas.height = destHeight;
- }
-
- // rotate if required, according to orientation tag
- if (!_preserveHeaders) {
- _rotateToOrientaion(_canvas.width, _canvas.height, orientation);
- }
-
- _drawToCanvas.call(this, img, _canvas, -x, -y, destWidth, destHeight);
-
- this.width = _canvas.width;
- this.height = _canvas.height;
-
- _modified = true;
- self.trigger('Resize');
- }
-
-
- function _drawToCanvas(img, canvas, x, y, w, h) {
- if (Env.OS === 'iOS') {
- // avoid squish bug in iOS6
- MegaPixel.renderTo(img, canvas, { width: w, height: h, x: x, y: y });
- } else {
- var ctx = canvas.getContext('2d');
- ctx.drawImage(img, x, y, w, h);
- }
- }
-
-
- /**
- * Transform canvas coordination according to specified frame size and orientation
- * Orientation value is from EXIF tag
- * @author Shinichi Tomita
- */
- function _rotateToOrientaion(width, height, orientation) {
- switch (orientation) {
- case 5:
- case 6:
- case 7:
- case 8:
- _canvas.width = height;
- _canvas.height = width;
- break;
- default:
- _canvas.width = width;
- _canvas.height = height;
- }
-
- /**
- 1 = The 0th row is at the visual top of the image, and the 0th column is the visual left-hand side.
- 2 = The 0th row is at the visual top of the image, and the 0th column is the visual right-hand side.
- 3 = The 0th row is at the visual bottom of the image, and the 0th column is the visual right-hand side.
- 4 = The 0th row is at the visual bottom of the image, and the 0th column is the visual left-hand side.
- 5 = The 0th row is the visual left-hand side of the image, and the 0th column is the visual top.
- 6 = The 0th row is the visual right-hand side of the image, and the 0th column is the visual top.
- 7 = The 0th row is the visual right-hand side of the image, and the 0th column is the visual bottom.
- 8 = The 0th row is the visual left-hand side of the image, and the 0th column is the visual bottom.
- */
-
- var ctx = _canvas.getContext('2d');
- switch (orientation) {
- case 2:
- // horizontal flip
- ctx.translate(width, 0);
- ctx.scale(-1, 1);
- break;
- case 3:
- // 180 rotate left
- ctx.translate(width, height);
- ctx.rotate(Math.PI);
- break;
- case 4:
- // vertical flip
- ctx.translate(0, height);
- ctx.scale(1, -1);
- break;
- case 5:
- // vertical flip + 90 rotate right
- ctx.rotate(0.5 * Math.PI);
- ctx.scale(1, -1);
- break;
- case 6:
- // 90 rotate right
- ctx.rotate(0.5 * Math.PI);
- ctx.translate(0, -height);
- break;
- case 7:
- // horizontal flip + 90 rotate right
- ctx.rotate(0.5 * Math.PI);
- ctx.translate(width, -height);
- ctx.scale(-1, 1);
- break;
- case 8:
- // 90 rotate left
- ctx.rotate(-0.5 * Math.PI);
- ctx.translate(-width, 0);
- break;
- }
- }
-
-
- function _purge() {
- if (_imgInfo) {
- _imgInfo.purge();
- _imgInfo = null;
- }
- _binStr = _img = _canvas = _blob = null;
- _modified = false;
- }
- }
-
- return (extensions.Image = HTML5Image);
-});
-
-/**
- * Stub for moxie/runtime/flash/Runtime
- * @private
- */
-define("moxie/runtime/flash/Runtime", [
-], function() {
- return {};
-});
-
-/**
- * Stub for moxie/runtime/silverlight/Runtime
- * @private
- */
-define("moxie/runtime/silverlight/Runtime", [
-], function() {
- return {};
-});
-
-// Included from: src/javascript/runtime/html4/Runtime.js
-
-/**
- * Runtime.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/*global File:true */
-
-/**
-Defines constructor for HTML4 runtime.
-
-@class moxie/runtime/html4/Runtime
-@private
-*/
-define("moxie/runtime/html4/Runtime", [
- "moxie/core/utils/Basic",
- "moxie/core/Exceptions",
- "moxie/runtime/Runtime",
- "moxie/core/utils/Env"
-], function(Basic, x, Runtime, Env) {
-
- var type = 'html4', extensions = {};
-
- function Html4Runtime(options) {
- var I = this
- , Test = Runtime.capTest
- , True = Runtime.capTrue
- ;
-
- Runtime.call(this, options, type, {
- access_binary: Test(window.FileReader || window.File && File.getAsDataURL),
- access_image_binary: false,
- display_media: Test(extensions.Image && (Env.can('create_canvas') || Env.can('use_data_uri_over32kb'))),
- do_cors: false,
- drag_and_drop: false,
- filter_by_extension: Test(function() { // if you know how to feature-detect this, please suggest
- return (Env.browser === 'Chrome' && Env.verComp(Env.version, 28, '>=')) ||
- (Env.browser === 'IE' && Env.verComp(Env.version, 10, '>=')) ||
- (Env.browser === 'Safari' && Env.verComp(Env.version, 7, '>='));
- }()),
- resize_image: function() {
- return extensions.Image && I.can('access_binary') && Env.can('create_canvas');
- },
- report_upload_progress: false,
- return_response_headers: false,
- return_response_type: function(responseType) {
- if (responseType === 'json' && !!window.JSON) {
- return true;
- }
- return !!~Basic.inArray(responseType, ['text', 'document', '']);
- },
- return_status_code: function(code) {
- return !Basic.arrayDiff(code, [200, 404]);
- },
- select_file: function() {
- return Env.can('use_fileinput');
- },
- select_multiple: false,
- send_binary_string: false,
- send_custom_headers: false,
- send_multipart: true,
- slice_blob: false,
- stream_upload: function() {
- return I.can('select_file');
- },
- summon_file_dialog: function() { // yeah... some dirty sniffing here...
- return I.can('select_file') && (
- (Env.browser === 'Firefox' && Env.verComp(Env.version, 4, '>=')) ||
- (Env.browser === 'Opera' && Env.verComp(Env.version, 12, '>=')) ||
- (Env.browser === 'IE' && Env.verComp(Env.version, 10, '>=')) ||
- !!~Basic.inArray(Env.browser, ['Chrome', 'Safari'])
- );
- },
- upload_filesize: True,
- use_http_method: function(methods) {
- return !Basic.arrayDiff(methods, ['GET', 'POST']);
- }
- });
-
-
- Basic.extend(this, {
- init : function() {
- this.trigger("Init");
- },
-
- destroy: (function(destroy) { // extend default destroy method
- return function() {
- destroy.call(I);
- destroy = I = null;
- };
- }(this.destroy))
- });
-
- Basic.extend(this.getShim(), extensions);
- }
-
- Runtime.addConstructor(type, Html4Runtime);
-
- return extensions;
-});
-
-// Included from: src/javascript/runtime/html4/file/FileInput.js
-
-/**
- * FileInput.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html4/file/FileInput
-@private
-*/
-define("moxie/runtime/html4/file/FileInput", [
- "moxie/runtime/html4/Runtime",
- "moxie/file/File",
- "moxie/core/utils/Basic",
- "moxie/core/utils/Dom",
- "moxie/core/utils/Events",
- "moxie/core/utils/Mime",
- "moxie/core/utils/Env"
-], function(extensions, File, Basic, Dom, Events, Mime, Env) {
-
- function FileInput() {
- var _uid, _mimes = [], _options;
-
- function addInput() {
- var comp = this, I = comp.getRuntime(), shimContainer, browseButton, currForm, form, input, uid;
-
- uid = Basic.guid('uid_');
-
- shimContainer = I.getShimContainer(); // we get new ref everytime to avoid memory leaks in IE
-
- if (_uid) { // move previous form out of the view
- currForm = Dom.get(_uid + '_form');
- if (currForm) {
- Basic.extend(currForm.style, { top: '100%' });
- }
- }
-
- // build form in DOM, since innerHTML version not able to submit file for some reason
- form = document.createElement('form');
- form.setAttribute('id', uid + '_form');
- form.setAttribute('method', 'post');
- form.setAttribute('enctype', 'multipart/form-data');
- form.setAttribute('encoding', 'multipart/form-data');
-
- Basic.extend(form.style, {
- overflow: 'hidden',
- position: 'absolute',
- top: 0,
- left: 0,
- width: '100%',
- height: '100%'
- });
-
- input = document.createElement('input');
- input.setAttribute('id', uid);
- input.setAttribute('type', 'file');
- input.setAttribute('name', _options.name || 'Filedata');
- input.setAttribute('accept', _mimes.join(','));
-
- Basic.extend(input.style, {
- fontSize: '999px',
- opacity: 0
- });
-
- form.appendChild(input);
- shimContainer.appendChild(form);
-
- // prepare file input to be placed underneath the browse_button element
- Basic.extend(input.style, {
- position: 'absolute',
- top: 0,
- left: 0,
- width: '100%',
- height: '100%'
- });
-
- if (Env.browser === 'IE' && Env.verComp(Env.version, 10, '<')) {
- Basic.extend(input.style, {
- filter : "progid:DXImageTransform.Microsoft.Alpha(opacity=0)"
- });
- }
-
- input.onchange = function() { // there should be only one handler for this
- var file;
-
- if (!this.value) {
- return;
- }
-
- if (this.files) { // check if browser is fresh enough
- file = this.files[0];
-
- // ignore empty files (IE10 for example hangs if you try to send them via XHR)
- if (file.size === 0) {
- form.parentNode.removeChild(form);
- return;
- }
- } else {
- file = {
- name: this.value
- };
- }
-
- file = new File(I.uid, file);
-
- // clear event handler
- this.onchange = function() {};
- addInput.call(comp);
-
- comp.files = [file];
-
- // substitute all ids with file uids (consider file.uid read-only - we cannot do it the other way around)
- input.setAttribute('id', file.uid);
- form.setAttribute('id', file.uid + '_form');
-
- comp.trigger('change');
-
- input = form = null;
- };
-
-
- // route click event to the input
- if (I.can('summon_file_dialog')) {
- browseButton = Dom.get(_options.browse_button);
- Events.removeEvent(browseButton, 'click', comp.uid);
- Events.addEvent(browseButton, 'click', function(e) {
- if (input && !input.disabled) { // for some reason FF (up to 8.0.1 so far) lets to click disabled input[type=file]
- input.click();
- }
- e.preventDefault();
- }, comp.uid);
- }
-
- _uid = uid;
-
- shimContainer = currForm = browseButton = null;
- }
-
- Basic.extend(this, {
- init: function(options) {
- var comp = this, I = comp.getRuntime(), shimContainer;
-
- // figure out accept string
- _options = options;
- _mimes = options.accept.mimes || Mime.extList2mimes(options.accept, I.can('filter_by_extension'));
-
- shimContainer = I.getShimContainer();
-
- (function() {
- var browseButton, zIndex, top;
-
- browseButton = Dom.get(options.browse_button);
-
- // Route click event to the input[type=file] element for browsers that support such behavior
- if (I.can('summon_file_dialog')) {
- if (Dom.getStyle(browseButton, 'position') === 'static') {
- browseButton.style.position = 'relative';
- }
-
- zIndex = parseInt(Dom.getStyle(browseButton, 'z-index'), 10) || 1;
-
- browseButton.style.zIndex = zIndex;
- shimContainer.style.zIndex = zIndex - 1;
- }
-
- /* Since we have to place input[type=file] on top of the browse_button for some browsers,
- browse_button loses interactivity, so we restore it here */
- top = I.can('summon_file_dialog') ? browseButton : shimContainer;
-
- Events.addEvent(top, 'mouseover', function() {
- comp.trigger('mouseenter');
- }, comp.uid);
-
- Events.addEvent(top, 'mouseout', function() {
- comp.trigger('mouseleave');
- }, comp.uid);
-
- Events.addEvent(top, 'mousedown', function() {
- comp.trigger('mousedown');
- }, comp.uid);
-
- Events.addEvent(Dom.get(options.container), 'mouseup', function() {
- comp.trigger('mouseup');
- }, comp.uid);
-
- browseButton = null;
- }());
-
- addInput.call(this);
-
- shimContainer = null;
-
- // trigger ready event asynchronously
- comp.trigger({
- type: 'ready',
- async: true
- });
- },
-
-
- disable: function(state) {
- var input;
-
- if ((input = Dom.get(_uid))) {
- input.disabled = !!state;
- }
- },
-
- destroy: function() {
- var I = this.getRuntime()
- , shim = I.getShim()
- , shimContainer = I.getShimContainer()
- ;
-
- Events.removeAllEvents(shimContainer, this.uid);
- Events.removeAllEvents(_options && Dom.get(_options.container), this.uid);
- Events.removeAllEvents(_options && Dom.get(_options.browse_button), this.uid);
-
- if (shimContainer) {
- shimContainer.innerHTML = '';
- }
-
- shim.removeInstance(this.uid);
-
- _uid = _mimes = _options = shimContainer = shim = null;
- }
- });
- }
-
- return (extensions.FileInput = FileInput);
-});
-
-// Included from: src/javascript/runtime/html4/file/FileReader.js
-
-/**
- * FileReader.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html4/file/FileReader
-@private
-*/
-define("moxie/runtime/html4/file/FileReader", [
- "moxie/runtime/html4/Runtime",
- "moxie/runtime/html5/file/FileReader"
-], function(extensions, FileReader) {
- return (extensions.FileReader = FileReader);
-});
-
-// Included from: src/javascript/runtime/html4/xhr/XMLHttpRequest.js
-
-/**
- * XMLHttpRequest.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html4/xhr/XMLHttpRequest
-@private
-*/
-define("moxie/runtime/html4/xhr/XMLHttpRequest", [
- "moxie/runtime/html4/Runtime",
- "moxie/core/utils/Basic",
- "moxie/core/utils/Dom",
- "moxie/core/utils/Url",
- "moxie/core/Exceptions",
- "moxie/core/utils/Events",
- "moxie/file/Blob",
- "moxie/xhr/FormData"
-], function(extensions, Basic, Dom, Url, x, Events, Blob, FormData) {
-
- function XMLHttpRequest() {
- var _status, _response, _iframe;
-
- function cleanup(cb) {
- var target = this, uid, form, inputs, i, hasFile = false;
-
- if (!_iframe) {
- return;
- }
-
- uid = _iframe.id.replace(/_iframe$/, '');
-
- form = Dom.get(uid + '_form');
- if (form) {
- inputs = form.getElementsByTagName('input');
- i = inputs.length;
-
- while (i--) {
- switch (inputs[i].getAttribute('type')) {
- case 'hidden':
- inputs[i].parentNode.removeChild(inputs[i]);
- break;
- case 'file':
- hasFile = true; // flag the case for later
- break;
- }
- }
- inputs = [];
-
- if (!hasFile) { // we need to keep the form for sake of possible retries
- form.parentNode.removeChild(form);
- }
- form = null;
- }
-
- // without timeout, request is marked as canceled (in console)
- setTimeout(function() {
- Events.removeEvent(_iframe, 'load', target.uid);
- if (_iframe.parentNode) { // #382
- _iframe.parentNode.removeChild(_iframe);
- }
-
- // check if shim container has any other children, if - not, remove it as well
- var shimContainer = target.getRuntime().getShimContainer();
- if (!shimContainer.children.length) {
- shimContainer.parentNode.removeChild(shimContainer);
- }
-
- shimContainer = _iframe = null;
- cb();
- }, 1);
- }
-
- Basic.extend(this, {
- send: function(meta, data) {
- var target = this, I = target.getRuntime(), uid, form, input, blob;
-
- _status = _response = null;
-
- function createIframe() {
- var container = I.getShimContainer() || document.body
- , temp = document.createElement('div')
- ;
-
- // IE 6 won't be able to set the name using setAttribute or iframe.name
- temp.innerHTML = '';
- _iframe = temp.firstChild;
- container.appendChild(_iframe);
-
- /* _iframe.onreadystatechange = function() {
- console.info(_iframe.readyState);
- };*/
-
- Events.addEvent(_iframe, 'load', function() { // _iframe.onload doesn't work in IE lte 8
- var el;
-
- try {
- el = _iframe.contentWindow.document || _iframe.contentDocument || window.frames[_iframe.id].document;
-
- // try to detect some standard error pages
- if (/^4(0[0-9]|1[0-7]|2[2346])\s/.test(el.title)) { // test if title starts with 4xx HTTP error
- _status = el.title.replace(/^(\d+).*$/, '$1');
- } else {
- _status = 200;
- // get result
- _response = Basic.trim(el.body.innerHTML);
-
- // we need to fire these at least once
- target.trigger({
- type: 'progress',
- loaded: _response.length,
- total: _response.length
- });
-
- if (blob) { // if we were uploading a file
- target.trigger({
- type: 'uploadprogress',
- loaded: blob.size || 1025,
- total: blob.size || 1025
- });
- }
- }
- } catch (ex) {
- if (Url.hasSameOrigin(meta.url)) {
- // if response is sent with error code, iframe in IE gets redirected to res://ieframe.dll/http_x.htm
- // which obviously results to cross domain error (wtf?)
- _status = 404;
- } else {
- cleanup.call(target, function() {
- target.trigger('error');
- });
- return;
- }
- }
-
- cleanup.call(target, function() {
- target.trigger('load');
- });
- }, target.uid);
- } // end createIframe
-
- // prepare data to be sent and convert if required
- if (data instanceof FormData && data.hasBlob()) {
- blob = data.getBlob();
- uid = blob.uid;
- input = Dom.get(uid);
- form = Dom.get(uid + '_form');
- if (!form) {
- throw new x.DOMException(x.DOMException.NOT_FOUND_ERR);
- }
- } else {
- uid = Basic.guid('uid_');
-
- form = document.createElement('form');
- form.setAttribute('id', uid + '_form');
- form.setAttribute('method', meta.method);
- form.setAttribute('enctype', 'multipart/form-data');
- form.setAttribute('encoding', 'multipart/form-data');
-
- I.getShimContainer().appendChild(form);
- }
-
- // set upload target
- form.setAttribute('target', uid + '_iframe');
-
- if (data instanceof FormData) {
- data.each(function(value, name) {
- if (value instanceof Blob) {
- if (input) {
- input.setAttribute('name', name);
- }
- } else {
- var hidden = document.createElement('input');
-
- Basic.extend(hidden, {
- type : 'hidden',
- name : name,
- value : value
- });
-
- // make sure that input[type="file"], if it's there, comes last
- if (input) {
- form.insertBefore(hidden, input);
- } else {
- form.appendChild(hidden);
- }
- }
- });
- }
-
- // set destination url
- form.setAttribute("action", meta.url);
-
- createIframe();
- form.submit();
- target.trigger('loadstart');
- },
-
- getStatus: function() {
- return _status;
- },
-
- getResponse: function(responseType) {
- if ('json' === responseType) {
- // strip off .. tags that might be enclosing the response
- if (Basic.typeOf(_response) === 'string' && !!window.JSON) {
- try {
- return JSON.parse(_response.replace(/^\s*]*>/, '').replace(/<\/pre>\s*$/, ''));
- } catch (ex) {
- return null;
- }
- }
- } else if ('document' === responseType) {
-
- }
- return _response;
- },
-
- abort: function() {
- var target = this;
-
- if (_iframe && _iframe.contentWindow) {
- if (_iframe.contentWindow.stop) { // FireFox/Safari/Chrome
- _iframe.contentWindow.stop();
- } else if (_iframe.contentWindow.document.execCommand) { // IE
- _iframe.contentWindow.document.execCommand('Stop');
- } else {
- _iframe.src = "about:blank";
- }
- }
-
- cleanup.call(this, function() {
- // target.dispatchEvent('readystatechange');
- target.dispatchEvent('abort');
- });
- }
- });
- }
-
- return (extensions.XMLHttpRequest = XMLHttpRequest);
-});
-
-// Included from: src/javascript/runtime/html4/image/Image.js
-
-/**
- * Image.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
-@class moxie/runtime/html4/image/Image
-@private
-*/
-define("moxie/runtime/html4/image/Image", [
- "moxie/runtime/html4/Runtime",
- "moxie/runtime/html5/image/Image"
-], function(extensions, Image) {
- return (extensions.Image = Image);
-});
-
-expose(["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/I18n","moxie/core/utils/Mime","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/core/EventTarget","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/file/FileInput","moxie/core/utils/Encode","moxie/file/Blob","moxie/file/File","moxie/file/FileDrop","moxie/file/FileReader","moxie/core/utils/Url","moxie/runtime/RuntimeTarget","moxie/file/FileReaderSync","moxie/xhr/FormData","moxie/xhr/XMLHttpRequest","moxie/runtime/Transporter","moxie/image/Image","moxie/core/utils/Events"]);
-})(this);
-/**
- * o.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/*global moxie:true */
-
-/**
-Globally exposed namespace with the most frequently used public classes and handy methods.
-
-@class o
-@static
-@private
-*/
-(function(exports) {
- "use strict";
-
- var o = {}, inArray = exports.moxie.core.utils.Basic.inArray;
-
- // directly add some public classes
- // (we do it dynamically here, since for custom builds we cannot know beforehand what modules were included)
- (function addAlias(ns) {
- var name, itemType;
- for (name in ns) {
- itemType = typeof(ns[name]);
- if (itemType === 'object' && !~inArray(name, ['Exceptions', 'Env', 'Mime'])) {
- addAlias(ns[name]);
- } else if (itemType === 'function') {
- o[name] = ns[name];
- }
- }
- })(exports.moxie);
-
- // add some manually
- o.Env = exports.moxie.core.utils.Env;
- o.Mime = exports.moxie.core.utils.Mime;
- o.Exceptions = exports.moxie.core.Exceptions;
-
- // expose globally
- exports.mOxie = o;
- if (!exports.o) {
- exports.o = o;
- }
- return o;
-})(this);
diff --git a/src/js/_enqueues/vendor/plupload/plupload.js b/src/js/_enqueues/vendor/plupload/plupload.js
index d562c9349446a..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/plupload/plupload.js
+++ b/src/js/_enqueues/vendor/plupload/plupload.js
@@ -1,2379 +0,0 @@
-/**
- * Plupload - multi-runtime File Uploader
- * v2.1.9
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- *
- * Date: 2016-05-15
- */
-/**
- * Plupload.js
- *
- * Copyright 2013, Moxiecode Systems AB
- * Released under GPL License.
- *
- * License: http://www.plupload.com/license
- * Contributing: http://www.plupload.com/contributing
- */
-
-/**
- * Modified for WordPress, Silverlight and Flash runtimes support was removed.
- * See https://core.trac.wordpress.org/ticket/41755.
- */
-
-/*global mOxie:true */
-
-;(function(window, o, undef) {
-
-var delay = window.setTimeout
-, fileFilters = {}
-;
-
-// convert plupload features to caps acceptable by mOxie
-function normalizeCaps(settings) {
- var features = settings.required_features, caps = {};
-
- function resolve(feature, value, strict) {
- // Feature notation is deprecated, use caps (this thing here is required for backward compatibility)
- var map = {
- chunks: 'slice_blob',
- jpgresize: 'send_binary_string',
- pngresize: 'send_binary_string',
- progress: 'report_upload_progress',
- multi_selection: 'select_multiple',
- dragdrop: 'drag_and_drop',
- drop_element: 'drag_and_drop',
- headers: 'send_custom_headers',
- urlstream_upload: 'send_binary_string',
- canSendBinary: 'send_binary',
- triggerDialog: 'summon_file_dialog'
- };
-
- if (map[feature]) {
- caps[map[feature]] = value;
- } else if (!strict) {
- caps[feature] = value;
- }
- }
-
- if (typeof(features) === 'string') {
- plupload.each(features.split(/\s*,\s*/), function(feature) {
- resolve(feature, true);
- });
- } else if (typeof(features) === 'object') {
- plupload.each(features, function(value, feature) {
- resolve(feature, value);
- });
- } else if (features === true) {
- // check settings for required features
- if (settings.chunk_size > 0) {
- caps.slice_blob = true;
- }
-
- if (settings.resize.enabled || !settings.multipart) {
- caps.send_binary_string = true;
- }
-
- plupload.each(settings, function(value, feature) {
- resolve(feature, !!value, true); // strict check
- });
- }
-
- // WP: only html runtimes.
- settings.runtimes = 'html5,html4';
-
- return caps;
-}
-
-/**
- * @module plupload
- * @static
- */
-var plupload = {
- /**
- * Plupload version will be replaced on build.
- *
- * @property VERSION
- * @for Plupload
- * @static
- * @final
- */
- VERSION : '2.1.9',
-
- /**
- * The state of the queue before it has started and after it has finished
- *
- * @property STOPPED
- * @static
- * @final
- */
- STOPPED : 1,
-
- /**
- * Upload process is running
- *
- * @property STARTED
- * @static
- * @final
- */
- STARTED : 2,
-
- /**
- * File is queued for upload
- *
- * @property QUEUED
- * @static
- * @final
- */
- QUEUED : 1,
-
- /**
- * File is being uploaded
- *
- * @property UPLOADING
- * @static
- * @final
- */
- UPLOADING : 2,
-
- /**
- * File has failed to be uploaded
- *
- * @property FAILED
- * @static
- * @final
- */
- FAILED : 4,
-
- /**
- * File has been uploaded successfully
- *
- * @property DONE
- * @static
- * @final
- */
- DONE : 5,
-
- // Error constants used by the Error event
-
- /**
- * Generic error for example if an exception is thrown inside Silverlight.
- *
- * @property GENERIC_ERROR
- * @static
- * @final
- */
- GENERIC_ERROR : -100,
-
- /**
- * HTTP transport error. For example if the server produces a HTTP status other than 200.
- *
- * @property HTTP_ERROR
- * @static
- * @final
- */
- HTTP_ERROR : -200,
-
- /**
- * Generic I/O error. For example if it wasn't possible to open the file stream on local machine.
- *
- * @property IO_ERROR
- * @static
- * @final
- */
- IO_ERROR : -300,
-
- /**
- * @property SECURITY_ERROR
- * @static
- * @final
- */
- SECURITY_ERROR : -400,
-
- /**
- * Initialization error. Will be triggered if no runtime was initialized.
- *
- * @property INIT_ERROR
- * @static
- * @final
- */
- INIT_ERROR : -500,
-
- /**
- * File size error. If the user selects a file that is too large it will be blocked and an error of this type will be triggered.
- *
- * @property FILE_SIZE_ERROR
- * @static
- * @final
- */
- FILE_SIZE_ERROR : -600,
-
- /**
- * File extension error. If the user selects a file that isn't valid according to the filters setting.
- *
- * @property FILE_EXTENSION_ERROR
- * @static
- * @final
- */
- FILE_EXTENSION_ERROR : -601,
-
- /**
- * Duplicate file error. If prevent_duplicates is set to true and user selects the same file again.
- *
- * @property FILE_DUPLICATE_ERROR
- * @static
- * @final
- */
- FILE_DUPLICATE_ERROR : -602,
-
- /**
- * Runtime will try to detect if image is proper one. Otherwise will throw this error.
- *
- * @property IMAGE_FORMAT_ERROR
- * @static
- * @final
- */
- IMAGE_FORMAT_ERROR : -700,
-
- /**
- * While working on files runtime may run out of memory and will throw this error.
- *
- * @since 2.1.2
- * @property MEMORY_ERROR
- * @static
- * @final
- */
- MEMORY_ERROR : -701,
-
- /**
- * Each runtime has an upper limit on a dimension of the image it can handle. If bigger, will throw this error.
- *
- * @property IMAGE_DIMENSIONS_ERROR
- * @static
- * @final
- */
- IMAGE_DIMENSIONS_ERROR : -702,
-
- /**
- * Mime type lookup table.
- *
- * @property mimeTypes
- * @type Object
- * @final
- */
- mimeTypes : o.mimes,
-
- /**
- * In some cases sniffing is the only way around :(
- */
- ua: o.ua,
-
- /**
- * Gets the true type of the built-in object (better version of typeof).
- * @credits Angus Croll (http://javascriptweblog.wordpress.com/)
- *
- * @method typeOf
- * @static
- * @param {Object} o Object to check.
- * @return {String} Object [[Class]]
- */
- typeOf: o.typeOf,
-
- /**
- * Extends the specified object with another object.
- *
- * @method extend
- * @static
- * @param {Object} target Object to extend.
- * @param {Object..} obj Multiple objects to extend with.
- * @return {Object} Same as target, the extended object.
- */
- extend : o.extend,
-
- /**
- * Generates an unique ID. This is 99.99% unique since it takes the current time and 5 random numbers.
- * The only way a user would be able to get the same ID is if the two persons at the same exact millisecond manages
- * to get 5 the same random numbers between 0-65535 it also uses a counter so each call will be guaranteed to be page unique.
- * It's more probable for the earth to be hit with an asteriod. You can also if you want to be 100% sure set the plupload.guidPrefix property
- * to an user unique key.
- *
- * @method guid
- * @static
- * @return {String} Virtually unique id.
- */
- guid : o.guid,
-
- /**
- * Get array of DOM Elements by their ids.
- *
- * @method get
- * @param {String} id Identifier of the DOM Element
- * @return {Array}
- */
- getAll : function get(ids) {
- var els = [], el;
-
- if (plupload.typeOf(ids) !== 'array') {
- ids = [ids];
- }
-
- var i = ids.length;
- while (i--) {
- el = plupload.get(ids[i]);
- if (el) {
- els.push(el);
- }
- }
-
- return els.length ? els : null;
- },
-
- /**
- Get DOM element by id
-
- @method get
- @param {String} id Identifier of the DOM Element
- @return {Node}
- */
- get: o.get,
-
- /**
- * Executes the callback function for each item in array/object. If you return false in the
- * callback it will break the loop.
- *
- * @method each
- * @static
- * @param {Object} obj Object to iterate.
- * @param {function} callback Callback function to execute for each item.
- */
- each : o.each,
-
- /**
- * Returns the absolute x, y position of an Element. The position will be returned in a object with x, y fields.
- *
- * @method getPos
- * @static
- * @param {Element} node HTML element or element id to get x, y position from.
- * @param {Element} root Optional root element to stop calculations at.
- * @return {object} Absolute position of the specified element object with x, y fields.
- */
- getPos : o.getPos,
-
- /**
- * Returns the size of the specified node in pixels.
- *
- * @method getSize
- * @static
- * @param {Node} node Node to get the size of.
- * @return {Object} Object with a w and h property.
- */
- getSize : o.getSize,
-
- /**
- * Encodes the specified string.
- *
- * @method xmlEncode
- * @static
- * @param {String} s String to encode.
- * @return {String} Encoded string.
- */
- xmlEncode : function(str) {
- var xmlEncodeChars = {'<' : 'lt', '>' : 'gt', '&' : 'amp', '"' : 'quot', '\'' : '#39'}, xmlEncodeRegExp = /[<>&\"\']/g;
-
- return str ? ('' + str).replace(xmlEncodeRegExp, function(chr) {
- return xmlEncodeChars[chr] ? '&' + xmlEncodeChars[chr] + ';' : chr;
- }) : str;
- },
-
- /**
- * Forces anything into an array.
- *
- * @method toArray
- * @static
- * @param {Object} obj Object with length field.
- * @return {Array} Array object containing all items.
- */
- toArray : o.toArray,
-
- /**
- * Find an element in array and return its index if present, otherwise return -1.
- *
- * @method inArray
- * @static
- * @param {mixed} needle Element to find
- * @param {Array} array
- * @return {Int} Index of the element, or -1 if not found
- */
- inArray : o.inArray,
-
- /**
- * Extends the language pack object with new items.
- *
- * @method addI18n
- * @static
- * @param {Object} pack Language pack items to add.
- * @return {Object} Extended language pack object.
- */
- addI18n : o.addI18n,
-
- /**
- * Translates the specified string by checking for the english string in the language pack lookup.
- *
- * @method translate
- * @static
- * @param {String} str String to look for.
- * @return {String} Translated string or the input string if it wasn't found.
- */
- translate : o.translate,
-
- /**
- * Checks if object is empty.
- *
- * @method isEmptyObj
- * @static
- * @param {Object} obj Object to check.
- * @return {Boolean}
- */
- isEmptyObj : o.isEmptyObj,
-
- /**
- * Checks if specified DOM element has specified class.
- *
- * @method hasClass
- * @static
- * @param {Object} obj DOM element like object to add handler to.
- * @param {String} name Class name
- */
- hasClass : o.hasClass,
-
- /**
- * Adds specified className to specified DOM element.
- *
- * @method addClass
- * @static
- * @param {Object} obj DOM element like object to add handler to.
- * @param {String} name Class name
- */
- addClass : o.addClass,
-
- /**
- * Removes specified className from specified DOM element.
- *
- * @method removeClass
- * @static
- * @param {Object} obj DOM element like object to add handler to.
- * @param {String} name Class name
- */
- removeClass : o.removeClass,
-
- /**
- * Returns a given computed style of a DOM element.
- *
- * @method getStyle
- * @static
- * @param {Object} obj DOM element like object.
- * @param {String} name Style you want to get from the DOM element
- */
- getStyle : o.getStyle,
-
- /**
- * Adds an event handler to the specified object and store reference to the handler
- * in objects internal Plupload registry (@see removeEvent).
- *
- * @method addEvent
- * @static
- * @param {Object} obj DOM element like object to add handler to.
- * @param {String} name Name to add event listener to.
- * @param {Function} callback Function to call when event occurs.
- * @param {String} (optional) key that might be used to add specifity to the event record.
- */
- addEvent : o.addEvent,
-
- /**
- * Remove event handler from the specified object. If third argument (callback)
- * is not specified remove all events with the specified name.
- *
- * @method removeEvent
- * @static
- * @param {Object} obj DOM element to remove event listener(s) from.
- * @param {String} name Name of event listener to remove.
- * @param {Function|String} (optional) might be a callback or unique key to match.
- */
- removeEvent: o.removeEvent,
-
- /**
- * Remove all kind of events from the specified object
- *
- * @method removeAllEvents
- * @static
- * @param {Object} obj DOM element to remove event listeners from.
- * @param {String} (optional) unique key to match, when removing events.
- */
- removeAllEvents: o.removeAllEvents,
-
- /**
- * Cleans the specified name from national characters (diacritics). The result will be a name with only a-z, 0-9 and _.
- *
- * @method cleanName
- * @static
- * @param {String} s String to clean up.
- * @return {String} Cleaned string.
- */
- cleanName : function(name) {
- var i, lookup;
-
- // Replace diacritics
- lookup = [
- /[\300-\306]/g, 'A', /[\340-\346]/g, 'a',
- /\307/g, 'C', /\347/g, 'c',
- /[\310-\313]/g, 'E', /[\350-\353]/g, 'e',
- /[\314-\317]/g, 'I', /[\354-\357]/g, 'i',
- /\321/g, 'N', /\361/g, 'n',
- /[\322-\330]/g, 'O', /[\362-\370]/g, 'o',
- /[\331-\334]/g, 'U', /[\371-\374]/g, 'u'
- ];
-
- for (i = 0; i < lookup.length; i += 2) {
- name = name.replace(lookup[i], lookup[i + 1]);
- }
-
- // Replace whitespace
- name = name.replace(/\s+/g, '_');
-
- // Remove anything else
- name = name.replace(/[^a-z0-9_\-\.]+/gi, '');
-
- return name;
- },
-
- /**
- * Builds a full url out of a base URL and an object with items to append as query string items.
- *
- * @method buildUrl
- * @static
- * @param {String} url Base URL to append query string items to.
- * @param {Object} items Name/value object to serialize as a querystring.
- * @return {String} String with url + serialized query string items.
- */
- buildUrl : function(url, items) {
- var query = '';
-
- plupload.each(items, function(value, name) {
- query += (query ? '&' : '') + encodeURIComponent(name) + '=' + encodeURIComponent(value);
- });
-
- if (query) {
- url += (url.indexOf('?') > 0 ? '&' : '?') + query;
- }
-
- return url;
- },
-
- /**
- * Formats the specified number as a size string for example 1024 becomes 1 KB.
- *
- * @method formatSize
- * @static
- * @param {Number} size Size to format as string.
- * @return {String} Formatted size string.
- */
- formatSize : function(size) {
-
- if (size === undef || /\D/.test(size)) {
- return plupload.translate('N/A');
- }
-
- function round(num, precision) {
- return Math.round(num * Math.pow(10, precision)) / Math.pow(10, precision);
- }
-
- var boundary = Math.pow(1024, 4);
-
- // TB
- if (size > boundary) {
- return round(size / boundary, 1) + " " + plupload.translate('tb');
- }
-
- // GB
- if (size > (boundary/=1024)) {
- return round(size / boundary, 1) + " " + plupload.translate('gb');
- }
-
- // MB
- if (size > (boundary/=1024)) {
- return round(size / boundary, 1) + " " + plupload.translate('mb');
- }
-
- // KB
- if (size > 1024) {
- return Math.round(size / 1024) + " " + plupload.translate('kb');
- }
-
- return size + " " + plupload.translate('b');
- },
-
-
- /**
- * Parses the specified size string into a byte value. For example 10kb becomes 10240.
- *
- * @method parseSize
- * @static
- * @param {String|Number} size String to parse or number to just pass through.
- * @return {Number} Size in bytes.
- */
- parseSize : o.parseSizeStr,
-
-
- /**
- * A way to predict what runtime will be choosen in the current environment with the
- * specified settings.
- *
- * @method predictRuntime
- * @static
- * @param {Object|String} config Plupload settings to check
- * @param {String} [runtimes] Comma-separated list of runtimes to check against
- * @return {String} Type of compatible runtime
- */
- predictRuntime : function(config, runtimes) {
- var up, runtime;
-
- up = new plupload.Uploader(config);
- runtime = o.Runtime.thatCan(up.getOption().required_features, runtimes || config.runtimes);
- up.destroy();
- return runtime;
- },
-
- /**
- * Registers a filter that will be executed for each file added to the queue.
- * If callback returns false, file will not be added.
- *
- * Callback receives two arguments: a value for the filter as it was specified in settings.filters
- * and a file to be filtered. Callback is executed in the context of uploader instance.
- *
- * @method addFileFilter
- * @static
- * @param {String} name Name of the filter by which it can be referenced in settings.filters
- * @param {String} cb Callback - the actual routine that every added file must pass
- */
- addFileFilter: function(name, cb) {
- fileFilters[name] = cb;
- }
-};
-
-
-plupload.addFileFilter('mime_types', function(filters, file, cb) {
- if (filters.length && !filters.regexp.test(file.name)) {
- this.trigger('Error', {
- code : plupload.FILE_EXTENSION_ERROR,
- message : plupload.translate('File extension error.'),
- file : file
- });
- cb(false);
- } else {
- cb(true);
- }
-});
-
-
-plupload.addFileFilter('max_file_size', function(maxSize, file, cb) {
- var undef;
-
- maxSize = plupload.parseSize(maxSize);
-
- // Invalid file size
- if (file.size !== undef && maxSize && file.size > maxSize) {
- this.trigger('Error', {
- code : plupload.FILE_SIZE_ERROR,
- message : plupload.translate('File size error.'),
- file : file
- });
- cb(false);
- } else {
- cb(true);
- }
-});
-
-
-plupload.addFileFilter('prevent_duplicates', function(value, file, cb) {
- if (value) {
- var ii = this.files.length;
- while (ii--) {
- // Compare by name and size (size might be 0 or undefined, but still equivalent for both)
- if (file.name === this.files[ii].name && file.size === this.files[ii].size) {
- this.trigger('Error', {
- code : plupload.FILE_DUPLICATE_ERROR,
- message : plupload.translate('Duplicate file error.'),
- file : file
- });
- cb(false);
- return;
- }
- }
- }
- cb(true);
-});
-
-
-/**
-@class Uploader
-@constructor
-
-@param {Object} settings For detailed information about each option check documentation.
- @param {String|DOMElement} settings.browse_button id of the DOM element or DOM element itself to use as file dialog trigger.
- @param {String} settings.url URL of the server-side upload handler.
- @param {Number|String} [settings.chunk_size=0] Chunk size in bytes to slice the file into. Shorcuts with b, kb, mb, gb, tb suffixes also supported. `e.g. 204800 or "204800b" or "200kb"`. By default - disabled.
- @param {Boolean} [settings.send_chunk_number=true] Whether to send chunks and chunk numbers, or total and offset bytes.
- @param {String|DOMElement} [settings.container] id of the DOM element or DOM element itself that will be used to wrap uploader structures. Defaults to immediate parent of the `browse_button` element.
- @param {String|DOMElement} [settings.drop_element] id of the DOM element or DOM element itself to use as a drop zone for Drag-n-Drop.
- @param {String} [settings.file_data_name="file"] Name for the file field in Multipart formated message.
- @param {Object} [settings.filters={}] Set of file type filters.
- @param {Array} [settings.filters.mime_types=[]] List of file types to accept, each one defined by title and list of extensions. `e.g. {title : "Image files", extensions : "jpg,jpeg,gif,png"}`. Dispatches `plupload.FILE_EXTENSION_ERROR`
- @param {String|Number} [settings.filters.max_file_size=0] Maximum file size that the user can pick, in bytes. Optionally supports b, kb, mb, gb, tb suffixes. `e.g. "10mb" or "1gb"`. By default - not set. Dispatches `plupload.FILE_SIZE_ERROR`.
- @param {Boolean} [settings.filters.prevent_duplicates=false] Do not let duplicates into the queue. Dispatches `plupload.FILE_DUPLICATE_ERROR`.
- @param {String} [settings.flash_swf_url] URL of the Flash swf. (Not used in WordPress)
- @param {Object} [settings.headers] Custom headers to send with the upload. Hash of name/value pairs.
- @param {Number} [settings.max_retries=0] How many times to retry the chunk or file, before triggering Error event.
- @param {Boolean} [settings.multipart=true] Whether to send file and additional parameters as Multipart formated message.
- @param {Object} [settings.multipart_params] Hash of key/value pairs to send with every file upload.
- @param {Boolean} [settings.multi_selection=true] Enable ability to select multiple files at once in file dialog.
- @param {String|Object} [settings.required_features] Either comma-separated list or hash of required features that chosen runtime should absolutely possess.
- @param {Object} [settings.resize] Enable resizng of images on client-side. Applies to `image/jpeg` and `image/png` only. `e.g. {width : 200, height : 200, quality : 90, crop: true}`
- @param {Number} [settings.resize.width] If image is bigger, it will be resized.
- @param {Number} [settings.resize.height] If image is bigger, it will be resized.
- @param {Number} [settings.resize.quality=90] Compression quality for jpegs (1-100).
- @param {Boolean} [settings.resize.crop=false] Whether to crop images to exact dimensions. By default they will be resized proportionally.
- @param {String} [settings.runtimes="html5,html4"] Comma separated list of runtimes, that Plupload will try in turn, moving to the next if previous fails.
- @param {String} [settings.silverlight_xap_url] URL of the Silverlight xap. (Not used in WordPress)
- @param {Boolean} [settings.unique_names=false] If true will generate unique filenames for uploaded files.
- @param {Boolean} [settings.send_file_name=true] Whether to send file name as additional argument - 'name' (required for chunked uploads and some other cases where file name cannot be sent via normal ways).
-*/
-plupload.Uploader = function(options) {
- /**
- Fires when the current RunTime has been initialized.
-
- @event Init
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- */
-
- /**
- Fires after the init event incase you need to perform actions there.
-
- @event PostInit
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- */
-
- /**
- Fires when the option is changed in via uploader.setOption().
-
- @event OptionChanged
- @since 2.1
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- @param {String} name Name of the option that was changed
- @param {Mixed} value New value for the specified option
- @param {Mixed} oldValue Previous value of the option
- */
-
- /**
- Fires when the silverlight/flash or other shim needs to move.
-
- @event Refresh
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- */
-
- /**
- Fires when the overall state is being changed for the upload queue.
-
- @event StateChanged
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- */
-
- /**
- Fires when browse_button is clicked and browse dialog shows.
-
- @event Browse
- @since 2.1.2
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- */
-
- /**
- Fires for every filtered file before it is added to the queue.
-
- @event FileFiltered
- @since 2.1
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- @param {plupload.File} file Another file that has to be added to the queue.
- */
-
- /**
- Fires when the file queue is changed. In other words when files are added/removed to the files array of the uploader instance.
-
- @event QueueChanged
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- */
-
- /**
- Fires after files were filtered and added to the queue.
-
- @event FilesAdded
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- @param {Array} files Array of file objects that were added to queue by the user.
- */
-
- /**
- Fires when file is removed from the queue.
-
- @event FilesRemoved
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- @param {Array} files Array of files that got removed.
- */
-
- /**
- Fires just before a file is uploaded. Can be used to cancel the upload for the specified file
- by returning false from the handler.
-
- @event BeforeUpload
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- @param {plupload.File} file File to be uploaded.
- */
-
- /**
- Fires when a file is to be uploaded by the runtime.
-
- @event UploadFile
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- @param {plupload.File} file File to be uploaded.
- */
-
- /**
- Fires while a file is being uploaded. Use this event to update the current file upload progress.
-
- @event UploadProgress
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- @param {plupload.File} file File that is currently being uploaded.
- */
-
- /**
- Fires when file chunk is uploaded.
-
- @event ChunkUploaded
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- @param {plupload.File} file File that the chunk was uploaded for.
- @param {Object} result Object with response properties.
- @param {Number} result.offset The amount of bytes the server has received so far, including this chunk.
- @param {Number} result.total The size of the file.
- @param {String} result.response The response body sent by the server.
- @param {Number} result.status The HTTP status code sent by the server.
- @param {String} result.responseHeaders All the response headers as a single string.
- */
-
- /**
- Fires when a file is successfully uploaded.
-
- @event FileUploaded
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- @param {plupload.File} file File that was uploaded.
- @param {Object} result Object with response properties.
- @param {String} result.response The response body sent by the server.
- @param {Number} result.status The HTTP status code sent by the server.
- @param {String} result.responseHeaders All the response headers as a single string.
- */
-
- /**
- Fires when all files in a queue are uploaded.
-
- @event UploadComplete
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- @param {Array} files Array of file objects that was added to queue/selected by the user.
- */
-
- /**
- Fires when a error occurs.
-
- @event Error
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- @param {Object} error Contains code, message and sometimes file and other details.
- @param {Number} error.code The plupload error code.
- @param {String} error.message Description of the error (uses i18n).
- */
-
- /**
- Fires when destroy method is called.
-
- @event Destroy
- @param {plupload.Uploader} uploader Uploader instance sending the event.
- */
- var uid = plupload.guid()
- , settings
- , files = []
- , preferred_caps = {}
- , fileInputs = []
- , fileDrops = []
- , startTime
- , total
- , disabled = false
- , xhr
- ;
-
-
- // Private methods
- function uploadNext() {
- var file, count = 0, i;
-
- if (this.state == plupload.STARTED) {
- // Find first QUEUED file
- for (i = 0; i < files.length; i++) {
- if (!file && files[i].status == plupload.QUEUED) {
- file = files[i];
- if (this.trigger("BeforeUpload", file)) {
- file.status = plupload.UPLOADING;
- this.trigger("UploadFile", file);
- }
- } else {
- count++;
- }
- }
-
- // All files are DONE or FAILED
- if (count == files.length) {
- if (this.state !== plupload.STOPPED) {
- this.state = plupload.STOPPED;
- this.trigger("StateChanged");
- }
- this.trigger("UploadComplete", files);
- }
- }
- }
-
-
- function calcFile(file) {
- file.percent = file.size > 0 ? Math.ceil(file.loaded / file.size * 100) : 100;
- calc();
- }
-
-
- function calc() {
- var i, file;
-
- // Reset stats
- total.reset();
-
- // Check status, size, loaded etc on all files
- for (i = 0; i < files.length; i++) {
- file = files[i];
-
- if (file.size !== undef) {
- // We calculate totals based on original file size
- total.size += file.origSize;
-
- // Since we cannot predict file size after resize, we do opposite and
- // interpolate loaded amount to match magnitude of total
- total.loaded += file.loaded * file.origSize / file.size;
- } else {
- total.size = undef;
- }
-
- if (file.status == plupload.DONE) {
- total.uploaded++;
- } else if (file.status == plupload.FAILED) {
- total.failed++;
- } else {
- total.queued++;
- }
- }
-
- // If we couldn't calculate a total file size then use the number of files to calc percent
- if (total.size === undef) {
- total.percent = files.length > 0 ? Math.ceil(total.uploaded / files.length * 100) : 0;
- } else {
- total.bytesPerSec = Math.ceil(total.loaded / ((+new Date() - startTime || 1) / 1000.0));
- total.percent = total.size > 0 ? Math.ceil(total.loaded / total.size * 100) : 0;
- }
- }
-
-
- function getRUID() {
- var ctrl = fileInputs[0] || fileDrops[0];
- if (ctrl) {
- return ctrl.getRuntime().uid;
- }
- return false;
- }
-
-
- function runtimeCan(file, cap) {
- if (file.ruid) {
- var info = o.Runtime.getInfo(file.ruid);
- if (info) {
- return info.can(cap);
- }
- }
- return false;
- }
-
-
- function bindEventListeners() {
- this.bind('FilesAdded FilesRemoved', function(up) {
- up.trigger('QueueChanged');
- up.refresh();
- });
-
- this.bind('CancelUpload', onCancelUpload);
-
- this.bind('BeforeUpload', onBeforeUpload);
-
- this.bind('UploadFile', onUploadFile);
-
- this.bind('UploadProgress', onUploadProgress);
-
- this.bind('StateChanged', onStateChanged);
-
- this.bind('QueueChanged', calc);
-
- this.bind('Error', onError);
-
- this.bind('FileUploaded', onFileUploaded);
-
- this.bind('Destroy', onDestroy);
- }
-
-
- function initControls(settings, cb) {
- var self = this, inited = 0, queue = [];
-
- // common settings
- var options = {
- runtime_order: settings.runtimes,
- required_caps: settings.required_features,
- preferred_caps: preferred_caps
- };
-
- // add runtime specific options if any
- plupload.each(settings.runtimes.split(/\s*,\s*/), function(runtime) {
- if (settings[runtime]) {
- options[runtime] = settings[runtime];
- }
- });
-
- // initialize file pickers - there can be many
- if (settings.browse_button) {
- plupload.each(settings.browse_button, function(el) {
- queue.push(function(cb) {
- var fileInput = new o.FileInput(plupload.extend({}, options, {
- accept: settings.filters.mime_types,
- name: settings.file_data_name,
- multiple: settings.multi_selection,
- container: settings.container,
- browse_button: el
- }));
-
- fileInput.onready = function() {
- var info = o.Runtime.getInfo(this.ruid);
-
- // for backward compatibility
- o.extend(self.features, {
- chunks: info.can('slice_blob'),
- multipart: info.can('send_multipart'),
- multi_selection: info.can('select_multiple')
- });
-
- inited++;
- fileInputs.push(this);
- cb();
- };
-
- fileInput.onchange = function() {
- self.addFile(this.files);
- };
-
- fileInput.bind('mouseenter mouseleave mousedown mouseup', function(e) {
- if (!disabled) {
- if (settings.browse_button_hover) {
- if ('mouseenter' === e.type) {
- o.addClass(el, settings.browse_button_hover);
- } else if ('mouseleave' === e.type) {
- o.removeClass(el, settings.browse_button_hover);
- }
- }
-
- if (settings.browse_button_active) {
- if ('mousedown' === e.type) {
- o.addClass(el, settings.browse_button_active);
- } else if ('mouseup' === e.type) {
- o.removeClass(el, settings.browse_button_active);
- }
- }
- }
- });
-
- fileInput.bind('mousedown', function() {
- self.trigger('Browse');
- });
-
- fileInput.bind('error runtimeerror', function() {
- fileInput = null;
- cb();
- });
-
- fileInput.init();
- });
- });
- }
-
- // initialize drop zones
- if (settings.drop_element) {
- plupload.each(settings.drop_element, function(el) {
- queue.push(function(cb) {
- var fileDrop = new o.FileDrop(plupload.extend({}, options, {
- drop_zone: el
- }));
-
- fileDrop.onready = function() {
- var info = o.Runtime.getInfo(this.ruid);
-
- // for backward compatibility
- o.extend(self.features, {
- chunks: info.can('slice_blob'),
- multipart: info.can('send_multipart'),
- dragdrop: info.can('drag_and_drop')
- });
-
- inited++;
- fileDrops.push(this);
- cb();
- };
-
- fileDrop.ondrop = function() {
- self.addFile(this.files);
- };
-
- fileDrop.bind('error runtimeerror', function() {
- fileDrop = null;
- cb();
- });
-
- fileDrop.init();
- });
- });
- }
-
-
- o.inSeries(queue, function() {
- if (typeof(cb) === 'function') {
- cb(inited);
- }
- });
- }
-
-
- function resizeImage(blob, params, cb) {
- var img = new o.Image();
-
- try {
- img.onload = function() {
- // no manipulation required if...
- if (params.width > this.width &&
- params.height > this.height &&
- params.quality === undef &&
- params.preserve_headers &&
- !params.crop
- ) {
- this.destroy();
- return cb(blob);
- }
- // otherwise downsize
- img.downsize(params.width, params.height, params.crop, params.preserve_headers);
- };
-
- img.onresize = function() {
- cb(this.getAsBlob(blob.type, params.quality));
- this.destroy();
- };
-
- img.onerror = function() {
- cb(blob);
- };
-
- img.load(blob);
- } catch(ex) {
- cb(blob);
- }
- }
-
-
- function setOption(option, value, init) {
- var self = this, reinitRequired = false;
-
- function _setOption(option, value, init) {
- var oldValue = settings[option];
-
- switch (option) {
- case 'max_file_size':
- if (option === 'max_file_size') {
- settings.max_file_size = settings.filters.max_file_size = value;
- }
- break;
-
- case 'chunk_size':
- if (value = plupload.parseSize(value)) {
- settings[option] = value;
- settings.send_file_name = true;
- }
- break;
-
- case 'multipart':
- settings[option] = value;
- if (!value) {
- settings.send_file_name = true;
- }
- break;
-
- case 'unique_names':
- settings[option] = value;
- if (value) {
- settings.send_file_name = true;
- }
- break;
-
- case 'filters':
- // for sake of backward compatibility
- if (plupload.typeOf(value) === 'array') {
- value = {
- mime_types: value
- };
- }
-
- if (init) {
- plupload.extend(settings.filters, value);
- } else {
- settings.filters = value;
- }
-
- // if file format filters are being updated, regenerate the matching expressions
- if (value.mime_types) {
- settings.filters.mime_types.regexp = (function(filters) {
- var extensionsRegExp = [];
-
- plupload.each(filters, function(filter) {
- plupload.each(filter.extensions.split(/,/), function(ext) {
- if (/^\s*\*\s*$/.test(ext)) {
- extensionsRegExp.push('\\.*');
- } else {
- extensionsRegExp.push('\\.' + ext.replace(new RegExp('[' + ('/^$.*+?|()[]{}\\'.replace(/./g, '\\$&')) + ']', 'g'), '\\$&'));
- }
- });
- });
-
- return new RegExp('(' + extensionsRegExp.join('|') + ')$', 'i');
- }(settings.filters.mime_types));
- }
- break;
-
- case 'resize':
- if (init) {
- plupload.extend(settings.resize, value, {
- enabled: true
- });
- } else {
- settings.resize = value;
- }
- break;
-
- case 'prevent_duplicates':
- settings.prevent_duplicates = settings.filters.prevent_duplicates = !!value;
- break;
-
- // options that require reinitialisation
- case 'container':
- case 'browse_button':
- case 'drop_element':
- value = 'container' === option
- ? plupload.get(value)
- : plupload.getAll(value)
- ;
-
- case 'runtimes':
- case 'multi_selection':
- settings[option] = value;
- if (!init) {
- reinitRequired = true;
- }
- break;
-
- default:
- settings[option] = value;
- }
-
- if (!init) {
- self.trigger('OptionChanged', option, value, oldValue);
- }
- }
-
- if (typeof(option) === 'object') {
- plupload.each(option, function(value, option) {
- _setOption(option, value, init);
- });
- } else {
- _setOption(option, value, init);
- }
-
- if (init) {
- // Normalize the list of required capabilities
- settings.required_features = normalizeCaps(plupload.extend({}, settings));
-
- // Come up with the list of capabilities that can affect default mode in a multi-mode runtimes
- preferred_caps = normalizeCaps(plupload.extend({}, settings, {
- required_features: true
- }));
- } else if (reinitRequired) {
- self.trigger('Destroy');
-
- initControls.call(self, settings, function(inited) {
- if (inited) {
- self.runtime = o.Runtime.getInfo(getRUID()).type;
- self.trigger('Init', { runtime: self.runtime });
- self.trigger('PostInit');
- } else {
- self.trigger('Error', {
- code : plupload.INIT_ERROR,
- message : plupload.translate('Init error.')
- });
- }
- });
- }
- }
-
-
- // Internal event handlers
- function onBeforeUpload(up, file) {
- // Generate unique target filenames
- if (up.settings.unique_names) {
- var matches = file.name.match(/\.([^.]+)$/), ext = "part";
- if (matches) {
- ext = matches[1];
- }
- file.target_name = file.id + '.' + ext;
- }
- }
-
-
- function onUploadFile(up, file) {
- var url = up.settings.url
- , chunkSize = up.settings.chunk_size
- , retries = up.settings.max_retries
- , features = up.features
- , offset = 0
- , blob
- ;
-
- // make sure we start at a predictable offset
- if (file.loaded) {
- offset = file.loaded = chunkSize ? chunkSize * Math.floor(file.loaded / chunkSize) : 0;
- }
-
- function handleError() {
- if (retries-- > 0) {
- delay(uploadNextChunk, 1000);
- } else {
- file.loaded = offset; // reset all progress
-
- up.trigger('Error', {
- code : plupload.HTTP_ERROR,
- message : plupload.translate('HTTP Error.'),
- file : file,
- response : xhr.responseText,
- status : xhr.status,
- responseHeaders: xhr.getAllResponseHeaders()
- });
- }
- }
-
- function uploadNextChunk() {
- var chunkBlob, formData, args = {}, curChunkSize;
-
- // make sure that file wasn't cancelled and upload is not stopped in general
- if (file.status !== plupload.UPLOADING || up.state === plupload.STOPPED) {
- return;
- }
-
- // send additional 'name' parameter only if required
- if (up.settings.send_file_name) {
- args.name = file.target_name || file.name;
- }
-
- if (chunkSize && features.chunks && blob.size > chunkSize) { // blob will be of type string if it was loaded in memory
- curChunkSize = Math.min(chunkSize, blob.size - offset);
- chunkBlob = blob.slice(offset, offset + curChunkSize);
- } else {
- curChunkSize = blob.size;
- chunkBlob = blob;
- }
-
- // If chunking is enabled add corresponding args, no matter if file is bigger than chunk or smaller
- if (chunkSize && features.chunks) {
- // Setup query string arguments
- if (up.settings.send_chunk_number) {
- args.chunk = Math.ceil(offset / chunkSize);
- args.chunks = Math.ceil(blob.size / chunkSize);
- } else { // keep support for experimental chunk format, just in case
- args.offset = offset;
- args.total = blob.size;
- }
- }
-
- xhr = new o.XMLHttpRequest();
-
- // Do we have upload progress support
- if (xhr.upload) {
- xhr.upload.onprogress = function(e) {
- file.loaded = Math.min(file.size, offset + e.loaded);
- up.trigger('UploadProgress', file);
- };
- }
-
- xhr.onload = function() {
- // check if upload made itself through
- if (xhr.status >= 400) {
- handleError();
- return;
- }
-
- retries = up.settings.max_retries; // reset the counter
-
- // Handle chunk response
- if (curChunkSize < blob.size) {
- chunkBlob.destroy();
-
- offset += curChunkSize;
- file.loaded = Math.min(offset, blob.size);
-
- up.trigger('ChunkUploaded', file, {
- offset : file.loaded,
- total : blob.size,
- response : xhr.responseText,
- status : xhr.status,
- responseHeaders: xhr.getAllResponseHeaders()
- });
-
- // stock Android browser doesn't fire upload progress events, but in chunking mode we can fake them
- if (o.Env.browser === 'Android Browser') {
- // doesn't harm in general, but is not required anywhere else
- up.trigger('UploadProgress', file);
- }
- } else {
- file.loaded = file.size;
- }
-
- chunkBlob = formData = null; // Free memory
-
- // Check if file is uploaded
- if (!offset || offset >= blob.size) {
- // If file was modified, destory the copy
- if (file.size != file.origSize) {
- blob.destroy();
- blob = null;
- }
-
- up.trigger('UploadProgress', file);
-
- file.status = plupload.DONE;
-
- up.trigger('FileUploaded', file, {
- response : xhr.responseText,
- status : xhr.status,
- responseHeaders: xhr.getAllResponseHeaders()
- });
- } else {
- // Still chunks left
- delay(uploadNextChunk, 1); // run detached, otherwise event handlers interfere
- }
- };
-
- xhr.onerror = function() {
- handleError();
- };
-
- xhr.onloadend = function() {
- this.destroy();
- xhr = null;
- };
-
- // Build multipart request
- if (up.settings.multipart && features.multipart) {
- xhr.open("post", url, true);
-
- // Set custom headers
- plupload.each(up.settings.headers, function(value, name) {
- xhr.setRequestHeader(name, value);
- });
-
- formData = new o.FormData();
-
- // Add multipart params
- plupload.each(plupload.extend(args, up.settings.multipart_params), function(value, name) {
- formData.append(name, value);
- });
-
- // Add file and send it
- formData.append(up.settings.file_data_name, chunkBlob);
- xhr.send(formData, {
- runtime_order: up.settings.runtimes,
- required_caps: up.settings.required_features,
- preferred_caps: preferred_caps
- });
- } else {
- // if no multipart, send as binary stream
- url = plupload.buildUrl(up.settings.url, plupload.extend(args, up.settings.multipart_params));
-
- xhr.open("post", url, true);
-
- xhr.setRequestHeader('Content-Type', 'application/octet-stream'); // Binary stream header
-
- // Set custom headers
- plupload.each(up.settings.headers, function(value, name) {
- xhr.setRequestHeader(name, value);
- });
-
- xhr.send(chunkBlob, {
- runtime_order: up.settings.runtimes,
- required_caps: up.settings.required_features,
- preferred_caps: preferred_caps
- });
- }
- }
-
- blob = file.getSource();
-
- // Start uploading chunks
- if (up.settings.resize.enabled && runtimeCan(blob, 'send_binary_string') && !!~o.inArray(blob.type, ['image/jpeg', 'image/png'])) {
- // Resize if required
- resizeImage.call(this, blob, up.settings.resize, function(resizedBlob) {
- blob = resizedBlob;
- file.size = resizedBlob.size;
- uploadNextChunk();
- });
- } else {
- uploadNextChunk();
- }
- }
-
-
- function onUploadProgress(up, file) {
- calcFile(file);
- }
-
-
- function onStateChanged(up) {
- if (up.state == plupload.STARTED) {
- // Get start time to calculate bps
- startTime = (+new Date());
- } else if (up.state == plupload.STOPPED) {
- // Reset currently uploading files
- for (var i = up.files.length - 1; i >= 0; i--) {
- if (up.files[i].status == plupload.UPLOADING) {
- up.files[i].status = plupload.QUEUED;
- calc();
- }
- }
- }
- }
-
-
- function onCancelUpload() {
- if (xhr) {
- xhr.abort();
- }
- }
-
-
- function onFileUploaded(up) {
- calc();
-
- // Upload next file but detach it from the error event
- // since other custom listeners might want to stop the queue
- delay(function() {
- uploadNext.call(up);
- }, 1);
- }
-
-
- function onError(up, err) {
- if (err.code === plupload.INIT_ERROR) {
- up.destroy();
- }
- // Set failed status if an error occured on a file
- else if (err.code === plupload.HTTP_ERROR) {
- err.file.status = plupload.FAILED;
- calcFile(err.file);
-
- // Upload next file but detach it from the error event
- // since other custom listeners might want to stop the queue
- if (up.state == plupload.STARTED) { // upload in progress
- up.trigger('CancelUpload');
- delay(function() {
- uploadNext.call(up);
- }, 1);
- }
- }
- }
-
-
- function onDestroy(up) {
- up.stop();
-
- // Purge the queue
- plupload.each(files, function(file) {
- file.destroy();
- });
- files = [];
-
- if (fileInputs.length) {
- plupload.each(fileInputs, function(fileInput) {
- fileInput.destroy();
- });
- fileInputs = [];
- }
-
- if (fileDrops.length) {
- plupload.each(fileDrops, function(fileDrop) {
- fileDrop.destroy();
- });
- fileDrops = [];
- }
-
- preferred_caps = {};
- disabled = false;
- startTime = xhr = null;
- total.reset();
- }
-
-
- // Default settings
- settings = {
- runtimes: o.Runtime.order,
- max_retries: 0,
- chunk_size: 0,
- multipart: true,
- multi_selection: true,
- file_data_name: 'file',
- filters: {
- mime_types: [],
- prevent_duplicates: false,
- max_file_size: 0
- },
- resize: {
- enabled: false,
- preserve_headers: true,
- crop: false
- },
- send_file_name: true,
- send_chunk_number: true
- };
-
-
- setOption.call(this, options, null, true);
-
- // Inital total state
- total = new plupload.QueueProgress();
-
- // Add public methods
- plupload.extend(this, {
-
- /**
- * Unique id for the Uploader instance.
- *
- * @property id
- * @type String
- */
- id : uid,
- uid : uid, // mOxie uses this to differentiate between event targets
-
- /**
- * Current state of the total uploading progress. This one can either be plupload.STARTED or plupload.STOPPED.
- * These states are controlled by the stop/start methods. The default value is STOPPED.
- *
- * @property state
- * @type Number
- */
- state : plupload.STOPPED,
-
- /**
- * Map of features that are available for the uploader runtime. Features will be filled
- * before the init event is called, these features can then be used to alter the UI for the end user.
- * Some of the current features that might be in this map is: dragdrop, chunks, jpgresize, pngresize.
- *
- * @property features
- * @type Object
- */
- features : {},
-
- /**
- * Current runtime name.
- *
- * @property runtime
- * @type String
- */
- runtime : null,
-
- /**
- * Current upload queue, an array of File instances.
- *
- * @property files
- * @type Array
- * @see plupload.File
- */
- files : files,
-
- /**
- * Object with name/value settings.
- *
- * @property settings
- * @type Object
- */
- settings : settings,
-
- /**
- * Total progess information. How many files has been uploaded, total percent etc.
- *
- * @property total
- * @type plupload.QueueProgress
- */
- total : total,
-
-
- /**
- * Initializes the Uploader instance and adds internal event listeners.
- *
- * @method init
- */
- init : function() {
- var self = this, opt, preinitOpt, err;
-
- preinitOpt = self.getOption('preinit');
- if (typeof(preinitOpt) == "function") {
- preinitOpt(self);
- } else {
- plupload.each(preinitOpt, function(func, name) {
- self.bind(name, func);
- });
- }
-
- bindEventListeners.call(self);
-
- // Check for required options
- plupload.each(['container', 'browse_button', 'drop_element'], function(el) {
- if (self.getOption(el) === null) {
- err = {
- code : plupload.INIT_ERROR,
- message : plupload.translate("'%' specified, but cannot be found.")
- }
- return false;
- }
- });
-
- if (err) {
- return self.trigger('Error', err);
- }
-
-
- if (!settings.browse_button && !settings.drop_element) {
- return self.trigger('Error', {
- code : plupload.INIT_ERROR,
- message : plupload.translate("You must specify either 'browse_button' or 'drop_element'.")
- });
- }
-
-
- initControls.call(self, settings, function(inited) {
- var initOpt = self.getOption('init');
- if (typeof(initOpt) == "function") {
- initOpt(self);
- } else {
- plupload.each(initOpt, function(func, name) {
- self.bind(name, func);
- });
- }
-
- if (inited) {
- self.runtime = o.Runtime.getInfo(getRUID()).type;
- self.trigger('Init', { runtime: self.runtime });
- self.trigger('PostInit');
- } else {
- self.trigger('Error', {
- code : plupload.INIT_ERROR,
- message : plupload.translate('Init error.')
- });
- }
- });
- },
-
- /**
- * Set the value for the specified option(s).
- *
- * @method setOption
- * @since 2.1
- * @param {String|Object} option Name of the option to change or the set of key/value pairs
- * @param {Mixed} [value] Value for the option (is ignored, if first argument is object)
- */
- setOption: function(option, value) {
- setOption.call(this, option, value, !this.runtime); // until runtime not set we do not need to reinitialize
- },
-
- /**
- * Get the value for the specified option or the whole configuration, if not specified.
- *
- * @method getOption
- * @since 2.1
- * @param {String} [option] Name of the option to get
- * @return {Mixed} Value for the option or the whole set
- */
- getOption: function(option) {
- if (!option) {
- return settings;
- }
- return settings[option];
- },
-
- /**
- * Refreshes the upload instance by dispatching out a refresh event to all runtimes.
- * This would for example reposition flash/silverlight shims on the page.
- *
- * @method refresh
- */
- refresh : function() {
- if (fileInputs.length) {
- plupload.each(fileInputs, function(fileInput) {
- fileInput.trigger('Refresh');
- });
- }
- this.trigger('Refresh');
- },
-
- /**
- * Starts uploading the queued files.
- *
- * @method start
- */
- start : function() {
- if (this.state != plupload.STARTED) {
- this.state = plupload.STARTED;
- this.trigger('StateChanged');
-
- uploadNext.call(this);
- }
- },
-
- /**
- * Stops the upload of the queued files.
- *
- * @method stop
- */
- stop : function() {
- if (this.state != plupload.STOPPED) {
- this.state = plupload.STOPPED;
- this.trigger('StateChanged');
- this.trigger('CancelUpload');
- }
- },
-
-
- /**
- * Disables/enables browse button on request.
- *
- * @method disableBrowse
- * @param {Boolean} disable Whether to disable or enable (default: true)
- */
- disableBrowse : function() {
- disabled = arguments[0] !== undef ? arguments[0] : true;
-
- if (fileInputs.length) {
- plupload.each(fileInputs, function(fileInput) {
- fileInput.disable(disabled);
- });
- }
-
- this.trigger('DisableBrowse', disabled);
- },
-
- /**
- * Returns the specified file object by id.
- *
- * @method getFile
- * @param {String} id File id to look for.
- * @return {plupload.File} File object or undefined if it wasn't found;
- */
- getFile : function(id) {
- var i;
- for (i = files.length - 1; i >= 0; i--) {
- if (files[i].id === id) {
- return files[i];
- }
- }
- },
-
- /**
- * Adds file to the queue programmatically. Can be native file, instance of Plupload.File,
- * instance of mOxie.File, input[type="file"] element, or array of these. Fires FilesAdded,
- * if any files were added to the queue. Otherwise nothing happens.
- *
- * @method addFile
- * @since 2.0
- * @param {plupload.File|mOxie.File|File|Node|Array} file File or files to add to the queue.
- * @param {String} [fileName] If specified, will be used as a name for the file
- */
- addFile : function(file, fileName) {
- var self = this
- , queue = []
- , filesAdded = []
- , ruid
- ;
-
- function filterFile(file, cb) {
- var queue = [];
- o.each(self.settings.filters, function(rule, name) {
- if (fileFilters[name]) {
- queue.push(function(cb) {
- fileFilters[name].call(self, rule, file, function(res) {
- cb(!res);
- });
- });
- }
- });
- o.inSeries(queue, cb);
- }
-
- /**
- * @method resolveFile
- * @private
- * @param {o.File|o.Blob|plupload.File|File|Blob|input[type="file"]} file
- */
- function resolveFile(file) {
- var type = o.typeOf(file);
-
- // o.File
- if (file instanceof o.File) {
- if (!file.ruid && !file.isDetached()) {
- if (!ruid) { // weird case
- return false;
- }
- file.ruid = ruid;
- file.connectRuntime(ruid);
- }
- resolveFile(new plupload.File(file));
- }
- // o.Blob
- else if (file instanceof o.Blob) {
- resolveFile(file.getSource());
- file.destroy();
- }
- // plupload.File - final step for other branches
- else if (file instanceof plupload.File) {
- if (fileName) {
- file.name = fileName;
- }
-
- queue.push(function(cb) {
- // run through the internal and user-defined filters, if any
- filterFile(file, function(err) {
- if (!err) {
- // make files available for the filters by updating the main queue directly
- files.push(file);
- // collect the files that will be passed to FilesAdded event
- filesAdded.push(file);
-
- self.trigger("FileFiltered", file);
- }
- delay(cb, 1); // do not build up recursions or eventually we might hit the limits
- });
- });
- }
- // native File or blob
- else if (o.inArray(type, ['file', 'blob']) !== -1) {
- resolveFile(new o.File(null, file));
- }
- // input[type="file"]
- else if (type === 'node' && o.typeOf(file.files) === 'filelist') {
- // if we are dealing with input[type="file"]
- o.each(file.files, resolveFile);
- }
- // mixed array of any supported types (see above)
- else if (type === 'array') {
- fileName = null; // should never happen, but unset anyway to avoid funny situations
- o.each(file, resolveFile);
- }
- }
-
- ruid = getRUID();
-
- resolveFile(file);
-
- if (queue.length) {
- o.inSeries(queue, function() {
- // if any files left after filtration, trigger FilesAdded
- if (filesAdded.length) {
- self.trigger("FilesAdded", filesAdded);
- }
- });
- }
- },
-
- /**
- * Removes a specific file.
- *
- * @method removeFile
- * @param {plupload.File|String} file File to remove from queue.
- */
- removeFile : function(file) {
- var id = typeof(file) === 'string' ? file : file.id;
-
- for (var i = files.length - 1; i >= 0; i--) {
- if (files[i].id === id) {
- return this.splice(i, 1)[0];
- }
- }
- },
-
- /**
- * Removes part of the queue and returns the files removed. This will also trigger the FilesRemoved and QueueChanged events.
- *
- * @method splice
- * @param {Number} start (Optional) Start index to remove from.
- * @param {Number} length (Optional) Lengh of items to remove.
- * @return {Array} Array of files that was removed.
- */
- splice : function(start, length) {
- // Splice and trigger events
- var removed = files.splice(start === undef ? 0 : start, length === undef ? files.length : length);
-
- // if upload is in progress we need to stop it and restart after files are removed
- var restartRequired = false;
- if (this.state == plupload.STARTED) { // upload in progress
- plupload.each(removed, function(file) {
- if (file.status === plupload.UPLOADING) {
- restartRequired = true; // do not restart, unless file that is being removed is uploading
- return false;
- }
- });
-
- if (restartRequired) {
- this.stop();
- }
- }
-
- this.trigger("FilesRemoved", removed);
-
- // Dispose any resources allocated by those files
- plupload.each(removed, function(file) {
- file.destroy();
- });
-
- if (restartRequired) {
- this.start();
- }
-
- return removed;
- },
-
- /**
- Dispatches the specified event name and its arguments to all listeners.
-
- @method trigger
- @param {String} name Event name to fire.
- @param {Object..} Multiple arguments to pass along to the listener functions.
- */
-
- // override the parent method to match Plupload-like event logic
- dispatchEvent: function(type) {
- var list, args, result;
-
- type = type.toLowerCase();
-
- list = this.hasEventListener(type);
-
- if (list) {
- // sort event list by priority
- list.sort(function(a, b) { return b.priority - a.priority; });
-
- // first argument should be current plupload.Uploader instance
- args = [].slice.call(arguments);
- args.shift();
- args.unshift(this);
-
- for (var i = 0; i < list.length; i++) {
- // Fire event, break chain if false is returned
- if (list[i].fn.apply(list[i].scope, args) === false) {
- return false;
- }
- }
- }
- return true;
- },
-
- /**
- Check whether uploader has any listeners to the specified event.
-
- @method hasEventListener
- @param {String} name Event name to check for.
- */
-
-
- /**
- Adds an event listener by name.
-
- @method bind
- @param {String} name Event name to listen for.
- @param {function} fn Function to call ones the event gets fired.
- @param {Object} [scope] Optional scope to execute the specified function in.
- @param {Number} [priority=0] Priority of the event handler - handlers with higher priorities will be called first
- */
- bind: function(name, fn, scope, priority) {
- // adapt moxie EventTarget style to Plupload-like
- plupload.Uploader.prototype.bind.call(this, name, fn, priority, scope);
- },
-
- /**
- Removes the specified event listener.
-
- @method unbind
- @param {String} name Name of event to remove.
- @param {function} fn Function to remove from listener.
- */
-
- /**
- Removes all event listeners.
-
- @method unbindAll
- */
-
-
- /**
- * Destroys Plupload instance and cleans after itself.
- *
- * @method destroy
- */
- destroy : function() {
- this.trigger('Destroy');
- settings = total = null; // purge these exclusively
- this.unbindAll();
- }
- });
-};
-
-plupload.Uploader.prototype = o.EventTarget.instance;
-
-/**
- * Constructs a new file instance.
- *
- * @class File
- * @constructor
- *
- * @param {Object} file Object containing file properties
- * @param {String} file.name Name of the file.
- * @param {Number} file.size File size.
- */
-plupload.File = (function() {
- var filepool = {};
-
- function PluploadFile(file) {
-
- plupload.extend(this, {
-
- /**
- * File id this is a globally unique id for the specific file.
- *
- * @property id
- * @type String
- */
- id: plupload.guid(),
-
- /**
- * File name for example "myfile.gif".
- *
- * @property name
- * @type String
- */
- name: file.name || file.fileName,
-
- /**
- * File type, `e.g image/jpeg`
- *
- * @property type
- * @type String
- */
- type: file.type || '',
-
- /**
- * File size in bytes (may change after client-side manupilation).
- *
- * @property size
- * @type Number
- */
- size: file.size || file.fileSize,
-
- /**
- * Original file size in bytes.
- *
- * @property origSize
- * @type Number
- */
- origSize: file.size || file.fileSize,
-
- /**
- * Number of bytes uploaded of the files total size.
- *
- * @property loaded
- * @type Number
- */
- loaded: 0,
-
- /**
- * Number of percentage uploaded of the file.
- *
- * @property percent
- * @type Number
- */
- percent: 0,
-
- /**
- * Status constant matching the plupload states QUEUED, UPLOADING, FAILED, DONE.
- *
- * @property status
- * @type Number
- * @see plupload
- */
- status: plupload.QUEUED,
-
- /**
- * Date of last modification.
- *
- * @property lastModifiedDate
- * @type {String}
- */
- lastModifiedDate: file.lastModifiedDate || (new Date()).toLocaleString(), // Thu Aug 23 2012 19:40:00 GMT+0400 (GET)
-
- /**
- * Returns native window.File object, when it's available.
- *
- * @method getNative
- * @return {window.File} or null, if plupload.File is of different origin
- */
- getNative: function() {
- var file = this.getSource().getSource();
- return o.inArray(o.typeOf(file), ['blob', 'file']) !== -1 ? file : null;
- },
-
- /**
- * Returns mOxie.File - unified wrapper object that can be used across runtimes.
- *
- * @method getSource
- * @return {mOxie.File} or null
- */
- getSource: function() {
- if (!filepool[this.id]) {
- return null;
- }
- return filepool[this.id];
- },
-
- /**
- * Destroys plupload.File object.
- *
- * @method destroy
- */
- destroy: function() {
- var src = this.getSource();
- if (src) {
- src.destroy();
- delete filepool[this.id];
- }
- }
- });
-
- filepool[this.id] = file;
- }
-
- return PluploadFile;
-}());
-
-
-/**
- * Constructs a queue progress.
- *
- * @class QueueProgress
- * @constructor
- */
- plupload.QueueProgress = function() {
- var self = this; // Setup alias for self to reduce code size when it's compressed
-
- /**
- * Total queue file size.
- *
- * @property size
- * @type Number
- */
- self.size = 0;
-
- /**
- * Total bytes uploaded.
- *
- * @property loaded
- * @type Number
- */
- self.loaded = 0;
-
- /**
- * Number of files uploaded.
- *
- * @property uploaded
- * @type Number
- */
- self.uploaded = 0;
-
- /**
- * Number of files failed to upload.
- *
- * @property failed
- * @type Number
- */
- self.failed = 0;
-
- /**
- * Number of files yet to be uploaded.
- *
- * @property queued
- * @type Number
- */
- self.queued = 0;
-
- /**
- * Total percent of the uploaded bytes.
- *
- * @property percent
- * @type Number
- */
- self.percent = 0;
-
- /**
- * Bytes uploaded per second.
- *
- * @property bytesPerSec
- * @type Number
- */
- self.bytesPerSec = 0;
-
- /**
- * Resets the progress to its initial values.
- *
- * @method reset
- */
- self.reset = function() {
- self.size = self.loaded = self.uploaded = self.failed = self.queued = self.percent = self.bytesPerSec = 0;
- };
-};
-
-window.plupload = plupload;
-
-}(window, mOxie));
diff --git a/src/js/_enqueues/vendor/plupload/wp-plupload.js b/src/js/_enqueues/vendor/plupload/wp-plupload.js
index c0eb570657bf4..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/plupload/wp-plupload.js
+++ b/src/js/_enqueues/vendor/plupload/wp-plupload.js
@@ -1,581 +0,0 @@
-/* global pluploadL10n, plupload, _wpPluploadSettings */
-
-/**
- * @namespace wp
- */
-window.wp = window.wp || {};
-
-( function( exports, $ ) {
- var Uploader;
-
- if ( typeof _wpPluploadSettings === 'undefined' ) {
- return;
- }
-
- /**
- * A WordPress uploader.
- *
- * The Plupload library provides cross-browser uploader UI integration.
- * This object bridges the Plupload API to integrate uploads into the
- * WordPress back end and the WordPress media experience.
- *
- * @class
- * @memberOf wp
- * @alias wp.Uploader
- *
- * @param {object} options The options passed to the new plupload instance.
- * @param {object} options.container The id of uploader container.
- * @param {object} options.browser The id of button to trigger the file select.
- * @param {object} options.dropzone The id of file drop target.
- * @param {object} options.plupload An object of parameters to pass to the plupload instance.
- * @param {object} options.params An object of parameters to pass to $_POST when uploading the file.
- * Extends this.plupload.multipart_params under the hood.
- */
- Uploader = function( options ) {
- var self = this,
- isIE, // Not used, back-compat.
- elements = {
- container: 'container',
- browser: 'browse_button',
- dropzone: 'drop_element'
- },
- tryAgainCount = {},
- tryAgain,
- key,
- error,
- fileUploaded;
-
- this.supports = {
- upload: Uploader.browser.supported
- };
-
- this.supported = this.supports.upload;
-
- if ( ! this.supported ) {
- return;
- }
-
- // Arguments to send to pluplad.Uploader().
- // Use deep extend to ensure that multipart_params and other objects are cloned.
- this.plupload = $.extend( true, { multipart_params: {} }, Uploader.defaults );
- this.container = document.body; // Set default container.
-
- /*
- * Extend the instance with options.
- *
- * Use deep extend to allow options.plupload to override individual
- * default plupload keys.
- */
- $.extend( true, this, options );
-
- // Proxy all methods so this always refers to the current instance.
- for ( key in this ) {
- if ( typeof this[ key ] === 'function' ) {
- this[ key ] = $.proxy( this[ key ], this );
- }
- }
-
- // Ensure all elements are jQuery elements and have id attributes,
- // then set the proper plupload arguments to the ids.
- for ( key in elements ) {
- if ( ! this[ key ] ) {
- continue;
- }
-
- this[ key ] = $( this[ key ] ).first();
-
- if ( ! this[ key ].length ) {
- delete this[ key ];
- continue;
- }
-
- if ( ! this[ key ].prop('id') ) {
- this[ key ].prop( 'id', '__wp-uploader-id-' + Uploader.uuid++ );
- }
-
- this.plupload[ elements[ key ] ] = this[ key ].prop('id');
- }
-
- // If the uploader has neither a browse button nor a dropzone, bail.
- if ( ! ( this.browser && this.browser.length ) && ! ( this.dropzone && this.dropzone.length ) ) {
- return;
- }
-
- // Initialize the plupload instance.
- this.uploader = new plupload.Uploader( this.plupload );
- delete this.plupload;
-
- // Set default params and remove this.params alias.
- this.param( this.params || {} );
- delete this.params;
-
- /**
- * Attempt to create image sub-sizes when an image was uploaded successfully
- * but the server responded with HTTP 5xx error.
- *
- * @since 5.3.0
- *
- * @param {string} message Error message.
- * @param {object} data Error data from Plupload.
- * @param {plupload.File} file File that was uploaded.
- */
- tryAgain = function( message, data, file ) {
- var times, id;
-
- if ( ! data || ! data.responseHeaders ) {
- error( pluploadL10n.http_error_image, data, file, 'no-retry' );
- return;
- }
-
- id = data.responseHeaders.match( /x-wp-upload-attachment-id:\s*(\d+)/i );
-
- if ( id && id[1] ) {
- id = id[1];
- } else {
- error( pluploadL10n.http_error_image, data, file, 'no-retry' );
- return;
- }
-
- times = tryAgainCount[ file.id ];
-
- if ( times && times > 4 ) {
- /*
- * The file may have been uploaded and attachment post created,
- * but post-processing and resizing failed...
- * Do a cleanup then tell the user to scale down the image and upload it again.
- */
- $.ajax({
- type: 'post',
- url: ajaxurl,
- dataType: 'json',
- data: {
- action: 'media-create-image-subsizes',
- _wpnonce: _wpPluploadSettings.defaults.multipart_params._wpnonce,
- attachment_id: id,
- _wp_upload_failed_cleanup: true,
- }
- });
-
- error( message, data, file, 'no-retry' );
- return;
- }
-
- if ( ! times ) {
- tryAgainCount[ file.id ] = 1;
- } else {
- tryAgainCount[ file.id ] = ++times;
- }
-
- // Another request to try to create the missing image sub-sizes.
- $.ajax({
- type: 'post',
- url: ajaxurl,
- dataType: 'json',
- data: {
- action: 'media-create-image-subsizes',
- _wpnonce: _wpPluploadSettings.defaults.multipart_params._wpnonce,
- attachment_id: id,
- }
- }).done( function( response ) {
- if ( response.success ) {
- fileUploaded( self.uploader, file, response );
- } else {
- if ( response.data && response.data.message ) {
- message = response.data.message;
- }
-
- error( message, data, file, 'no-retry' );
- }
- }).fail( function( jqXHR ) {
- // If another HTTP 5xx error, try try again...
- if ( jqXHR.status >= 500 && jqXHR.status < 600 ) {
- tryAgain( message, data, file );
- return;
- }
-
- error( message, data, file, 'no-retry' );
- });
- }
-
- /**
- * Custom error callback.
- *
- * Add a new error to the errors collection, so other modules can track
- * and display errors. @see wp.Uploader.errors.
- *
- * @param {string} message Error message.
- * @param {object} data Error data from Plupload.
- * @param {plupload.File} file File that was uploaded.
- * @param {string} retry Whether to try again to create image sub-sizes. Passing 'no-retry' will prevent it.
- */
- error = function( message, data, file, retry ) {
- var isImage = file.type && file.type.indexOf( 'image/' ) === 0,
- status = data && data.status;
-
- // If the file is an image and the error is HTTP 5xx try to create sub-sizes again.
- if ( retry !== 'no-retry' && isImage && status >= 500 && status < 600 ) {
- tryAgain( message, data, file );
- return;
- }
-
- if ( file.attachment ) {
- file.attachment.destroy();
- }
-
- Uploader.errors.unshift({
- message: message || pluploadL10n.default_error,
- data: data,
- file: file
- });
-
- self.error( message, data, file );
- };
-
- /**
- * After a file is successfully uploaded, update its model.
- *
- * @param {plupload.Uploader} up Uploader instance.
- * @param {plupload.File} file File that was uploaded.
- * @param {Object} response Object with response properties.
- */
- fileUploaded = function( up, file, response ) {
- var complete;
-
- // Remove the "uploading" UI elements.
- _.each( ['file','loaded','size','percent'], function( key ) {
- file.attachment.unset( key );
- } );
-
- file.attachment.set( _.extend( response.data, { uploading: false } ) );
-
- wp.media.model.Attachment.get( response.data.id, file.attachment );
-
- complete = Uploader.queue.all( function( attachment ) {
- return ! attachment.get( 'uploading' );
- });
-
- if ( complete ) {
- Uploader.queue.reset();
- }
-
- self.success( file.attachment );
- }
-
- /**
- * After the Uploader has been initialized, initialize some behaviors for the dropzone.
- *
- * @param {plupload.Uploader} uploader Uploader instance.
- */
- this.uploader.bind( 'init', function( uploader ) {
- var timer, active, dragdrop,
- dropzone = self.dropzone;
-
- dragdrop = self.supports.dragdrop = uploader.features.dragdrop && ! Uploader.browser.mobile;
-
- // Generate drag/drop helper classes.
- if ( ! dropzone ) {
- return;
- }
-
- dropzone.toggleClass( 'supports-drag-drop', !! dragdrop );
-
- if ( ! dragdrop ) {
- return dropzone.unbind('.wp-uploader');
- }
-
- // 'dragenter' doesn't fire correctly, simulate it with a limited 'dragover'.
- dropzone.on( 'dragover.wp-uploader', function() {
- if ( timer ) {
- clearTimeout( timer );
- }
-
- if ( active ) {
- return;
- }
-
- dropzone.trigger('dropzone:enter').addClass('drag-over');
- active = true;
- });
-
- dropzone.on('dragleave.wp-uploader, drop.wp-uploader', function() {
- /*
- * Using an instant timer prevents the drag-over class
- * from being quickly removed and re-added when elements
- * inside the dropzone are repositioned.
- *
- * @see https://core.trac.wordpress.org/ticket/21705
- */
- timer = setTimeout( function() {
- active = false;
- dropzone.trigger('dropzone:leave').removeClass('drag-over');
- }, 0 );
- });
-
- self.ready = true;
- $(self).trigger( 'uploader:ready' );
- });
-
- this.uploader.bind( 'postinit', function( up ) {
- up.refresh();
- self.init();
- });
-
- this.uploader.init();
-
- if ( this.browser ) {
- this.browser.on( 'mouseenter', this.refresh );
- } else {
- this.uploader.disableBrowse( true );
- }
-
- $( self ).on( 'uploader:ready', function() {
- $( '.moxie-shim-html5 input[type="file"]' )
- .attr( {
- tabIndex: '-1',
- 'aria-hidden': 'true'
- } );
- } );
-
- /**
- * After files were filtered and added to the queue, create a model for each.
- *
- * @param {plupload.Uploader} up Uploader instance.
- * @param {Array} files Array of file objects that were added to queue by the user.
- */
- this.uploader.bind( 'FilesAdded', function( up, files ) {
- _.each( files, function( file ) {
- var attributes, image;
-
- // Ignore failed uploads.
- if ( plupload.FAILED === file.status ) {
- return;
- }
-
- if ( file.type === 'image/heic' && up.settings.heic_upload_error ) {
- // Show error but do not block uploading.
- Uploader.errors.unshift({
- message: pluploadL10n.unsupported_image,
- data: {},
- file: file
- });
- } else if ( file.type === 'image/webp' && up.settings.webp_upload_error ) {
- // Disallow uploading of WebP images if the server cannot edit them.
- error( pluploadL10n.noneditable_image, {}, file, 'no-retry' );
- up.removeFile( file );
- return;
- } else if ( file.type === 'image/avif' && up.settings.avif_upload_error ) {
- // Disallow uploading of AVIF images if the server cannot edit them.
- error( pluploadL10n.noneditable_image, {}, file, 'no-retry' );
- up.removeFile( file );
- return;
- }
-
- // Generate attributes for a new `Attachment` model.
- attributes = _.extend({
- file: file,
- uploading: true,
- date: new Date(),
- filename: file.name,
- menuOrder: 0,
- uploadedTo: wp.media.model.settings.post.id
- }, _.pick( file, 'loaded', 'size', 'percent' ) );
-
- // Handle early mime type scanning for images.
- image = /(?:jpe?g|png|gif)$/i.exec( file.name );
-
- // For images set the model's type and subtype attributes.
- if ( image ) {
- attributes.type = 'image';
-
- // `jpeg`, `png` and `gif` are valid subtypes.
- // `jpg` is not, so map it to `jpeg`.
- attributes.subtype = ( 'jpg' === image[0] ) ? 'jpeg' : image[0];
- }
-
- // Create a model for the attachment, and add it to the Upload queue collection
- // so listeners to the upload queue can track and display upload progress.
- file.attachment = wp.media.model.Attachment.create( attributes );
- Uploader.queue.add( file.attachment );
-
- self.added( file.attachment );
- });
-
- up.refresh();
- up.start();
- });
-
- this.uploader.bind( 'UploadProgress', function( up, file ) {
- file.attachment.set( _.pick( file, 'loaded', 'percent' ) );
- self.progress( file.attachment );
- });
-
- /**
- * After a file is successfully uploaded, update its model.
- *
- * @param {plupload.Uploader} up Uploader instance.
- * @param {plupload.File} file File that was uploaded.
- * @param {Object} response Object with response properties.
- * @return {mixed}
- */
- this.uploader.bind( 'FileUploaded', function( up, file, response ) {
-
- try {
- response = JSON.parse( response.response );
- } catch ( e ) {
- return error( pluploadL10n.default_error, e, file );
- }
-
- if ( ! _.isObject( response ) || _.isUndefined( response.success ) ) {
- return error( pluploadL10n.default_error, null, file );
- } else if ( ! response.success ) {
- return error( response.data && response.data.message, response.data, file );
- }
-
- // Success. Update the UI with the new attachment.
- fileUploaded( up, file, response );
- });
-
- /**
- * When plupload surfaces an error, send it to the error handler.
- *
- * @param {plupload.Uploader} up Uploader instance.
- * @param {Object} pluploadError Contains code, message and sometimes file and other details.
- */
- this.uploader.bind( 'Error', function( up, pluploadError ) {
- var message = pluploadL10n.default_error,
- key;
-
- // Check for plupload errors.
- for ( key in Uploader.errorMap ) {
- if ( pluploadError.code === plupload[ key ] ) {
- message = Uploader.errorMap[ key ];
-
- if ( typeof message === 'function' ) {
- message = message( pluploadError.file, pluploadError );
- }
-
- break;
- }
- }
-
- error( message, pluploadError, pluploadError.file );
- up.refresh();
- });
-
- };
-
- // Adds the 'defaults' and 'browser' properties.
- $.extend( Uploader, _wpPluploadSettings );
-
- Uploader.uuid = 0;
-
- // Map Plupload error codes to user friendly error messages.
- Uploader.errorMap = {
- 'FAILED': pluploadL10n.upload_failed,
- 'FILE_EXTENSION_ERROR': pluploadL10n.invalid_filetype,
- 'IMAGE_FORMAT_ERROR': pluploadL10n.not_an_image,
- 'IMAGE_MEMORY_ERROR': pluploadL10n.image_memory_exceeded,
- 'IMAGE_DIMENSIONS_ERROR': pluploadL10n.image_dimensions_exceeded,
- 'GENERIC_ERROR': pluploadL10n.upload_failed,
- 'IO_ERROR': pluploadL10n.io_error,
- 'SECURITY_ERROR': pluploadL10n.security_error,
-
- 'FILE_SIZE_ERROR': function( file ) {
- return pluploadL10n.file_exceeds_size_limit.replace( '%s', file.name );
- },
-
- 'HTTP_ERROR': function( file ) {
- if ( file.type && file.type.indexOf( 'image/' ) === 0 ) {
- return pluploadL10n.http_error_image;
- }
-
- return pluploadL10n.http_error;
- },
- };
-
- $.extend( Uploader.prototype, /** @lends wp.Uploader.prototype */{
- /**
- * Acts as a shortcut to extending the uploader's multipart_params object.
- *
- * param( key )
- * Returns the value of the key.
- *
- * param( key, value )
- * Sets the value of a key.
- *
- * param( map )
- * Sets values for a map of data.
- */
- param: function( key, value ) {
- if ( arguments.length === 1 && typeof key === 'string' ) {
- return this.uploader.settings.multipart_params[ key ];
- }
-
- if ( arguments.length > 1 ) {
- this.uploader.settings.multipart_params[ key ] = value;
- } else {
- $.extend( this.uploader.settings.multipart_params, key );
- }
- },
-
- /**
- * Make a few internal event callbacks available on the wp.Uploader object
- * to change the Uploader internals if absolutely necessary.
- */
- init: function() {},
- error: function() {},
- success: function() {},
- added: function() {},
- progress: function() {},
- complete: function() {},
- refresh: function() {
- var node, attached, container, id;
-
- if ( this.browser ) {
- node = this.browser[0];
-
- // Check if the browser node is in the DOM.
- while ( node ) {
- if ( node === document.body ) {
- attached = true;
- break;
- }
- node = node.parentNode;
- }
-
- /*
- * If the browser node is not attached to the DOM,
- * use a temporary container to house it, as the browser button shims
- * require the button to exist in the DOM at all times.
- */
- if ( ! attached ) {
- id = 'wp-uploader-browser-' + this.uploader.id;
-
- container = $( '#' + id );
- if ( ! container.length ) {
- container = $('
').css({
- position: 'fixed',
- top: '-1000px',
- left: '-1000px',
- height: 0,
- width: 0
- }).attr( 'id', 'wp-uploader-browser-' + this.uploader.id ).appendTo('body');
- }
-
- container.append( this.browser );
- }
- }
-
- this.uploader.refresh();
- }
- });
-
- // Create a collection of attachments in the upload queue,
- // so that other modules can track and display upload progress.
- Uploader.queue = new wp.media.model.Attachments( [], { query: false });
-
- // Create a collection to collect errors incurred while attempting upload.
- Uploader.errors = new Backbone.Collection();
-
- exports.Uploader = Uploader;
-})( wp, jQuery );
diff --git a/src/js/_enqueues/vendor/thickbox/thickbox.css b/src/js/_enqueues/vendor/thickbox/thickbox.css
index 343b231cc1d66..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/thickbox/thickbox.css
+++ b/src/js/_enqueues/vendor/thickbox/thickbox.css
@@ -1,156 +0,0 @@
-#TB_overlay {
- background: #000;
- opacity: 0.7;
- filter: alpha(opacity=70);
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 100050; /* Above DFW. */
-}
-
-#TB_window {
- position: fixed;
- background-color: #fff;
- z-index: 100050; /* Above DFW. */
- visibility: hidden;
- text-align: left;
- top: 50%;
- left: 50%;
- -webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );
- box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );
-}
-
-#TB_window img#TB_Image {
- display: block;
- margin: 15px 0 0 15px;
- border-right: 1px solid #ccc;
- border-bottom: 1px solid #ccc;
- border-top: 1px solid #666;
- border-left: 1px solid #666;
-}
-
-#TB_caption{
- height: 25px;
- padding: 7px 30px 10px 25px;
- float: left;
-}
-
-#TB_closeWindow {
- height: 25px;
- padding: 11px 25px 10px 0;
- float: right;
-}
-
-#TB_closeWindowButton {
- position: absolute;
- left: auto;
- right: 0;
- width: 29px;
- height: 29px;
- border: 0;
- padding: 0;
- background: none;
- cursor: pointer;
- outline: none;
- -webkit-transition: color .1s ease-in-out, background .1s ease-in-out;
- transition: color .1s ease-in-out, background .1s ease-in-out;
-}
-
-#TB_ajaxWindowTitle {
- float: left;
- font-weight: 600;
- line-height: 29px;
- overflow: hidden;
- padding: 0 29px 0 10px;
- text-overflow: ellipsis;
- white-space: nowrap;
- width: calc( 100% - 39px );
-}
-
-#TB_title {
- background: #fcfcfc;
- border-bottom: 1px solid #ddd;
- height: 29px;
-}
-
-#TB_ajaxContent {
- clear: both;
- padding: 2px 15px 15px 15px;
- overflow: auto;
- text-align: left;
- line-height: 1.4em;
-}
-
-#TB_ajaxContent.TB_modal {
- padding: 15px;
-}
-
-#TB_ajaxContent p {
- padding: 5px 0px 5px 0px;
-}
-
-#TB_load {
- position: fixed;
- display: none;
- z-index: 100050;
- top: 50%;
- left: 50%;
- background-color: #E8E8E8;
- border: 1px solid #555;
- margin: -45px 0 0 -125px;
- padding: 40px 15px 15px;
-}
-
-#TB_HideSelect {
- z-index: 99;
- position: fixed;
- top: 0;
- left: 0;
- background-color: #fff;
- border: none;
- filter: alpha(opacity=0);
- opacity: 0;
- height: 100%;
- width: 100%;
-}
-
-#TB_iframeContent {
- clear: both;
- border: none;
-}
-
-.tb-close-icon {
- display: block;
- color: #666;
- text-align: center;
- line-height: 29px;
- width: 29px;
- height: 29px;
- position: absolute;
- top: 0;
- right: 0;
-}
-
-.tb-close-icon:before {
- content: "\f158";
- content: "\f158" / '';
- font: normal 20px/29px dashicons;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-#TB_closeWindowButton:hover .tb-close-icon,
-#TB_closeWindowButton:focus .tb-close-icon {
- color: #006799;
-}
-
-#TB_closeWindowButton:focus .tb-close-icon {
- -webkit-box-shadow:
- 0 0 0 1px #5b9dd9,
- 0 0 2px 1px rgba(30, 140, 190, .8);
- box-shadow:
- 0 0 0 1px #5b9dd9,
- 0 0 2px 1px rgba(30, 140, 190, .8);
-}
diff --git a/src/js/_enqueues/vendor/thickbox/thickbox.js b/src/js/_enqueues/vendor/thickbox/thickbox.js
index 2c7b7f95260fa..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/thickbox/thickbox.js
+++ b/src/js/_enqueues/vendor/thickbox/thickbox.js
@@ -1,345 +0,0 @@
-/*
- * Thickbox 3.1 - One Box To Rule Them All.
- * By Cody Lindley (http://www.codylindley.com)
- * Copyright (c) 2007 cody lindley
- * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php
-*/
-
-if ( typeof tb_pathToImage != 'string' ) {
- var tb_pathToImage = thickboxL10n.loadingAnimation;
-}
-
-/*!!!!!!!!!!!!!!!!! edit below this line at your own risk !!!!!!!!!!!!!!!!!!!!!!!*/
-
-//on page load call tb_init
-jQuery(document).ready(function(){
- tb_init('a.thickbox, area.thickbox, input.thickbox');//pass where to apply thickbox
- imgLoader = new Image();// preload image
- imgLoader.src = tb_pathToImage;
-});
-
-/*
- * Add thickbox to href & area elements that have a class of .thickbox.
- * Remove the loading indicator when content in an iframe has loaded.
- */
-function tb_init(domChunk){
- jQuery( 'body' )
- .on( 'click', domChunk, tb_click )
- .on( 'thickbox:iframe:loaded', function() {
- jQuery( '#TB_window' ).removeClass( 'thickbox-loading' );
- });
-}
-
-function tb_click(){
- var t = this.title || this.name || null;
- var a = this.href || this.alt;
- var g = this.rel || false;
- tb_show(t,a,g);
- this.blur();
- return false;
-}
-
-function tb_show(caption, url, imageGroup) {//function called when the user clicks on a thickbox link
-
- var $closeBtn;
-
- try {
- if (typeof document.body.style.maxHeight === "undefined") {//if IE 6
- jQuery("body","html").css({height: "100%", width: "100%"});
- jQuery("html").css("overflow","hidden");
- if (document.getElementById("TB_HideSelect") === null) {//iframe to hide select elements in ie6
- jQuery("body").append("
");
- jQuery("#TB_overlay").on( 'click', tb_remove );
- }
- }else{//all others
- if(document.getElementById("TB_overlay") === null){
- jQuery("body").append("
");
- jQuery("#TB_overlay").on( 'click', tb_remove );
- jQuery( 'body' ).addClass( 'modal-open' );
- }
- }
-
- if(tb_detectMacXFF()){
- jQuery("#TB_overlay").addClass("TB_overlayMacFFBGHack");//use png overlay so hide flash
- }else{
- jQuery("#TB_overlay").addClass("TB_overlayBG");//use background and opacity
- }
-
- if(caption===null){caption="";}
- jQuery("body").append("");//add loader to the page
- jQuery('#TB_load').show();//show loader
-
- var baseURL;
- if(url.indexOf("?")!==-1){ //ff there is a query string involved
- baseURL = url.substr(0, url.indexOf("?"));
- }else{
- baseURL = url;
- }
-
- var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$|\.webp$|\.avif$/;
- var urlType = baseURL.toLowerCase().match(urlString);
-
- if(urlType == '.jpg' ||
- urlType == '.jpeg' ||
- urlType == '.png' ||
- urlType == '.gif' ||
- urlType == '.bmp' ||
- urlType == '.webp' ||
- urlType == '.avif'
- ){//code to show images
-
- TB_PrevCaption = "";
- TB_PrevURL = "";
- TB_PrevHTML = "";
- TB_NextCaption = "";
- TB_NextURL = "";
- TB_NextHTML = "";
- TB_imageCount = "";
- TB_FoundURL = false;
- if(imageGroup){
- TB_TempArray = jQuery("a[rel="+imageGroup+"]").get();
- for (TB_Counter = 0; ((TB_Counter < TB_TempArray.length) && (TB_NextHTML === "")); TB_Counter++) {
- var urlTypeTemp = TB_TempArray[TB_Counter].href.toLowerCase().match(urlString);
- if (!(TB_TempArray[TB_Counter].href == url)) {
- if (TB_FoundURL) {
- TB_NextCaption = TB_TempArray[TB_Counter].title;
- TB_NextURL = TB_TempArray[TB_Counter].href;
- TB_NextHTML = " "+thickboxL10n.next+" ";
- } else {
- TB_PrevCaption = TB_TempArray[TB_Counter].title;
- TB_PrevURL = TB_TempArray[TB_Counter].href;
- TB_PrevHTML = " "+thickboxL10n.prev+" ";
- }
- } else {
- TB_FoundURL = true;
- TB_imageCount = thickboxL10n.image + ' ' + (TB_Counter + 1) + ' ' + thickboxL10n.of + ' ' + (TB_TempArray.length);
- }
- }
- }
-
- imgPreloader = new Image();
- imgPreloader.onload = function(){
- imgPreloader.onload = null;
-
- // Resizing large images - original by Christian Montoya edited by me.
- var pagesize = tb_getPageSize();
- var x = pagesize[0] - 150;
- var y = pagesize[1] - 150;
- var imageWidth = imgPreloader.width;
- var imageHeight = imgPreloader.height;
- if (imageWidth > x) {
- imageHeight = imageHeight * (x / imageWidth);
- imageWidth = x;
- if (imageHeight > y) {
- imageWidth = imageWidth * (y / imageHeight);
- imageHeight = y;
- }
- } else if (imageHeight > y) {
- imageWidth = imageWidth * (y / imageHeight);
- imageHeight = y;
- if (imageWidth > x) {
- imageHeight = imageHeight * (x / imageWidth);
- imageWidth = x;
- }
- }
- // End Resizing
-
- TB_WIDTH = imageWidth + 30;
- TB_HEIGHT = imageHeight + 60;
- jQuery("#TB_window").append(""+thickboxL10n.close+" " + ""+caption+"
" + TB_imageCount + TB_PrevHTML + TB_NextHTML + "
"+thickboxL10n.close+"
");
-
- jQuery("#TB_closeWindowButton").on( 'click', tb_remove );
-
- if (!(TB_PrevHTML === "")) {
- function goPrev(){
- if(jQuery(document).off("click",goPrev)){jQuery(document).off("click",goPrev);}
- jQuery("#TB_window").remove();
- jQuery("body").append("
");
- tb_show(TB_PrevCaption, TB_PrevURL, imageGroup);
- return false;
- }
- jQuery("#TB_prev").on( 'click', goPrev );
- }
-
- if (!(TB_NextHTML === "")) {
- function goNext(){
- jQuery("#TB_window").remove();
- jQuery("body").append("
");
- tb_show(TB_NextCaption, TB_NextURL, imageGroup);
- return false;
- }
- jQuery("#TB_next").on( 'click', goNext );
-
- }
-
- jQuery(document).on('keydown.thickbox', function(e){
- if ( e.which == 27 ){ // close
- tb_remove();
-
- } else if ( e.which == 190 ){ // display previous image
- if(!(TB_NextHTML == "")){
- jQuery(document).off('thickbox');
- goNext();
- }
- } else if ( e.which == 188 ){ // display next image
- if(!(TB_PrevHTML == "")){
- jQuery(document).off('thickbox');
- goPrev();
- }
- }
- return false;
- });
-
- tb_position();
- jQuery("#TB_load").remove();
- jQuery("#TB_ImageOff").on( 'click', tb_remove );
- jQuery("#TB_window").css({'visibility':'visible'}); //for safari using css instead of show
- };
-
- imgPreloader.src = url;
- }else{//code to show html
-
- var queryString = url.replace(/^[^\?]+\??/,'');
- var params = tb_parseQuery( queryString );
-
- TB_WIDTH = (params['width']*1) + 30 || 630; //defaults to 630 if no parameters were added to URL
- TB_HEIGHT = (params['height']*1) + 40 || 440; //defaults to 440 if no parameters were added to URL
- ajaxContentW = TB_WIDTH - 30;
- ajaxContentH = TB_HEIGHT - 45;
-
- if(url.indexOf('TB_iframe') != -1){// either iframe or ajax window
- urlNoQuery = url.split('TB_');
- jQuery("#TB_iframeContent").remove();
- if(params['modal'] != "true"){//iframe no modal
- jQuery("#TB_window").append(""+caption+"
"+thickboxL10n.close+"
");
- }else{//iframe modal
- jQuery("#TB_overlay").off();
- jQuery("#TB_window").append("");
- }
- }else{// not an iframe, ajax
- if(jQuery("#TB_window").css("visibility") != "visible"){
- if(params['modal'] != "true"){//ajax no modal
- jQuery("#TB_window").append(""+caption+"
"+thickboxL10n.close+"
");
- }else{//ajax modal
- jQuery("#TB_overlay").off();
- jQuery("#TB_window").append("
");
- }
- }else{//this means the window is already up, we are just loading new content via ajax
- jQuery("#TB_ajaxContent")[0].style.width = ajaxContentW +"px";
- jQuery("#TB_ajaxContent")[0].style.height = ajaxContentH +"px";
- jQuery("#TB_ajaxContent")[0].scrollTop = 0;
- jQuery("#TB_ajaxWindowTitle").html(caption);
- }
- }
-
- jQuery("#TB_closeWindowButton").on( 'click', tb_remove );
-
- if(url.indexOf('TB_inline') != -1){
- jQuery("#TB_ajaxContent").append(jQuery('#' + params['inlineId']).children());
- jQuery("#TB_window").on('tb_unload', function () {
- jQuery('#' + params['inlineId']).append( jQuery("#TB_ajaxContent").children() ); // move elements back when you're finished
- });
- tb_position();
- jQuery("#TB_load").remove();
- jQuery("#TB_window").css({'visibility':'visible'});
- }else if(url.indexOf('TB_iframe') != -1){
- tb_position();
- jQuery("#TB_load").remove();
- jQuery("#TB_window").css({'visibility':'visible'});
- }else{
- var load_url = url;
- load_url += -1 === url.indexOf('?') ? '?' : '&';
- jQuery("#TB_ajaxContent").load(load_url += "random=" + (new Date().getTime()),function(){//to do a post change this load method
- tb_position();
- jQuery("#TB_load").remove();
- tb_init("#TB_ajaxContent a.thickbox");
- jQuery("#TB_window").css({'visibility':'visible'});
- });
- }
-
- }
-
- if(!params['modal']){
- jQuery(document).on('keydown.thickbox', function(e){
- if ( e.which == 27 ){ // close
- tb_remove();
- return false;
- }
- });
- }
-
- $closeBtn = jQuery( '#TB_closeWindowButton' );
- /*
- * If the native Close button icon is visible, move focus on the button
- * (e.g. in the Network Admin Themes screen).
- * In other admin screens is hidden and replaced by a different icon.
- */
- if ( $closeBtn.find( '.tb-close-icon' ).is( ':visible' ) ) {
- $closeBtn.trigger( 'focus' );
- }
-
- } catch(e) {
- //nothing here
- }
-}
-
-//helper functions below
-function tb_showIframe(){
- jQuery("#TB_load").remove();
- jQuery("#TB_window").css({'visibility':'visible'}).trigger( 'thickbox:iframe:loaded' );
-}
-
-function tb_remove() {
- jQuery("#TB_imageOff").off("click");
- jQuery("#TB_closeWindowButton").off("click");
- jQuery( '#TB_window' ).fadeOut( 'fast', function() {
- jQuery( '#TB_window, #TB_overlay, #TB_HideSelect' ).trigger( 'tb_unload' ).off().remove();
- jQuery( 'body' ).trigger( 'thickbox:removed' );
- });
- jQuery( 'body' ).removeClass( 'modal-open' );
- jQuery("#TB_load").remove();
- if (typeof document.body.style.maxHeight == "undefined") {//if IE 6
- jQuery("body","html").css({height: "auto", width: "auto"});
- jQuery("html").css("overflow","");
- }
- jQuery(document).off('.thickbox');
- return false;
-}
-
-function tb_position() {
-var isIE6 = typeof document.body.style.maxHeight === "undefined";
-jQuery("#TB_window").css({marginLeft: '-' + parseInt((TB_WIDTH / 2),10) + 'px', width: TB_WIDTH + 'px'});
- if ( ! isIE6 ) { // take away IE6
- jQuery("#TB_window").css({marginTop: '-' + parseInt((TB_HEIGHT / 2),10) + 'px'});
- }
-}
-
-function tb_parseQuery ( query ) {
- var Params = {};
- if ( ! query ) {return Params;}// return empty object
- var Pairs = query.split(/[;&]/);
- for ( var i = 0; i < Pairs.length; i++ ) {
- var KeyVal = Pairs[i].split('=');
- if ( ! KeyVal || KeyVal.length != 2 ) {continue;}
- var key = unescape( KeyVal[0] );
- var val = unescape( KeyVal[1] );
- val = val.replace(/\+/g, ' ');
- Params[key] = val;
- }
- return Params;
-}
-
-function tb_getPageSize(){
- var de = document.documentElement;
- var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
- var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
- arrayPageSize = [w,h];
- return arrayPageSize;
-}
-
-function tb_detectMacXFF() {
- var userAgent = navigator.userAgent.toLowerCase();
- if (userAgent.indexOf('mac') != -1 && userAgent.indexOf('firefox')!=-1) {
- return true;
- }
-}
diff --git a/src/js/_enqueues/vendor/tinymce/langs/wp-langs-en.js b/src/js/_enqueues/vendor/tinymce/langs/wp-langs-en.js
index c3ddbb3332344..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/langs/wp-langs-en.js
+++ b/src/js/_enqueues/vendor/tinymce/langs/wp-langs-en.js
@@ -1,516 +0,0 @@
-/**
- * TinyMCE 3.x language strings
- *
- * Loaded only when external plugins are added to TinyMCE.
- */
-( function() {
- var main = {}, lang = 'en';
-
- if ( typeof tinyMCEPreInit !== 'undefined' && tinyMCEPreInit.ref.language !== 'en' ) {
- lang = tinyMCEPreInit.ref.language;
- }
-
- main[lang] = {
- common: {
- edit_confirm: "Do you want to use the WYSIWYG mode for this textarea?",
- apply: "Apply",
- insert: "Insert",
- update: "Update",
- cancel: "Cancel",
- close: "Close",
- browse: "Browse",
- class_name: "Class",
- not_set: "-- Not set --",
- clipboard_msg: "Copy/Cut/Paste is not available in Mozilla and Firefox.",
- clipboard_no_support: "Currently not supported by your browser, use keyboard shortcuts instead.",
- popup_blocked: "Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.",
- invalid_data: "Error: Invalid values entered, these are marked in red.",
- invalid_data_number: "{#field} must be a number",
- invalid_data_min: "{#field} must be a number greater than {#min}",
- invalid_data_size: "{#field} must be a number or percentage",
- more_colors: "More colors"
- },
- colors: {
- "000000": "Black",
- "993300": "Burnt orange",
- "333300": "Dark olive",
- "003300": "Dark green",
- "003366": "Dark azure",
- "000080": "Navy Blue",
- "333399": "Indigo",
- "333333": "Very dark gray",
- "800000": "Maroon",
- "FF6600": "Orange",
- "808000": "Olive",
- "008000": "Green",
- "008080": "Teal",
- "0000FF": "Blue",
- "666699": "Grayish blue",
- "808080": "Gray",
- "FF0000": "Red",
- "FF9900": "Amber",
- "99CC00": "Yellow green",
- "339966": "Sea green",
- "33CCCC": "Turquoise",
- "3366FF": "Royal blue",
- "800080": "Purple",
- "999999": "Medium gray",
- "FF00FF": "Magenta",
- "FFCC00": "Gold",
- "FFFF00": "Yellow",
- "00FF00": "Lime",
- "00FFFF": "Aqua",
- "00CCFF": "Sky blue",
- "993366": "Brown",
- "C0C0C0": "Silver",
- "FF99CC": "Pink",
- "FFCC99": "Peach",
- "FFFF99": "Light yellow",
- "CCFFCC": "Pale green",
- "CCFFFF": "Pale cyan",
- "99CCFF": "Light sky blue",
- "CC99FF": "Plum",
- "FFFFFF": "White"
- },
- contextmenu: {
- align: "Alignment",
- left: "Left",
- center: "Center",
- right: "Right",
- full: "Full"
- },
- insertdatetime: {
- date_fmt: "%Y-%m-%d",
- time_fmt: "%H:%M:%S",
- insertdate_desc: "Insert date",
- inserttime_desc: "Insert time",
- months_long: "January,February,March,April,May,June,July,August,September,October,November,December",
- months_short: "Jan_January_abbreviation,Feb_February_abbreviation,Mar_March_abbreviation,Apr_April_abbreviation,May_May_abbreviation,Jun_June_abbreviation,Jul_July_abbreviation,Aug_August_abbreviation,Sep_September_abbreviation,Oct_October_abbreviation,Nov_November_abbreviation,Dec_December_abbreviation",
- day_long: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",
- day_short: "Sun,Mon,Tue,Wed,Thu,Fri,Sat"
- },
- print: {
- print_desc: "Print"
- },
- preview: {
- preview_desc: "Preview"
- },
- directionality: {
- ltr_desc: "Direction left to right",
- rtl_desc: "Direction right to left"
- },
- layer: {
- insertlayer_desc: "Insert new layer",
- forward_desc: "Move forward",
- backward_desc: "Move backward",
- absolute_desc: "Toggle absolute positioning",
- content: "New layer..."
- },
- save: {
- save_desc: "Save",
- cancel_desc: "Cancel all changes"
- },
- nonbreaking: {
- nonbreaking_desc: "Insert non-breaking space character"
- },
- iespell: {
- iespell_desc: "Run spell checking",
- download: "ieSpell not detected. Do you want to install it now?"
- },
- advhr: {
- advhr_desc: "Horizontal rule"
- },
- emotions: {
- emotions_desc: "Emotions"
- },
- searchreplace: {
- search_desc: "Find",
- replace_desc: "Find/Replace"
- },
- advimage: {
- image_desc: "Insert/edit image"
- },
- advlink: {
- link_desc: "Insert/edit link"
- },
- xhtmlxtras: {
- cite_desc: "Citation",
- abbr_desc: "Abbreviation",
- acronym_desc: "Acronym",
- del_desc: "Deletion",
- ins_desc: "Insertion",
- attribs_desc: "Insert/Edit Attributes"
- },
- style: {
- desc: "Edit CSS Style"
- },
- paste: {
- paste_text_desc: "Paste as Plain Text",
- paste_word_desc: "Paste from Word",
- selectall_desc: "Select All",
- plaintext_mode_sticky: "Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",
- plaintext_mode: "Paste is now in plain text mode. Click again to toggle back to regular paste mode."
- },
- paste_dlg: {
- text_title: "Use Ctrl + V on your keyboard to paste the text into the window.",
- text_linebreaks: "Keep linebreaks",
- word_title: "Use Ctrl + V on your keyboard to paste the text into the window."
- },
- table: {
- desc: "Inserts a new table",
- row_before_desc: "Insert row before",
- row_after_desc: "Insert row after",
- delete_row_desc: "Delete row",
- col_before_desc: "Insert column before",
- col_after_desc: "Insert column after",
- delete_col_desc: "Remove column",
- split_cells_desc: "Split merged table cells",
- merge_cells_desc: "Merge table cells",
- row_desc: "Table row properties",
- cell_desc: "Table cell properties",
- props_desc: "Table properties",
- paste_row_before_desc: "Paste table row before",
- paste_row_after_desc: "Paste table row after",
- cut_row_desc: "Cut table row",
- copy_row_desc: "Copy table row",
- del: "Delete table",
- row: "Row",
- col: "Column",
- cell: "Cell"
- },
- autosave: {
- unload_msg: "The changes you made will be lost if you navigate away from this page."
- },
- fullscreen: {
- desc: "Toggle fullscreen mode (Alt + Shift + G)"
- },
- media: {
- desc: "Insert / edit embedded media",
- edit: "Edit embedded media"
- },
- fullpage: {
- desc: "Document properties"
- },
- template: {
- desc: "Insert predefined template content"
- },
- visualchars: {
- desc: "Visual control characters on/off."
- },
- spellchecker: {
- desc: "Toggle spellchecker (Alt + Shift + N)",
- menu: "Spellchecker settings",
- ignore_word: "Ignore word",
- ignore_words: "Ignore all",
- langs: "Languages",
- wait: "Please wait...",
- sug: "Suggestions",
- no_sug: "No suggestions",
- no_mpell: "No misspellings found.",
- learn_word: "Learn word"
- },
- pagebreak: {
- desc: "Insert Page Break"
- },
- advlist:{
- types: "Types",
- def: "Default",
- lower_alpha: "Lower alpha",
- lower_greek: "Lower greek",
- lower_roman: "Lower roman",
- upper_alpha: "Upper alpha",
- upper_roman: "Upper roman",
- circle: "Circle",
- disc: "Disc",
- square: "Square"
- },
- aria: {
- rich_text_area: "Rich Text Area"
- },
- wordcount:{
- words: "Words: "
- }
- };
-
- tinyMCE.addI18n( main );
-
- tinyMCE.addI18n( lang + ".advanced", {
- style_select: "Styles",
- font_size: "Font size",
- fontdefault: "Font family",
- block: "Format",
- paragraph: "Paragraph",
- div: "Div",
- address: "Address",
- pre: "Preformatted",
- h1: "Heading 1",
- h2: "Heading 2",
- h3: "Heading 3",
- h4: "Heading 4",
- h5: "Heading 5",
- h6: "Heading 6",
- blockquote: "Blockquote",
- code: "Code",
- samp: "Code sample",
- dt: "Definition term ",
- dd: "Definition description",
- bold_desc: "Bold (Ctrl + B)",
- italic_desc: "Italic (Ctrl + I)",
- underline_desc: "Underline",
- striketrough_desc: "Strikethrough (Alt + Shift + D)",
- justifyleft_desc: "Align Left (Alt + Shift + L)",
- justifycenter_desc: "Align Center (Alt + Shift + C)",
- justifyright_desc: "Align Right (Alt + Shift + R)",
- justifyfull_desc: "Align Full (Alt + Shift + J)",
- bullist_desc: "Unordered list (Alt + Shift + U)",
- numlist_desc: "Ordered list (Alt + Shift + O)",
- outdent_desc: "Outdent",
- indent_desc: "Indent",
- undo_desc: "Undo (Ctrl + Z)",
- redo_desc: "Redo (Ctrl + Y)",
- link_desc: "Insert/edit link (Alt + Shift + A)",
- unlink_desc: "Unlink (Alt + Shift + S)",
- image_desc: "Insert/edit image (Alt + Shift + M)",
- cleanup_desc: "Cleanup messy code",
- code_desc: "Edit HTML Source",
- sub_desc: "Subscript",
- sup_desc: "Superscript",
- hr_desc: "Insert horizontal ruler",
- removeformat_desc: "Remove formatting",
- forecolor_desc: "Select text color",
- backcolor_desc: "Select background color",
- charmap_desc: "Insert custom character",
- visualaid_desc: "Toggle guidelines/invisible elements",
- anchor_desc: "Insert/edit anchor",
- cut_desc: "Cut",
- copy_desc: "Copy",
- paste_desc: "Paste",
- image_props_desc: "Image properties",
- newdocument_desc: "New document",
- help_desc: "Help",
- blockquote_desc: "Blockquote (Alt + Shift + Q)",
- clipboard_msg: "Copy/Cut/Paste is not available in Mozilla and Firefox.",
- path: "Path",
- newdocument: "Are you sure you want to clear all contents?",
- toolbar_focus: "Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",
- more_colors: "More colors",
- shortcuts_desc: "Accessibility Help",
- help_shortcut: " Press ALT F10 for toolbar. Press ALT 0 for help.",
- rich_text_area: "Rich Text Area",
- toolbar: "Toolbar"
- });
-
- tinyMCE.addI18n( lang + ".advanced_dlg", {
- about_title: "About TinyMCE",
- about_general: "About",
- about_help: "Help",
- about_license: "License",
- about_plugins: "Plugins",
- about_plugin: "Plugin",
- about_author: "Author",
- about_version: "Version",
- about_loaded: "Loaded plugins",
- anchor_title: "Insert/edit anchor",
- anchor_name: "Anchor name",
- code_title: "HTML Source Editor",
- code_wordwrap: "Word wrap",
- colorpicker_title: "Select a color",
- colorpicker_picker_tab: "Picker",
- colorpicker_picker_title: "Color picker",
- colorpicker_palette_tab: "Palette",
- colorpicker_palette_title: "Palette colors",
- colorpicker_named_tab: "Named",
- colorpicker_named_title: "Named colors",
- colorpicker_color: "Color: ",
- colorpicker_name: "Name: ",
- charmap_title: "Select custom character",
- charmap_usage: "Use left and right arrows to navigate.",
- image_title: "Insert/edit image",
- image_src: "Image URL",
- image_alt: "Image description",
- image_list: "Image list",
- image_border: "Border",
- image_dimensions: "Dimensions",
- image_vspace: "Vertical space",
- image_hspace: "Horizontal space",
- image_align: "Alignment",
- image_align_baseline: "Baseline",
- image_align_top: "Top",
- image_align_middle: "Middle",
- image_align_bottom: "Bottom",
- image_align_texttop: "Text top",
- image_align_textbottom: "Text bottom",
- image_align_left: "Left",
- image_align_right: "Right",
- link_title: "Insert/edit link",
- link_url: "Link URL",
- link_target: "Target",
- link_target_same: "Open link in the same window",
- link_target_blank: "Open link in a new window",
- link_titlefield: "Title",
- link_is_email: "The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",
- link_is_external: "The URL you entered seems to be an external link, do you want to add the required http:// prefix?",
- link_list: "Link list",
- accessibility_help: "Accessibility Help",
- accessibility_usage_title: "General Usage"
- });
-
- tinyMCE.addI18n( lang + ".media_dlg", {
- title: "Insert / edit embedded media",
- general: "General",
- advanced: "Advanced",
- file: "File/URL",
- list: "List",
- size: "Dimensions",
- preview: "Preview",
- constrain_proportions: "Constrain proportions",
- type: "Type",
- id: "Id",
- name: "Name",
- class_name: "Class",
- vspace: "V-Space",
- hspace: "H-Space",
- play: "Auto play",
- loop: "Loop",
- menu: "Show menu",
- quality: "Quality",
- scale: "Scale",
- align: "Align",
- salign: "SAlign",
- wmode: "WMode",
- bgcolor: "Background",
- base: "Base",
- flashvars: "Flashvars",
- liveconnect: "SWLiveConnect",
- autohref: "AutoHREF",
- cache: "Cache",
- hidden: "Hidden",
- controller: "Controller",
- kioskmode: "Kiosk mode",
- playeveryframe: "Play every frame",
- targetcache: "Target cache",
- correction: "No correction",
- enablejavascript: "Enable JavaScript",
- starttime: "Start time",
- endtime: "End time",
- href: "href",
- qtsrcchokespeed: "Choke speed",
- target: "Target",
- volume: "Volume",
- autostart: "Auto start",
- enabled: "Enabled",
- fullscreen: "Fullscreen",
- invokeurls: "Invoke URLs",
- mute: "Mute",
- stretchtofit: "Stretch to fit",
- windowlessvideo: "Windowless video",
- balance: "Balance",
- baseurl: "Base URL",
- captioningid: "Captioning id",
- currentmarker: "Current marker",
- currentposition: "Current position",
- defaultframe: "Default frame",
- playcount: "Play count",
- rate: "Rate",
- uimode: "UI Mode",
- flash_options: "Flash options",
- qt_options: "QuickTime options",
- wmp_options: "Windows media player options",
- rmp_options: "Real media player options",
- shockwave_options: "Shockwave options",
- autogotourl: "Auto goto URL",
- center: "Center",
- imagestatus: "Image status",
- maintainaspect: "Maintain aspect",
- nojava: "No java",
- prefetch: "Prefetch",
- shuffle: "Shuffle",
- console: "Console",
- numloop: "Num loops",
- controls: "Controls",
- scriptcallbacks: "Script callbacks",
- swstretchstyle: "Stretch style",
- swstretchhalign: "Stretch H-Align",
- swstretchvalign: "Stretch V-Align",
- sound: "Sound",
- progress: "Progress",
- qtsrc: "QT Src",
- qt_stream_warn: "Streamed rtsp resources should be added to the QT Src field under the advanced tab.",
- align_top: "Top",
- align_right: "Right",
- align_bottom: "Bottom",
- align_left: "Left",
- align_center: "Center",
- align_top_left: "Top left",
- align_top_right: "Top right",
- align_bottom_left: "Bottom left",
- align_bottom_right: "Bottom right",
- flv_options: "Flash video options",
- flv_scalemode: "Scale mode",
- flv_buffer: "Buffer",
- flv_startimage: "Start image",
- flv_starttime: "Start time",
- flv_defaultvolume: "Default volume",
- flv_hiddengui: "Hidden GUI",
- flv_autostart: "Auto start",
- flv_loop: "Loop",
- flv_showscalemodes: "Show scale modes",
- flv_smoothvideo: "Smooth video",
- flv_jscallback: "JS Callback",
- html5_video_options: "HTML5 Video Options",
- altsource1: "Alternative source 1",
- altsource2: "Alternative source 2",
- preload: "Preload",
- poster: "Poster",
- source: "Source"
- });
-
- tinyMCE.addI18n( lang + ".wordpress", {
- wp_adv_desc: "Show/Hide Kitchen Sink (Alt + Shift + Z)",
- wp_more_desc: "Insert More Tag (Alt + Shift + T)",
- wp_page_desc: "Insert Page break (Alt + Shift + P)",
- wp_help_desc: "Help (Alt + Shift + H)",
- wp_more_alt: "More...",
- wp_page_alt: "Next page...",
- add_media: "Add Media",
- add_image: "Add an Image",
- add_video: "Add Video",
- add_audio: "Add Audio",
- editgallery: "Edit Gallery",
- delgallery: "Delete Gallery",
- wp_fullscreen_desc: "Distraction-free writing mode (Alt + Shift + W)"
- });
-
- tinyMCE.addI18n( lang + ".wpeditimage", {
- edit_img: "Edit Image",
- del_img: "Delete Image",
- adv_settings: "Advanced Settings",
- none: "None",
- size: "Size",
- thumbnail: "Thumbnail",
- medium: "Medium",
- full_size: "Full Size",
- current_link: "Current Link",
- link_to_img: "Link to Image",
- link_help: "Enter a link URL or click above for presets.",
- adv_img_settings: "Advanced Image Settings",
- source: "Source",
- width: "Width",
- height: "Height",
- orig_size: "Original Size",
- css: "CSS Class",
- adv_link_settings: "Advanced Link Settings",
- link_rel: "Link Rel",
- s60: "60%",
- s70: "70%",
- s80: "80%",
- s90: "90%",
- s100: "100%",
- s110: "110%",
- s120: "120%",
- s130: "130%",
- img_title: "Title",
- caption: "Caption",
- alt: "Alternative Text"
- });
-}());
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/charmap/plugin.js b/src/js/_enqueues/vendor/tinymce/plugins/charmap/plugin.js
index 48b26f1c5617f..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/charmap/plugin.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/charmap/plugin.js
@@ -1,1275 +0,0 @@
-(function () {
-var charmap = (function () {
- 'use strict';
-
- var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- var fireInsertCustomChar = function (editor, chr) {
- return editor.fire('insertCustomChar', { chr: chr });
- };
- var Events = { fireInsertCustomChar: fireInsertCustomChar };
-
- var insertChar = function (editor, chr) {
- var evtChr = Events.fireInsertCustomChar(editor, chr).chr;
- editor.execCommand('mceInsertContent', false, evtChr);
- };
- var Actions = { insertChar: insertChar };
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');
-
- var getCharMap = function (editor) {
- return editor.settings.charmap;
- };
- var getCharMapAppend = function (editor) {
- return editor.settings.charmap_append;
- };
- var Settings = {
- getCharMap: getCharMap,
- getCharMapAppend: getCharMapAppend
- };
-
- var isArray = global$1.isArray;
- var getDefaultCharMap = function () {
- return [
- [
- '160',
- 'no-break space'
- ],
- [
- '173',
- 'soft hyphen'
- ],
- [
- '34',
- 'quotation mark'
- ],
- [
- '162',
- 'cent sign'
- ],
- [
- '8364',
- 'euro sign'
- ],
- [
- '163',
- 'pound sign'
- ],
- [
- '165',
- 'yen sign'
- ],
- [
- '169',
- 'copyright sign'
- ],
- [
- '174',
- 'registered sign'
- ],
- [
- '8482',
- 'trade mark sign'
- ],
- [
- '8240',
- 'per mille sign'
- ],
- [
- '181',
- 'micro sign'
- ],
- [
- '183',
- 'middle dot'
- ],
- [
- '8226',
- 'bullet'
- ],
- [
- '8230',
- 'three dot leader'
- ],
- [
- '8242',
- 'minutes / feet'
- ],
- [
- '8243',
- 'seconds / inches'
- ],
- [
- '167',
- 'section sign'
- ],
- [
- '182',
- 'paragraph sign'
- ],
- [
- '223',
- 'sharp s / ess-zed'
- ],
- [
- '8249',
- 'single left-pointing angle quotation mark'
- ],
- [
- '8250',
- 'single right-pointing angle quotation mark'
- ],
- [
- '171',
- 'left pointing guillemet'
- ],
- [
- '187',
- 'right pointing guillemet'
- ],
- [
- '8216',
- 'left single quotation mark'
- ],
- [
- '8217',
- 'right single quotation mark'
- ],
- [
- '8220',
- 'left double quotation mark'
- ],
- [
- '8221',
- 'right double quotation mark'
- ],
- [
- '8218',
- 'single low-9 quotation mark'
- ],
- [
- '8222',
- 'double low-9 quotation mark'
- ],
- [
- '60',
- 'less-than sign'
- ],
- [
- '62',
- 'greater-than sign'
- ],
- [
- '8804',
- 'less-than or equal to'
- ],
- [
- '8805',
- 'greater-than or equal to'
- ],
- [
- '8211',
- 'en dash'
- ],
- [
- '8212',
- 'em dash'
- ],
- [
- '175',
- 'macron'
- ],
- [
- '8254',
- 'overline'
- ],
- [
- '164',
- 'currency sign'
- ],
- [
- '166',
- 'broken bar'
- ],
- [
- '168',
- 'diaeresis'
- ],
- [
- '161',
- 'inverted exclamation mark'
- ],
- [
- '191',
- 'turned question mark'
- ],
- [
- '710',
- 'circumflex accent'
- ],
- [
- '732',
- 'small tilde'
- ],
- [
- '176',
- 'degree sign'
- ],
- [
- '8722',
- 'minus sign'
- ],
- [
- '177',
- 'plus-minus sign'
- ],
- [
- '247',
- 'division sign'
- ],
- [
- '8260',
- 'fraction slash'
- ],
- [
- '215',
- 'multiplication sign'
- ],
- [
- '185',
- 'superscript one'
- ],
- [
- '178',
- 'superscript two'
- ],
- [
- '179',
- 'superscript three'
- ],
- [
- '188',
- 'fraction one quarter'
- ],
- [
- '189',
- 'fraction one half'
- ],
- [
- '190',
- 'fraction three quarters'
- ],
- [
- '402',
- 'function / florin'
- ],
- [
- '8747',
- 'integral'
- ],
- [
- '8721',
- 'n-ary sumation'
- ],
- [
- '8734',
- 'infinity'
- ],
- [
- '8730',
- 'square root'
- ],
- [
- '8764',
- 'similar to'
- ],
- [
- '8773',
- 'approximately equal to'
- ],
- [
- '8776',
- 'almost equal to'
- ],
- [
- '8800',
- 'not equal to'
- ],
- [
- '8801',
- 'identical to'
- ],
- [
- '8712',
- 'element of'
- ],
- [
- '8713',
- 'not an element of'
- ],
- [
- '8715',
- 'contains as member'
- ],
- [
- '8719',
- 'n-ary product'
- ],
- [
- '8743',
- 'logical and'
- ],
- [
- '8744',
- 'logical or'
- ],
- [
- '172',
- 'not sign'
- ],
- [
- '8745',
- 'intersection'
- ],
- [
- '8746',
- 'union'
- ],
- [
- '8706',
- 'partial differential'
- ],
- [
- '8704',
- 'for all'
- ],
- [
- '8707',
- 'there exists'
- ],
- [
- '8709',
- 'diameter'
- ],
- [
- '8711',
- 'backward difference'
- ],
- [
- '8727',
- 'asterisk operator'
- ],
- [
- '8733',
- 'proportional to'
- ],
- [
- '8736',
- 'angle'
- ],
- [
- '180',
- 'acute accent'
- ],
- [
- '184',
- 'cedilla'
- ],
- [
- '170',
- 'feminine ordinal indicator'
- ],
- [
- '186',
- 'masculine ordinal indicator'
- ],
- [
- '8224',
- 'dagger'
- ],
- [
- '8225',
- 'double dagger'
- ],
- [
- '192',
- 'A - grave'
- ],
- [
- '193',
- 'A - acute'
- ],
- [
- '194',
- 'A - circumflex'
- ],
- [
- '195',
- 'A - tilde'
- ],
- [
- '196',
- 'A - diaeresis'
- ],
- [
- '197',
- 'A - ring above'
- ],
- [
- '256',
- 'A - macron'
- ],
- [
- '198',
- 'ligature AE'
- ],
- [
- '199',
- 'C - cedilla'
- ],
- [
- '200',
- 'E - grave'
- ],
- [
- '201',
- 'E - acute'
- ],
- [
- '202',
- 'E - circumflex'
- ],
- [
- '203',
- 'E - diaeresis'
- ],
- [
- '274',
- 'E - macron'
- ],
- [
- '204',
- 'I - grave'
- ],
- [
- '205',
- 'I - acute'
- ],
- [
- '206',
- 'I - circumflex'
- ],
- [
- '207',
- 'I - diaeresis'
- ],
- [
- '298',
- 'I - macron'
- ],
- [
- '208',
- 'ETH'
- ],
- [
- '209',
- 'N - tilde'
- ],
- [
- '210',
- 'O - grave'
- ],
- [
- '211',
- 'O - acute'
- ],
- [
- '212',
- 'O - circumflex'
- ],
- [
- '213',
- 'O - tilde'
- ],
- [
- '214',
- 'O - diaeresis'
- ],
- [
- '216',
- 'O - slash'
- ],
- [
- '332',
- 'O - macron'
- ],
- [
- '338',
- 'ligature OE'
- ],
- [
- '352',
- 'S - caron'
- ],
- [
- '217',
- 'U - grave'
- ],
- [
- '218',
- 'U - acute'
- ],
- [
- '219',
- 'U - circumflex'
- ],
- [
- '220',
- 'U - diaeresis'
- ],
- [
- '362',
- 'U - macron'
- ],
- [
- '221',
- 'Y - acute'
- ],
- [
- '376',
- 'Y - diaeresis'
- ],
- [
- '562',
- 'Y - macron'
- ],
- [
- '222',
- 'THORN'
- ],
- [
- '224',
- 'a - grave'
- ],
- [
- '225',
- 'a - acute'
- ],
- [
- '226',
- 'a - circumflex'
- ],
- [
- '227',
- 'a - tilde'
- ],
- [
- '228',
- 'a - diaeresis'
- ],
- [
- '229',
- 'a - ring above'
- ],
- [
- '257',
- 'a - macron'
- ],
- [
- '230',
- 'ligature ae'
- ],
- [
- '231',
- 'c - cedilla'
- ],
- [
- '232',
- 'e - grave'
- ],
- [
- '233',
- 'e - acute'
- ],
- [
- '234',
- 'e - circumflex'
- ],
- [
- '235',
- 'e - diaeresis'
- ],
- [
- '275',
- 'e - macron'
- ],
- [
- '236',
- 'i - grave'
- ],
- [
- '237',
- 'i - acute'
- ],
- [
- '238',
- 'i - circumflex'
- ],
- [
- '239',
- 'i - diaeresis'
- ],
- [
- '299',
- 'i - macron'
- ],
- [
- '240',
- 'eth'
- ],
- [
- '241',
- 'n - tilde'
- ],
- [
- '242',
- 'o - grave'
- ],
- [
- '243',
- 'o - acute'
- ],
- [
- '244',
- 'o - circumflex'
- ],
- [
- '245',
- 'o - tilde'
- ],
- [
- '246',
- 'o - diaeresis'
- ],
- [
- '248',
- 'o slash'
- ],
- [
- '333',
- 'o macron'
- ],
- [
- '339',
- 'ligature oe'
- ],
- [
- '353',
- 's - caron'
- ],
- [
- '249',
- 'u - grave'
- ],
- [
- '250',
- 'u - acute'
- ],
- [
- '251',
- 'u - circumflex'
- ],
- [
- '252',
- 'u - diaeresis'
- ],
- [
- '363',
- 'u - macron'
- ],
- [
- '253',
- 'y - acute'
- ],
- [
- '254',
- 'thorn'
- ],
- [
- '255',
- 'y - diaeresis'
- ],
- [
- '563',
- 'y - macron'
- ],
- [
- '913',
- 'Alpha'
- ],
- [
- '914',
- 'Beta'
- ],
- [
- '915',
- 'Gamma'
- ],
- [
- '916',
- 'Delta'
- ],
- [
- '917',
- 'Epsilon'
- ],
- [
- '918',
- 'Zeta'
- ],
- [
- '919',
- 'Eta'
- ],
- [
- '920',
- 'Theta'
- ],
- [
- '921',
- 'Iota'
- ],
- [
- '922',
- 'Kappa'
- ],
- [
- '923',
- 'Lambda'
- ],
- [
- '924',
- 'Mu'
- ],
- [
- '925',
- 'Nu'
- ],
- [
- '926',
- 'Xi'
- ],
- [
- '927',
- 'Omicron'
- ],
- [
- '928',
- 'Pi'
- ],
- [
- '929',
- 'Rho'
- ],
- [
- '931',
- 'Sigma'
- ],
- [
- '932',
- 'Tau'
- ],
- [
- '933',
- 'Upsilon'
- ],
- [
- '934',
- 'Phi'
- ],
- [
- '935',
- 'Chi'
- ],
- [
- '936',
- 'Psi'
- ],
- [
- '937',
- 'Omega'
- ],
- [
- '945',
- 'alpha'
- ],
- [
- '946',
- 'beta'
- ],
- [
- '947',
- 'gamma'
- ],
- [
- '948',
- 'delta'
- ],
- [
- '949',
- 'epsilon'
- ],
- [
- '950',
- 'zeta'
- ],
- [
- '951',
- 'eta'
- ],
- [
- '952',
- 'theta'
- ],
- [
- '953',
- 'iota'
- ],
- [
- '954',
- 'kappa'
- ],
- [
- '955',
- 'lambda'
- ],
- [
- '956',
- 'mu'
- ],
- [
- '957',
- 'nu'
- ],
- [
- '958',
- 'xi'
- ],
- [
- '959',
- 'omicron'
- ],
- [
- '960',
- 'pi'
- ],
- [
- '961',
- 'rho'
- ],
- [
- '962',
- 'final sigma'
- ],
- [
- '963',
- 'sigma'
- ],
- [
- '964',
- 'tau'
- ],
- [
- '965',
- 'upsilon'
- ],
- [
- '966',
- 'phi'
- ],
- [
- '967',
- 'chi'
- ],
- [
- '968',
- 'psi'
- ],
- [
- '969',
- 'omega'
- ],
- [
- '8501',
- 'alef symbol'
- ],
- [
- '982',
- 'pi symbol'
- ],
- [
- '8476',
- 'real part symbol'
- ],
- [
- '978',
- 'upsilon - hook symbol'
- ],
- [
- '8472',
- 'Weierstrass p'
- ],
- [
- '8465',
- 'imaginary part'
- ],
- [
- '8592',
- 'leftwards arrow'
- ],
- [
- '8593',
- 'upwards arrow'
- ],
- [
- '8594',
- 'rightwards arrow'
- ],
- [
- '8595',
- 'downwards arrow'
- ],
- [
- '8596',
- 'left right arrow'
- ],
- [
- '8629',
- 'carriage return'
- ],
- [
- '8656',
- 'leftwards double arrow'
- ],
- [
- '8657',
- 'upwards double arrow'
- ],
- [
- '8658',
- 'rightwards double arrow'
- ],
- [
- '8659',
- 'downwards double arrow'
- ],
- [
- '8660',
- 'left right double arrow'
- ],
- [
- '8756',
- 'therefore'
- ],
- [
- '8834',
- 'subset of'
- ],
- [
- '8835',
- 'superset of'
- ],
- [
- '8836',
- 'not a subset of'
- ],
- [
- '8838',
- 'subset of or equal to'
- ],
- [
- '8839',
- 'superset of or equal to'
- ],
- [
- '8853',
- 'circled plus'
- ],
- [
- '8855',
- 'circled times'
- ],
- [
- '8869',
- 'perpendicular'
- ],
- [
- '8901',
- 'dot operator'
- ],
- [
- '8968',
- 'left ceiling'
- ],
- [
- '8969',
- 'right ceiling'
- ],
- [
- '8970',
- 'left floor'
- ],
- [
- '8971',
- 'right floor'
- ],
- [
- '9001',
- 'left-pointing angle bracket'
- ],
- [
- '9002',
- 'right-pointing angle bracket'
- ],
- [
- '9674',
- 'lozenge'
- ],
- [
- '9824',
- 'black spade suit'
- ],
- [
- '9827',
- 'black club suit'
- ],
- [
- '9829',
- 'black heart suit'
- ],
- [
- '9830',
- 'black diamond suit'
- ],
- [
- '8194',
- 'en space'
- ],
- [
- '8195',
- 'em space'
- ],
- [
- '8201',
- 'thin space'
- ],
- [
- '8204',
- 'zero width non-joiner'
- ],
- [
- '8205',
- 'zero width joiner'
- ],
- [
- '8206',
- 'left-to-right mark'
- ],
- [
- '8207',
- 'right-to-left mark'
- ]
- ];
- };
- var charmapFilter = function (charmap) {
- return global$1.grep(charmap, function (item) {
- return isArray(item) && item.length === 2;
- });
- };
- var getCharsFromSetting = function (settingValue) {
- if (isArray(settingValue)) {
- return [].concat(charmapFilter(settingValue));
- }
- if (typeof settingValue === 'function') {
- return settingValue();
- }
- return [];
- };
- var extendCharMap = function (editor, charmap) {
- var userCharMap = Settings.getCharMap(editor);
- if (userCharMap) {
- charmap = getCharsFromSetting(userCharMap);
- }
- var userCharMapAppend = Settings.getCharMapAppend(editor);
- if (userCharMapAppend) {
- return [].concat(charmap).concat(getCharsFromSetting(userCharMapAppend));
- }
- return charmap;
- };
- var getCharMap$1 = function (editor) {
- return extendCharMap(editor, getDefaultCharMap());
- };
- var CharMap = { getCharMap: getCharMap$1 };
-
- var get = function (editor) {
- var getCharMap = function () {
- return CharMap.getCharMap(editor);
- };
- var insertChar = function (chr) {
- Actions.insertChar(editor, chr);
- };
- return {
- getCharMap: getCharMap,
- insertChar: insertChar
- };
- };
- var Api = { get: get };
-
- var getHtml = function (charmap) {
- var gridHtml, x, y;
- var width = Math.min(charmap.length, 25);
- var height = Math.ceil(charmap.length / width);
- gridHtml = ' ';
- for (y = 0; y < height; y++) {
- gridHtml += '';
- for (x = 0; x < width; x++) {
- var index = y * width + x;
- if (index < charmap.length) {
- var chr = charmap[index];
- var charCode = parseInt(chr[0], 10);
- var chrText = chr ? String.fromCharCode(charCode) : ' ';
- gridHtml += '' + '' + chrText + '
' + ' ';
- } else {
- gridHtml += ' ';
- }
- }
- gridHtml += ' ';
- }
- gridHtml += '
';
- return gridHtml;
- };
- var GridHtml = { getHtml: getHtml };
-
- var getParentTd = function (elm) {
- while (elm) {
- if (elm.nodeName === 'TD') {
- return elm;
- }
- elm = elm.parentNode;
- }
- };
- var open = function (editor) {
- var win;
- var charMapPanel = {
- type: 'container',
- html: GridHtml.getHtml(CharMap.getCharMap(editor)),
- onclick: function (e) {
- var target = e.target;
- if (/^(TD|DIV)$/.test(target.nodeName)) {
- var charDiv = getParentTd(target).firstChild;
- if (charDiv && charDiv.hasAttribute('data-chr')) {
- var charCodeString = charDiv.getAttribute('data-chr');
- var charCode = parseInt(charCodeString, 10);
- if (!isNaN(charCode)) {
- Actions.insertChar(editor, String.fromCharCode(charCode));
- }
- if (!e.ctrlKey) {
- win.close();
- }
- }
- }
- },
- onmouseover: function (e) {
- var td = getParentTd(e.target);
- if (td && td.firstChild) {
- win.find('#preview').text(td.firstChild.firstChild.data);
- win.find('#previewTitle').text(td.title);
- } else {
- win.find('#preview').text(' ');
- win.find('#previewTitle').text(' ');
- }
- }
- };
- win = editor.windowManager.open({
- title: 'Special character',
- spacing: 10,
- padding: 10,
- items: [
- charMapPanel,
- {
- type: 'container',
- layout: 'flex',
- direction: 'column',
- align: 'center',
- spacing: 5,
- minWidth: 160,
- minHeight: 160,
- items: [
- {
- type: 'label',
- name: 'preview',
- text: ' ',
- style: 'font-size: 40px; text-align: center',
- border: 1,
- minWidth: 140,
- minHeight: 80
- },
- {
- type: 'spacer',
- minHeight: 20
- },
- {
- type: 'label',
- name: 'previewTitle',
- text: ' ',
- style: 'white-space: pre-wrap;',
- border: 1,
- minWidth: 140
- }
- ]
- }
- ],
- buttons: [{
- text: 'Close',
- onclick: function () {
- win.close();
- }
- }]
- });
- };
- var Dialog = { open: open };
-
- var register = function (editor) {
- editor.addCommand('mceShowCharmap', function () {
- Dialog.open(editor);
- });
- };
- var Commands = { register: register };
-
- var register$1 = function (editor) {
- editor.addButton('charmap', {
- icon: 'charmap',
- tooltip: 'Special character',
- cmd: 'mceShowCharmap'
- });
- editor.addMenuItem('charmap', {
- icon: 'charmap',
- text: 'Special character',
- cmd: 'mceShowCharmap',
- context: 'insert'
- });
- };
- var Buttons = { register: register$1 };
-
- global.add('charmap', function (editor) {
- Commands.register(editor);
- Buttons.register(editor);
- return Api.get(editor);
- });
- function Plugin () {
- }
-
- return Plugin;
-
-}());
-})();
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/charmap/plugin.min.js b/src/js/_enqueues/vendor/tinymce/plugins/charmap/plugin.min.js
index 9ea3f757513c5..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/charmap/plugin.min.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/charmap/plugin.min.js
@@ -1 +0,0 @@
-!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(e,t){return e.fire("insertCustomChar",{chr:t})},l=function(e,t){var a=i(e,t).chr;e.execCommand("mceInsertContent",!1,a)},a=tinymce.util.Tools.resolve("tinymce.util.Tools"),r=function(e){return e.settings.charmap},n=function(e){return e.settings.charmap_append},o=a.isArray,c=function(e){return o(e)?[].concat((t=e,a.grep(t,function(e){return o(e)&&2===e.length}))):"function"==typeof e?e():[];var t},s=function(e){return function(e,t){var a=r(e);a&&(t=c(a));var i=n(e);return i?[].concat(t).concat(c(i)):t}(e,[["160","no-break space"],["173","soft hyphen"],["34","quotation mark"],["162","cent sign"],["8364","euro sign"],["163","pound sign"],["165","yen sign"],["169","copyright sign"],["174","registered sign"],["8482","trade mark sign"],["8240","per mille sign"],["181","micro sign"],["183","middle dot"],["8226","bullet"],["8230","three dot leader"],["8242","minutes / feet"],["8243","seconds / inches"],["167","section sign"],["182","paragraph sign"],["223","sharp s / ess-zed"],["8249","single left-pointing angle quotation mark"],["8250","single right-pointing angle quotation mark"],["171","left pointing guillemet"],["187","right pointing guillemet"],["8216","left single quotation mark"],["8217","right single quotation mark"],["8220","left double quotation mark"],["8221","right double quotation mark"],["8218","single low-9 quotation mark"],["8222","double low-9 quotation mark"],["60","less-than sign"],["62","greater-than sign"],["8804","less-than or equal to"],["8805","greater-than or equal to"],["8211","en dash"],["8212","em dash"],["175","macron"],["8254","overline"],["164","currency sign"],["166","broken bar"],["168","diaeresis"],["161","inverted exclamation mark"],["191","turned question mark"],["710","circumflex accent"],["732","small tilde"],["176","degree sign"],["8722","minus sign"],["177","plus-minus sign"],["247","division sign"],["8260","fraction slash"],["215","multiplication sign"],["185","superscript one"],["178","superscript two"],["179","superscript three"],["188","fraction one quarter"],["189","fraction one half"],["190","fraction three quarters"],["402","function / florin"],["8747","integral"],["8721","n-ary sumation"],["8734","infinity"],["8730","square root"],["8764","similar to"],["8773","approximately equal to"],["8776","almost equal to"],["8800","not equal to"],["8801","identical to"],["8712","element of"],["8713","not an element of"],["8715","contains as member"],["8719","n-ary product"],["8743","logical and"],["8744","logical or"],["172","not sign"],["8745","intersection"],["8746","union"],["8706","partial differential"],["8704","for all"],["8707","there exists"],["8709","diameter"],["8711","backward difference"],["8727","asterisk operator"],["8733","proportional to"],["8736","angle"],["180","acute accent"],["184","cedilla"],["170","feminine ordinal indicator"],["186","masculine ordinal indicator"],["8224","dagger"],["8225","double dagger"],["192","A - grave"],["193","A - acute"],["194","A - circumflex"],["195","A - tilde"],["196","A - diaeresis"],["197","A - ring above"],["256","A - macron"],["198","ligature AE"],["199","C - cedilla"],["200","E - grave"],["201","E - acute"],["202","E - circumflex"],["203","E - diaeresis"],["274","E - macron"],["204","I - grave"],["205","I - acute"],["206","I - circumflex"],["207","I - diaeresis"],["298","I - macron"],["208","ETH"],["209","N - tilde"],["210","O - grave"],["211","O - acute"],["212","O - circumflex"],["213","O - tilde"],["214","O - diaeresis"],["216","O - slash"],["332","O - macron"],["338","ligature OE"],["352","S - caron"],["217","U - grave"],["218","U - acute"],["219","U - circumflex"],["220","U - diaeresis"],["362","U - macron"],["221","Y - acute"],["376","Y - diaeresis"],["562","Y - macron"],["222","THORN"],["224","a - grave"],["225","a - acute"],["226","a - circumflex"],["227","a - tilde"],["228","a - diaeresis"],["229","a - ring above"],["257","a - macron"],["230","ligature ae"],["231","c - cedilla"],["232","e - grave"],["233","e - acute"],["234","e - circumflex"],["235","e - diaeresis"],["275","e - macron"],["236","i - grave"],["237","i - acute"],["238","i - circumflex"],["239","i - diaeresis"],["299","i - macron"],["240","eth"],["241","n - tilde"],["242","o - grave"],["243","o - acute"],["244","o - circumflex"],["245","o - tilde"],["246","o - diaeresis"],["248","o slash"],["333","o macron"],["339","ligature oe"],["353","s - caron"],["249","u - grave"],["250","u - acute"],["251","u - circumflex"],["252","u - diaeresis"],["363","u - macron"],["253","y - acute"],["254","thorn"],["255","y - diaeresis"],["563","y - macron"],["913","Alpha"],["914","Beta"],["915","Gamma"],["916","Delta"],["917","Epsilon"],["918","Zeta"],["919","Eta"],["920","Theta"],["921","Iota"],["922","Kappa"],["923","Lambda"],["924","Mu"],["925","Nu"],["926","Xi"],["927","Omicron"],["928","Pi"],["929","Rho"],["931","Sigma"],["932","Tau"],["933","Upsilon"],["934","Phi"],["935","Chi"],["936","Psi"],["937","Omega"],["945","alpha"],["946","beta"],["947","gamma"],["948","delta"],["949","epsilon"],["950","zeta"],["951","eta"],["952","theta"],["953","iota"],["954","kappa"],["955","lambda"],["956","mu"],["957","nu"],["958","xi"],["959","omicron"],["960","pi"],["961","rho"],["962","final sigma"],["963","sigma"],["964","tau"],["965","upsilon"],["966","phi"],["967","chi"],["968","psi"],["969","omega"],["8501","alef symbol"],["982","pi symbol"],["8476","real part symbol"],["978","upsilon - hook symbol"],["8472","Weierstrass p"],["8465","imaginary part"],["8592","leftwards arrow"],["8593","upwards arrow"],["8594","rightwards arrow"],["8595","downwards arrow"],["8596","left right arrow"],["8629","carriage return"],["8656","leftwards double arrow"],["8657","upwards double arrow"],["8658","rightwards double arrow"],["8659","downwards double arrow"],["8660","left right double arrow"],["8756","therefore"],["8834","subset of"],["8835","superset of"],["8836","not a subset of"],["8838","subset of or equal to"],["8839","superset of or equal to"],["8853","circled plus"],["8855","circled times"],["8869","perpendicular"],["8901","dot operator"],["8968","left ceiling"],["8969","right ceiling"],["8970","left floor"],["8971","right floor"],["9001","left-pointing angle bracket"],["9002","right-pointing angle bracket"],["9674","lozenge"],["9824","black spade suit"],["9827","black club suit"],["9829","black heart suit"],["9830","black diamond suit"],["8194","en space"],["8195","em space"],["8201","thin space"],["8204","zero width non-joiner"],["8205","zero width joiner"],["8206","left-to-right mark"],["8207","right-to-left mark"]])},t=function(t){return{getCharMap:function(){return s(t)},insertChar:function(e){l(t,e)}}},u=function(e){var t,a,i,r=Math.min(e.length,25),n=Math.ceil(e.length/r);for(t='',i=0;i",a=0;a'+s+"
"}else t+=" "}t+=""}return t+="
"},d=function(e){for(;e;){if("TD"===e.nodeName)return e;e=e.parentNode}},m=function(n){var o,e={type:"container",html:u(s(n)),onclick:function(e){var t=e.target;if(/^(TD|DIV)$/.test(t.nodeName)){var a=d(t).firstChild;if(a&&a.hasAttribute("data-chr")){var i=a.getAttribute("data-chr"),r=parseInt(i,10);isNaN(r)||l(n,String.fromCharCode(r)),e.ctrlKey||o.close()}}},onmouseover:function(e){var t=d(e.target);t&&t.firstChild?(o.find("#preview").text(t.firstChild.firstChild.data),o.find("#previewTitle").text(t.title)):(o.find("#preview").text(" "),o.find("#previewTitle").text(" "))}};o=n.windowManager.open({title:"Special character",spacing:10,padding:10,items:[e,{type:"container",layout:"flex",direction:"column",align:"center",spacing:5,minWidth:160,minHeight:160,items:[{type:"label",name:"preview",text:" ",style:"font-size: 40px; text-align: center",border:1,minWidth:140,minHeight:80},{type:"spacer",minHeight:20},{type:"label",name:"previewTitle",text:" ",style:"white-space: pre-wrap;",border:1,minWidth:140}]}],buttons:[{text:"Close",onclick:function(){o.close()}}]})},g=function(e){e.addCommand("mceShowCharmap",function(){m(e)})},p=function(e){e.addButton("charmap",{icon:"charmap",tooltip:"Special character",cmd:"mceShowCharmap"}),e.addMenuItem("charmap",{icon:"charmap",text:"Special character",cmd:"mceShowCharmap",context:"insert"})};e.add("charmap",function(e){return g(e),p(e),t(e)})}();
\ No newline at end of file
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/colorpicker/plugin.js b/src/js/_enqueues/vendor/tinymce/plugins/colorpicker/plugin.js
index 04872b3c7a8c0..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/colorpicker/plugin.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/colorpicker/plugin.js
@@ -1,126 +0,0 @@
-(function () {
-var colorpicker = (function () {
- 'use strict';
-
- var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.util.Color');
-
- var showPreview = function (win, hexColor) {
- win.find('#preview')[0].getEl().style.background = hexColor;
- };
- var setColor = function (win, value) {
- var color = global$1(value), rgb = color.toRgb();
- win.fromJSON({
- r: rgb.r,
- g: rgb.g,
- b: rgb.b,
- hex: color.toHex().substr(1)
- });
- showPreview(win, color.toHex());
- };
- var open = function (editor, callback, value) {
- var win = editor.windowManager.open({
- title: 'Color',
- items: {
- type: 'container',
- layout: 'flex',
- direction: 'row',
- align: 'stretch',
- padding: 5,
- spacing: 10,
- items: [
- {
- type: 'colorpicker',
- value: value,
- onchange: function () {
- var rgb = this.rgb();
- if (win) {
- win.find('#r').value(rgb.r);
- win.find('#g').value(rgb.g);
- win.find('#b').value(rgb.b);
- win.find('#hex').value(this.value().substr(1));
- showPreview(win, this.value());
- }
- }
- },
- {
- type: 'form',
- padding: 0,
- labelGap: 5,
- defaults: {
- type: 'textbox',
- size: 7,
- value: '0',
- flex: 1,
- spellcheck: false,
- onchange: function () {
- var colorPickerCtrl = win.find('colorpicker')[0];
- var name, value;
- name = this.name();
- value = this.value();
- if (name === 'hex') {
- value = '#' + value;
- setColor(win, value);
- colorPickerCtrl.value(value);
- return;
- }
- value = {
- r: win.find('#r').value(),
- g: win.find('#g').value(),
- b: win.find('#b').value()
- };
- colorPickerCtrl.value(value);
- setColor(win, value);
- }
- },
- items: [
- {
- name: 'r',
- label: 'R',
- autofocus: 1
- },
- {
- name: 'g',
- label: 'G'
- },
- {
- name: 'b',
- label: 'B'
- },
- {
- name: 'hex',
- label: '#',
- value: '000000'
- },
- {
- name: 'preview',
- type: 'container',
- border: 1
- }
- ]
- }
- ]
- },
- onSubmit: function () {
- callback('#' + win.toJSON().hex);
- }
- });
- setColor(win, value);
- };
- var Dialog = { open: open };
-
- global.add('colorpicker', function (editor) {
- if (!editor.settings.color_picker_callback) {
- editor.settings.color_picker_callback = function (callback, value) {
- Dialog.open(editor, callback, value);
- };
- }
- });
- function Plugin () {
- }
-
- return Plugin;
-
-}());
-})();
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/colorpicker/plugin.min.js b/src/js/_enqueues/vendor/tinymce/plugins/colorpicker/plugin.min.js
index 10317a5f6f4b0..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/colorpicker/plugin.min.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/colorpicker/plugin.min.js
@@ -1 +0,0 @@
-!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=tinymce.util.Tools.resolve("tinymce.util.Color"),a=function(e,n){e.find("#preview")[0].getEl().style.background=n},o=function(e,n){var i=l(n),t=i.toRgb();e.fromJSON({r:t.r,g:t.g,b:t.b,hex:i.toHex().substr(1)}),a(e,i.toHex())},t=function(e,n,i){var t=e.windowManager.open({title:"Color",items:{type:"container",layout:"flex",direction:"row",align:"stretch",padding:5,spacing:10,items:[{type:"colorpicker",value:i,onchange:function(){var e=this.rgb();t&&(t.find("#r").value(e.r),t.find("#g").value(e.g),t.find("#b").value(e.b),t.find("#hex").value(this.value().substr(1)),a(t,this.value()))}},{type:"form",padding:0,labelGap:5,defaults:{type:"textbox",size:7,value:"0",flex:1,spellcheck:!1,onchange:function(){var e,n,i=t.find("colorpicker")[0];if(e=this.name(),n=this.value(),"hex"===e)return o(t,n="#"+n),void i.value(n);n={r:t.find("#r").value(),g:t.find("#g").value(),b:t.find("#b").value()},i.value(n),o(t,n)}},items:[{name:"r",label:"R",autofocus:1},{name:"g",label:"G"},{name:"b",label:"B"},{name:"hex",label:"#",value:"000000"},{name:"preview",type:"container",border:1}]}]},onSubmit:function(){n("#"+t.toJSON().hex)}});o(t,i)};e.add("colorpicker",function(i){i.settings.color_picker_callback||(i.settings.color_picker_callback=function(e,n){t(i,e,n)})})}();
\ No newline at end of file
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/compat3x/css/dialog.css b/src/js/_enqueues/vendor/tinymce/plugins/compat3x/css/dialog.css
index e75543a18ef2d..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/compat3x/css/dialog.css
+++ b/src/js/_enqueues/vendor/tinymce/plugins/compat3x/css/dialog.css
@@ -1,215 +0,0 @@
-/*
- * Edited for compatibility with old TinyMCE 3.x plugins in WordPress.
- * More info: https://core.trac.wordpress.org/ticket/31596#comment:10
- */
-
-/* Generic */
-body {
-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-font-size:13px;
-background:#fcfcfc;
-padding:0;
-margin:8px 8px 0 8px;
-}
-
-textarea {resize:none;outline:none;}
-
-a:link, a:hover {
- color: #2B6FB6;
-}
-
-a:visited {
- color: #3C2BB6;
-}
-
-.nowrap {white-space: nowrap}
-
-/* Forms */
-form {margin: 0;}
-fieldset {margin:0; padding:4px; border:1px solid #dfdfdf; font-family:Verdana, Arial; font-size:10px;}
-legend {color:#2B6FB6; font-weight:bold;}
-label.msg {display:none;}
-label.invalid {color:#EE0000; display:inline;}
-input.invalid {border:1px solid #EE0000;}
-input {background:#FFF; border:1px solid #dfdfdf;}
-input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
-input, select, textarea {border:1px solid #dfdfdf;}
-input.radio {border:1px none #000000; background:transparent; vertical-align:middle;}
-input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;}
-.input_noborder {border:0;}
-
-/* Buttons */
-#insert,
-#cancel,
-#apply,
-.mceActionPanel .button,
-input.mceButton,
-.updateButton {
- display: inline-block;
- text-decoration: none;
- border: 1px solid #adadad;
- margin: 0;
- padding: 0 10px 1px;
- font-size: 13px;
- height: 24px;
- line-height: 22px;
- color: #333;
- cursor: pointer;
- -webkit-border-radius: 3px;
- -webkit-appearance: none;
- border-radius: 3px;
- white-space: nowrap;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- background: #fafafa;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fafafa), to(#e9e9e9));
- background-image: -webkit-linear-gradient(top, #fafafa, #e9e9e9);
- background-image: -moz-linear-gradient(top, #fafafa, #e9e9e9);
- background-image: -o-linear-gradient(top, #fafafa, #e9e9e9);
- background-image: linear-gradient(to bottom, #fafafa, #e9e9e9);
-
- text-shadow: 0 1px 0 #fff;
- -webkit-box-shadow: inset 0 1px 0 #fff;
- -moz-box-shadow: inset 0 1px 0 #fff;
- box-shadow: inset 0 1px 0 #fff;
-}
-
-#insert {
- background: #2ea2cc;
- background: -webkit-gradient(linear, left top, left bottom, from(#2ea2cc), to(#1e8cbe));
- background: -webkit-linear-gradient(top, #2ea2cc 0%,#1e8cbe 100%);
- background: linear-gradient(top, #2ea2cc 0%,#1e8cbe 100%);
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#2ea2cc', endColorstr='#1e8cbe',GradientType=0 );
- border-color: #0074a2;
- -webkit-box-shadow: inset 0 1px 0 rgba(120,200,230,0.5);
- box-shadow: inset 0 1px 0 rgba(120,200,230,0.5);
- color: #fff;
- text-decoration: none;
- text-shadow: 0 1px 0 rgba(0,86,132,0.7);
-}
-
-#cancel:hover,
-input.mceButton:hover,
-.updateButton:hover,
-#cancel:focus,
-input.mceButton:focus,
-.updateButton:focus {
- background: #f3f3f3;
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f3f3f3));
- background-image: -webkit-linear-gradient(top, #fff, #f3f3f3);
- background-image: -moz-linear-gradient(top, #fff, #f3f3f3);
- background-image: -ms-linear-gradient(top, #fff, #f3f3f3);
- background-image: -o-linear-gradient(top, #fff, #f3f3f3);
- background-image: linear-gradient(to bottom, #fff, #f3f3f3);
- border-color: #999;
- color: #222;
-}
-
-#insert:hover,
-#insert:focus {
- background: #1e8cbe;
- background: -webkit-gradient(linear, left top, left bottom, from(#1e8cbe), to(#0074a2));
- background: -webkit-linear-gradient(top, #1e8cbe 0%,#0074a2 100%);
- background: linear-gradient(top, #1e8cbe 0%,#0074a2 100%);
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e8cbe', endColorstr='#0074a2',GradientType=0 );
- border-color: #0074a2;
- -webkit-box-shadow: inset 0 1px 0 rgba(120,200,230,0.6);
- box-shadow: inset 0 1px 0 rgba(120,200,230,0.6);
- color: #fff;
-}
-
-.mceActionPanel #insert {
- float: right;
-}
-
-/* Browse */
-a.pickcolor, a.browse {text-decoration:none}
-a.browse span {display:block; width:20px; height:18px; border:1px solid #FFF; margin-left:1px;}
-.mceOldBoxModel a.browse span {width:22px; height:20px;}
-a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;}
-a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30);}
-a.browse:hover span.disabled {border:1px solid white; background-color:transparent;}
-a.pickcolor span {display:block; width:20px; height:16px; margin-left:2px;}
-.mceOldBoxModel a.pickcolor span {width:21px; height:17px;}
-a.pickcolor:hover span {background-color:#B2BBD0;}
-div.iframecontainer {background: #fff;}
-
-/* Charmap */
-table.charmap {border:1px solid #AAA; text-align:center}
-td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;}
-#charmap a {display:block; color:#000; text-decoration:none; border:0}
-#charmap a:hover {background:#CCC;color:#2B6FB6}
-#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center}
-#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center}
-#charmap #charmapView {background-color:#fff;}
-
-/* Source */
-.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;}
-.mceActionPanel {margin-top:5px;}
-
-/* Tabs classes */
-.tabs {width:100%; height:19px; line-height:normal; border-bottom: 1px solid #aaa;}
-.tabs ul {margin:0; padding:0; list-style:none;}
-.tabs li {float:left; border: 1px solid #aaa; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;}
-.tabs li.current {border-bottom: 1px solid #fff; margin-right:2px;}
-.tabs span {float:left; display:block; padding:0px 10px 0 0;}
-.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;}
-.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;}
-
-.wp-core-ui #tabs {
- padding-bottom: 5px;
- background-color: transparent;
-}
-
-.wp-core-ui #tabs a {
- padding: 6px 10px;
- margin: 0 2px;
-}
-
-/* Panels */
-.panel_wrapper div.panel {display:none;}
-.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;}
-.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;}
-
-/* Columns */
-.column {float:left;}
-.properties {width:100%;}
-.properties .column1 {}
-.properties .column2 {text-align:left;}
-
-/* Titles */
-h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;}
-h3 {font-size:14px;}
-.title {font-size:12px; font-weight:bold; color:#2B6FB6;}
-
-/* Dialog specific */
-#link .panel_wrapper, #link div.current {height:125px;}
-#image .panel_wrapper, #image div.current {height:200px;}
-#plugintable thead {font-weight:bold; background:#DDD;}
-#plugintable, #about #plugintable td {border:1px solid #919B9C;}
-#plugintable {width:96%; margin-top:10px;}
-#pluginscontainer {height:290px; overflow:auto;}
-#colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px}
-#colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline}
-#colorpicker #preview_wrapper {text-align:center; padding-top:4px; white-space: nowrap; float: right;}
-#colorpicker #insert, #colorpicker #cancel {width: 90px}
-#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;}
-#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;}
-#colorpicker #light div {overflow:hidden;}
-#colorpicker .panel_wrapper div.current {height:175px;}
-#colorpicker #namedcolors {width:150px;}
-#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;}
-#colorpicker #colornamecontainer {margin-top:5px;}
-#colorpicker #picker_panel fieldset {margin:auto;width:325px;}
-
-
-/* Localization */
-
-body[dir="rtl"],
-body[dir="rtl"] fieldset,
-body[dir="rtl"] input, body[dir="rtl"] select, body[dir="rtl"] textarea,
-body[dir="rtl"] #charmap #codeN,
-body[dir="rtl"] .tabs a {
- font-family: Tahoma, sans-serif;
-}
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/compat3x/plugin.js b/src/js/_enqueues/vendor/tinymce/plugins/compat3x/plugin.js
index 92d433edcd5e5..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/compat3x/plugin.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/compat3x/plugin.js
@@ -1,322 +0,0 @@
-/**
- * plugin.js
- *
- * Released under LGPL License.
- * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
- *
- * License: http://www.tinymce.com/license
- * Contributing: http://www.tinymce.com/contributing
- */
-
-/*global tinymce:true, console:true */
-/*eslint no-console:0, new-cap:0 */
-
-/**
- * This plugin adds missing events form the 4.x API back. Not every event is
- * properly supported but most things should work.
- *
- * Unsupported things:
- * - No editor.onEvent
- * - Can't cancel execCommands with beforeExecCommand
- */
-(function (tinymce) {
- var reported;
-
- function noop() {
- }
-
- function log(apiCall) {
- if (!reported && window && window.console) {
- reported = true;
- console.log("Deprecated TinyMCE API call: " + apiCall);
- }
- }
-
- function Dispatcher(target, newEventName, argsMap, defaultScope) {
- target = target || this;
- var cbs = [];
-
- if (!newEventName) {
- this.add = this.addToTop = this.remove = this.dispatch = noop;
- return;
- }
-
- this.add = function (callback, scope, prepend) {
- log('.on' + newEventName + ".add(..)");
-
- // Convert callback({arg1:x, arg2:x}) -> callback(arg1, arg2)
- function patchedEventCallback(e) {
- var callbackArgs = [];
-
- if (typeof argsMap == "string") {
- argsMap = argsMap.split(" ");
- }
-
- if (argsMap && typeof argsMap !== "function") {
- for (var i = 0; i < argsMap.length; i++) {
- callbackArgs.push(e[argsMap[i]]);
- }
- }
-
- if (typeof argsMap == "function") {
- callbackArgs = argsMap(newEventName, e, target);
- if (!callbackArgs) {
- return;
- }
- }
-
- if (!argsMap) {
- callbackArgs = [e];
- }
-
- callbackArgs.unshift(defaultScope || target);
-
- if (callback.apply(scope || defaultScope || target, callbackArgs) === false) {
- e.stopImmediatePropagation();
- }
- }
-
- target.on(newEventName, patchedEventCallback, prepend);
-
- var handlers = {
- original: callback,
- patched: patchedEventCallback
- };
-
- cbs.push(handlers);
- return patchedEventCallback;
- };
-
- this.addToTop = function (callback, scope) {
- this.add(callback, scope, true);
- };
-
- this.remove = function (callback) {
- cbs.forEach(function (item, i) {
- if (item.original === callback) {
- cbs.splice(i, 1);
- return target.off(newEventName, item.patched);
- }
- });
-
- return target.off(newEventName, callback);
- };
-
- this.dispatch = function () {
- target.fire(newEventName);
- return true;
- };
- }
-
- tinymce.util.Dispatcher = Dispatcher;
- tinymce.onBeforeUnload = new Dispatcher(tinymce, "BeforeUnload");
- tinymce.onAddEditor = new Dispatcher(tinymce, "AddEditor", "editor");
- tinymce.onRemoveEditor = new Dispatcher(tinymce, "RemoveEditor", "editor");
-
- tinymce.util.Cookie = {
- get: noop, getHash: noop, remove: noop, set: noop, setHash: noop
- };
-
- function patchEditor(editor) {
-
- function translate(str) {
- var prefix = editor.settings.language || "en";
- var prefixedStr = [prefix, str].join('.');
- var translatedStr = tinymce.i18n.translate(prefixedStr);
-
- return prefixedStr !== translatedStr ? translatedStr : tinymce.i18n.translate(str);
- }
-
- function patchEditorEvents(oldEventNames, argsMap) {
- tinymce.each(oldEventNames.split(" "), function (oldName) {
- editor["on" + oldName] = new Dispatcher(editor, oldName, argsMap);
- });
- }
-
- function convertUndoEventArgs(type, event, target) {
- return [
- event.level,
- target
- ];
- }
-
- function filterSelectionEvents(needsSelection) {
- return function (type, e) {
- if ((!e.selection && !needsSelection) || e.selection == needsSelection) {
- return [e];
- }
- };
- }
-
- if (editor.controlManager) {
- return;
- }
-
- function cmNoop() {
- var obj = {}, methods = 'add addMenu addSeparator collapse createMenu destroy displayColor expand focus ' +
- 'getLength hasMenus hideMenu isActive isCollapsed isDisabled isRendered isSelected mark ' +
- 'postRender remove removeAll renderHTML renderMenu renderNode renderTo select selectByIndex ' +
- 'setActive setAriaProperty setColor setDisabled setSelected setState showMenu update';
-
- log('editor.controlManager.*');
-
- function _noop() {
- return cmNoop();
- }
-
- tinymce.each(methods.split(' '), function (method) {
- obj[method] = _noop;
- });
-
- return obj;
- }
-
- editor.controlManager = {
- buttons: {},
-
- setDisabled: function (name, state) {
- log("controlManager.setDisabled(..)");
-
- if (this.buttons[name]) {
- this.buttons[name].disabled(state);
- }
- },
-
- setActive: function (name, state) {
- log("controlManager.setActive(..)");
-
- if (this.buttons[name]) {
- this.buttons[name].active(state);
- }
- },
-
- onAdd: new Dispatcher(),
- onPostRender: new Dispatcher(),
-
- add: function (obj) {
- return obj;
- },
- createButton: cmNoop,
- createColorSplitButton: cmNoop,
- createControl: cmNoop,
- createDropMenu: cmNoop,
- createListBox: cmNoop,
- createMenuButton: cmNoop,
- createSeparator: cmNoop,
- createSplitButton: cmNoop,
- createToolbar: cmNoop,
- createToolbarGroup: cmNoop,
- destroy: noop,
- get: noop,
- setControlType: cmNoop
- };
-
- patchEditorEvents("PreInit BeforeRenderUI PostRender Load Init Remove Activate Deactivate", "editor");
- patchEditorEvents("Click MouseUp MouseDown DblClick KeyDown KeyUp KeyPress ContextMenu Paste Submit Reset");
- patchEditorEvents("BeforeExecCommand ExecCommand", "command ui value args"); // args.terminate not supported
- patchEditorEvents("PreProcess PostProcess LoadContent SaveContent Change");
- patchEditorEvents("BeforeSetContent BeforeGetContent SetContent GetContent", filterSelectionEvents(false));
- patchEditorEvents("SetProgressState", "state time");
- patchEditorEvents("VisualAid", "element hasVisual");
- patchEditorEvents("Undo Redo", convertUndoEventArgs);
-
- patchEditorEvents("NodeChange", function (type, e) {
- return [
- editor.controlManager,
- e.element,
- editor.selection.isCollapsed(),
- e
- ];
- });
-
- var originalAddButton = editor.addButton;
- editor.addButton = function (name, settings) {
- var originalOnPostRender;
-
- function patchedPostRender() {
- editor.controlManager.buttons[name] = this;
-
- if (originalOnPostRender) {
- return originalOnPostRender.apply(this, arguments);
- }
- }
-
- for (var key in settings) {
- if (key.toLowerCase() === "onpostrender") {
- originalOnPostRender = settings[key];
- settings.onPostRender = patchedPostRender;
- }
- }
-
- if (!originalOnPostRender) {
- settings.onPostRender = patchedPostRender;
- }
-
- if (settings.title) {
- settings.title = translate(settings.title);
- }
-
- return originalAddButton.call(this, name, settings);
- };
-
- editor.on('init', function () {
- var undoManager = editor.undoManager, selection = editor.selection;
-
- undoManager.onUndo = new Dispatcher(editor, "Undo", convertUndoEventArgs, null, undoManager);
- undoManager.onRedo = new Dispatcher(editor, "Redo", convertUndoEventArgs, null, undoManager);
- undoManager.onBeforeAdd = new Dispatcher(editor, "BeforeAddUndo", null, undoManager);
- undoManager.onAdd = new Dispatcher(editor, "AddUndo", null, undoManager);
-
- selection.onBeforeGetContent = new Dispatcher(editor, "BeforeGetContent", filterSelectionEvents(true), selection);
- selection.onGetContent = new Dispatcher(editor, "GetContent", filterSelectionEvents(true), selection);
- selection.onBeforeSetContent = new Dispatcher(editor, "BeforeSetContent", filterSelectionEvents(true), selection);
- selection.onSetContent = new Dispatcher(editor, "SetContent", filterSelectionEvents(true), selection);
- });
-
- editor.on('BeforeRenderUI', function () {
- var windowManager = editor.windowManager;
-
- windowManager.onOpen = new Dispatcher();
- windowManager.onClose = new Dispatcher();
- windowManager.createInstance = function (className, a, b, c, d, e) {
- log("windowManager.createInstance(..)");
-
- var constr = tinymce.resolve(className);
- return new constr(a, b, c, d, e);
- };
- });
- }
-
- tinymce.on('SetupEditor', function (e) {
- patchEditor(e.editor);
- });
-
- tinymce.PluginManager.add("compat3x", patchEditor);
-
- tinymce.addI18n = function (prefix, o) {
- var I18n = tinymce.util.I18n, each = tinymce.each;
-
- if (typeof prefix == "string" && prefix.indexOf('.') === -1) {
- I18n.add(prefix, o);
- return;
- }
-
- if (!tinymce.is(prefix, 'string')) {
- each(prefix, function (o, lc) {
- each(o, function (o, g) {
- each(o, function (o, k) {
- if (g === 'common') {
- I18n.data[lc + '.' + k] = o;
- } else {
- I18n.data[lc + '.' + g + '.' + k] = o;
- }
- });
- });
- });
- } else {
- each(o, function (o, k) {
- I18n.data[prefix + '.' + k] = o;
- });
- }
- };
-})(tinymce);
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/compat3x/plugin.min.js b/src/js/_enqueues/vendor/tinymce/plugins/compat3x/plugin.min.js
index 8562cb7c76111..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/compat3x/plugin.min.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/compat3x/plugin.min.js
@@ -1 +0,0 @@
-!function(u){var t;function l(){}function f(e){!t&&window&&window.console&&(t=!0,console.log("Deprecated TinyMCE API call: "+e))}function i(i,a,d,s){i=i||this;var c=[];a?(this.add=function(o,r,e){function t(e){var t=[];if("string"==typeof d&&(d=d.split(" ")),d&&"function"!=typeof d)for(var n=0;n.on"+a+".add(..)"),i.on(a,t,e);var n={original:o,patched:t};return c.push(n),t},this.addToTop=function(e,t){this.add(e,t,!0)},this.remove=function(n){return c.forEach(function(e,t){if(e.original===n)return c.splice(t,1),i.off(a,e.patched)}),i.off(a,n)},this.dispatch=function(){return i.fire(a),!0}):this.add=this.addToTop=this.remove=this.dispatch=l}function n(s){function e(e,t){u.each(e.split(" "),function(e){s["on"+e]=new i(s,e,t)})}function n(e,t,n){return[t.level,n]}function o(n){return function(e,t){if(!t.selection&&!n||t.selection==n)return[t]}}if(!s.controlManager){s.controlManager={buttons:{},setDisabled:function(e,t){f("controlManager.setDisabled(..)"),this.buttons[e]&&this.buttons[e].disabled(t)},setActive:function(e,t){f("controlManager.setActive(..)"),this.buttons[e]&&this.buttons[e].active(t)},onAdd:new i,onPostRender:new i,add:function(e){return e},createButton:r,createColorSplitButton:r,createControl:r,createDropMenu:r,createListBox:r,createMenuButton:r,createSeparator:r,createSplitButton:r,createToolbar:r,createToolbarGroup:r,destroy:l,get:l,setControlType:r},e("PreInit BeforeRenderUI PostRender Load Init Remove Activate Deactivate","editor"),e("Click MouseUp MouseDown DblClick KeyDown KeyUp KeyPress ContextMenu Paste Submit Reset"),e("BeforeExecCommand ExecCommand","command ui value args"),e("PreProcess PostProcess LoadContent SaveContent Change"),e("BeforeSetContent BeforeGetContent SetContent GetContent",o(!1)),e("SetProgressState","state time"),e("VisualAid","element hasVisual"),e("Undo Redo",n),e("NodeChange",function(e,t){return[s.controlManager,t.element,s.selection.isCollapsed(),t]});var c=s.addButton;s.addButton=function(e,t){var n,o,r,i;function a(){if(s.controlManager.buttons[e]=this,n)return n.apply(this,arguments)}for(var d in t)"onpostrender"===d.toLowerCase()&&(n=t[d],t.onPostRender=a);return n||(t.onPostRender=a),t.title&&(t.title=(o=t.title,r=[s.settings.language||"en",o].join("."),i=u.i18n.translate(r),r!==i?i:u.i18n.translate(o))),c.call(this,e,t)},s.on("init",function(){var e=s.undoManager,t=s.selection;e.onUndo=new i(s,"Undo",n,null,e),e.onRedo=new i(s,"Redo",n,null,e),e.onBeforeAdd=new i(s,"BeforeAddUndo",null,e),e.onAdd=new i(s,"AddUndo",null,e),t.onBeforeGetContent=new i(s,"BeforeGetContent",o(!0),t),t.onGetContent=new i(s,"GetContent",o(!0),t),t.onBeforeSetContent=new i(s,"BeforeSetContent",o(!0),t),t.onSetContent=new i(s,"SetContent",o(!0),t)}),s.on("BeforeRenderUI",function(){var e=s.windowManager;e.onOpen=new i,e.onClose=new i,e.createInstance=function(e,t,n,o,r,i){return f("windowManager.createInstance(..)"),new(u.resolve(e))(t,n,o,r,i)}})}function r(){var t={};function n(){return r()}return f("editor.controlManager.*"),u.each("add addMenu addSeparator collapse createMenu destroy displayColor expand focus getLength hasMenus hideMenu isActive isCollapsed isDisabled isRendered isSelected mark postRender remove removeAll renderHTML renderMenu renderNode renderTo select selectByIndex setActive setAriaProperty setColor setDisabled setSelected setState showMenu update".split(" "),function(e){t[e]=n}),t}}u.util.Dispatcher=i,u.onBeforeUnload=new i(u,"BeforeUnload"),u.onAddEditor=new i(u,"AddEditor","editor"),u.onRemoveEditor=new i(u,"RemoveEditor","editor"),u.util.Cookie={get:l,getHash:l,remove:l,set:l,setHash:l},u.on("SetupEditor",function(e){n(e.editor)}),u.PluginManager.add("compat3x",n),u.addI18n=function(n,e){var r=u.util.I18n,t=u.each;"string"!=typeof n||-1!==n.indexOf(".")?u.is(n,"string")?t(e,function(e,t){r.data[n+"."+t]=e}):t(n,function(e,o){t(e,function(e,n){t(e,function(e,t){"common"===n?r.data[o+"."+t]=e:r.data[o+"."+n+"."+t]=e})})}):r.add(n,e)}}(tinymce);
\ No newline at end of file
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/directionality/plugin.js b/src/js/_enqueues/vendor/tinymce/plugins/directionality/plugin.js
index 4b8669be27b3c..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/directionality/plugin.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/directionality/plugin.js
@@ -1,66 +0,0 @@
-(function () {
-var directionality = (function () {
- 'use strict';
-
- var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');
-
- var setDir = function (editor, dir) {
- var dom = editor.dom;
- var curDir;
- var blocks = editor.selection.getSelectedBlocks();
- if (blocks.length) {
- curDir = dom.getAttrib(blocks[0], 'dir');
- global$1.each(blocks, function (block) {
- if (!dom.getParent(block.parentNode, '*[dir="' + dir + '"]', dom.getRoot())) {
- dom.setAttrib(block, 'dir', curDir !== dir ? dir : null);
- }
- });
- editor.nodeChanged();
- }
- };
- var Direction = { setDir: setDir };
-
- var register = function (editor) {
- editor.addCommand('mceDirectionLTR', function () {
- Direction.setDir(editor, 'ltr');
- });
- editor.addCommand('mceDirectionRTL', function () {
- Direction.setDir(editor, 'rtl');
- });
- };
- var Commands = { register: register };
-
- var generateSelector = function (dir) {
- var selector = [];
- global$1.each('h1 h2 h3 h4 h5 h6 div p'.split(' '), function (name) {
- selector.push(name + '[dir=' + dir + ']');
- });
- return selector.join(',');
- };
- var register$1 = function (editor) {
- editor.addButton('ltr', {
- title: 'Left to right',
- cmd: 'mceDirectionLTR',
- stateSelector: generateSelector('ltr')
- });
- editor.addButton('rtl', {
- title: 'Right to left',
- cmd: 'mceDirectionRTL',
- stateSelector: generateSelector('rtl')
- });
- };
- var Buttons = { register: register$1 };
-
- global.add('directionality', function (editor) {
- Commands.register(editor);
- Buttons.register(editor);
- });
- function Plugin () {
- }
-
- return Plugin;
-
-}());
-})();
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/directionality/plugin.min.js b/src/js/_enqueues/vendor/tinymce/plugins/directionality/plugin.min.js
index bb48bcf941776..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/directionality/plugin.min.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/directionality/plugin.min.js
@@ -1 +0,0 @@
-!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.util.Tools"),e=function(t,e){var i,n=t.dom,o=t.selection.getSelectedBlocks();o.length&&(i=n.getAttrib(o[0],"dir"),c.each(o,function(t){n.getParent(t.parentNode,'*[dir="'+e+'"]',n.getRoot())||n.setAttrib(t,"dir",i!==e?e:null)}),t.nodeChanged())},i=function(t){t.addCommand("mceDirectionLTR",function(){e(t,"ltr")}),t.addCommand("mceDirectionRTL",function(){e(t,"rtl")})},n=function(e){var i=[];return c.each("h1 h2 h3 h4 h5 h6 div p".split(" "),function(t){i.push(t+"[dir="+e+"]")}),i.join(",")},o=function(t){t.addButton("ltr",{title:"Left to right",cmd:"mceDirectionLTR",stateSelector:n("ltr")}),t.addButton("rtl",{title:"Right to left",cmd:"mceDirectionRTL",stateSelector:n("rtl")})};t.add("directionality",function(t){i(t),o(t)})}();
\ No newline at end of file
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/fullscreen/plugin.js b/src/js/_enqueues/vendor/tinymce/plugins/fullscreen/plugin.js
index 1c5c00ea209cc..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/fullscreen/plugin.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/fullscreen/plugin.js
@@ -1,177 +0,0 @@
-(function () {
-var fullscreen = (function (domGlobals) {
- 'use strict';
-
- var Cell = function (initial) {
- var value = initial;
- var get = function () {
- return value;
- };
- var set = function (v) {
- value = v;
- };
- var clone = function () {
- return Cell(get());
- };
- return {
- get: get,
- set: set,
- clone: clone
- };
- };
-
- var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- var get = function (fullscreenState) {
- return {
- isFullscreen: function () {
- return fullscreenState.get() !== null;
- }
- };
- };
- var Api = { get: get };
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
-
- var fireFullscreenStateChanged = function (editor, state) {
- editor.fire('FullscreenStateChanged', { state: state });
- };
- var Events = { fireFullscreenStateChanged: fireFullscreenStateChanged };
-
- var DOM = global$1.DOM;
- var getWindowSize = function () {
- var w;
- var h;
- var win = domGlobals.window;
- var doc = domGlobals.document;
- var body = doc.body;
- if (body.offsetWidth) {
- w = body.offsetWidth;
- h = body.offsetHeight;
- }
- if (win.innerWidth && win.innerHeight) {
- w = win.innerWidth;
- h = win.innerHeight;
- }
- return {
- w: w,
- h: h
- };
- };
- var getScrollPos = function () {
- var vp = DOM.getViewPort();
- return {
- x: vp.x,
- y: vp.y
- };
- };
- var setScrollPos = function (pos) {
- domGlobals.window.scrollTo(pos.x, pos.y);
- };
- var toggleFullscreen = function (editor, fullscreenState) {
- var body = domGlobals.document.body;
- var documentElement = domGlobals.document.documentElement;
- var editorContainerStyle;
- var editorContainer, iframe, iframeStyle;
- var fullscreenInfo = fullscreenState.get();
- var resize = function () {
- DOM.setStyle(iframe, 'height', getWindowSize().h - (editorContainer.clientHeight - iframe.clientHeight));
- };
- var removeResize = function () {
- DOM.unbind(domGlobals.window, 'resize', resize);
- };
- editorContainer = editor.getContainer();
- editorContainerStyle = editorContainer.style;
- iframe = editor.getContentAreaContainer().firstChild;
- iframeStyle = iframe.style;
- if (!fullscreenInfo) {
- var newFullScreenInfo = {
- scrollPos: getScrollPos(),
- containerWidth: editorContainerStyle.width,
- containerHeight: editorContainerStyle.height,
- iframeWidth: iframeStyle.width,
- iframeHeight: iframeStyle.height,
- resizeHandler: resize,
- removeHandler: removeResize
- };
- iframeStyle.width = iframeStyle.height = '100%';
- editorContainerStyle.width = editorContainerStyle.height = '';
- DOM.addClass(body, 'mce-fullscreen');
- DOM.addClass(documentElement, 'mce-fullscreen');
- DOM.addClass(editorContainer, 'mce-fullscreen');
- DOM.bind(domGlobals.window, 'resize', resize);
- editor.on('remove', removeResize);
- resize();
- fullscreenState.set(newFullScreenInfo);
- Events.fireFullscreenStateChanged(editor, true);
- } else {
- iframeStyle.width = fullscreenInfo.iframeWidth;
- iframeStyle.height = fullscreenInfo.iframeHeight;
- if (fullscreenInfo.containerWidth) {
- editorContainerStyle.width = fullscreenInfo.containerWidth;
- }
- if (fullscreenInfo.containerHeight) {
- editorContainerStyle.height = fullscreenInfo.containerHeight;
- }
- DOM.removeClass(body, 'mce-fullscreen');
- DOM.removeClass(documentElement, 'mce-fullscreen');
- DOM.removeClass(editorContainer, 'mce-fullscreen');
- setScrollPos(fullscreenInfo.scrollPos);
- DOM.unbind(domGlobals.window, 'resize', fullscreenInfo.resizeHandler);
- editor.off('remove', fullscreenInfo.removeHandler);
- fullscreenState.set(null);
- Events.fireFullscreenStateChanged(editor, false);
- }
- };
- var Actions = { toggleFullscreen: toggleFullscreen };
-
- var register = function (editor, fullscreenState) {
- editor.addCommand('mceFullScreen', function () {
- Actions.toggleFullscreen(editor, fullscreenState);
- });
- };
- var Commands = { register: register };
-
- var postRender = function (editor) {
- return function (e) {
- var ctrl = e.control;
- editor.on('FullscreenStateChanged', function (e) {
- ctrl.active(e.state);
- });
- };
- };
- var register$1 = function (editor) {
- editor.addMenuItem('fullscreen', {
- text: 'Fullscreen',
- shortcut: 'Ctrl+Shift+F',
- selectable: true,
- cmd: 'mceFullScreen',
- onPostRender: postRender(editor),
- context: 'view'
- });
- editor.addButton('fullscreen', {
- active: false,
- tooltip: 'Fullscreen',
- cmd: 'mceFullScreen',
- onPostRender: postRender(editor)
- });
- };
- var Buttons = { register: register$1 };
-
- global.add('fullscreen', function (editor) {
- var fullscreenState = Cell(null);
- if (editor.settings.inline) {
- return Api.get(fullscreenState);
- }
- Commands.register(editor, fullscreenState);
- Buttons.register(editor);
- editor.addShortcut('Ctrl+Shift+F', '', 'mceFullScreen');
- return Api.get(fullscreenState);
- });
- function Plugin () {
- }
-
- return Plugin;
-
-}(window));
-})();
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/fullscreen/plugin.min.js b/src/js/_enqueues/vendor/tinymce/plugins/fullscreen/plugin.min.js
index 259afc9a5b83a..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/fullscreen/plugin.min.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/fullscreen/plugin.min.js
@@ -1 +0,0 @@
-!function(m){"use strict";var i=function(e){var n=e,t=function(){return n};return{get:t,set:function(e){n=e},clone:function(){return i(t())}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(e){return{isFullscreen:function(){return null!==e.get()}}},n=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),g=function(e,n){e.fire("FullscreenStateChanged",{state:n})},w=n.DOM,r=function(e,n){var t,r,l,i,o,c,s=m.document.body,u=m.document.documentElement,d=n.get(),a=function(){var e,n,t,i;w.setStyle(l,"height",(t=m.window,i=m.document.body,i.offsetWidth&&(e=i.offsetWidth,n=i.offsetHeight),t.innerWidth&&t.innerHeight&&(e=t.innerWidth,n=t.innerHeight),{w:e,h:n}).h-(r.clientHeight-l.clientHeight))},h=function(){w.unbind(m.window,"resize",a)};if(t=(r=e.getContainer()).style,i=(l=e.getContentAreaContainer().firstChild).style,d)i.width=d.iframeWidth,i.height=d.iframeHeight,d.containerWidth&&(t.width=d.containerWidth),d.containerHeight&&(t.height=d.containerHeight),w.removeClass(s,"mce-fullscreen"),w.removeClass(u,"mce-fullscreen"),w.removeClass(r,"mce-fullscreen"),o=d.scrollPos,m.window.scrollTo(o.x,o.y),w.unbind(m.window,"resize",d.resizeHandler),e.off("remove",d.removeHandler),n.set(null),g(e,!1);else{var f={scrollPos:(c=w.getViewPort(),{x:c.x,y:c.y}),containerWidth:t.width,containerHeight:t.height,iframeWidth:i.width,iframeHeight:i.height,resizeHandler:a,removeHandler:h};i.width=i.height="100%",t.width=t.height="",w.addClass(s,"mce-fullscreen"),w.addClass(u,"mce-fullscreen"),w.addClass(r,"mce-fullscreen"),w.bind(m.window,"resize",a),e.on("remove",h),a(),n.set(f),g(e,!0)}},l=function(e,n){e.addCommand("mceFullScreen",function(){r(e,n)})},o=function(t){return function(e){var n=e.control;t.on("FullscreenStateChanged",function(e){n.active(e.state)})}},c=function(e){e.addMenuItem("fullscreen",{text:"Fullscreen",shortcut:"Ctrl+Shift+F",selectable:!0,cmd:"mceFullScreen",onPostRender:o(e),context:"view"}),e.addButton("fullscreen",{active:!1,tooltip:"Fullscreen",cmd:"mceFullScreen",onPostRender:o(e)})};e.add("fullscreen",function(e){var n=i(null);return e.settings.inline||(l(e,n),c(e),e.addShortcut("Ctrl+Shift+F","","mceFullScreen")),t(n)})}(window);
\ No newline at end of file
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/hr/plugin.js b/src/js/_enqueues/vendor/tinymce/plugins/hr/plugin.js
index 56f9d08ca3298..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/hr/plugin.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/hr/plugin.js
@@ -1,39 +0,0 @@
-(function () {
-var hr = (function () {
- 'use strict';
-
- var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- var register = function (editor) {
- editor.addCommand('InsertHorizontalRule', function () {
- editor.execCommand('mceInsertContent', false, ' ');
- });
- };
- var Commands = { register: register };
-
- var register$1 = function (editor) {
- editor.addButton('hr', {
- icon: 'hr',
- tooltip: 'Horizontal line',
- cmd: 'InsertHorizontalRule'
- });
- editor.addMenuItem('hr', {
- icon: 'hr',
- text: 'Horizontal line',
- cmd: 'InsertHorizontalRule',
- context: 'insert'
- });
- };
- var Buttons = { register: register$1 };
-
- global.add('hr', function (editor) {
- Commands.register(editor);
- Buttons.register(editor);
- });
- function Plugin () {
- }
-
- return Plugin;
-
-}());
-})();
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/hr/plugin.min.js b/src/js/_enqueues/vendor/tinymce/plugins/hr/plugin.min.js
index 72bc2cabd109c..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/hr/plugin.min.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/hr/plugin.min.js
@@ -1 +0,0 @@
-!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(n){n.addCommand("InsertHorizontalRule",function(){n.execCommand("mceInsertContent",!1," ")})},o=function(n){n.addButton("hr",{icon:"hr",tooltip:"Horizontal line",cmd:"InsertHorizontalRule"}),n.addMenuItem("hr",{icon:"hr",text:"Horizontal line",cmd:"InsertHorizontalRule",context:"insert"})};n.add("hr",function(n){t(n),o(n)})}();
\ No newline at end of file
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/image/plugin.js b/src/js/_enqueues/vendor/tinymce/plugins/image/plugin.js
index 62ccc9da7818e..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/image/plugin.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/image/plugin.js
@@ -1,1209 +0,0 @@
-(function () {
-var image = (function (domGlobals) {
- 'use strict';
-
- var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
-
- var hasDimensions = function (editor) {
- return editor.settings.image_dimensions === false ? false : true;
- };
- var hasAdvTab = function (editor) {
- return editor.settings.image_advtab === true ? true : false;
- };
- var getPrependUrl = function (editor) {
- return editor.getParam('image_prepend_url', '');
- };
- var getClassList = function (editor) {
- return editor.getParam('image_class_list');
- };
- var hasDescription = function (editor) {
- return editor.settings.image_description === false ? false : true;
- };
- var hasImageTitle = function (editor) {
- return editor.settings.image_title === true ? true : false;
- };
- var hasImageCaption = function (editor) {
- return editor.settings.image_caption === true ? true : false;
- };
- var getImageList = function (editor) {
- return editor.getParam('image_list', false);
- };
- var hasUploadUrl = function (editor) {
- return editor.getParam('images_upload_url', false);
- };
- var hasUploadHandler = function (editor) {
- return editor.getParam('images_upload_handler', false);
- };
- var getUploadUrl = function (editor) {
- return editor.getParam('images_upload_url');
- };
- var getUploadHandler = function (editor) {
- return editor.getParam('images_upload_handler');
- };
- var getUploadBasePath = function (editor) {
- return editor.getParam('images_upload_base_path');
- };
- var getUploadCredentials = function (editor) {
- return editor.getParam('images_upload_credentials');
- };
- var Settings = {
- hasDimensions: hasDimensions,
- hasAdvTab: hasAdvTab,
- getPrependUrl: getPrependUrl,
- getClassList: getClassList,
- hasDescription: hasDescription,
- hasImageTitle: hasImageTitle,
- hasImageCaption: hasImageCaption,
- getImageList: getImageList,
- hasUploadUrl: hasUploadUrl,
- hasUploadHandler: hasUploadHandler,
- getUploadUrl: getUploadUrl,
- getUploadHandler: getUploadHandler,
- getUploadBasePath: getUploadBasePath,
- getUploadCredentials: getUploadCredentials
- };
-
- var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();
-
- var path = function (parts, scope) {
- var o = scope !== undefined && scope !== null ? scope : Global;
- for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) {
- o = o[parts[i]];
- }
- return o;
- };
- var resolve = function (p, scope) {
- var parts = p.split('.');
- return path(parts, scope);
- };
-
- var unsafe = function (name, scope) {
- return resolve(name, scope);
- };
- var getOrDie = function (name, scope) {
- var actual = unsafe(name, scope);
- if (actual === undefined || actual === null) {
- throw new Error(name + ' not available on this browser');
- }
- return actual;
- };
- var Global$1 = { getOrDie: getOrDie };
-
- function FileReader () {
- var f = Global$1.getOrDie('FileReader');
- return new f();
- }
-
- var global$1 = tinymce.util.Tools.resolve('tinymce.util.Promise');
-
- var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools');
-
- var global$3 = tinymce.util.Tools.resolve('tinymce.util.XHR');
-
- var parseIntAndGetMax = function (val1, val2) {
- return Math.max(parseInt(val1, 10), parseInt(val2, 10));
- };
- var getImageSize = function (url, callback) {
- var img = domGlobals.document.createElement('img');
- function done(width, height) {
- if (img.parentNode) {
- img.parentNode.removeChild(img);
- }
- callback({
- width: width,
- height: height
- });
- }
- img.onload = function () {
- var width = parseIntAndGetMax(img.width, img.clientWidth);
- var height = parseIntAndGetMax(img.height, img.clientHeight);
- done(width, height);
- };
- img.onerror = function () {
- done(0, 0);
- };
- var style = img.style;
- style.visibility = 'hidden';
- style.position = 'fixed';
- style.bottom = style.left = '0px';
- style.width = style.height = 'auto';
- domGlobals.document.body.appendChild(img);
- img.src = url;
- };
- var buildListItems = function (inputList, itemCallback, startItems) {
- function appendItems(values, output) {
- output = output || [];
- global$2.each(values, function (item) {
- var menuItem = { text: item.text || item.title };
- if (item.menu) {
- menuItem.menu = appendItems(item.menu);
- } else {
- menuItem.value = item.value;
- itemCallback(menuItem);
- }
- output.push(menuItem);
- });
- return output;
- }
- return appendItems(inputList, startItems || []);
- };
- var removePixelSuffix = function (value) {
- if (value) {
- value = value.replace(/px$/, '');
- }
- return value;
- };
- var addPixelSuffix = function (value) {
- if (value.length > 0 && /^[0-9]+$/.test(value)) {
- value += 'px';
- }
- return value;
- };
- var mergeMargins = function (css) {
- if (css.margin) {
- var splitMargin = css.margin.split(' ');
- switch (splitMargin.length) {
- case 1:
- css['margin-top'] = css['margin-top'] || splitMargin[0];
- css['margin-right'] = css['margin-right'] || splitMargin[0];
- css['margin-bottom'] = css['margin-bottom'] || splitMargin[0];
- css['margin-left'] = css['margin-left'] || splitMargin[0];
- break;
- case 2:
- css['margin-top'] = css['margin-top'] || splitMargin[0];
- css['margin-right'] = css['margin-right'] || splitMargin[1];
- css['margin-bottom'] = css['margin-bottom'] || splitMargin[0];
- css['margin-left'] = css['margin-left'] || splitMargin[1];
- break;
- case 3:
- css['margin-top'] = css['margin-top'] || splitMargin[0];
- css['margin-right'] = css['margin-right'] || splitMargin[1];
- css['margin-bottom'] = css['margin-bottom'] || splitMargin[2];
- css['margin-left'] = css['margin-left'] || splitMargin[1];
- break;
- case 4:
- css['margin-top'] = css['margin-top'] || splitMargin[0];
- css['margin-right'] = css['margin-right'] || splitMargin[1];
- css['margin-bottom'] = css['margin-bottom'] || splitMargin[2];
- css['margin-left'] = css['margin-left'] || splitMargin[3];
- }
- delete css.margin;
- }
- return css;
- };
- var createImageList = function (editor, callback) {
- var imageList = Settings.getImageList(editor);
- if (typeof imageList === 'string') {
- global$3.send({
- url: imageList,
- success: function (text) {
- callback(JSON.parse(text));
- }
- });
- } else if (typeof imageList === 'function') {
- imageList(callback);
- } else {
- callback(imageList);
- }
- };
- var waitLoadImage = function (editor, data, imgElm) {
- function selectImage() {
- imgElm.onload = imgElm.onerror = null;
- if (editor.selection) {
- editor.selection.select(imgElm);
- editor.nodeChanged();
- }
- }
- imgElm.onload = function () {
- if (!data.width && !data.height && Settings.hasDimensions(editor)) {
- editor.dom.setAttribs(imgElm, {
- width: imgElm.clientWidth,
- height: imgElm.clientHeight
- });
- }
- selectImage();
- };
- imgElm.onerror = selectImage;
- };
- var blobToDataUri = function (blob) {
- return new global$1(function (resolve, reject) {
- var reader = FileReader();
- reader.onload = function () {
- resolve(reader.result);
- };
- reader.onerror = function () {
- reject(reader.error.message);
- };
- reader.readAsDataURL(blob);
- });
- };
- var Utils = {
- getImageSize: getImageSize,
- buildListItems: buildListItems,
- removePixelSuffix: removePixelSuffix,
- addPixelSuffix: addPixelSuffix,
- mergeMargins: mergeMargins,
- createImageList: createImageList,
- waitLoadImage: waitLoadImage,
- blobToDataUri: blobToDataUri
- };
-
- var global$4 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
-
- var hasOwnProperty = Object.prototype.hasOwnProperty;
- var shallow = function (old, nu) {
- return nu;
- };
- var baseMerge = function (merger) {
- return function () {
- var objects = new Array(arguments.length);
- for (var i = 0; i < objects.length; i++) {
- objects[i] = arguments[i];
- }
- if (objects.length === 0) {
- throw new Error('Can\'t merge zero objects');
- }
- var ret = {};
- for (var j = 0; j < objects.length; j++) {
- var curObject = objects[j];
- for (var key in curObject) {
- if (hasOwnProperty.call(curObject, key)) {
- ret[key] = merger(ret[key], curObject[key]);
- }
- }
- }
- return ret;
- };
- };
- var merge = baseMerge(shallow);
-
- var DOM = global$4.DOM;
- var getHspace = function (image) {
- if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) {
- return Utils.removePixelSuffix(image.style.marginLeft);
- } else {
- return '';
- }
- };
- var getVspace = function (image) {
- if (image.style.marginTop && image.style.marginBottom && image.style.marginTop === image.style.marginBottom) {
- return Utils.removePixelSuffix(image.style.marginTop);
- } else {
- return '';
- }
- };
- var getBorder = function (image) {
- if (image.style.borderWidth) {
- return Utils.removePixelSuffix(image.style.borderWidth);
- } else {
- return '';
- }
- };
- var getAttrib = function (image, name) {
- if (image.hasAttribute(name)) {
- return image.getAttribute(name);
- } else {
- return '';
- }
- };
- var getStyle = function (image, name) {
- return image.style[name] ? image.style[name] : '';
- };
- var hasCaption = function (image) {
- return image.parentNode !== null && image.parentNode.nodeName === 'FIGURE';
- };
- var setAttrib = function (image, name, value) {
- image.setAttribute(name, value);
- };
- var wrapInFigure = function (image) {
- var figureElm = DOM.create('figure', { class: 'image' });
- DOM.insertAfter(figureElm, image);
- figureElm.appendChild(image);
- figureElm.appendChild(DOM.create('figcaption', { contentEditable: true }, 'Caption'));
- figureElm.contentEditable = 'false';
- };
- var removeFigure = function (image) {
- var figureElm = image.parentNode;
- DOM.insertAfter(image, figureElm);
- DOM.remove(figureElm);
- };
- var toggleCaption = function (image) {
- if (hasCaption(image)) {
- removeFigure(image);
- } else {
- wrapInFigure(image);
- }
- };
- var normalizeStyle = function (image, normalizeCss) {
- var attrValue = image.getAttribute('style');
- var value = normalizeCss(attrValue !== null ? attrValue : '');
- if (value.length > 0) {
- image.setAttribute('style', value);
- image.setAttribute('data-mce-style', value);
- } else {
- image.removeAttribute('style');
- }
- };
- var setSize = function (name, normalizeCss) {
- return function (image, name, value) {
- if (image.style[name]) {
- image.style[name] = Utils.addPixelSuffix(value);
- normalizeStyle(image, normalizeCss);
- } else {
- setAttrib(image, name, value);
- }
- };
- };
- var getSize = function (image, name) {
- if (image.style[name]) {
- return Utils.removePixelSuffix(image.style[name]);
- } else {
- return getAttrib(image, name);
- }
- };
- var setHspace = function (image, value) {
- var pxValue = Utils.addPixelSuffix(value);
- image.style.marginLeft = pxValue;
- image.style.marginRight = pxValue;
- };
- var setVspace = function (image, value) {
- var pxValue = Utils.addPixelSuffix(value);
- image.style.marginTop = pxValue;
- image.style.marginBottom = pxValue;
- };
- var setBorder = function (image, value) {
- var pxValue = Utils.addPixelSuffix(value);
- image.style.borderWidth = pxValue;
- };
- var setBorderStyle = function (image, value) {
- image.style.borderStyle = value;
- };
- var getBorderStyle = function (image) {
- return getStyle(image, 'borderStyle');
- };
- var isFigure = function (elm) {
- return elm.nodeName === 'FIGURE';
- };
- var defaultData = function () {
- return {
- src: '',
- alt: '',
- title: '',
- width: '',
- height: '',
- class: '',
- style: '',
- caption: false,
- hspace: '',
- vspace: '',
- border: '',
- borderStyle: ''
- };
- };
- var getStyleValue = function (normalizeCss, data) {
- var image = domGlobals.document.createElement('img');
- setAttrib(image, 'style', data.style);
- if (getHspace(image) || data.hspace !== '') {
- setHspace(image, data.hspace);
- }
- if (getVspace(image) || data.vspace !== '') {
- setVspace(image, data.vspace);
- }
- if (getBorder(image) || data.border !== '') {
- setBorder(image, data.border);
- }
- if (getBorderStyle(image) || data.borderStyle !== '') {
- setBorderStyle(image, data.borderStyle);
- }
- return normalizeCss(image.getAttribute('style'));
- };
- var create = function (normalizeCss, data) {
- var image = domGlobals.document.createElement('img');
- write(normalizeCss, merge(data, { caption: false }), image);
- setAttrib(image, 'alt', data.alt);
- if (data.caption) {
- var figure = DOM.create('figure', { class: 'image' });
- figure.appendChild(image);
- figure.appendChild(DOM.create('figcaption', { contentEditable: true }, 'Caption'));
- figure.contentEditable = 'false';
- return figure;
- } else {
- return image;
- }
- };
- var read = function (normalizeCss, image) {
- return {
- src: getAttrib(image, 'src'),
- alt: getAttrib(image, 'alt'),
- title: getAttrib(image, 'title'),
- width: getSize(image, 'width'),
- height: getSize(image, 'height'),
- class: getAttrib(image, 'class'),
- style: normalizeCss(getAttrib(image, 'style')),
- caption: hasCaption(image),
- hspace: getHspace(image),
- vspace: getVspace(image),
- border: getBorder(image),
- borderStyle: getStyle(image, 'borderStyle')
- };
- };
- var updateProp = function (image, oldData, newData, name, set) {
- if (newData[name] !== oldData[name]) {
- set(image, name, newData[name]);
- }
- };
- var normalized = function (set, normalizeCss) {
- return function (image, name, value) {
- set(image, value);
- normalizeStyle(image, normalizeCss);
- };
- };
- var write = function (normalizeCss, newData, image) {
- var oldData = read(normalizeCss, image);
- updateProp(image, oldData, newData, 'caption', function (image, _name, _value) {
- return toggleCaption(image);
- });
- updateProp(image, oldData, newData, 'src', setAttrib);
- updateProp(image, oldData, newData, 'alt', setAttrib);
- updateProp(image, oldData, newData, 'title', setAttrib);
- updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss));
- updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss));
- updateProp(image, oldData, newData, 'class', setAttrib);
- updateProp(image, oldData, newData, 'style', normalized(function (image, value) {
- return setAttrib(image, 'style', value);
- }, normalizeCss));
- updateProp(image, oldData, newData, 'hspace', normalized(setHspace, normalizeCss));
- updateProp(image, oldData, newData, 'vspace', normalized(setVspace, normalizeCss));
- updateProp(image, oldData, newData, 'border', normalized(setBorder, normalizeCss));
- updateProp(image, oldData, newData, 'borderStyle', normalized(setBorderStyle, normalizeCss));
- };
-
- var normalizeCss = function (editor, cssText) {
- var css = editor.dom.styles.parse(cssText);
- var mergedCss = Utils.mergeMargins(css);
- var compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss));
- return editor.dom.styles.serialize(compressed);
- };
- var getSelectedImage = function (editor) {
- var imgElm = editor.selection.getNode();
- var figureElm = editor.dom.getParent(imgElm, 'figure.image');
- if (figureElm) {
- return editor.dom.select('img', figureElm)[0];
- }
- if (imgElm && (imgElm.nodeName !== 'IMG' || imgElm.getAttribute('data-mce-object') || imgElm.getAttribute('data-mce-placeholder'))) {
- return null;
- }
- return imgElm;
- };
- var splitTextBlock = function (editor, figure) {
- var dom = editor.dom;
- var textBlock = dom.getParent(figure.parentNode, function (node) {
- return editor.schema.getTextBlockElements()[node.nodeName];
- }, editor.getBody());
- if (textBlock) {
- return dom.split(textBlock, figure);
- } else {
- return figure;
- }
- };
- var readImageDataFromSelection = function (editor) {
- var image = getSelectedImage(editor);
- return image ? read(function (css) {
- return normalizeCss(editor, css);
- }, image) : defaultData();
- };
- var insertImageAtCaret = function (editor, data) {
- var elm = create(function (css) {
- return normalizeCss(editor, css);
- }, data);
- editor.dom.setAttrib(elm, 'data-mce-id', '__mcenew');
- editor.focus();
- editor.selection.setContent(elm.outerHTML);
- var insertedElm = editor.dom.select('*[data-mce-id="__mcenew"]')[0];
- editor.dom.setAttrib(insertedElm, 'data-mce-id', null);
- if (isFigure(insertedElm)) {
- var figure = splitTextBlock(editor, insertedElm);
- editor.selection.select(figure);
- } else {
- editor.selection.select(insertedElm);
- }
- };
- var syncSrcAttr = function (editor, image) {
- editor.dom.setAttrib(image, 'src', image.getAttribute('src'));
- };
- var deleteImage = function (editor, image) {
- if (image) {
- var elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image;
- editor.dom.remove(elm);
- editor.focus();
- editor.nodeChanged();
- if (editor.dom.isEmpty(editor.getBody())) {
- editor.setContent('');
- editor.selection.setCursorLocation();
- }
- }
- };
- var writeImageDataToSelection = function (editor, data) {
- var image = getSelectedImage(editor);
- write(function (css) {
- return normalizeCss(editor, css);
- }, data, image);
- syncSrcAttr(editor, image);
- if (isFigure(image.parentNode)) {
- var figure = image.parentNode;
- splitTextBlock(editor, figure);
- editor.selection.select(image.parentNode);
- } else {
- editor.selection.select(image);
- Utils.waitLoadImage(editor, data, image);
- }
- };
- var insertOrUpdateImage = function (editor, data) {
- var image = getSelectedImage(editor);
- if (image) {
- if (data.src) {
- writeImageDataToSelection(editor, data);
- } else {
- deleteImage(editor, image);
- }
- } else if (data.src) {
- insertImageAtCaret(editor, data);
- }
- };
-
- var updateVSpaceHSpaceBorder = function (editor) {
- return function (evt) {
- var dom = editor.dom;
- var rootControl = evt.control.rootControl;
- if (!Settings.hasAdvTab(editor)) {
- return;
- }
- var data = rootControl.toJSON();
- var css = dom.parseStyle(data.style);
- rootControl.find('#vspace').value('');
- rootControl.find('#hspace').value('');
- css = Utils.mergeMargins(css);
- if (css['margin-top'] && css['margin-bottom'] || css['margin-right'] && css['margin-left']) {
- if (css['margin-top'] === css['margin-bottom']) {
- rootControl.find('#vspace').value(Utils.removePixelSuffix(css['margin-top']));
- } else {
- rootControl.find('#vspace').value('');
- }
- if (css['margin-right'] === css['margin-left']) {
- rootControl.find('#hspace').value(Utils.removePixelSuffix(css['margin-right']));
- } else {
- rootControl.find('#hspace').value('');
- }
- }
- if (css['border-width']) {
- rootControl.find('#border').value(Utils.removePixelSuffix(css['border-width']));
- } else {
- rootControl.find('#border').value('');
- }
- if (css['border-style']) {
- rootControl.find('#borderStyle').value(css['border-style']);
- } else {
- rootControl.find('#borderStyle').value('');
- }
- rootControl.find('#style').value(dom.serializeStyle(dom.parseStyle(dom.serializeStyle(css))));
- };
- };
- var updateStyle = function (editor, win) {
- win.find('#style').each(function (ctrl) {
- var value = getStyleValue(function (css) {
- return normalizeCss(editor, css);
- }, merge(defaultData(), win.toJSON()));
- ctrl.value(value);
- });
- };
- var makeTab = function (editor) {
- return {
- title: 'Advanced',
- type: 'form',
- pack: 'start',
- items: [
- {
- label: 'Style',
- name: 'style',
- type: 'textbox',
- onchange: updateVSpaceHSpaceBorder(editor)
- },
- {
- type: 'form',
- layout: 'grid',
- packV: 'start',
- columns: 2,
- padding: 0,
- defaults: {
- type: 'textbox',
- maxWidth: 50,
- onchange: function (evt) {
- updateStyle(editor, evt.control.rootControl);
- }
- },
- items: [
- {
- label: 'Vertical space',
- name: 'vspace'
- },
- {
- label: 'Border width',
- name: 'border'
- },
- {
- label: 'Horizontal space',
- name: 'hspace'
- },
- {
- label: 'Border style',
- type: 'listbox',
- name: 'borderStyle',
- width: 90,
- maxWidth: 90,
- onselect: function (evt) {
- updateStyle(editor, evt.control.rootControl);
- },
- values: [
- {
- text: 'Select...',
- value: ''
- },
- {
- text: 'Solid',
- value: 'solid'
- },
- {
- text: 'Dotted',
- value: 'dotted'
- },
- {
- text: 'Dashed',
- value: 'dashed'
- },
- {
- text: 'Double',
- value: 'double'
- },
- {
- text: 'Groove',
- value: 'groove'
- },
- {
- text: 'Ridge',
- value: 'ridge'
- },
- {
- text: 'Inset',
- value: 'inset'
- },
- {
- text: 'Outset',
- value: 'outset'
- },
- {
- text: 'None',
- value: 'none'
- },
- {
- text: 'Hidden',
- value: 'hidden'
- }
- ]
- }
- ]
- }
- ]
- };
- };
- var AdvTab = { makeTab: makeTab };
-
- var doSyncSize = function (widthCtrl, heightCtrl) {
- widthCtrl.state.set('oldVal', widthCtrl.value());
- heightCtrl.state.set('oldVal', heightCtrl.value());
- };
- var doSizeControls = function (win, f) {
- var widthCtrl = win.find('#width')[0];
- var heightCtrl = win.find('#height')[0];
- var constrained = win.find('#constrain')[0];
- if (widthCtrl && heightCtrl && constrained) {
- f(widthCtrl, heightCtrl, constrained.checked());
- }
- };
- var doUpdateSize = function (widthCtrl, heightCtrl, isContrained) {
- var oldWidth = widthCtrl.state.get('oldVal');
- var oldHeight = heightCtrl.state.get('oldVal');
- var newWidth = widthCtrl.value();
- var newHeight = heightCtrl.value();
- if (isContrained && oldWidth && oldHeight && newWidth && newHeight) {
- if (newWidth !== oldWidth) {
- newHeight = Math.round(newWidth / oldWidth * newHeight);
- if (!isNaN(newHeight)) {
- heightCtrl.value(newHeight);
- }
- } else {
- newWidth = Math.round(newHeight / oldHeight * newWidth);
- if (!isNaN(newWidth)) {
- widthCtrl.value(newWidth);
- }
- }
- }
- doSyncSize(widthCtrl, heightCtrl);
- };
- var syncSize = function (win) {
- doSizeControls(win, doSyncSize);
- };
- var updateSize = function (win) {
- doSizeControls(win, doUpdateSize);
- };
- var createUi = function () {
- var recalcSize = function (evt) {
- updateSize(evt.control.rootControl);
- };
- return {
- type: 'container',
- label: 'Dimensions',
- layout: 'flex',
- align: 'center',
- spacing: 5,
- items: [
- {
- name: 'width',
- type: 'textbox',
- maxLength: 5,
- size: 5,
- onchange: recalcSize,
- ariaLabel: 'Width'
- },
- {
- type: 'label',
- text: 'x'
- },
- {
- name: 'height',
- type: 'textbox',
- maxLength: 5,
- size: 5,
- onchange: recalcSize,
- ariaLabel: 'Height'
- },
- {
- name: 'constrain',
- type: 'checkbox',
- checked: true,
- text: 'Constrain proportions'
- }
- ]
- };
- };
- var SizeManager = {
- createUi: createUi,
- syncSize: syncSize,
- updateSize: updateSize
- };
-
- var onSrcChange = function (evt, editor) {
- var srcURL, prependURL, absoluteURLPattern;
- var meta = evt.meta || {};
- var control = evt.control;
- var rootControl = control.rootControl;
- var imageListCtrl = rootControl.find('#image-list')[0];
- if (imageListCtrl) {
- imageListCtrl.value(editor.convertURL(control.value(), 'src'));
- }
- global$2.each(meta, function (value, key) {
- rootControl.find('#' + key).value(value);
- });
- if (!meta.width && !meta.height) {
- srcURL = editor.convertURL(control.value(), 'src');
- prependURL = Settings.getPrependUrl(editor);
- absoluteURLPattern = new RegExp('^(?:[a-z]+:)?//', 'i');
- if (prependURL && !absoluteURLPattern.test(srcURL) && srcURL.substring(0, prependURL.length) !== prependURL) {
- srcURL = prependURL + srcURL;
- }
- control.value(srcURL);
- Utils.getImageSize(editor.documentBaseURI.toAbsolute(control.value()), function (data) {
- if (data.width && data.height && Settings.hasDimensions(editor)) {
- rootControl.find('#width').value(data.width);
- rootControl.find('#height').value(data.height);
- SizeManager.syncSize(rootControl);
- }
- });
- }
- };
- var onBeforeCall = function (evt) {
- evt.meta = evt.control.rootControl.toJSON();
- };
- var getGeneralItems = function (editor, imageListCtrl) {
- var generalFormItems = [
- {
- name: 'src',
- type: 'filepicker',
- filetype: 'image',
- label: 'Source',
- autofocus: true,
- onchange: function (evt) {
- onSrcChange(evt, editor);
- },
- onbeforecall: onBeforeCall
- },
- imageListCtrl
- ];
- if (Settings.hasDescription(editor)) {
- generalFormItems.push({
- name: 'alt',
- type: 'textbox',
- label: 'Image description'
- });
- }
- if (Settings.hasImageTitle(editor)) {
- generalFormItems.push({
- name: 'title',
- type: 'textbox',
- label: 'Image Title'
- });
- }
- if (Settings.hasDimensions(editor)) {
- generalFormItems.push(SizeManager.createUi());
- }
- if (Settings.getClassList(editor)) {
- generalFormItems.push({
- name: 'class',
- type: 'listbox',
- label: 'Class',
- values: Utils.buildListItems(Settings.getClassList(editor), function (item) {
- if (item.value) {
- item.textStyle = function () {
- return editor.formatter.getCssText({
- inline: 'img',
- classes: [item.value]
- });
- };
- }
- })
- });
- }
- if (Settings.hasImageCaption(editor)) {
- generalFormItems.push({
- name: 'caption',
- type: 'checkbox',
- label: 'Caption'
- });
- }
- return generalFormItems;
- };
- var makeTab$1 = function (editor, imageListCtrl) {
- return {
- title: 'General',
- type: 'form',
- items: getGeneralItems(editor, imageListCtrl)
- };
- };
- var MainTab = {
- makeTab: makeTab$1,
- getGeneralItems: getGeneralItems
- };
-
- var url = function () {
- return Global$1.getOrDie('URL');
- };
- var createObjectURL = function (blob) {
- return url().createObjectURL(blob);
- };
- var revokeObjectURL = function (u) {
- url().revokeObjectURL(u);
- };
- var URL = {
- createObjectURL: createObjectURL,
- revokeObjectURL: revokeObjectURL
- };
-
- var global$5 = tinymce.util.Tools.resolve('tinymce.ui.Factory');
-
- function XMLHttpRequest () {
- var f = Global$1.getOrDie('XMLHttpRequest');
- return new f();
- }
-
- var noop = function () {
- };
- var pathJoin = function (path1, path2) {
- if (path1) {
- return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, '');
- }
- return path2;
- };
- function Uploader (settings) {
- var defaultHandler = function (blobInfo, success, failure, progress) {
- var xhr, formData;
- xhr = XMLHttpRequest();
- xhr.open('POST', settings.url);
- xhr.withCredentials = settings.credentials;
- xhr.upload.onprogress = function (e) {
- progress(e.loaded / e.total * 100);
- };
- xhr.onerror = function () {
- failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status);
- };
- xhr.onload = function () {
- var json;
- if (xhr.status < 200 || xhr.status >= 300) {
- failure('HTTP Error: ' + xhr.status);
- return;
- }
- json = JSON.parse(xhr.responseText);
- if (!json || typeof json.location !== 'string') {
- failure('Invalid JSON: ' + xhr.responseText);
- return;
- }
- success(pathJoin(settings.basePath, json.location));
- };
- formData = new domGlobals.FormData();
- formData.append('file', blobInfo.blob(), blobInfo.filename());
- xhr.send(formData);
- };
- var uploadBlob = function (blobInfo, handler) {
- return new global$1(function (resolve, reject) {
- try {
- handler(blobInfo, resolve, reject, noop);
- } catch (ex) {
- reject(ex.message);
- }
- });
- };
- var isDefaultHandler = function (handler) {
- return handler === defaultHandler;
- };
- var upload = function (blobInfo) {
- return !settings.url && isDefaultHandler(settings.handler) ? global$1.reject('Upload url missing from the settings.') : uploadBlob(blobInfo, settings.handler);
- };
- settings = global$2.extend({
- credentials: false,
- handler: defaultHandler
- }, settings);
- return { upload: upload };
- }
-
- var onFileInput = function (editor) {
- return function (evt) {
- var Throbber = global$5.get('Throbber');
- var rootControl = evt.control.rootControl;
- var throbber = new Throbber(rootControl.getEl());
- var file = evt.control.value();
- var blobUri = URL.createObjectURL(file);
- var uploader = Uploader({
- url: Settings.getUploadUrl(editor),
- basePath: Settings.getUploadBasePath(editor),
- credentials: Settings.getUploadCredentials(editor),
- handler: Settings.getUploadHandler(editor)
- });
- var finalize = function () {
- throbber.hide();
- URL.revokeObjectURL(blobUri);
- };
- throbber.show();
- return Utils.blobToDataUri(file).then(function (dataUrl) {
- var blobInfo = editor.editorUpload.blobCache.create({
- blob: file,
- blobUri: blobUri,
- name: file.name ? file.name.replace(/\.[^\.]+$/, '') : null,
- base64: dataUrl.split(',')[1]
- });
- return uploader.upload(blobInfo).then(function (url) {
- var src = rootControl.find('#src');
- src.value(url);
- rootControl.find('tabpanel')[0].activateTab(0);
- src.fire('change');
- finalize();
- return url;
- });
- }).catch(function (err) {
- editor.windowManager.alert(err);
- finalize();
- });
- };
- };
- var acceptExts = '.jpg,.jpeg,.png,.gif';
- var makeTab$2 = function (editor) {
- return {
- title: 'Upload',
- type: 'form',
- layout: 'flex',
- direction: 'column',
- align: 'stretch',
- padding: '20 20 20 20',
- items: [
- {
- type: 'container',
- layout: 'flex',
- direction: 'column',
- align: 'center',
- spacing: 10,
- items: [
- {
- text: 'Browse for an image',
- type: 'browsebutton',
- accept: acceptExts,
- onchange: onFileInput(editor)
- },
- {
- text: 'OR',
- type: 'label'
- }
- ]
- },
- {
- text: 'Drop an image here',
- type: 'dropzone',
- accept: acceptExts,
- height: 100,
- onchange: onFileInput(editor)
- }
- ]
- };
- };
- var UploadTab = { makeTab: makeTab$2 };
-
- function curry(fn) {
- var initialArgs = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- initialArgs[_i - 1] = arguments[_i];
- }
- return function () {
- var restArgs = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- restArgs[_i] = arguments[_i];
- }
- var all = initialArgs.concat(restArgs);
- return fn.apply(null, all);
- };
- }
-
- var submitForm = function (editor, evt) {
- var win = evt.control.getRoot();
- SizeManager.updateSize(win);
- editor.undoManager.transact(function () {
- var data = merge(readImageDataFromSelection(editor), win.toJSON());
- insertOrUpdateImage(editor, data);
- });
- editor.editorUpload.uploadImagesAuto();
- };
- function Dialog (editor) {
- function showDialog(imageList) {
- var data = readImageDataFromSelection(editor);
- var win, imageListCtrl;
- if (imageList) {
- imageListCtrl = {
- type: 'listbox',
- label: 'Image list',
- name: 'image-list',
- values: Utils.buildListItems(imageList, function (item) {
- item.value = editor.convertURL(item.value || item.url, 'src');
- }, [{
- text: 'None',
- value: ''
- }]),
- value: data.src && editor.convertURL(data.src, 'src'),
- onselect: function (e) {
- var altCtrl = win.find('#alt');
- if (!altCtrl.value() || e.lastControl && altCtrl.value() === e.lastControl.text()) {
- altCtrl.value(e.control.text());
- }
- win.find('#src').value(e.control.value()).fire('change');
- },
- onPostRender: function () {
- imageListCtrl = this;
- }
- };
- }
- if (Settings.hasAdvTab(editor) || Settings.hasUploadUrl(editor) || Settings.hasUploadHandler(editor)) {
- var body = [MainTab.makeTab(editor, imageListCtrl)];
- if (Settings.hasAdvTab(editor)) {
- body.push(AdvTab.makeTab(editor));
- }
- if (Settings.hasUploadUrl(editor) || Settings.hasUploadHandler(editor)) {
- body.push(UploadTab.makeTab(editor));
- }
- win = editor.windowManager.open({
- title: 'Insert/edit image',
- data: data,
- bodyType: 'tabpanel',
- body: body,
- onSubmit: curry(submitForm, editor)
- });
- } else {
- win = editor.windowManager.open({
- title: 'Insert/edit image',
- data: data,
- body: MainTab.getGeneralItems(editor, imageListCtrl),
- onSubmit: curry(submitForm, editor)
- });
- }
- SizeManager.syncSize(win);
- }
- function open() {
- Utils.createImageList(editor, showDialog);
- }
- return { open: open };
- }
-
- var register = function (editor) {
- editor.addCommand('mceImage', Dialog(editor).open);
- };
- var Commands = { register: register };
-
- var hasImageClass = function (node) {
- var className = node.attr('class');
- return className && /\bimage\b/.test(className);
- };
- var toggleContentEditableState = function (state) {
- return function (nodes) {
- var i = nodes.length, node;
- var toggleContentEditable = function (node) {
- node.attr('contenteditable', state ? 'true' : null);
- };
- while (i--) {
- node = nodes[i];
- if (hasImageClass(node)) {
- node.attr('contenteditable', state ? 'false' : null);
- global$2.each(node.getAll('figcaption'), toggleContentEditable);
- }
- }
- };
- };
- var setup = function (editor) {
- editor.on('preInit', function () {
- editor.parser.addNodeFilter('figure', toggleContentEditableState(true));
- editor.serializer.addNodeFilter('figure', toggleContentEditableState(false));
- });
- };
- var FilterContent = { setup: setup };
-
- var register$1 = function (editor) {
- editor.addButton('image', {
- icon: 'image',
- tooltip: 'Insert/edit image',
- onclick: Dialog(editor).open,
- stateSelector: 'img:not([data-mce-object],[data-mce-placeholder]),figure.image'
- });
- editor.addMenuItem('image', {
- icon: 'image',
- text: 'Image',
- onclick: Dialog(editor).open,
- context: 'insert',
- prependToContext: true
- });
- };
- var Buttons = { register: register$1 };
-
- global.add('image', function (editor) {
- FilterContent.setup(editor);
- Buttons.register(editor);
- Commands.register(editor);
- });
- function Plugin () {
- }
-
- return Plugin;
-
-}(window));
-})();
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/image/plugin.min.js b/src/js/_enqueues/vendor/tinymce/plugins/image/plugin.min.js
index 23473aa76db46..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/image/plugin.min.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/image/plugin.min.js
@@ -1 +0,0 @@
-!function(l){"use strict";var i,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),d=function(e){return!1!==e.settings.image_dimensions},u=function(e){return!0===e.settings.image_advtab},m=function(e){return e.getParam("image_prepend_url","")},n=function(e){return e.getParam("image_class_list")},r=function(e){return!1!==e.settings.image_description},a=function(e){return!0===e.settings.image_title},o=function(e){return!0===e.settings.image_caption},c=function(e){return e.getParam("image_list",!1)},s=function(e){return e.getParam("images_upload_url",!1)},g=function(e){return e.getParam("images_upload_handler",!1)},f=function(e){return e.getParam("images_upload_url")},p=function(e){return e.getParam("images_upload_handler")},h=function(e){return e.getParam("images_upload_base_path")},v=function(e){return e.getParam("images_upload_credentials")},b="undefined"!=typeof l.window?l.window:Function("return this;")(),y=function(e,t){return function(e,t){for(var n=t!==undefined&&null!==t?t:b,r=0;r 10) {
- var link = domGlobals.document.createElement('a');
- link.target = '_blank';
- link.href = url;
- link.rel = 'noreferrer noopener';
- var evt = domGlobals.document.createEvent('MouseEvents');
- evt.initMouseEvent('click', true, true, domGlobals.window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
- appendClickRemove(link, evt);
- } else {
- var win = domGlobals.window.open('', '_blank');
- if (win) {
- win.opener = null;
- var doc = win.document;
- doc.open();
- doc.write(' ');
- doc.close();
- }
- }
- };
- var OpenUrl = { open: open };
-
- var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools');
-
- var toggleTargetRules = function (rel, isUnsafe) {
- var rules = ['noopener'];
- var newRel = rel ? rel.split(/\s+/) : [];
- var toString = function (rel) {
- return global$4.trim(rel.sort().join(' '));
- };
- var addTargetRules = function (rel) {
- rel = removeTargetRules(rel);
- return rel.length ? rel.concat(rules) : rules;
- };
- var removeTargetRules = function (rel) {
- return rel.filter(function (val) {
- return global$4.inArray(rules, val) === -1;
- });
- };
- newRel = isUnsafe ? addTargetRules(newRel) : removeTargetRules(newRel);
- return newRel.length ? toString(newRel) : null;
- };
- var trimCaretContainers = function (text) {
- return text.replace(/\uFEFF/g, '');
- };
- var getAnchorElement = function (editor, selectedElm) {
- selectedElm = selectedElm || editor.selection.getNode();
- if (isImageFigure(selectedElm)) {
- return editor.dom.select('a[href]', selectedElm)[0];
- } else {
- return editor.dom.getParent(selectedElm, 'a[href]');
- }
- };
- var getAnchorText = function (selection, anchorElm) {
- var text = anchorElm ? anchorElm.innerText || anchorElm.textContent : selection.getContent({ format: 'text' });
- return trimCaretContainers(text);
- };
- var isLink = function (elm) {
- return elm && elm.nodeName === 'A' && elm.href;
- };
- var hasLinks = function (elements) {
- return global$4.grep(elements, isLink).length > 0;
- };
- var isOnlyTextSelected = function (html) {
- if (/]+>[^<]+<\/a>$/.test(html) || html.indexOf('href=') === -1)) {
- return false;
- }
- return true;
- };
- var isImageFigure = function (node) {
- return node && node.nodeName === 'FIGURE' && /\bimage\b/i.test(node.className);
- };
- var link = function (editor, attachState) {
- return function (data) {
- editor.undoManager.transact(function () {
- var selectedElm = editor.selection.getNode();
- var anchorElm = getAnchorElement(editor, selectedElm);
- var linkAttrs = {
- href: data.href,
- target: data.target ? data.target : null,
- rel: data.rel ? data.rel : null,
- class: data.class ? data.class : null,
- title: data.title ? data.title : null
- };
- if (!Settings.hasRelList(editor.settings) && Settings.allowUnsafeLinkTarget(editor.settings) === false) {
- linkAttrs.rel = toggleTargetRules(linkAttrs.rel, linkAttrs.target === '_blank');
- }
- if (data.href === attachState.href) {
- attachState.attach();
- attachState = {};
- }
- if (anchorElm) {
- editor.focus();
- if (data.hasOwnProperty('text')) {
- if ('innerText' in anchorElm) {
- anchorElm.innerText = data.text;
- } else {
- anchorElm.textContent = data.text;
- }
- }
- editor.dom.setAttribs(anchorElm, linkAttrs);
- editor.selection.select(anchorElm);
- editor.undoManager.add();
- } else {
- if (isImageFigure(selectedElm)) {
- linkImageFigure(editor, selectedElm, linkAttrs);
- } else if (data.hasOwnProperty('text')) {
- editor.insertContent(editor.dom.createHTML('a', linkAttrs, editor.dom.encode(data.text)));
- } else {
- editor.execCommand('mceInsertLink', false, linkAttrs);
- }
- }
- });
- };
- };
- var unlink = function (editor) {
- return function () {
- editor.undoManager.transact(function () {
- var node = editor.selection.getNode();
- if (isImageFigure(node)) {
- unlinkImageFigure(editor, node);
- } else {
- editor.execCommand('unlink');
- }
- });
- };
- };
- var unlinkImageFigure = function (editor, fig) {
- var a, img;
- img = editor.dom.select('img', fig)[0];
- if (img) {
- a = editor.dom.getParents(img, 'a[href]', fig)[0];
- if (a) {
- a.parentNode.insertBefore(img, a);
- editor.dom.remove(a);
- }
- }
- };
- var linkImageFigure = function (editor, fig, attrs) {
- var a, img;
- img = editor.dom.select('img', fig)[0];
- if (img) {
- a = editor.dom.create('a', attrs);
- img.parentNode.insertBefore(a, img);
- a.appendChild(img);
- }
- };
- var Utils = {
- link: link,
- unlink: unlink,
- isLink: isLink,
- hasLinks: hasLinks,
- isOnlyTextSelected: isOnlyTextSelected,
- getAnchorElement: getAnchorElement,
- getAnchorText: getAnchorText,
- toggleTargetRules: toggleTargetRules
- };
-
- var global$5 = tinymce.util.Tools.resolve('tinymce.util.Delay');
-
- var global$6 = tinymce.util.Tools.resolve('tinymce.util.XHR');
-
- var attachState = {};
- var createLinkList = function (editor, callback) {
- var linkList = Settings.getLinkList(editor.settings);
- if (typeof linkList === 'string') {
- global$6.send({
- url: linkList,
- success: function (text) {
- callback(editor, JSON.parse(text));
- }
- });
- } else if (typeof linkList === 'function') {
- linkList(function (list) {
- callback(editor, list);
- });
- } else {
- callback(editor, linkList);
- }
- };
- var buildListItems = function (inputList, itemCallback, startItems) {
- var appendItems = function (values, output) {
- output = output || [];
- global$4.each(values, function (item) {
- var menuItem = { text: item.text || item.title };
- if (item.menu) {
- menuItem.menu = appendItems(item.menu);
- } else {
- menuItem.value = item.value;
- if (itemCallback) {
- itemCallback(menuItem);
- }
- }
- output.push(menuItem);
- });
- return output;
- };
- return appendItems(inputList, startItems || []);
- };
- var delayedConfirm = function (editor, message, callback) {
- var rng = editor.selection.getRng();
- global$5.setEditorTimeout(editor, function () {
- editor.windowManager.confirm(message, function (state) {
- editor.selection.setRng(rng);
- callback(state);
- });
- });
- };
- var showDialog = function (editor, linkList) {
- var data = {};
- var selection = editor.selection;
- var dom = editor.dom;
- var anchorElm, initialText;
- var win, onlyText, textListCtrl, linkListCtrl, relListCtrl, targetListCtrl, classListCtrl, linkTitleCtrl, value;
- var linkListChangeHandler = function (e) {
- var textCtrl = win.find('#text');
- if (!textCtrl.value() || e.lastControl && textCtrl.value() === e.lastControl.text()) {
- textCtrl.value(e.control.text());
- }
- win.find('#href').value(e.control.value());
- };
- var buildAnchorListControl = function (url) {
- var anchorList = [];
- global$4.each(editor.dom.select('a:not([href])'), function (anchor) {
- var id = anchor.name || anchor.id;
- if (id) {
- anchorList.push({
- text: id,
- value: '#' + id,
- selected: url.indexOf('#' + id) !== -1
- });
- }
- });
- if (anchorList.length) {
- anchorList.unshift({
- text: 'None',
- value: ''
- });
- return {
- name: 'anchor',
- type: 'listbox',
- label: 'Anchors',
- values: anchorList,
- onselect: linkListChangeHandler
- };
- }
- };
- var updateText = function () {
- if (!initialText && onlyText && !data.text) {
- this.parent().parent().find('#text')[0].value(this.value());
- }
- };
- var urlChange = function (e) {
- var meta = e.meta || {};
- if (linkListCtrl) {
- linkListCtrl.value(editor.convertURL(this.value(), 'href'));
- }
- global$4.each(e.meta, function (value, key) {
- var inp = win.find('#' + key);
- if (key === 'text') {
- if (initialText.length === 0) {
- inp.value(value);
- data.text = value;
- }
- } else {
- inp.value(value);
- }
- });
- if (meta.attach) {
- attachState = {
- href: this.value(),
- attach: meta.attach
- };
- }
- if (!meta.text) {
- updateText.call(this);
- }
- };
- var onBeforeCall = function (e) {
- e.meta = win.toJSON();
- };
- onlyText = Utils.isOnlyTextSelected(selection.getContent());
- anchorElm = Utils.getAnchorElement(editor);
- data.text = initialText = Utils.getAnchorText(editor.selection, anchorElm);
- data.href = anchorElm ? dom.getAttrib(anchorElm, 'href') : '';
- if (anchorElm) {
- data.target = dom.getAttrib(anchorElm, 'target');
- } else if (Settings.hasDefaultLinkTarget(editor.settings)) {
- data.target = Settings.getDefaultLinkTarget(editor.settings);
- }
- if (value = dom.getAttrib(anchorElm, 'rel')) {
- data.rel = value;
- }
- if (value = dom.getAttrib(anchorElm, 'class')) {
- data.class = value;
- }
- if (value = dom.getAttrib(anchorElm, 'title')) {
- data.title = value;
- }
- if (onlyText) {
- textListCtrl = {
- name: 'text',
- type: 'textbox',
- size: 40,
- label: 'Text to display',
- onchange: function () {
- data.text = this.value();
- }
- };
- }
- if (linkList) {
- linkListCtrl = {
- type: 'listbox',
- label: 'Link list',
- values: buildListItems(linkList, function (item) {
- item.value = editor.convertURL(item.value || item.url, 'href');
- }, [{
- text: 'None',
- value: ''
- }]),
- onselect: linkListChangeHandler,
- value: editor.convertURL(data.href, 'href'),
- onPostRender: function () {
- linkListCtrl = this;
- }
- };
- }
- if (Settings.shouldShowTargetList(editor.settings)) {
- if (Settings.getTargetList(editor.settings) === undefined) {
- Settings.setTargetList(editor, [
- {
- text: 'None',
- value: ''
- },
- {
- text: 'New window',
- value: '_blank'
- }
- ]);
- }
- targetListCtrl = {
- name: 'target',
- type: 'listbox',
- label: 'Target',
- values: buildListItems(Settings.getTargetList(editor.settings))
- };
- }
- if (Settings.hasRelList(editor.settings)) {
- relListCtrl = {
- name: 'rel',
- type: 'listbox',
- label: 'Rel',
- values: buildListItems(Settings.getRelList(editor.settings), function (item) {
- if (Settings.allowUnsafeLinkTarget(editor.settings) === false) {
- item.value = Utils.toggleTargetRules(item.value, data.target === '_blank');
- }
- })
- };
- }
- if (Settings.hasLinkClassList(editor.settings)) {
- classListCtrl = {
- name: 'class',
- type: 'listbox',
- label: 'Class',
- values: buildListItems(Settings.getLinkClassList(editor.settings), function (item) {
- if (item.value) {
- item.textStyle = function () {
- return editor.formatter.getCssText({
- inline: 'a',
- classes: [item.value]
- });
- };
- }
- })
- };
- }
- if (Settings.shouldShowLinkTitle(editor.settings)) {
- linkTitleCtrl = {
- name: 'title',
- type: 'textbox',
- label: 'Title',
- value: data.title
- };
- }
- win = editor.windowManager.open({
- title: 'Insert link',
- data: data,
- body: [
- {
- name: 'href',
- type: 'filepicker',
- filetype: 'file',
- size: 40,
- autofocus: true,
- label: 'Url',
- onchange: urlChange,
- onkeyup: updateText,
- onpaste: updateText,
- onbeforecall: onBeforeCall
- },
- textListCtrl,
- linkTitleCtrl,
- buildAnchorListControl(data.href),
- linkListCtrl,
- relListCtrl,
- targetListCtrl,
- classListCtrl
- ],
- onSubmit: function (e) {
- var assumeExternalTargets = Settings.assumeExternalTargets(editor.settings);
- var insertLink = Utils.link(editor, attachState);
- var removeLink = Utils.unlink(editor);
- var resultData = global$4.extend({}, data, e.data);
- var href = resultData.href;
- if (!href) {
- removeLink();
- return;
- }
- if (!onlyText || resultData.text === initialText) {
- delete resultData.text;
- }
- if (href.indexOf('@') > 0 && href.indexOf('//') === -1 && href.indexOf('mailto:') === -1) {
- delayedConfirm(editor, 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?', function (state) {
- if (state) {
- resultData.href = 'mailto:' + href;
- }
- insertLink(resultData);
- });
- return;
- }
- if (assumeExternalTargets === true && !/^\w+:/i.test(href) || assumeExternalTargets === false && /^\s*www[\.|\d\.]/i.test(href)) {
- delayedConfirm(editor, 'The URL you entered seems to be an external link. Do you want to add the required http:// prefix?', function (state) {
- if (state) {
- resultData.href = 'http://' + href;
- }
- insertLink(resultData);
- });
- return;
- }
- insertLink(resultData);
- }
- });
- };
- var open$1 = function (editor) {
- createLinkList(editor, showDialog);
- };
- var Dialog = { open: open$1 };
-
- var getLink = function (editor, elm) {
- return editor.dom.getParent(elm, 'a[href]');
- };
- var getSelectedLink = function (editor) {
- return getLink(editor, editor.selection.getStart());
- };
- var getHref = function (elm) {
- var href = elm.getAttribute('data-mce-href');
- return href ? href : elm.getAttribute('href');
- };
- var isContextMenuVisible = function (editor) {
- var contextmenu = editor.plugins.contextmenu;
- return contextmenu ? contextmenu.isContextMenuVisible() : false;
- };
- var hasOnlyAltModifier = function (e) {
- return e.altKey === true && e.shiftKey === false && e.ctrlKey === false && e.metaKey === false;
- };
- var gotoLink = function (editor, a) {
- if (a) {
- var href = getHref(a);
- if (/^#/.test(href)) {
- var targetEl = editor.$(href);
- if (targetEl.length) {
- editor.selection.scrollIntoView(targetEl[0], true);
- }
- } else {
- OpenUrl.open(a.href);
- }
- }
- };
- var openDialog = function (editor) {
- return function () {
- Dialog.open(editor);
- };
- };
- var gotoSelectedLink = function (editor) {
- return function () {
- gotoLink(editor, getSelectedLink(editor));
- };
- };
- var leftClickedOnAHref = function (editor) {
- return function (elm) {
- var sel, rng, node;
- if (Settings.hasContextToolbar(editor.settings) && !isContextMenuVisible(editor) && Utils.isLink(elm)) {
- sel = editor.selection;
- rng = sel.getRng();
- node = rng.startContainer;
- if (node.nodeType === 3 && sel.isCollapsed() && rng.startOffset > 0 && rng.startOffset < node.data.length) {
- return true;
- }
- }
- return false;
- };
- };
- var setupGotoLinks = function (editor) {
- editor.on('click', function (e) {
- var link = getLink(editor, e.target);
- if (link && global$1.metaKeyPressed(e)) {
- e.preventDefault();
- gotoLink(editor, link);
- }
- });
- editor.on('keydown', function (e) {
- var link = getSelectedLink(editor);
- if (link && e.keyCode === 13 && hasOnlyAltModifier(e)) {
- e.preventDefault();
- gotoLink(editor, link);
- }
- });
- };
- var toggleActiveState = function (editor) {
- return function () {
- var self = this;
- editor.on('nodechange', function (e) {
- self.active(!editor.readonly && !!Utils.getAnchorElement(editor, e.element));
- });
- };
- };
- var toggleViewLinkState = function (editor) {
- return function () {
- var self = this;
- var toggleVisibility = function (e) {
- if (Utils.hasLinks(e.parents)) {
- self.show();
- } else {
- self.hide();
- }
- };
- if (!Utils.hasLinks(editor.dom.getParents(editor.selection.getStart()))) {
- self.hide();
- }
- editor.on('nodechange', toggleVisibility);
- self.on('remove', function () {
- editor.off('nodechange', toggleVisibility);
- });
- };
- };
- var Actions = {
- openDialog: openDialog,
- gotoSelectedLink: gotoSelectedLink,
- leftClickedOnAHref: leftClickedOnAHref,
- setupGotoLinks: setupGotoLinks,
- toggleActiveState: toggleActiveState,
- toggleViewLinkState: toggleViewLinkState
- };
-
- var register = function (editor) {
- editor.addCommand('mceLink', Actions.openDialog(editor));
- };
- var Commands = { register: register };
-
- var setup = function (editor) {
- editor.addShortcut('Meta+K', '', Actions.openDialog(editor));
- };
- var Keyboard = { setup: setup };
-
- var setupButtons = function (editor) {
- editor.addButton('link', {
- active: false,
- icon: 'link',
- tooltip: 'Insert/edit link',
- onclick: Actions.openDialog(editor),
- onpostrender: Actions.toggleActiveState(editor)
- });
- editor.addButton('unlink', {
- active: false,
- icon: 'unlink',
- tooltip: 'Remove link',
- onclick: Utils.unlink(editor),
- onpostrender: Actions.toggleActiveState(editor)
- });
- if (editor.addContextToolbar) {
- editor.addButton('openlink', {
- icon: 'newtab',
- tooltip: 'Open link',
- onclick: Actions.gotoSelectedLink(editor)
- });
- }
- };
- var setupMenuItems = function (editor) {
- editor.addMenuItem('openlink', {
- text: 'Open link',
- icon: 'newtab',
- onclick: Actions.gotoSelectedLink(editor),
- onPostRender: Actions.toggleViewLinkState(editor),
- prependToContext: true
- });
- editor.addMenuItem('link', {
- icon: 'link',
- text: 'Link',
- shortcut: 'Meta+K',
- onclick: Actions.openDialog(editor),
- stateSelector: 'a[href]',
- context: 'insert',
- prependToContext: true
- });
- editor.addMenuItem('unlink', {
- icon: 'unlink',
- text: 'Remove link',
- onclick: Utils.unlink(editor),
- stateSelector: 'a[href]'
- });
- };
- var setupContextToolbars = function (editor) {
- if (editor.addContextToolbar) {
- editor.addContextToolbar(Actions.leftClickedOnAHref(editor), 'openlink | link unlink');
- }
- };
- var Controls = {
- setupButtons: setupButtons,
- setupMenuItems: setupMenuItems,
- setupContextToolbars: setupContextToolbars
- };
-
- global.add('link', function (editor) {
- Controls.setupButtons(editor);
- Controls.setupMenuItems(editor);
- Controls.setupContextToolbars(editor);
- Actions.setupGotoLinks(editor);
- Commands.register(editor);
- Keyboard.setup(editor);
- });
- function Plugin () {
- }
-
- return Plugin;
-
-}(window));
-})();
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/link/plugin.min.js b/src/js/_enqueues/vendor/tinymce/plugins/link/plugin.min.js
index e07a9120b927a..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/link/plugin.min.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/link/plugin.min.js
@@ -1 +0,0 @@
-!function(l){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.VK"),e=function(t){return t.target_list},o=function(t){return t.rel_list},i=function(t){return t.link_class_list},p=function(t){return"boolean"==typeof t.link_assume_external_targets&&t.link_assume_external_targets},a=function(t){return"boolean"==typeof t.link_context_toolbar&&t.link_context_toolbar},r=function(t){return t.link_list},k=function(t){return"string"==typeof t.default_link_target},y=function(t){return t.default_link_target},b=e,_=function(t,e){t.settings.target_list=e},w=function(t){return!1!==e(t)},T=o,C=function(t){return o(t)!==undefined},M=i,O=function(t){return i(t)!==undefined},R=function(t){return!1!==t.link_title},N=function(t){return"boolean"==typeof t.allow_unsafe_link_target&&t.allow_unsafe_link_target},u=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),c=tinymce.util.Tools.resolve("tinymce.Env"),s=function(t){if(!c.ie||10'),i.close()}}var r,a},A=tinymce.util.Tools.resolve("tinymce.util.Tools"),f=function(t,e){var n,o,i=["noopener"],r=t?t.split(/\s+/):[],a=function(t){return t.filter(function(t){return-1===A.inArray(i,t)})};return(r=e?(n=a(n=r)).length?n.concat(i):i:a(r)).length?(o=r,A.trim(o.sort().join(" "))):null},d=function(t,e){return e=e||t.selection.getNode(),v(e)?t.dom.select("a[href]",e)[0]:t.dom.getParent(e,"a[href]")},m=function(t){return t&&"A"===t.nodeName&&t.href},v=function(t){return t&&"FIGURE"===t.nodeName&&/\bimage\b/i.test(t.className)},g=function(t,e){var n,o;(o=t.dom.select("img",e)[0])&&(n=t.dom.getParents(o,"a[href]",e)[0])&&(n.parentNode.insertBefore(o,n),t.dom.remove(n))},h=function(t,e,n){var o,i;(i=t.dom.select("img",e)[0])&&(o=t.dom.create("a",n),i.parentNode.insertBefore(o,i),o.appendChild(i))},L=function(i,r){return function(o){i.undoManager.transact(function(){var t=i.selection.getNode(),e=d(i,t),n={href:o.href,target:o.target?o.target:null,rel:o.rel?o.rel:null,"class":o["class"]?o["class"]:null,title:o.title?o.title:null};C(i.settings)||!1!==N(i.settings)||(n.rel=f(n.rel,"_blank"===n.target)),o.href===r.href&&(r.attach(),r={}),e?(i.focus(),o.hasOwnProperty("text")&&("innerText"in e?e.innerText=o.text:e.textContent=o.text),i.dom.setAttribs(e,n),i.selection.select(e),i.undoManager.add()):v(t)?h(i,t,n):o.hasOwnProperty("text")?i.insertContent(i.dom.createHTML("a",n,i.dom.encode(o.text))):i.execCommand("mceInsertLink",!1,n)})}},P=function(e){return function(){e.undoManager.transact(function(){var t=e.selection.getNode();v(t)?g(e,t):e.execCommand("unlink")})}},x=m,E=function(t){return 0]+>[^<]+<\/a>$/.test(t)||-1===t.indexOf("href=")))},I=d,K=function(t,e){var n=e?e.innerText||e.textContent:t.getContent({format:"text"});return n.replace(/\uFEFF/g,"")},U=f,D=tinymce.util.Tools.resolve("tinymce.util.Delay"),B=tinymce.util.Tools.resolve("tinymce.util.XHR"),F={},q=function(t,o,e){var i=function(t,n){return n=n||[],A.each(t,function(t){var e={text:t.text||t.title};t.menu?e.menu=i(t.menu):(e.value=t.value,o&&o(e)),n.push(e)}),n};return i(t,e||[])},V=function(e,t,n){var o=e.selection.getRng();D.setEditorTimeout(e,function(){e.windowManager.confirm(t,function(t){e.selection.setRng(o),n(t)})})},z=function(a,t){var e,l,o,u,n,i,r,c,s,f,d,m={},v=a.selection,g=a.dom,h=function(t){var e=o.find("#text");(!e.value()||t.lastControl&&e.value()===t.lastControl.text())&&e.value(t.control.text()),o.find("#href").value(t.control.value())},x=function(){l||!u||m.text||this.parent().parent().find("#text")[0].value(this.value())};u=S(v.getContent()),e=I(a),m.text=l=K(a.selection,e),m.href=e?g.getAttrib(e,"href"):"",e?m.target=g.getAttrib(e,"target"):k(a.settings)&&(m.target=y(a.settings)),(d=g.getAttrib(e,"rel"))&&(m.rel=d),(d=g.getAttrib(e,"class"))&&(m["class"]=d),(d=g.getAttrib(e,"title"))&&(m.title=d),u&&(n={name:"text",type:"textbox",size:40,label:"Text to display",onchange:function(){m.text=this.value()}}),t&&(i={type:"listbox",label:"Link list",values:q(t,function(t){t.value=a.convertURL(t.value||t.url,"href")},[{text:"None",value:""}]),onselect:h,value:a.convertURL(m.href,"href"),onPostRender:function(){i=this}}),w(a.settings)&&(b(a.settings)===undefined&&_(a,[{text:"None",value:""},{text:"New window",value:"_blank"}]),c={name:"target",type:"listbox",label:"Target",values:q(b(a.settings))}),C(a.settings)&&(r={name:"rel",type:"listbox",label:"Rel",values:q(T(a.settings),function(t){!1===N(a.settings)&&(t.value=U(t.value,"_blank"===m.target))})}),O(a.settings)&&(s={name:"class",type:"listbox",label:"Class",values:q(M(a.settings),function(t){t.value&&(t.textStyle=function(){return a.formatter.getCssText({inline:"a",classes:[t.value]})})})}),R(a.settings)&&(f={name:"title",type:"textbox",label:"Title",value:m.title}),o=a.windowManager.open({title:"Insert link",data:m,body:[{name:"href",type:"filepicker",filetype:"file",size:40,autofocus:!0,label:"Url",onchange:function(t){var e=t.meta||{};i&&i.value(a.convertURL(this.value(),"href")),A.each(t.meta,function(t,e){var n=o.find("#"+e);"text"===e?0===l.length&&(n.value(t),m.text=t):n.value(t)}),e.attach&&(F={href:this.value(),attach:e.attach}),e.text||x.call(this)},onkeyup:x,onpaste:x,onbeforecall:function(t){t.meta=o.toJSON()}},n,f,function(n){var o=[];if(A.each(a.dom.select("a:not([href])"),function(t){var e=t.name||t.id;e&&o.push({text:e,value:"#"+e,selected:-1!==n.indexOf("#"+e)})}),o.length)return o.unshift({text:"None",value:""}),{name:"anchor",type:"listbox",label:"Anchors",values:o,onselect:h}}(m.href),i,r,c,s],onSubmit:function(t){var e=p(a.settings),n=L(a,F),o=P(a),i=A.extend({},m,t.data),r=i.href;r?(u&&i.text!==l||delete i.text,0 0) {
- return false;
- }
- return empty;
- };
- var isChildOfBody = function (dom, elm) {
- return dom.isChildOf(elm, dom.getRoot());
- };
- var NodeType = {
- isTextNode: isTextNode,
- isListNode: isListNode,
- isOlUlNode: isOlUlNode,
- isDlItemNode: isDlItemNode,
- isListItemNode: isListItemNode,
- isTableCellNode: isTableCellNode,
- isBr: isBr,
- isFirstChild: isFirstChild,
- isLastChild: isLastChild,
- isTextBlock: isTextBlock,
- isBlock: isBlock,
- isBogusBr: isBogusBr,
- isEmpty: isEmpty,
- isChildOfBody: isChildOfBody
- };
-
- var getNormalizedPoint = function (container, offset) {
- if (NodeType.isTextNode(container)) {
- return {
- container: container,
- offset: offset
- };
- }
- var node = global$1.getNode(container, offset);
- if (NodeType.isTextNode(node)) {
- return {
- container: node,
- offset: offset >= container.childNodes.length ? node.data.length : 0
- };
- } else if (node.previousSibling && NodeType.isTextNode(node.previousSibling)) {
- return {
- container: node.previousSibling,
- offset: node.previousSibling.data.length
- };
- } else if (node.nextSibling && NodeType.isTextNode(node.nextSibling)) {
- return {
- container: node.nextSibling,
- offset: 0
- };
- }
- return {
- container: container,
- offset: offset
- };
- };
- var normalizeRange = function (rng) {
- var outRng = rng.cloneRange();
- var rangeStart = getNormalizedPoint(rng.startContainer, rng.startOffset);
- outRng.setStart(rangeStart.container, rangeStart.offset);
- var rangeEnd = getNormalizedPoint(rng.endContainer, rng.endOffset);
- outRng.setEnd(rangeEnd.container, rangeEnd.offset);
- return outRng;
- };
- var Range = {
- getNormalizedPoint: getNormalizedPoint,
- normalizeRange: normalizeRange
- };
-
- var DOM = global$6.DOM;
- var createBookmark = function (rng) {
- var bookmark = {};
- var setupEndPoint = function (start) {
- var offsetNode, container, offset;
- container = rng[start ? 'startContainer' : 'endContainer'];
- offset = rng[start ? 'startOffset' : 'endOffset'];
- if (container.nodeType === 1) {
- offsetNode = DOM.create('span', { 'data-mce-type': 'bookmark' });
- if (container.hasChildNodes()) {
- offset = Math.min(offset, container.childNodes.length - 1);
- if (start) {
- container.insertBefore(offsetNode, container.childNodes[offset]);
- } else {
- DOM.insertAfter(offsetNode, container.childNodes[offset]);
- }
- } else {
- container.appendChild(offsetNode);
- }
- container = offsetNode;
- offset = 0;
- }
- bookmark[start ? 'startContainer' : 'endContainer'] = container;
- bookmark[start ? 'startOffset' : 'endOffset'] = offset;
- };
- setupEndPoint(true);
- if (!rng.collapsed) {
- setupEndPoint();
- }
- return bookmark;
- };
- var resolveBookmark = function (bookmark) {
- function restoreEndPoint(start) {
- var container, offset, node;
- var nodeIndex = function (container) {
- var node = container.parentNode.firstChild, idx = 0;
- while (node) {
- if (node === container) {
- return idx;
- }
- if (node.nodeType !== 1 || node.getAttribute('data-mce-type') !== 'bookmark') {
- idx++;
- }
- node = node.nextSibling;
- }
- return -1;
- };
- container = node = bookmark[start ? 'startContainer' : 'endContainer'];
- offset = bookmark[start ? 'startOffset' : 'endOffset'];
- if (!container) {
- return;
- }
- if (container.nodeType === 1) {
- offset = nodeIndex(container);
- container = container.parentNode;
- DOM.remove(node);
- if (!container.hasChildNodes() && DOM.isBlock(container)) {
- container.appendChild(DOM.create('br'));
- }
- }
- bookmark[start ? 'startContainer' : 'endContainer'] = container;
- bookmark[start ? 'startOffset' : 'endOffset'] = offset;
- }
- restoreEndPoint(true);
- restoreEndPoint();
- var rng = DOM.createRng();
- rng.setStart(bookmark.startContainer, bookmark.startOffset);
- if (bookmark.endContainer) {
- rng.setEnd(bookmark.endContainer, bookmark.endOffset);
- }
- return Range.normalizeRange(rng);
- };
- var Bookmark = {
- createBookmark: createBookmark,
- resolveBookmark: resolveBookmark
- };
-
- var noop = function () {
- };
- var constant = function (value) {
- return function () {
- return value;
- };
- };
- var not = function (f) {
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- return !f.apply(null, args);
- };
- };
- var never = constant(false);
- var always = constant(true);
-
- var none = function () {
- return NONE;
- };
- var NONE = function () {
- var eq = function (o) {
- return o.isNone();
- };
- var call = function (thunk) {
- return thunk();
- };
- var id = function (n) {
- return n;
- };
- var me = {
- fold: function (n, s) {
- return n();
- },
- is: never,
- isSome: never,
- isNone: always,
- getOr: id,
- getOrThunk: call,
- getOrDie: function (msg) {
- throw new Error(msg || 'error: getOrDie called on none.');
- },
- getOrNull: constant(null),
- getOrUndefined: constant(undefined),
- or: id,
- orThunk: call,
- map: none,
- each: noop,
- bind: none,
- exists: never,
- forall: always,
- filter: none,
- equals: eq,
- equals_: eq,
- toArray: function () {
- return [];
- },
- toString: constant('none()')
- };
- if (Object.freeze) {
- Object.freeze(me);
- }
- return me;
- }();
- var some = function (a) {
- var constant_a = constant(a);
- var self = function () {
- return me;
- };
- var bind = function (f) {
- return f(a);
- };
- var me = {
- fold: function (n, s) {
- return s(a);
- },
- is: function (v) {
- return a === v;
- },
- isSome: always,
- isNone: never,
- getOr: constant_a,
- getOrThunk: constant_a,
- getOrDie: constant_a,
- getOrNull: constant_a,
- getOrUndefined: constant_a,
- or: self,
- orThunk: self,
- map: function (f) {
- return some(f(a));
- },
- each: function (f) {
- f(a);
- },
- bind: bind,
- exists: bind,
- forall: bind,
- filter: function (f) {
- return f(a) ? me : NONE;
- },
- toArray: function () {
- return [a];
- },
- toString: function () {
- return 'some(' + a + ')';
- },
- equals: function (o) {
- return o.is(a);
- },
- equals_: function (o, elementEq) {
- return o.fold(never, function (b) {
- return elementEq(a, b);
- });
- }
- };
- return me;
- };
- var from = function (value) {
- return value === null || value === undefined ? NONE : some(value);
- };
- var Option = {
- some: some,
- none: none,
- from: from
- };
-
- var typeOf = function (x) {
- if (x === null) {
- return 'null';
- }
- var t = typeof x;
- if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
- return 'array';
- }
- if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
- return 'string';
- }
- return t;
- };
- var isType = function (type) {
- return function (value) {
- return typeOf(value) === type;
- };
- };
- var isString = isType('string');
- var isArray = isType('array');
- var isBoolean = isType('boolean');
- var isFunction = isType('function');
- var isNumber = isType('number');
-
- var nativeSlice = Array.prototype.slice;
- var nativePush = Array.prototype.push;
- var map = function (xs, f) {
- var len = xs.length;
- var r = new Array(len);
- for (var i = 0; i < len; i++) {
- var x = xs[i];
- r[i] = f(x, i);
- }
- return r;
- };
- var each = function (xs, f) {
- for (var i = 0, len = xs.length; i < len; i++) {
- var x = xs[i];
- f(x, i);
- }
- };
- var filter = function (xs, pred) {
- var r = [];
- for (var i = 0, len = xs.length; i < len; i++) {
- var x = xs[i];
- if (pred(x, i)) {
- r.push(x);
- }
- }
- return r;
- };
- var groupBy = function (xs, f) {
- if (xs.length === 0) {
- return [];
- } else {
- var wasType = f(xs[0]);
- var r = [];
- var group = [];
- for (var i = 0, len = xs.length; i < len; i++) {
- var x = xs[i];
- var type = f(x);
- if (type !== wasType) {
- r.push(group);
- group = [];
- }
- wasType = type;
- group.push(x);
- }
- if (group.length !== 0) {
- r.push(group);
- }
- return r;
- }
- };
- var foldl = function (xs, f, acc) {
- each(xs, function (x) {
- acc = f(acc, x);
- });
- return acc;
- };
- var find = function (xs, pred) {
- for (var i = 0, len = xs.length; i < len; i++) {
- var x = xs[i];
- if (pred(x, i)) {
- return Option.some(x);
- }
- }
- return Option.none();
- };
- var flatten = function (xs) {
- var r = [];
- for (var i = 0, len = xs.length; i < len; ++i) {
- if (!isArray(xs[i])) {
- throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
- }
- nativePush.apply(r, xs[i]);
- }
- return r;
- };
- var bind = function (xs, f) {
- var output = map(xs, f);
- return flatten(output);
- };
- var reverse = function (xs) {
- var r = nativeSlice.call(xs, 0);
- r.reverse();
- return r;
- };
- var head = function (xs) {
- return xs.length === 0 ? Option.none() : Option.some(xs[0]);
- };
- var last = function (xs) {
- return xs.length === 0 ? Option.none() : Option.some(xs[xs.length - 1]);
- };
- var from$1 = isFunction(Array.from) ? Array.from : function (x) {
- return nativeSlice.call(x);
- };
-
- var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();
-
- var path = function (parts, scope) {
- var o = scope !== undefined && scope !== null ? scope : Global;
- for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) {
- o = o[parts[i]];
- }
- return o;
- };
- var resolve = function (p, scope) {
- var parts = p.split('.');
- return path(parts, scope);
- };
-
- var unsafe = function (name, scope) {
- return resolve(name, scope);
- };
- var getOrDie = function (name, scope) {
- var actual = unsafe(name, scope);
- if (actual === undefined || actual === null) {
- throw new Error(name + ' not available on this browser');
- }
- return actual;
- };
- var Global$1 = { getOrDie: getOrDie };
-
- var htmlElement = function (scope) {
- return Global$1.getOrDie('HTMLElement', scope);
- };
- var isPrototypeOf = function (x) {
- var scope = resolve('ownerDocument.defaultView', x);
- return htmlElement(scope).prototype.isPrototypeOf(x);
- };
- var HTMLElement = { isPrototypeOf: isPrototypeOf };
-
- var global$7 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery');
-
- var getParentList = function (editor) {
- var selectionStart = editor.selection.getStart(true);
- return editor.dom.getParent(selectionStart, 'OL,UL,DL', getClosestListRootElm(editor, selectionStart));
- };
- var isParentListSelected = function (parentList, selectedBlocks) {
- return parentList && selectedBlocks.length === 1 && selectedBlocks[0] === parentList;
- };
- var findSubLists = function (parentList) {
- return global$5.grep(parentList.querySelectorAll('ol,ul,dl'), function (elm) {
- return NodeType.isListNode(elm);
- });
- };
- var getSelectedSubLists = function (editor) {
- var parentList = getParentList(editor);
- var selectedBlocks = editor.selection.getSelectedBlocks();
- if (isParentListSelected(parentList, selectedBlocks)) {
- return findSubLists(parentList);
- } else {
- return global$5.grep(selectedBlocks, function (elm) {
- return NodeType.isListNode(elm) && parentList !== elm;
- });
- }
- };
- var findParentListItemsNodes = function (editor, elms) {
- var listItemsElms = global$5.map(elms, function (elm) {
- var parentLi = editor.dom.getParent(elm, 'li,dd,dt', getClosestListRootElm(editor, elm));
- return parentLi ? parentLi : elm;
- });
- return global$7.unique(listItemsElms);
- };
- var getSelectedListItems = function (editor) {
- var selectedBlocks = editor.selection.getSelectedBlocks();
- return global$5.grep(findParentListItemsNodes(editor, selectedBlocks), function (block) {
- return NodeType.isListItemNode(block);
- });
- };
- var getSelectedDlItems = function (editor) {
- return filter(getSelectedListItems(editor), NodeType.isDlItemNode);
- };
- var getClosestListRootElm = function (editor, elm) {
- var parentTableCell = editor.dom.getParents(elm, 'TD,TH');
- var root = parentTableCell.length > 0 ? parentTableCell[0] : editor.getBody();
- return root;
- };
- var findLastParentListNode = function (editor, elm) {
- var parentLists = editor.dom.getParents(elm, 'ol,ul', getClosestListRootElm(editor, elm));
- return last(parentLists);
- };
- var getSelectedLists = function (editor) {
- var firstList = findLastParentListNode(editor, editor.selection.getStart());
- var subsequentLists = filter(editor.selection.getSelectedBlocks(), NodeType.isOlUlNode);
- return firstList.toArray().concat(subsequentLists);
- };
- var getSelectedListRoots = function (editor) {
- var selectedLists = getSelectedLists(editor);
- return getUniqueListRoots(editor, selectedLists);
- };
- var getUniqueListRoots = function (editor, lists) {
- var listRoots = map(lists, function (list) {
- return findLastParentListNode(editor, list).getOr(list);
- });
- return global$7.unique(listRoots);
- };
- var isList = function (editor) {
- var list = getParentList(editor);
- return HTMLElement.isPrototypeOf(list);
- };
- var Selection = {
- isList: isList,
- getParentList: getParentList,
- getSelectedSubLists: getSelectedSubLists,
- getSelectedListItems: getSelectedListItems,
- getClosestListRootElm: getClosestListRootElm,
- getSelectedDlItems: getSelectedDlItems,
- getSelectedListRoots: getSelectedListRoots
- };
-
- var fromHtml = function (html, scope) {
- var doc = scope || domGlobals.document;
- var div = doc.createElement('div');
- div.innerHTML = html;
- if (!div.hasChildNodes() || div.childNodes.length > 1) {
- domGlobals.console.error('HTML does not have a single root node', html);
- throw new Error('HTML must have a single root node');
- }
- return fromDom(div.childNodes[0]);
- };
- var fromTag = function (tag, scope) {
- var doc = scope || domGlobals.document;
- var node = doc.createElement(tag);
- return fromDom(node);
- };
- var fromText = function (text, scope) {
- var doc = scope || domGlobals.document;
- var node = doc.createTextNode(text);
- return fromDom(node);
- };
- var fromDom = function (node) {
- if (node === null || node === undefined) {
- throw new Error('Node cannot be null or undefined');
- }
- return { dom: constant(node) };
- };
- var fromPoint = function (docElm, x, y) {
- var doc = docElm.dom();
- return Option.from(doc.elementFromPoint(x, y)).map(fromDom);
- };
- var Element = {
- fromHtml: fromHtml,
- fromTag: fromTag,
- fromText: fromText,
- fromDom: fromDom,
- fromPoint: fromPoint
- };
-
- var lift2 = function (oa, ob, f) {
- return oa.isSome() && ob.isSome() ? Option.some(f(oa.getOrDie(), ob.getOrDie())) : Option.none();
- };
-
- var fromElements = function (elements, scope) {
- var doc = scope || domGlobals.document;
- var fragment = doc.createDocumentFragment();
- each(elements, function (element) {
- fragment.appendChild(element.dom());
- });
- return Element.fromDom(fragment);
- };
-
- var Immutable = function () {
- var fields = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- fields[_i] = arguments[_i];
- }
- return function () {
- var values = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- values[_i] = arguments[_i];
- }
- if (fields.length !== values.length) {
- throw new Error('Wrong number of arguments to struct. Expected "[' + fields.length + ']", got ' + values.length + ' arguments');
- }
- var struct = {};
- each(fields, function (name, i) {
- struct[name] = constant(values[i]);
- });
- return struct;
- };
- };
-
- var keys = Object.keys;
- var each$1 = function (obj, f) {
- var props = keys(obj);
- for (var k = 0, len = props.length; k < len; k++) {
- var i = props[k];
- var x = obj[i];
- f(x, i);
- }
- };
-
- var node = function () {
- var f = Global$1.getOrDie('Node');
- return f;
- };
- var compareDocumentPosition = function (a, b, match) {
- return (a.compareDocumentPosition(b) & match) !== 0;
- };
- var documentPositionPreceding = function (a, b) {
- return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_PRECEDING);
- };
- var documentPositionContainedBy = function (a, b) {
- return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_CONTAINED_BY);
- };
- var Node = {
- documentPositionPreceding: documentPositionPreceding,
- documentPositionContainedBy: documentPositionContainedBy
- };
-
- var cached = function (f) {
- var called = false;
- var r;
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (!called) {
- called = true;
- r = f.apply(null, args);
- }
- return r;
- };
- };
-
- var firstMatch = function (regexes, s) {
- for (var i = 0; i < regexes.length; i++) {
- var x = regexes[i];
- if (x.test(s)) {
- return x;
- }
- }
- return undefined;
- };
- var find$1 = function (regexes, agent) {
- var r = firstMatch(regexes, agent);
- if (!r) {
- return {
- major: 0,
- minor: 0
- };
- }
- var group = function (i) {
- return Number(agent.replace(r, '$' + i));
- };
- return nu(group(1), group(2));
- };
- var detect = function (versionRegexes, agent) {
- var cleanedAgent = String(agent).toLowerCase();
- if (versionRegexes.length === 0) {
- return unknown();
- }
- return find$1(versionRegexes, cleanedAgent);
- };
- var unknown = function () {
- return nu(0, 0);
- };
- var nu = function (major, minor) {
- return {
- major: major,
- minor: minor
- };
- };
- var Version = {
- nu: nu,
- detect: detect,
- unknown: unknown
- };
-
- var edge = 'Edge';
- var chrome = 'Chrome';
- var ie = 'IE';
- var opera = 'Opera';
- var firefox = 'Firefox';
- var safari = 'Safari';
- var isBrowser = function (name, current) {
- return function () {
- return current === name;
- };
- };
- var unknown$1 = function () {
- return nu$1({
- current: undefined,
- version: Version.unknown()
- });
- };
- var nu$1 = function (info) {
- var current = info.current;
- var version = info.version;
- return {
- current: current,
- version: version,
- isEdge: isBrowser(edge, current),
- isChrome: isBrowser(chrome, current),
- isIE: isBrowser(ie, current),
- isOpera: isBrowser(opera, current),
- isFirefox: isBrowser(firefox, current),
- isSafari: isBrowser(safari, current)
- };
- };
- var Browser = {
- unknown: unknown$1,
- nu: nu$1,
- edge: constant(edge),
- chrome: constant(chrome),
- ie: constant(ie),
- opera: constant(opera),
- firefox: constant(firefox),
- safari: constant(safari)
- };
-
- var windows = 'Windows';
- var ios = 'iOS';
- var android = 'Android';
- var linux = 'Linux';
- var osx = 'OSX';
- var solaris = 'Solaris';
- var freebsd = 'FreeBSD';
- var isOS = function (name, current) {
- return function () {
- return current === name;
- };
- };
- var unknown$2 = function () {
- return nu$2({
- current: undefined,
- version: Version.unknown()
- });
- };
- var nu$2 = function (info) {
- var current = info.current;
- var version = info.version;
- return {
- current: current,
- version: version,
- isWindows: isOS(windows, current),
- isiOS: isOS(ios, current),
- isAndroid: isOS(android, current),
- isOSX: isOS(osx, current),
- isLinux: isOS(linux, current),
- isSolaris: isOS(solaris, current),
- isFreeBSD: isOS(freebsd, current)
- };
- };
- var OperatingSystem = {
- unknown: unknown$2,
- nu: nu$2,
- windows: constant(windows),
- ios: constant(ios),
- android: constant(android),
- linux: constant(linux),
- osx: constant(osx),
- solaris: constant(solaris),
- freebsd: constant(freebsd)
- };
-
- var DeviceType = function (os, browser, userAgent) {
- var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
- var isiPhone = os.isiOS() && !isiPad;
- var isAndroid3 = os.isAndroid() && os.version.major === 3;
- var isAndroid4 = os.isAndroid() && os.version.major === 4;
- var isTablet = isiPad || isAndroid3 || isAndroid4 && /mobile/i.test(userAgent) === true;
- var isTouch = os.isiOS() || os.isAndroid();
- var isPhone = isTouch && !isTablet;
- var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
- return {
- isiPad: constant(isiPad),
- isiPhone: constant(isiPhone),
- isTablet: constant(isTablet),
- isPhone: constant(isPhone),
- isTouch: constant(isTouch),
- isAndroid: os.isAndroid,
- isiOS: os.isiOS,
- isWebView: constant(iOSwebview)
- };
- };
-
- var detect$1 = function (candidates, userAgent) {
- var agent = String(userAgent).toLowerCase();
- return find(candidates, function (candidate) {
- return candidate.search(agent);
- });
- };
- var detectBrowser = function (browsers, userAgent) {
- return detect$1(browsers, userAgent).map(function (browser) {
- var version = Version.detect(browser.versionRegexes, userAgent);
- return {
- current: browser.name,
- version: version
- };
- });
- };
- var detectOs = function (oses, userAgent) {
- return detect$1(oses, userAgent).map(function (os) {
- var version = Version.detect(os.versionRegexes, userAgent);
- return {
- current: os.name,
- version: version
- };
- });
- };
- var UaString = {
- detectBrowser: detectBrowser,
- detectOs: detectOs
- };
-
- var contains = function (str, substr) {
- return str.indexOf(substr) !== -1;
- };
-
- var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
- var checkContains = function (target) {
- return function (uastring) {
- return contains(uastring, target);
- };
- };
- var browsers = [
- {
- name: 'Edge',
- versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
- search: function (uastring) {
- return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit');
- }
- },
- {
- name: 'Chrome',
- versionRegexes: [
- /.*?chrome\/([0-9]+)\.([0-9]+).*/,
- normalVersionRegex
- ],
- search: function (uastring) {
- return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe');
- }
- },
- {
- name: 'IE',
- versionRegexes: [
- /.*?msie\ ?([0-9]+)\.([0-9]+).*/,
- /.*?rv:([0-9]+)\.([0-9]+).*/
- ],
- search: function (uastring) {
- return contains(uastring, 'msie') || contains(uastring, 'trident');
- }
- },
- {
- name: 'Opera',
- versionRegexes: [
- normalVersionRegex,
- /.*?opera\/([0-9]+)\.([0-9]+).*/
- ],
- search: checkContains('opera')
- },
- {
- name: 'Firefox',
- versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
- search: checkContains('firefox')
- },
- {
- name: 'Safari',
- versionRegexes: [
- normalVersionRegex,
- /.*?cpu os ([0-9]+)_([0-9]+).*/
- ],
- search: function (uastring) {
- return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit');
- }
- }
- ];
- var oses = [
- {
- name: 'Windows',
- search: checkContains('win'),
- versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
- },
- {
- name: 'iOS',
- search: function (uastring) {
- return contains(uastring, 'iphone') || contains(uastring, 'ipad');
- },
- versionRegexes: [
- /.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
- /.*cpu os ([0-9]+)_([0-9]+).*/,
- /.*cpu iphone os ([0-9]+)_([0-9]+).*/
- ]
- },
- {
- name: 'Android',
- search: checkContains('android'),
- versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
- },
- {
- name: 'OSX',
- search: checkContains('os x'),
- versionRegexes: [/.*?os\ x\ ?([0-9]+)_([0-9]+).*/]
- },
- {
- name: 'Linux',
- search: checkContains('linux'),
- versionRegexes: []
- },
- {
- name: 'Solaris',
- search: checkContains('sunos'),
- versionRegexes: []
- },
- {
- name: 'FreeBSD',
- search: checkContains('freebsd'),
- versionRegexes: []
- }
- ];
- var PlatformInfo = {
- browsers: constant(browsers),
- oses: constant(oses)
- };
-
- var detect$2 = function (userAgent) {
- var browsers = PlatformInfo.browsers();
- var oses = PlatformInfo.oses();
- var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu);
- var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
- var deviceType = DeviceType(os, browser, userAgent);
- return {
- browser: browser,
- os: os,
- deviceType: deviceType
- };
- };
- var PlatformDetection = { detect: detect$2 };
-
- var detect$3 = cached(function () {
- var userAgent = domGlobals.navigator.userAgent;
- return PlatformDetection.detect(userAgent);
- });
- var PlatformDetection$1 = { detect: detect$3 };
-
- var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;
- var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;
- var COMMENT = domGlobals.Node.COMMENT_NODE;
- var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;
- var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;
- var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;
- var ELEMENT = domGlobals.Node.ELEMENT_NODE;
- var TEXT = domGlobals.Node.TEXT_NODE;
- var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;
- var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;
- var ENTITY = domGlobals.Node.ENTITY_NODE;
- var NOTATION = domGlobals.Node.NOTATION_NODE;
-
- var ELEMENT$1 = ELEMENT;
- var is = function (element, selector) {
- var dom = element.dom();
- if (dom.nodeType !== ELEMENT$1) {
- return false;
- } else {
- var elem = dom;
- if (elem.matches !== undefined) {
- return elem.matches(selector);
- } else if (elem.msMatchesSelector !== undefined) {
- return elem.msMatchesSelector(selector);
- } else if (elem.webkitMatchesSelector !== undefined) {
- return elem.webkitMatchesSelector(selector);
- } else if (elem.mozMatchesSelector !== undefined) {
- return elem.mozMatchesSelector(selector);
- } else {
- throw new Error('Browser lacks native selectors');
- }
- }
- };
-
- var eq = function (e1, e2) {
- return e1.dom() === e2.dom();
- };
- var regularContains = function (e1, e2) {
- var d1 = e1.dom();
- var d2 = e2.dom();
- return d1 === d2 ? false : d1.contains(d2);
- };
- var ieContains = function (e1, e2) {
- return Node.documentPositionContainedBy(e1.dom(), e2.dom());
- };
- var browser = PlatformDetection$1.detect().browser;
- var contains$1 = browser.isIE() ? ieContains : regularContains;
- var is$1 = is;
-
- var parent = function (element) {
- return Option.from(element.dom().parentNode).map(Element.fromDom);
- };
- var children = function (element) {
- return map(element.dom().childNodes, Element.fromDom);
- };
- var child = function (element, index) {
- var cs = element.dom().childNodes;
- return Option.from(cs[index]).map(Element.fromDom);
- };
- var firstChild = function (element) {
- return child(element, 0);
- };
- var lastChild = function (element) {
- return child(element, element.dom().childNodes.length - 1);
- };
- var spot = Immutable('element', 'offset');
-
- var before = function (marker, element) {
- var parent$1 = parent(marker);
- parent$1.each(function (v) {
- v.dom().insertBefore(element.dom(), marker.dom());
- });
- };
- var append = function (parent, element) {
- parent.dom().appendChild(element.dom());
- };
-
- var before$1 = function (marker, elements) {
- each(elements, function (x) {
- before(marker, x);
- });
- };
- var append$1 = function (parent, elements) {
- each(elements, function (x) {
- append(parent, x);
- });
- };
-
- var remove = function (element) {
- var dom = element.dom();
- if (dom.parentNode !== null) {
- dom.parentNode.removeChild(dom);
- }
- };
-
- var name = function (element) {
- var r = element.dom().nodeName;
- return r.toLowerCase();
- };
- var type = function (element) {
- return element.dom().nodeType;
- };
- var isType$1 = function (t) {
- return function (element) {
- return type(element) === t;
- };
- };
- var isElement = isType$1(ELEMENT);
-
- var rawSet = function (dom, key, value) {
- if (isString(value) || isBoolean(value) || isNumber(value)) {
- dom.setAttribute(key, value + '');
- } else {
- domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom);
- throw new Error('Attribute value was not simple');
- }
- };
- var setAll = function (element, attrs) {
- var dom = element.dom();
- each$1(attrs, function (v, k) {
- rawSet(dom, k, v);
- });
- };
- var clone = function (element) {
- return foldl(element.dom().attributes, function (acc, attr) {
- acc[attr.name] = attr.value;
- return acc;
- }, {});
- };
-
- var isSupported = function (dom) {
- return dom.style !== undefined && isFunction(dom.style.getPropertyValue);
- };
-
- var internalSet = function (dom, property, value) {
- if (!isString(value)) {
- domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
- throw new Error('CSS value must be a string: ' + value);
- }
- if (isSupported(dom)) {
- dom.style.setProperty(property, value);
- }
- };
- var set = function (element, property, value) {
- var dom = element.dom();
- internalSet(dom, property, value);
- };
-
- var clone$1 = function (original, isDeep) {
- return Element.fromDom(original.dom().cloneNode(isDeep));
- };
- var deep = function (original) {
- return clone$1(original, true);
- };
- var shallowAs = function (original, tag) {
- var nu = Element.fromTag(tag);
- var attributes = clone(original);
- setAll(nu, attributes);
- return nu;
- };
- var mutate = function (original, tag) {
- var nu = shallowAs(original, tag);
- before(original, nu);
- var children$1 = children(original);
- append$1(nu, children$1);
- remove(original);
- return nu;
- };
-
- var joinSegment = function (parent, child) {
- append(parent.item, child.list);
- };
- var joinSegments = function (segments) {
- for (var i = 1; i < segments.length; i++) {
- joinSegment(segments[i - 1], segments[i]);
- }
- };
- var appendSegments = function (head$1, tail) {
- lift2(last(head$1), head(tail), joinSegment);
- };
- var createSegment = function (scope, listType) {
- var segment = {
- list: Element.fromTag(listType, scope),
- item: Element.fromTag('li', scope)
- };
- append(segment.list, segment.item);
- return segment;
- };
- var createSegments = function (scope, entry, size) {
- var segments = [];
- for (var i = 0; i < size; i++) {
- segments.push(createSegment(scope, entry.listType));
- }
- return segments;
- };
- var populateSegments = function (segments, entry) {
- for (var i = 0; i < segments.length - 1; i++) {
- set(segments[i].item, 'list-style-type', 'none');
- }
- last(segments).each(function (segment) {
- setAll(segment.list, entry.listAttributes);
- setAll(segment.item, entry.itemAttributes);
- append$1(segment.item, entry.content);
- });
- };
- var normalizeSegment = function (segment, entry) {
- if (name(segment.list) !== entry.listType) {
- segment.list = mutate(segment.list, entry.listType);
- }
- setAll(segment.list, entry.listAttributes);
- };
- var createItem = function (scope, attr, content) {
- var item = Element.fromTag('li', scope);
- setAll(item, attr);
- append$1(item, content);
- return item;
- };
- var appendItem = function (segment, item) {
- append(segment.list, item);
- segment.item = item;
- };
- var writeShallow = function (scope, cast, entry) {
- var newCast = cast.slice(0, entry.depth);
- last(newCast).each(function (segment) {
- var item = createItem(scope, entry.itemAttributes, entry.content);
- appendItem(segment, item);
- normalizeSegment(segment, entry);
- });
- return newCast;
- };
- var writeDeep = function (scope, cast, entry) {
- var segments = createSegments(scope, entry, entry.depth - cast.length);
- joinSegments(segments);
- populateSegments(segments, entry);
- appendSegments(cast, segments);
- return cast.concat(segments);
- };
- var composeList = function (scope, entries) {
- var cast = foldl(entries, function (cast, entry) {
- return entry.depth > cast.length ? writeDeep(scope, cast, entry) : writeShallow(scope, cast, entry);
- }, []);
- return head(cast).map(function (segment) {
- return segment.list;
- });
- };
-
- var isList$1 = function (el) {
- return is$1(el, 'OL,UL');
- };
- var hasFirstChildList = function (el) {
- return firstChild(el).map(isList$1).getOr(false);
- };
- var hasLastChildList = function (el) {
- return lastChild(el).map(isList$1).getOr(false);
- };
-
- var isIndented = function (entry) {
- return entry.depth > 0;
- };
- var isSelected = function (entry) {
- return entry.isSelected;
- };
- var cloneItemContent = function (li) {
- var children$1 = children(li);
- var content = hasLastChildList(li) ? children$1.slice(0, -1) : children$1;
- return map(content, deep);
- };
- var createEntry = function (li, depth, isSelected) {
- return parent(li).filter(isElement).map(function (list) {
- return {
- depth: depth,
- isSelected: isSelected,
- content: cloneItemContent(li),
- itemAttributes: clone(li),
- listAttributes: clone(list),
- listType: name(list)
- };
- });
- };
-
- var indentEntry = function (indentation, entry) {
- switch (indentation) {
- case 'Indent':
- entry.depth++;
- break;
- case 'Outdent':
- entry.depth--;
- break;
- case 'Flatten':
- entry.depth = 0;
- }
- };
-
- var hasOwnProperty = Object.prototype.hasOwnProperty;
- var shallow = function (old, nu) {
- return nu;
- };
- var baseMerge = function (merger) {
- return function () {
- var objects = new Array(arguments.length);
- for (var i = 0; i < objects.length; i++) {
- objects[i] = arguments[i];
- }
- if (objects.length === 0) {
- throw new Error('Can\'t merge zero objects');
- }
- var ret = {};
- for (var j = 0; j < objects.length; j++) {
- var curObject = objects[j];
- for (var key in curObject) {
- if (hasOwnProperty.call(curObject, key)) {
- ret[key] = merger(ret[key], curObject[key]);
- }
- }
- }
- return ret;
- };
- };
- var merge = baseMerge(shallow);
-
- var cloneListProperties = function (target, source) {
- target.listType = source.listType;
- target.listAttributes = merge({}, source.listAttributes);
- };
- var previousSiblingEntry = function (entries, start) {
- var depth = entries[start].depth;
- for (var i = start - 1; i >= 0; i--) {
- if (entries[i].depth === depth) {
- return Option.some(entries[i]);
- }
- if (entries[i].depth < depth) {
- break;
- }
- }
- return Option.none();
- };
- var normalizeEntries = function (entries) {
- each(entries, function (entry, i) {
- previousSiblingEntry(entries, i).each(function (matchingEntry) {
- cloneListProperties(entry, matchingEntry);
- });
- });
- };
-
- var Cell = function (initial) {
- var value = initial;
- var get = function () {
- return value;
- };
- var set = function (v) {
- value = v;
- };
- var clone = function () {
- return Cell(get());
- };
- return {
- get: get,
- set: set,
- clone: clone
- };
- };
-
- var parseItem = function (depth, itemSelection, selectionState, item) {
- return firstChild(item).filter(isList$1).fold(function () {
- itemSelection.each(function (selection) {
- if (eq(selection.start, item)) {
- selectionState.set(true);
- }
- });
- var currentItemEntry = createEntry(item, depth, selectionState.get());
- itemSelection.each(function (selection) {
- if (eq(selection.end, item)) {
- selectionState.set(false);
- }
- });
- var childListEntries = lastChild(item).filter(isList$1).map(function (list) {
- return parseList(depth, itemSelection, selectionState, list);
- }).getOr([]);
- return currentItemEntry.toArray().concat(childListEntries);
- }, function (list) {
- return parseList(depth, itemSelection, selectionState, list);
- });
- };
- var parseList = function (depth, itemSelection, selectionState, list) {
- return bind(children(list), function (element) {
- var parser = isList$1(element) ? parseList : parseItem;
- var newDepth = depth + 1;
- return parser(newDepth, itemSelection, selectionState, element);
- });
- };
- var parseLists = function (lists, itemSelection) {
- var selectionState = Cell(false);
- var initialDepth = 0;
- return map(lists, function (list) {
- return {
- sourceList: list,
- entries: parseList(initialDepth, itemSelection, selectionState, list)
- };
- });
- };
-
- var global$8 = tinymce.util.Tools.resolve('tinymce.Env');
-
- var createTextBlock = function (editor, contentNode) {
- var dom = editor.dom;
- var blockElements = editor.schema.getBlockElements();
- var fragment = dom.createFragment();
- var node, textBlock, blockName, hasContentNode;
- if (editor.settings.forced_root_block) {
- blockName = editor.settings.forced_root_block;
- }
- if (blockName) {
- textBlock = dom.create(blockName);
- if (textBlock.tagName === editor.settings.forced_root_block) {
- dom.setAttribs(textBlock, editor.settings.forced_root_block_attrs);
- }
- if (!NodeType.isBlock(contentNode.firstChild, blockElements)) {
- fragment.appendChild(textBlock);
- }
- }
- if (contentNode) {
- while (node = contentNode.firstChild) {
- var nodeName = node.nodeName;
- if (!hasContentNode && (nodeName !== 'SPAN' || node.getAttribute('data-mce-type') !== 'bookmark')) {
- hasContentNode = true;
- }
- if (NodeType.isBlock(node, blockElements)) {
- fragment.appendChild(node);
- textBlock = null;
- } else {
- if (blockName) {
- if (!textBlock) {
- textBlock = dom.create(blockName);
- fragment.appendChild(textBlock);
- }
- textBlock.appendChild(node);
- } else {
- fragment.appendChild(node);
- }
- }
- }
- }
- if (!editor.settings.forced_root_block) {
- fragment.appendChild(dom.create('br'));
- } else {
- if (!hasContentNode && (!global$8.ie || global$8.ie > 10)) {
- textBlock.appendChild(dom.create('br', { 'data-mce-bogus': '1' }));
- }
- }
- return fragment;
- };
-
- var outdentedComposer = function (editor, entries) {
- return map(entries, function (entry) {
- var content = fromElements(entry.content);
- return Element.fromDom(createTextBlock(editor, content.dom()));
- });
- };
- var indentedComposer = function (editor, entries) {
- normalizeEntries(entries);
- return composeList(editor.contentDocument, entries).toArray();
- };
- var composeEntries = function (editor, entries) {
- return bind(groupBy(entries, isIndented), function (entries) {
- var groupIsIndented = head(entries).map(isIndented).getOr(false);
- return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries);
- });
- };
- var indentSelectedEntries = function (entries, indentation) {
- each(filter(entries, isSelected), function (entry) {
- return indentEntry(indentation, entry);
- });
- };
- var getItemSelection = function (editor) {
- var selectedListItems = map(Selection.getSelectedListItems(editor), Element.fromDom);
- return lift2(find(selectedListItems, not(hasFirstChildList)), find(reverse(selectedListItems), not(hasFirstChildList)), function (start, end) {
- return {
- start: start,
- end: end
- };
- });
- };
- var listsIndentation = function (editor, lists, indentation) {
- var entrySets = parseLists(lists, getItemSelection(editor));
- each(entrySets, function (entrySet) {
- indentSelectedEntries(entrySet.entries, indentation);
- before$1(entrySet.sourceList, composeEntries(editor, entrySet.entries));
- remove(entrySet.sourceList);
- });
- };
-
- var DOM$1 = global$6.DOM;
- var splitList = function (editor, ul, li) {
- var tmpRng, fragment, bookmarks, node, newBlock;
- var removeAndKeepBookmarks = function (targetNode) {
- global$5.each(bookmarks, function (node) {
- targetNode.parentNode.insertBefore(node, li.parentNode);
- });
- DOM$1.remove(targetNode);
- };
- bookmarks = DOM$1.select('span[data-mce-type="bookmark"]', ul);
- newBlock = createTextBlock(editor, li);
- tmpRng = DOM$1.createRng();
- tmpRng.setStartAfter(li);
- tmpRng.setEndAfter(ul);
- fragment = tmpRng.extractContents();
- for (node = fragment.firstChild; node; node = node.firstChild) {
- if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) {
- DOM$1.remove(node);
- break;
- }
- }
- if (!editor.dom.isEmpty(fragment)) {
- DOM$1.insertAfter(fragment, ul);
- }
- DOM$1.insertAfter(newBlock, ul);
- if (NodeType.isEmpty(editor.dom, li.parentNode)) {
- removeAndKeepBookmarks(li.parentNode);
- }
- DOM$1.remove(li);
- if (NodeType.isEmpty(editor.dom, ul)) {
- DOM$1.remove(ul);
- }
- };
- var SplitList = { splitList: splitList };
-
- var outdentDlItem = function (editor, item) {
- if (is$1(item, 'dd')) {
- mutate(item, 'dt');
- } else if (is$1(item, 'dt')) {
- parent(item).each(function (dl) {
- return SplitList.splitList(editor, dl.dom(), item.dom());
- });
- }
- };
- var indentDlItem = function (item) {
- if (is$1(item, 'dt')) {
- mutate(item, 'dd');
- }
- };
- var dlIndentation = function (editor, indentation, dlItems) {
- if (indentation === 'Indent') {
- each(dlItems, indentDlItem);
- } else {
- each(dlItems, function (item) {
- return outdentDlItem(editor, item);
- });
- }
- };
-
- var selectionIndentation = function (editor, indentation) {
- var lists = map(Selection.getSelectedListRoots(editor), Element.fromDom);
- var dlItems = map(Selection.getSelectedDlItems(editor), Element.fromDom);
- var isHandled = false;
- if (lists.length || dlItems.length) {
- var bookmark = editor.selection.getBookmark();
- listsIndentation(editor, lists, indentation);
- dlIndentation(editor, indentation, dlItems);
- editor.selection.moveToBookmark(bookmark);
- editor.selection.setRng(Range.normalizeRange(editor.selection.getRng()));
- editor.nodeChanged();
- isHandled = true;
- }
- return isHandled;
- };
- var indentListSelection = function (editor) {
- return selectionIndentation(editor, 'Indent');
- };
- var outdentListSelection = function (editor) {
- return selectionIndentation(editor, 'Outdent');
- };
- var flattenListSelection = function (editor) {
- return selectionIndentation(editor, 'Flatten');
- };
-
- var updateListStyle = function (dom, el, detail) {
- var type = detail['list-style-type'] ? detail['list-style-type'] : null;
- dom.setStyle(el, 'list-style-type', type);
- };
- var setAttribs = function (elm, attrs) {
- global$5.each(attrs, function (value, key) {
- elm.setAttribute(key, value);
- });
- };
- var updateListAttrs = function (dom, el, detail) {
- setAttribs(el, detail['list-attributes']);
- global$5.each(dom.select('li', el), function (li) {
- setAttribs(li, detail['list-item-attributes']);
- });
- };
- var updateListWithDetails = function (dom, el, detail) {
- updateListStyle(dom, el, detail);
- updateListAttrs(dom, el, detail);
- };
- var removeStyles = function (dom, element, styles) {
- global$5.each(styles, function (style) {
- var _a;
- return dom.setStyle(element, (_a = {}, _a[style] = '', _a));
- });
- };
- var getEndPointNode = function (editor, rng, start, root) {
- var container, offset;
- container = rng[start ? 'startContainer' : 'endContainer'];
- offset = rng[start ? 'startOffset' : 'endOffset'];
- if (container.nodeType === 1) {
- container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;
- }
- if (!start && NodeType.isBr(container.nextSibling)) {
- container = container.nextSibling;
- }
- while (container.parentNode !== root) {
- if (NodeType.isTextBlock(editor, container)) {
- return container;
- }
- if (/^(TD|TH)$/.test(container.parentNode.nodeName)) {
- return container;
- }
- container = container.parentNode;
- }
- return container;
- };
- var getSelectedTextBlocks = function (editor, rng, root) {
- var textBlocks = [], dom = editor.dom;
- var startNode = getEndPointNode(editor, rng, true, root);
- var endNode = getEndPointNode(editor, rng, false, root);
- var block;
- var siblings = [];
- for (var node = startNode; node; node = node.nextSibling) {
- siblings.push(node);
- if (node === endNode) {
- break;
- }
- }
- global$5.each(siblings, function (node) {
- if (NodeType.isTextBlock(editor, node)) {
- textBlocks.push(node);
- block = null;
- return;
- }
- if (dom.isBlock(node) || NodeType.isBr(node)) {
- if (NodeType.isBr(node)) {
- dom.remove(node);
- }
- block = null;
- return;
- }
- var nextSibling = node.nextSibling;
- if (global$4.isBookmarkNode(node)) {
- if (NodeType.isTextBlock(editor, nextSibling) || !nextSibling && node.parentNode === root) {
- block = null;
- return;
- }
- }
- if (!block) {
- block = dom.create('p');
- node.parentNode.insertBefore(block, node);
- textBlocks.push(block);
- }
- block.appendChild(node);
- });
- return textBlocks;
- };
- var hasCompatibleStyle = function (dom, sib, detail) {
- var sibStyle = dom.getStyle(sib, 'list-style-type');
- var detailStyle = detail ? detail['list-style-type'] : '';
- detailStyle = detailStyle === null ? '' : detailStyle;
- return sibStyle === detailStyle;
- };
- var applyList = function (editor, listName, detail) {
- if (detail === void 0) {
- detail = {};
- }
- var rng = editor.selection.getRng(true);
- var bookmark;
- var listItemName = 'LI';
- var root = Selection.getClosestListRootElm(editor, editor.selection.getStart(true));
- var dom = editor.dom;
- if (dom.getContentEditable(editor.selection.getNode()) === 'false') {
- return;
- }
- listName = listName.toUpperCase();
- if (listName === 'DL') {
- listItemName = 'DT';
- }
- bookmark = Bookmark.createBookmark(rng);
- global$5.each(getSelectedTextBlocks(editor, rng, root), function (block) {
- var listBlock, sibling;
- sibling = block.previousSibling;
- if (sibling && NodeType.isListNode(sibling) && sibling.nodeName === listName && hasCompatibleStyle(dom, sibling, detail)) {
- listBlock = sibling;
- block = dom.rename(block, listItemName);
- sibling.appendChild(block);
- } else {
- listBlock = dom.create(listName);
- block.parentNode.insertBefore(listBlock, block);
- listBlock.appendChild(block);
- block = dom.rename(block, listItemName);
- }
- removeStyles(dom, block, [
- 'margin',
- 'margin-right',
- 'margin-bottom',
- 'margin-left',
- 'margin-top',
- 'padding',
- 'padding-right',
- 'padding-bottom',
- 'padding-left',
- 'padding-top'
- ]);
- updateListWithDetails(dom, listBlock, detail);
- mergeWithAdjacentLists(editor.dom, listBlock);
- });
- editor.selection.setRng(Bookmark.resolveBookmark(bookmark));
- };
- var isValidLists = function (list1, list2) {
- return list1 && list2 && NodeType.isListNode(list1) && list1.nodeName === list2.nodeName;
- };
- var hasSameListStyle = function (dom, list1, list2) {
- var targetStyle = dom.getStyle(list1, 'list-style-type', true);
- var style = dom.getStyle(list2, 'list-style-type', true);
- return targetStyle === style;
- };
- var hasSameClasses = function (elm1, elm2) {
- return elm1.className === elm2.className;
- };
- var shouldMerge = function (dom, list1, list2) {
- return isValidLists(list1, list2) && hasSameListStyle(dom, list1, list2) && hasSameClasses(list1, list2);
- };
- var mergeWithAdjacentLists = function (dom, listBlock) {
- var sibling, node;
- sibling = listBlock.nextSibling;
- if (shouldMerge(dom, listBlock, sibling)) {
- while (node = sibling.firstChild) {
- listBlock.appendChild(node);
- }
- dom.remove(sibling);
- }
- sibling = listBlock.previousSibling;
- if (shouldMerge(dom, listBlock, sibling)) {
- while (node = sibling.lastChild) {
- listBlock.insertBefore(node, listBlock.firstChild);
- }
- dom.remove(sibling);
- }
- };
- var updateList = function (dom, list, listName, detail) {
- if (list.nodeName !== listName) {
- var newList = dom.rename(list, listName);
- updateListWithDetails(dom, newList, detail);
- } else {
- updateListWithDetails(dom, list, detail);
- }
- };
- var toggleMultipleLists = function (editor, parentList, lists, listName, detail) {
- if (parentList.nodeName === listName && !hasListStyleDetail(detail)) {
- flattenListSelection(editor);
- } else {
- var bookmark = Bookmark.createBookmark(editor.selection.getRng(true));
- global$5.each([parentList].concat(lists), function (elm) {
- updateList(editor.dom, elm, listName, detail);
- });
- editor.selection.setRng(Bookmark.resolveBookmark(bookmark));
- }
- };
- var hasListStyleDetail = function (detail) {
- return 'list-style-type' in detail;
- };
- var toggleSingleList = function (editor, parentList, listName, detail) {
- if (parentList === editor.getBody()) {
- return;
- }
- if (parentList) {
- if (parentList.nodeName === listName && !hasListStyleDetail(detail)) {
- flattenListSelection(editor);
- } else {
- var bookmark = Bookmark.createBookmark(editor.selection.getRng(true));
- updateListWithDetails(editor.dom, parentList, detail);
- mergeWithAdjacentLists(editor.dom, editor.dom.rename(parentList, listName));
- editor.selection.setRng(Bookmark.resolveBookmark(bookmark));
- }
- } else {
- applyList(editor, listName, detail);
- }
- };
- var toggleList = function (editor, listName, detail) {
- var parentList = Selection.getParentList(editor);
- var selectedSubLists = Selection.getSelectedSubLists(editor);
- detail = detail ? detail : {};
- if (parentList && selectedSubLists.length > 0) {
- toggleMultipleLists(editor, parentList, selectedSubLists, listName, detail);
- } else {
- toggleSingleList(editor, parentList, listName, detail);
- }
- };
- var ToggleList = {
- toggleList: toggleList,
- mergeWithAdjacentLists: mergeWithAdjacentLists
- };
-
- var DOM$2 = global$6.DOM;
- var normalizeList = function (dom, ul) {
- var sibling;
- var parentNode = ul.parentNode;
- if (parentNode.nodeName === 'LI' && parentNode.firstChild === ul) {
- sibling = parentNode.previousSibling;
- if (sibling && sibling.nodeName === 'LI') {
- sibling.appendChild(ul);
- if (NodeType.isEmpty(dom, parentNode)) {
- DOM$2.remove(parentNode);
- }
- } else {
- DOM$2.setStyle(parentNode, 'listStyleType', 'none');
- }
- }
- if (NodeType.isListNode(parentNode)) {
- sibling = parentNode.previousSibling;
- if (sibling && sibling.nodeName === 'LI') {
- sibling.appendChild(ul);
- }
- }
- };
- var normalizeLists = function (dom, element) {
- global$5.each(global$5.grep(dom.select('ol,ul', element)), function (ul) {
- normalizeList(dom, ul);
- });
- };
- var NormalizeLists = {
- normalizeList: normalizeList,
- normalizeLists: normalizeLists
- };
-
- var findNextCaretContainer = function (editor, rng, isForward, root) {
- var node = rng.startContainer;
- var offset = rng.startOffset;
- var nonEmptyBlocks, walker;
- if (node.nodeType === 3 && (isForward ? offset < node.data.length : offset > 0)) {
- return node;
- }
- nonEmptyBlocks = editor.schema.getNonEmptyElements();
- if (node.nodeType === 1) {
- node = global$1.getNode(node, offset);
- }
- walker = new global$2(node, root);
- if (isForward) {
- if (NodeType.isBogusBr(editor.dom, node)) {
- walker.next();
- }
- }
- while (node = walker[isForward ? 'next' : 'prev2']()) {
- if (node.nodeName === 'LI' && !node.hasChildNodes()) {
- return node;
- }
- if (nonEmptyBlocks[node.nodeName]) {
- return node;
- }
- if (node.nodeType === 3 && node.data.length > 0) {
- return node;
- }
- }
- };
- var hasOnlyOneBlockChild = function (dom, elm) {
- var childNodes = elm.childNodes;
- return childNodes.length === 1 && !NodeType.isListNode(childNodes[0]) && dom.isBlock(childNodes[0]);
- };
- var unwrapSingleBlockChild = function (dom, elm) {
- if (hasOnlyOneBlockChild(dom, elm)) {
- dom.remove(elm.firstChild, true);
- }
- };
- var moveChildren = function (dom, fromElm, toElm) {
- var node, targetElm;
- targetElm = hasOnlyOneBlockChild(dom, toElm) ? toElm.firstChild : toElm;
- unwrapSingleBlockChild(dom, fromElm);
- if (!NodeType.isEmpty(dom, fromElm, true)) {
- while (node = fromElm.firstChild) {
- targetElm.appendChild(node);
- }
- }
- };
- var mergeLiElements = function (dom, fromElm, toElm) {
- var node, listNode;
- var ul = fromElm.parentNode;
- if (!NodeType.isChildOfBody(dom, fromElm) || !NodeType.isChildOfBody(dom, toElm)) {
- return;
- }
- if (NodeType.isListNode(toElm.lastChild)) {
- listNode = toElm.lastChild;
- }
- if (ul === toElm.lastChild) {
- if (NodeType.isBr(ul.previousSibling)) {
- dom.remove(ul.previousSibling);
- }
- }
- node = toElm.lastChild;
- if (node && NodeType.isBr(node) && fromElm.hasChildNodes()) {
- dom.remove(node);
- }
- if (NodeType.isEmpty(dom, toElm, true)) {
- dom.$(toElm).empty();
- }
- moveChildren(dom, fromElm, toElm);
- if (listNode) {
- toElm.appendChild(listNode);
- }
- var contains = contains$1(Element.fromDom(toElm), Element.fromDom(fromElm));
- var nestedLists = contains ? dom.getParents(fromElm, NodeType.isListNode, toElm) : [];
- dom.remove(fromElm);
- each(nestedLists, function (list) {
- if (NodeType.isEmpty(dom, list) && list !== dom.getRoot()) {
- dom.remove(list);
- }
- });
- };
- var mergeIntoEmptyLi = function (editor, fromLi, toLi) {
- editor.dom.$(toLi).empty();
- mergeLiElements(editor.dom, fromLi, toLi);
- editor.selection.setCursorLocation(toLi);
- };
- var mergeForward = function (editor, rng, fromLi, toLi) {
- var dom = editor.dom;
- if (dom.isEmpty(toLi)) {
- mergeIntoEmptyLi(editor, fromLi, toLi);
- } else {
- var bookmark = Bookmark.createBookmark(rng);
- mergeLiElements(dom, fromLi, toLi);
- editor.selection.setRng(Bookmark.resolveBookmark(bookmark));
- }
- };
- var mergeBackward = function (editor, rng, fromLi, toLi) {
- var bookmark = Bookmark.createBookmark(rng);
- mergeLiElements(editor.dom, fromLi, toLi);
- var resolvedBookmark = Bookmark.resolveBookmark(bookmark);
- editor.selection.setRng(resolvedBookmark);
- };
- var backspaceDeleteFromListToListCaret = function (editor, isForward) {
- var dom = editor.dom, selection = editor.selection;
- var selectionStartElm = selection.getStart();
- var root = Selection.getClosestListRootElm(editor, selectionStartElm);
- var li = dom.getParent(selection.getStart(), 'LI', root);
- var ul, rng, otherLi;
- if (li) {
- ul = li.parentNode;
- if (ul === editor.getBody() && NodeType.isEmpty(dom, ul)) {
- return true;
- }
- rng = Range.normalizeRange(selection.getRng(true));
- otherLi = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root);
- if (otherLi && otherLi !== li) {
- if (isForward) {
- mergeForward(editor, rng, otherLi, li);
- } else {
- mergeBackward(editor, rng, li, otherLi);
- }
- return true;
- } else if (!otherLi) {
- if (!isForward) {
- flattenListSelection(editor);
- return true;
- }
- }
- }
- return false;
- };
- var removeBlock = function (dom, block, root) {
- var parentBlock = dom.getParent(block.parentNode, dom.isBlock, root);
- dom.remove(block);
- if (parentBlock && dom.isEmpty(parentBlock)) {
- dom.remove(parentBlock);
- }
- };
- var backspaceDeleteIntoListCaret = function (editor, isForward) {
- var dom = editor.dom;
- var selectionStartElm = editor.selection.getStart();
- var root = Selection.getClosestListRootElm(editor, selectionStartElm);
- var block = dom.getParent(selectionStartElm, dom.isBlock, root);
- if (block && dom.isEmpty(block)) {
- var rng = Range.normalizeRange(editor.selection.getRng(true));
- var otherLi_1 = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root);
- if (otherLi_1) {
- editor.undoManager.transact(function () {
- removeBlock(dom, block, root);
- ToggleList.mergeWithAdjacentLists(dom, otherLi_1.parentNode);
- editor.selection.select(otherLi_1, true);
- editor.selection.collapse(isForward);
- });
- return true;
- }
- }
- return false;
- };
- var backspaceDeleteCaret = function (editor, isForward) {
- return backspaceDeleteFromListToListCaret(editor, isForward) || backspaceDeleteIntoListCaret(editor, isForward);
- };
- var backspaceDeleteRange = function (editor) {
- var selectionStartElm = editor.selection.getStart();
- var root = Selection.getClosestListRootElm(editor, selectionStartElm);
- var startListParent = editor.dom.getParent(selectionStartElm, 'LI,DT,DD', root);
- if (startListParent || Selection.getSelectedListItems(editor).length > 0) {
- editor.undoManager.transact(function () {
- editor.execCommand('Delete');
- NormalizeLists.normalizeLists(editor.dom, editor.getBody());
- });
- return true;
- }
- return false;
- };
- var backspaceDelete = function (editor, isForward) {
- return editor.selection.isCollapsed() ? backspaceDeleteCaret(editor, isForward) : backspaceDeleteRange(editor);
- };
- var setup = function (editor) {
- editor.on('keydown', function (e) {
- if (e.keyCode === global$3.BACKSPACE) {
- if (backspaceDelete(editor, false)) {
- e.preventDefault();
- }
- } else if (e.keyCode === global$3.DELETE) {
- if (backspaceDelete(editor, true)) {
- e.preventDefault();
- }
- }
- });
- };
- var Delete = {
- setup: setup,
- backspaceDelete: backspaceDelete
- };
-
- var get = function (editor) {
- return {
- backspaceDelete: function (isForward) {
- Delete.backspaceDelete(editor, isForward);
- }
- };
- };
- var Api = { get: get };
-
- var queryListCommandState = function (editor, listName) {
- return function () {
- var parentList = editor.dom.getParent(editor.selection.getStart(), 'UL,OL,DL');
- return parentList && parentList.nodeName === listName;
- };
- };
- var register = function (editor) {
- editor.on('BeforeExecCommand', function (e) {
- var cmd = e.command.toLowerCase();
- if (cmd === 'indent') {
- indentListSelection(editor);
- } else if (cmd === 'outdent') {
- outdentListSelection(editor);
- }
- });
- editor.addCommand('InsertUnorderedList', function (ui, detail) {
- ToggleList.toggleList(editor, 'UL', detail);
- });
- editor.addCommand('InsertOrderedList', function (ui, detail) {
- ToggleList.toggleList(editor, 'OL', detail);
- });
- editor.addCommand('InsertDefinitionList', function (ui, detail) {
- ToggleList.toggleList(editor, 'DL', detail);
- });
- editor.addCommand('RemoveList', function () {
- flattenListSelection(editor);
- });
- editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState(editor, 'UL'));
- editor.addQueryStateHandler('InsertOrderedList', queryListCommandState(editor, 'OL'));
- editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState(editor, 'DL'));
- };
- var Commands = { register: register };
-
- var shouldIndentOnTab = function (editor) {
- return editor.getParam('lists_indent_on_tab', true);
- };
- var Settings = { shouldIndentOnTab: shouldIndentOnTab };
-
- var setupTabKey = function (editor) {
- editor.on('keydown', function (e) {
- if (e.keyCode !== global$3.TAB || global$3.metaKeyPressed(e)) {
- return;
- }
- editor.undoManager.transact(function () {
- if (e.shiftKey ? outdentListSelection(editor) : indentListSelection(editor)) {
- e.preventDefault();
- }
- });
- });
- };
- var setup$1 = function (editor) {
- if (Settings.shouldIndentOnTab(editor)) {
- setupTabKey(editor);
- }
- Delete.setup(editor);
- };
- var Keyboard = { setup: setup$1 };
-
- var findIndex = function (list, predicate) {
- for (var index = 0; index < list.length; index++) {
- var element = list[index];
- if (predicate(element)) {
- return index;
- }
- }
- return -1;
- };
- var listState = function (editor, listName) {
- return function (e) {
- var ctrl = e.control;
- editor.on('NodeChange', function (e) {
- var tableCellIndex = findIndex(e.parents, NodeType.isTableCellNode);
- var parents = tableCellIndex !== -1 ? e.parents.slice(0, tableCellIndex) : e.parents;
- var lists = global$5.grep(parents, NodeType.isListNode);
- ctrl.active(lists.length > 0 && lists[0].nodeName === listName);
- });
- };
- };
- var register$1 = function (editor) {
- var hasPlugin = function (editor, plugin) {
- var plugins = editor.settings.plugins ? editor.settings.plugins : '';
- return global$5.inArray(plugins.split(/[ ,]/), plugin) !== -1;
- };
- if (!hasPlugin(editor, 'advlist')) {
- editor.addButton('numlist', {
- active: false,
- title: 'Numbered list',
- cmd: 'InsertOrderedList',
- onPostRender: listState(editor, 'OL')
- });
- editor.addButton('bullist', {
- active: false,
- title: 'Bullet list',
- cmd: 'InsertUnorderedList',
- onPostRender: listState(editor, 'UL')
- });
- }
- editor.addButton('indent', {
- icon: 'indent',
- title: 'Increase indent',
- cmd: 'Indent'
- });
- };
- var Buttons = { register: register$1 };
-
- global.add('lists', function (editor) {
- Keyboard.setup(editor);
- Buttons.register(editor);
- Commands.register(editor);
- return Api.get(editor);
- });
- function Plugin () {
- }
-
- return Plugin;
-
-}(window));
-})();
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/lists/plugin.min.js b/src/js/_enqueues/vendor/tinymce/plugins/lists/plugin.min.js
index d92fc6df35bdf..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/lists/plugin.min.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/lists/plugin.min.js
@@ -1 +0,0 @@
-!function(u){"use strict";var e,n,t,r,o,i,s,a,c,f=tinymce.util.Tools.resolve("tinymce.PluginManager"),d=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),l=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),m=tinymce.util.Tools.resolve("tinymce.util.VK"),p=tinymce.util.Tools.resolve("tinymce.dom.BookmarkManager"),v=tinymce.util.Tools.resolve("tinymce.util.Tools"),g=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),h=function(e){return e&&"BR"===e.nodeName},y=function(e){return e&&3===e.nodeType},N=function(e){return e&&/^(OL|UL|DL)$/.test(e.nodeName)},S=function(e){return e&&/^(OL|UL)$/.test(e.nodeName)},C=function(e){return e&&/^(DT|DD)$/.test(e.nodeName)},O=function(e){return e&&/^(LI|DT|DD)$/.test(e.nodeName)},b=function(e){return e&&/^(TH|TD)$/.test(e.nodeName)},T=h,E=function(e,n){return n&&!!e.schema.getTextBlockElements()[n.nodeName]},L=function(e,n){return e&&e.nodeName in n},D=function(e,n){return!!h(n)&&!(!e.isBlock(n.nextSibling)||h(n.previousSibling))},w=function(e,n,t){var r=e.isEmpty(n);return!(t&&0=e.childNodes.length?t.data.length:0}:t.previousSibling&&y(t.previousSibling)?{container:t.previousSibling,offset:t.previousSibling.data.length}:t.nextSibling&&y(t.nextSibling)?{container:t.nextSibling,offset:0}:{container:e,offset:n}},x=function(e){var n=e.cloneRange(),t=A(e.startContainer,e.startOffset);n.setStart(t.container,t.offset);var r=A(e.endContainer,e.endOffset);return n.setEnd(r.container,r.offset),n},R=g.DOM,I=function(o){var i={},e=function(e){var n,t,r;t=o[e?"startContainer":"endContainer"],r=o[e?"startOffset":"endOffset"],1===t.nodeType&&(n=R.create("span",{"data-mce-type":"bookmark"}),t.hasChildNodes()?(r=Math.min(r,t.childNodes.length-1),e?t.insertBefore(n,t.childNodes[r]):R.insertAfter(n,t.childNodes[r])):t.appendChild(n),t=n,r=0),i[e?"startContainer":"endContainer"]=t,i[e?"startOffset":"endOffset"]=r};return e(!0),o.collapsed||e(),i},_=function(o){function e(e){var n,t,r;n=r=o[e?"startContainer":"endContainer"],t=o[e?"startOffset":"endOffset"],n&&(1===n.nodeType&&(t=function(e){for(var n=e.parentNode.firstChild,t=0;n;){if(n===e)return t;1===n.nodeType&&"bookmark"===n.getAttribute("data-mce-type")||t++,n=n.nextSibling}return-1}(n),n=n.parentNode,R.remove(r),!n.hasChildNodes()&&R.isBlock(n)&&n.appendChild(R.create("br"))),o[e?"startContainer":"endContainer"]=n,o[e?"startOffset":"endOffset"]=t)}e(!0),e();var n=R.createRng();return n.setStart(o.startContainer,o.startOffset),o.endContainer&&n.setEnd(o.endContainer,o.endOffset),x(n)},B=function(){},P=function(e){return function(){return e}},M=function(t){return function(){for(var e=[],n=0;ne.length?Sn(t,e,n):Nn(t,e,n)},[]),oe(o).map(function(e){return e.list})).toArray();var t,r,o},Pn=function(e){var n,t,r=J(ve.getSelectedListItems(e),ye.fromDom);return Ne(te(r,M(On)),te((n=r,(t=Y.call(n,0)).reverse(),t),M(On)),function(e,n){return{start:e,end:n}})},Mn=function(s,e,a){var n,t,r,o=(n=e,t=Pn(s),r=kn(!1),J(n,function(e){return{sourceList:e,entries:xn(0,t,r,e)}}));Z(o,function(e){var n,t,r,o,i,u;n=e.entries,t=a,Z(ee(n,Tn),function(e){return function(e,n){switch(e){case"Indent":n.depth++;break;case"Outdent":n.depth--;break;case"Flatten":n.depth=0}}(t,e)}),r=e.sourceList,i=s,u=e.entries,o=re(function(e,n){if(0===e.length)return[];for(var t=n(e[0]),r=[],o=[],i=0,u=e.length;i 0) {
- return global$2.extend({}, pattern[0], { url: getUrl(pattern[0], url) });
- } else {
- return null;
- }
- };
-
- var getIframeHtml = function (data) {
- var allowFullscreen = data.allowFullscreen ? ' allowFullscreen="1"' : '';
- return '';
- };
- var getFlashHtml = function (data) {
- var html = '';
- if (data.poster) {
- html += ' ';
- }
- html += ' ';
- return html;
- };
- var getAudioHtml = function (data, audioTemplateCallback) {
- if (audioTemplateCallback) {
- return audioTemplateCallback(data);
- } else {
- return '' + (data.source2 ? '\n \n' : '') + ' ';
- }
- };
- var getVideoHtml = function (data, videoTemplateCallback) {
- if (videoTemplateCallback) {
- return videoTemplateCallback(data);
- } else {
- return '\n' + ' \n' + (data.source2 ? ' \n' : '') + ' ';
- }
- };
- var getScriptHtml = function (data) {
- return '';
- };
- var dataToHtml = function (editor, dataIn) {
- var data = global$2.extend({}, dataIn);
- if (!data.source1) {
- global$2.extend(data, HtmlToData.htmlToData(Settings.getScripts(editor), data.embed));
- if (!data.source1) {
- return '';
- }
- }
- if (!data.source2) {
- data.source2 = '';
- }
- if (!data.poster) {
- data.poster = '';
- }
- data.source1 = editor.convertURL(data.source1, 'source');
- data.source2 = editor.convertURL(data.source2, 'source');
- data.source1mime = Mime.guess(data.source1);
- data.source2mime = Mime.guess(data.source2);
- data.poster = editor.convertURL(data.poster, 'poster');
- var pattern = matchPattern(data.source1);
- if (pattern) {
- data.source1 = pattern.url;
- data.type = pattern.type;
- data.allowFullscreen = pattern.allowFullscreen;
- data.width = data.width || pattern.w;
- data.height = data.height || pattern.h;
- }
- if (data.embed) {
- return UpdateHtml.updateHtml(data.embed, data, true);
- } else {
- var videoScript = VideoScript.getVideoScriptMatch(Settings.getScripts(editor), data.source1);
- if (videoScript) {
- data.type = 'script';
- data.width = videoScript.width;
- data.height = videoScript.height;
- }
- var audioTemplateCallback = Settings.getAudioTemplateCallback(editor);
- var videoTemplateCallback = Settings.getVideoTemplateCallback(editor);
- data.width = data.width || 300;
- data.height = data.height || 150;
- global$2.each(data, function (value, key) {
- data[key] = editor.dom.encode(value);
- });
- if (data.type === 'iframe') {
- return getIframeHtml(data);
- } else if (data.source1mime === 'application/x-shockwave-flash') {
- return getFlashHtml(data);
- } else if (data.source1mime.indexOf('audio') !== -1) {
- return getAudioHtml(data, audioTemplateCallback);
- } else if (data.type === 'script') {
- return getScriptHtml(data);
- } else {
- return getVideoHtml(data, videoTemplateCallback);
- }
- }
- };
- var DataToHtml = { dataToHtml: dataToHtml };
-
- var cache = {};
- var embedPromise = function (data, dataToHtml, handler) {
- return new global$5(function (res, rej) {
- var wrappedResolve = function (response) {
- if (response.html) {
- cache[data.source1] = response;
- }
- return res({
- url: data.source1,
- html: response.html ? response.html : dataToHtml(data)
- });
- };
- if (cache[data.source1]) {
- wrappedResolve(cache[data.source1]);
- } else {
- handler({ url: data.source1 }, wrappedResolve, rej);
- }
- });
- };
- var defaultPromise = function (data, dataToHtml) {
- return new global$5(function (res) {
- res({
- html: dataToHtml(data),
- url: data.source1
- });
- });
- };
- var loadedData = function (editor) {
- return function (data) {
- return DataToHtml.dataToHtml(editor, data);
- };
- };
- var getEmbedHtml = function (editor, data) {
- var embedHandler = Settings.getUrlResolver(editor);
- return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor));
- };
- var isCached = function (url) {
- return cache.hasOwnProperty(url);
- };
- var Service = {
- getEmbedHtml: getEmbedHtml,
- isCached: isCached
- };
-
- var trimPx$1 = function (value) {
- return value.replace(/px$/, '');
- };
- var addPx$1 = function (value) {
- return /^[0-9.]+$/.test(value) ? value + 'px' : value;
- };
- var getSize = function (name) {
- return function (elm) {
- return elm ? trimPx$1(elm.style[name]) : '';
- };
- };
- var setSize = function (name) {
- return function (elm, value) {
- if (elm) {
- elm.style[name] = addPx$1(value);
- }
- };
- };
- var Size = {
- getMaxWidth: getSize('maxWidth'),
- getMaxHeight: getSize('maxHeight'),
- setMaxWidth: setSize('maxWidth'),
- setMaxHeight: setSize('maxHeight')
- };
-
- var doSyncSize = function (widthCtrl, heightCtrl) {
- widthCtrl.state.set('oldVal', widthCtrl.value());
- heightCtrl.state.set('oldVal', heightCtrl.value());
- };
- var doSizeControls = function (win, f) {
- var widthCtrl = win.find('#width')[0];
- var heightCtrl = win.find('#height')[0];
- var constrained = win.find('#constrain')[0];
- if (widthCtrl && heightCtrl && constrained) {
- f(widthCtrl, heightCtrl, constrained.checked());
- }
- };
- var doUpdateSize = function (widthCtrl, heightCtrl, isContrained) {
- var oldWidth = widthCtrl.state.get('oldVal');
- var oldHeight = heightCtrl.state.get('oldVal');
- var newWidth = widthCtrl.value();
- var newHeight = heightCtrl.value();
- if (isContrained && oldWidth && oldHeight && newWidth && newHeight) {
- if (newWidth !== oldWidth) {
- newHeight = Math.round(newWidth / oldWidth * newHeight);
- if (!isNaN(newHeight)) {
- heightCtrl.value(newHeight);
- }
- } else {
- newWidth = Math.round(newHeight / oldHeight * newWidth);
- if (!isNaN(newWidth)) {
- widthCtrl.value(newWidth);
- }
- }
- }
- doSyncSize(widthCtrl, heightCtrl);
- };
- var syncSize = function (win) {
- doSizeControls(win, doSyncSize);
- };
- var updateSize = function (win) {
- doSizeControls(win, doUpdateSize);
- };
- var createUi = function (onChange) {
- var recalcSize = function () {
- onChange(function (win) {
- updateSize(win);
- });
- };
- return {
- type: 'container',
- label: 'Dimensions',
- layout: 'flex',
- align: 'center',
- spacing: 5,
- items: [
- {
- name: 'width',
- type: 'textbox',
- maxLength: 5,
- size: 5,
- onchange: recalcSize,
- ariaLabel: 'Width'
- },
- {
- type: 'label',
- text: 'x'
- },
- {
- name: 'height',
- type: 'textbox',
- maxLength: 5,
- size: 5,
- onchange: recalcSize,
- ariaLabel: 'Height'
- },
- {
- name: 'constrain',
- type: 'checkbox',
- checked: true,
- text: 'Constrain proportions'
- }
- ]
- };
- };
- var SizeManager = {
- createUi: createUi,
- syncSize: syncSize,
- updateSize: updateSize
- };
-
- var embedChange = global$1.ie && global$1.ie <= 8 ? 'onChange' : 'onInput';
- var handleError = function (editor) {
- return function (error) {
- var errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.';
- editor.notificationManager.open({
- type: 'error',
- text: errorMessage
- });
- };
- };
- var getData = function (editor) {
- var element = editor.selection.getNode();
- var dataEmbed = element.getAttribute('data-ephox-embed-iri');
- if (dataEmbed) {
- return {
- 'source1': dataEmbed,
- 'data-ephox-embed-iri': dataEmbed,
- 'width': Size.getMaxWidth(element),
- 'height': Size.getMaxHeight(element)
- };
- }
- return element.getAttribute('data-mce-object') ? HtmlToData.htmlToData(Settings.getScripts(editor), editor.serializer.serialize(element, { selection: true })) : {};
- };
- var getSource = function (editor) {
- var elm = editor.selection.getNode();
- if (elm.getAttribute('data-mce-object') || elm.getAttribute('data-ephox-embed-iri')) {
- return editor.selection.getContent();
- }
- };
- var addEmbedHtml = function (win, editor) {
- return function (response) {
- var html = response.html;
- var embed = win.find('#embed')[0];
- var data = global$2.extend(HtmlToData.htmlToData(Settings.getScripts(editor), html), { source1: response.url });
- win.fromJSON(data);
- if (embed) {
- embed.value(html);
- SizeManager.updateSize(win);
- }
- };
- };
- var selectPlaceholder = function (editor, beforeObjects) {
- var i;
- var y;
- var afterObjects = editor.dom.select('img[data-mce-object]');
- for (i = 0; i < beforeObjects.length; i++) {
- for (y = afterObjects.length - 1; y >= 0; y--) {
- if (beforeObjects[i] === afterObjects[y]) {
- afterObjects.splice(y, 1);
- }
- }
- }
- editor.selection.select(afterObjects[0]);
- };
- var handleInsert = function (editor, html) {
- var beforeObjects = editor.dom.select('img[data-mce-object]');
- editor.insertContent(html);
- selectPlaceholder(editor, beforeObjects);
- editor.nodeChanged();
- };
- var submitForm = function (win, editor) {
- var data = win.toJSON();
- data.embed = UpdateHtml.updateHtml(data.embed, data);
- if (data.embed && Service.isCached(data.source1)) {
- handleInsert(editor, data.embed);
- } else {
- Service.getEmbedHtml(editor, data).then(function (response) {
- handleInsert(editor, response.html);
- }).catch(handleError(editor));
- }
- };
- var populateMeta = function (win, meta) {
- global$2.each(meta, function (value, key) {
- win.find('#' + key).value(value);
- });
- };
- var showDialog = function (editor) {
- var win;
- var data;
- var generalFormItems = [{
- name: 'source1',
- type: 'filepicker',
- filetype: 'media',
- size: 40,
- autofocus: true,
- label: 'Source',
- onpaste: function () {
- setTimeout(function () {
- Service.getEmbedHtml(editor, win.toJSON()).then(addEmbedHtml(win, editor)).catch(handleError(editor));
- }, 1);
- },
- onchange: function (e) {
- Service.getEmbedHtml(editor, win.toJSON()).then(addEmbedHtml(win, editor)).catch(handleError(editor));
- populateMeta(win, e.meta);
- },
- onbeforecall: function (e) {
- e.meta = win.toJSON();
- }
- }];
- var advancedFormItems = [];
- var reserialise = function (update) {
- update(win);
- data = win.toJSON();
- win.find('#embed').value(UpdateHtml.updateHtml(data.embed, data));
- };
- if (Settings.hasAltSource(editor)) {
- advancedFormItems.push({
- name: 'source2',
- type: 'filepicker',
- filetype: 'media',
- size: 40,
- label: 'Alternative source'
- });
- }
- if (Settings.hasPoster(editor)) {
- advancedFormItems.push({
- name: 'poster',
- type: 'filepicker',
- filetype: 'image',
- size: 40,
- label: 'Poster'
- });
- }
- if (Settings.hasDimensions(editor)) {
- var control = SizeManager.createUi(reserialise);
- generalFormItems.push(control);
- }
- data = getData(editor);
- var embedTextBox = {
- id: 'mcemediasource',
- type: 'textbox',
- flex: 1,
- name: 'embed',
- value: getSource(editor),
- multiline: true,
- rows: 5,
- label: 'Source'
- };
- var updateValueOnChange = function () {
- data = global$2.extend({}, HtmlToData.htmlToData(Settings.getScripts(editor), this.value()));
- this.parent().parent().fromJSON(data);
- };
- embedTextBox[embedChange] = updateValueOnChange;
- var body = [
- {
- title: 'General',
- type: 'form',
- items: generalFormItems
- },
- {
- title: 'Embed',
- type: 'container',
- layout: 'flex',
- direction: 'column',
- align: 'stretch',
- padding: 10,
- spacing: 10,
- items: [
- {
- type: 'label',
- text: 'Paste your embed code below:',
- forId: 'mcemediasource'
- },
- embedTextBox
- ]
- }
- ];
- if (advancedFormItems.length > 0) {
- body.push({
- title: 'Advanced',
- type: 'form',
- items: advancedFormItems
- });
- }
- win = editor.windowManager.open({
- title: 'Insert/edit media',
- data: data,
- bodyType: 'tabpanel',
- body: body,
- onSubmit: function () {
- SizeManager.updateSize(win);
- submitForm(win, editor);
- }
- });
- SizeManager.syncSize(win);
- };
- var Dialog = { showDialog: showDialog };
-
- var get$1 = function (editor) {
- var showDialog = function () {
- Dialog.showDialog(editor);
- };
- return { showDialog: showDialog };
- };
- var Api = { get: get$1 };
-
- var register = function (editor) {
- var showDialog = function () {
- Dialog.showDialog(editor);
- };
- editor.addCommand('mceMedia', showDialog);
- };
- var Commands = { register: register };
-
- var global$8 = tinymce.util.Tools.resolve('tinymce.html.Node');
-
- var sanitize = function (editor, html) {
- if (Settings.shouldFilterHtml(editor) === false) {
- return html;
- }
- var writer = global$7();
- var blocked;
- global$4({
- validate: false,
- allow_conditional_comments: false,
- special: 'script,noscript',
- comment: function (text) {
- writer.comment(text);
- },
- cdata: function (text) {
- writer.cdata(text);
- },
- text: function (text, raw) {
- writer.text(text, raw);
- },
- start: function (name, attrs, empty) {
- blocked = true;
- if (name === 'script' || name === 'noscript' || name === 'svg') {
- return;
- }
- for (var i = attrs.length - 1; i >= 0; i--) {
- var attrName = attrs[i].name;
- if (attrName.indexOf('on') === 0) {
- delete attrs.map[attrName];
- attrs.splice(i, 1);
- }
- if (attrName === 'style') {
- attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name);
- }
- }
- writer.start(name, attrs, empty);
- blocked = false;
- },
- end: function (name) {
- if (blocked) {
- return;
- }
- writer.end(name);
- }
- }, global$6({})).parse(html);
- return writer.getContent();
- };
- var Sanitize = { sanitize: sanitize };
-
- var createPlaceholderNode = function (editor, node) {
- var placeHolder;
- var name = node.name;
- placeHolder = new global$8('img', 1);
- placeHolder.shortEnded = true;
- retainAttributesAndInnerHtml(editor, node, placeHolder);
- placeHolder.attr({
- 'width': node.attr('width') || '300',
- 'height': node.attr('height') || (name === 'audio' ? '30' : '150'),
- 'style': node.attr('style'),
- 'src': global$1.transparentSrc,
- 'data-mce-object': name,
- 'class': 'mce-object mce-object-' + name
- });
- return placeHolder;
- };
- var createPreviewIframeNode = function (editor, node) {
- var previewWrapper;
- var previewNode;
- var shimNode;
- var name = node.name;
- previewWrapper = new global$8('span', 1);
- previewWrapper.attr({
- 'contentEditable': 'false',
- 'style': node.attr('style'),
- 'data-mce-object': name,
- 'class': 'mce-preview-object mce-object-' + name
- });
- retainAttributesAndInnerHtml(editor, node, previewWrapper);
- previewNode = new global$8(name, 1);
- previewNode.attr({
- src: node.attr('src'),
- allowfullscreen: node.attr('allowfullscreen'),
- style: node.attr('style'),
- class: node.attr('class'),
- width: node.attr('width'),
- height: node.attr('height'),
- frameborder: '0'
- });
- shimNode = new global$8('span', 1);
- shimNode.attr('class', 'mce-shim');
- previewWrapper.append(previewNode);
- previewWrapper.append(shimNode);
- return previewWrapper;
- };
- var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) {
- var attrName;
- var attrValue;
- var attribs;
- var ai;
- var innerHtml;
- attribs = sourceNode.attributes;
- ai = attribs.length;
- while (ai--) {
- attrName = attribs[ai].name;
- attrValue = attribs[ai].value;
- if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') {
- if (attrName === 'data' || attrName === 'src') {
- attrValue = editor.convertURL(attrValue, attrName);
- }
- targetNode.attr('data-mce-p-' + attrName, attrValue);
- }
- }
- innerHtml = sourceNode.firstChild && sourceNode.firstChild.value;
- if (innerHtml) {
- targetNode.attr('data-mce-html', escape(Sanitize.sanitize(editor, innerHtml)));
- targetNode.firstChild = null;
- }
- };
- var isWithinEphoxEmbed = function (node) {
- while (node = node.parent) {
- if (node.attr('data-ephox-embed-iri')) {
- return true;
- }
- }
- return false;
- };
- var placeHolderConverter = function (editor) {
- return function (nodes) {
- var i = nodes.length;
- var node;
- var videoScript;
- while (i--) {
- node = nodes[i];
- if (!node.parent) {
- continue;
- }
- if (node.parent.attr('data-mce-object')) {
- continue;
- }
- if (node.name === 'script') {
- videoScript = VideoScript.getVideoScriptMatch(Settings.getScripts(editor), node.attr('src'));
- if (!videoScript) {
- continue;
- }
- }
- if (videoScript) {
- if (videoScript.width) {
- node.attr('width', videoScript.width.toString());
- }
- if (videoScript.height) {
- node.attr('height', videoScript.height.toString());
- }
- }
- if (node.name === 'iframe' && Settings.hasLiveEmbeds(editor) && global$1.ceFalse) {
- if (!isWithinEphoxEmbed(node)) {
- node.replace(createPreviewIframeNode(editor, node));
- }
- } else {
- if (!isWithinEphoxEmbed(node)) {
- node.replace(createPlaceholderNode(editor, node));
- }
- }
- }
- };
- };
- var Nodes = {
- createPreviewIframeNode: createPreviewIframeNode,
- createPlaceholderNode: createPlaceholderNode,
- placeHolderConverter: placeHolderConverter
- };
-
- var setup = function (editor) {
- editor.on('preInit', function () {
- var specialElements = editor.schema.getSpecialElements();
- global$2.each('video audio iframe object'.split(' '), function (name) {
- specialElements[name] = new RegExp('' + name + '[^>]*>', 'gi');
- });
- var boolAttrs = editor.schema.getBoolAttrs();
- global$2.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) {
- boolAttrs[name] = {};
- });
- editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', Nodes.placeHolderConverter(editor));
- editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) {
- var i = nodes.length;
- var node;
- var realElm;
- var ai;
- var attribs;
- var innerHtml;
- var innerNode;
- var realElmName;
- var className;
- while (i--) {
- node = nodes[i];
- if (!node.parent) {
- continue;
- }
- realElmName = node.attr(name);
- realElm = new global$8(realElmName, 1);
- if (realElmName !== 'audio' && realElmName !== 'script') {
- className = node.attr('class');
- if (className && className.indexOf('mce-preview-object') !== -1) {
- realElm.attr({
- width: node.firstChild.attr('width'),
- height: node.firstChild.attr('height')
- });
- } else {
- realElm.attr({
- width: node.attr('width'),
- height: node.attr('height')
- });
- }
- }
- realElm.attr({ style: node.attr('style') });
- attribs = node.attributes;
- ai = attribs.length;
- while (ai--) {
- var attrName = attribs[ai].name;
- if (attrName.indexOf('data-mce-p-') === 0) {
- realElm.attr(attrName.substr(11), attribs[ai].value);
- }
- }
- if (realElmName === 'script') {
- realElm.attr('type', 'text/javascript');
- }
- innerHtml = node.attr('data-mce-html');
- if (innerHtml) {
- innerNode = new global$8('#text', 3);
- innerNode.raw = true;
- innerNode.value = Sanitize.sanitize(editor, unescape(innerHtml));
- realElm.append(innerNode);
- }
- node.replace(realElm);
- }
- });
- });
- editor.on('setContent', function () {
- editor.$('span.mce-preview-object').each(function (index, elm) {
- var $elm = editor.$(elm);
- if ($elm.find('span.mce-shim', elm).length === 0) {
- $elm.append(' ');
- }
- });
- });
- };
- var FilterContent = { setup: setup };
-
- var setup$1 = function (editor) {
- editor.on('ResolveName', function (e) {
- var name;
- if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) {
- e.name = name;
- }
- });
- };
- var ResolveName = { setup: setup$1 };
-
- var setup$2 = function (editor) {
- editor.on('click keyup', function () {
- var selectedNode = editor.selection.getNode();
- if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) {
- if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) {
- selectedNode.setAttribute('data-mce-selected', '2');
- }
- }
- });
- editor.on('ObjectSelected', function (e) {
- var objectType = e.target.getAttribute('data-mce-object');
- if (objectType === 'audio' || objectType === 'script') {
- e.preventDefault();
- }
- });
- editor.on('objectResized', function (e) {
- var target = e.target;
- var html;
- if (target.getAttribute('data-mce-object')) {
- html = target.getAttribute('data-mce-html');
- if (html) {
- html = unescape(html);
- target.setAttribute('data-mce-html', escape(UpdateHtml.updateHtml(html, {
- width: e.width,
- height: e.height
- })));
- }
- }
- });
- };
- var Selection = { setup: setup$2 };
-
- var register$1 = function (editor) {
- editor.addButton('media', {
- tooltip: 'Insert/edit media',
- cmd: 'mceMedia',
- stateSelector: [
- 'img[data-mce-object]',
- 'span[data-mce-object]',
- 'div[data-ephox-embed-iri]'
- ]
- });
- editor.addMenuItem('media', {
- icon: 'media',
- text: 'Media',
- cmd: 'mceMedia',
- context: 'insert',
- prependToContext: true
- });
- };
- var Buttons = { register: register$1 };
-
- global.add('media', function (editor) {
- Commands.register(editor);
- Buttons.register(editor);
- ResolveName.setup(editor);
- FilterContent.setup(editor);
- Selection.setup(editor);
- return Api.get(editor);
- });
- function Plugin () {
- }
-
- return Plugin;
-
-}());
-})();
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/media/plugin.min.js b/src/js/_enqueues/vendor/tinymce/plugins/media/plugin.min.js
index e78d8efc11915..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/media/plugin.min.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/media/plugin.min.js
@@ -1 +0,0 @@
-!function(){"use strict";var e,t,r,n,i=tinymce.util.Tools.resolve("tinymce.PluginManager"),o=tinymce.util.Tools.resolve("tinymce.Env"),v=tinymce.util.Tools.resolve("tinymce.util.Tools"),w=function(e){return e.getParam("media_scripts")},b=function(e){return e.getParam("audio_template_callback")},y=function(e){return e.getParam("video_template_callback")},a=function(e){return e.getParam("media_live_embeds",!0)},u=function(e){return e.getParam("media_filter_html",!0)},s=function(e){return e.getParam("media_url_resolver")},m=function(e){return e.getParam("media_alt_source",!0)},d=function(e){return e.getParam("media_poster",!0)},h=function(e){return e.getParam("media_dimensions",!0)},f=function(e){var t=e,r=function(){return t};return{get:r,set:function(e){t=e},clone:function(){return f(r())}}},c=function(){},l=function(e){return function(){return e}},p=l(!1),g=l(!0),x=function(){return O},O=(e=function(e){return e.isNone()},n={fold:function(e,t){return e()},is:p,isSome:p,isNone:g,getOr:r=function(e){return e},getOrThunk:t=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:l(null),getOrUndefined:l(undefined),or:r,orThunk:t,map:x,each:c,bind:x,exists:p,forall:g,filter:x,equals:e,equals_:e,toArray:function(){return[]},toString:l("none()")},Object.freeze&&Object.freeze(n),n),j=function(r){var e=l(r),t=function(){return i},n=function(e){return e(r)},i={fold:function(e,t){return t(r)},is:function(e){return r===e},isSome:g,isNone:p,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:t,orThunk:t,map:function(e){return j(e(r))},each:function(e){e(r)},bind:n,exists:n,forall:n,filter:function(e){return e(r)?i:O},toArray:function(){return[r]},toString:function(){return"some("+r+")"},equals:function(e){return e.is(r)},equals_:function(e,t){return e.fold(p,function(e){return t(r,e)})}};return i},_=x,S=function(e){return null===e||e===undefined?O:j(e)},k=Object.hasOwnProperty,N=function(e,t){return M(e,t)?S(e[t]):_()},M=function(e,t){return k.call(e,t)},T=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),z=tinymce.util.Tools.resolve("tinymce.html.SaxParser"),A=function(e,t){if(e)for(var r=0;r"):"application/x-shockwave-flash"===n.source1mime?(d='',m.poster&&(d+=' '),d+=" "):-1!==n.source1mime.indexOf("audio")?(s=n,(l=p)?l(s):''+(s.source2?'\n \n":"")+" "):"script"===n.type?'');
- tinymce.ScriptLoader.markDone(url);
- }
- }
- },
-
- /**
- * Executes a color picker on the specified element id. When the user
- * then selects a color it will be set as the value of the specified element.
- *
- * @method pickColor
- * @param {DOMEvent} e DOM event object.
- * @param {string} element_id Element id to be filled with the color value from the picker.
- */
- pickColor: function (e, element_id) {
- var el = document.getElementById(element_id), colorPickerCallback = this.editor.settings.color_picker_callback;
- if (colorPickerCallback) {
- colorPickerCallback.call(
- this.editor,
- function (value) {
- el.value = value;
- try {
- el.onchange();
- } catch (ex) {
- // Try fire event, ignore errors
- }
- },
- el.value
- );
- }
- },
-
- /**
- * Opens a filebrowser/imagebrowser this will set the output value from
- * the browser as a value on the specified element.
- *
- * @method openBrowser
- * @param {string} element_id Id of the element to set value in.
- * @param {string} type Type of browser to open image/file/flash.
- * @param {string} option Option name to get the file_broswer_callback function name from.
- */
- openBrowser: function (element_id, type) {
- tinyMCEPopup.restoreSelection();
- this.editor.execCallback('file_browser_callback', element_id, document.getElementById(element_id).value, type, window);
- },
-
- /**
- * Creates a confirm dialog. Please don't use the blocking behavior of this
- * native version use the callback method instead then it can be extended.
- *
- * @method confirm
- * @param {String} t Title for the new confirm dialog.
- * @param {function} cb Callback function to be executed after the user has selected ok or cancel.
- * @param {Object} s Optional scope to execute the callback in.
- */
- confirm: function (t, cb, s) {
- this.editor.windowManager.confirm(t, cb, s, window);
- },
-
- /**
- * Creates a alert dialog. Please don't use the blocking behavior of this
- * native version use the callback method instead then it can be extended.
- *
- * @method alert
- * @param {String} tx Title for the new alert dialog.
- * @param {function} cb Callback function to be executed after the user has selected ok.
- * @param {Object} s Optional scope to execute the callback in.
- */
- alert: function (tx, cb, s) {
- this.editor.windowManager.alert(tx, cb, s, window);
- },
-
- /**
- * Closes the current window.
- *
- * @method close
- */
- close: function () {
- var t = this;
-
- // To avoid domain relaxing issue in Opera
- function close() {
- t.editor.windowManager.close(window);
- tinymce = tinyMCE = t.editor = t.params = t.dom = t.dom.doc = null; // Cleanup
- }
-
- if (tinymce.isOpera) {
- t.getWin().setTimeout(close, 0);
- } else {
- close();
- }
- },
-
- // Internal functions
-
- _restoreSelection: function () {
- var e = window.event.srcElement;
-
- if (e.nodeName == 'INPUT' && (e.type == 'submit' || e.type == 'button')) {
- tinyMCEPopup.restoreSelection();
- }
- },
-
- /* _restoreSelection : function() {
- var e = window.event.srcElement;
-
- // If user focus a non text input or textarea
- if ((e.nodeName != 'INPUT' && e.nodeName != 'TEXTAREA') || e.type != 'text')
- tinyMCEPopup.restoreSelection();
- },*/
-
- _onDOMLoaded: function () {
- var t = tinyMCEPopup, ti = document.title, h, nv;
-
- // Translate page
- if (t.features.translate_i18n !== false) {
- var map = {
- "update": "Ok",
- "insert": "Ok",
- "cancel": "Cancel",
- "not_set": "--",
- "class_name": "Class name",
- "browse": "Browse"
- };
-
- var langCode = (tinymce.settings ? tinymce.settings : t.editor.settings).language || 'en';
- for (var key in map) {
- tinymce.i18n.data[langCode + "." + key] = tinymce.i18n.translate(map[key]);
- }
-
- h = document.body.innerHTML;
-
- // Replace a=x with a="x" in IE
- if (tinymce.isIE) {
- h = h.replace(/ (value|title|alt)=([^"][^\s>]+)/gi, ' $1="$2"');
- }
-
- document.dir = t.editor.getParam('directionality', '');
-
- if ((nv = t.editor.translate(h)) && nv != h) {
- document.body.innerHTML = nv;
- }
-
- if ((nv = t.editor.translate(ti)) && nv != ti) {
- document.title = ti = nv;
- }
- }
-
- if (!t.editor.getParam('browser_preferred_colors', false) || !t.isWindow) {
- t.dom.addClass(document.body, 'forceColors');
- }
-
- document.body.style.display = '';
-
- // Restore selection in IE when focus is placed on a non textarea or input element of the type text
- if (tinymce.Env.ie) {
- if (tinymce.Env.ie < 11) {
- document.attachEvent('onmouseup', tinyMCEPopup._restoreSelection);
-
- // Add base target element for it since it would fail with modal dialogs
- t.dom.add(t.dom.select('head')[0], 'base', { target: '_self' });
- } else {
- document.addEventListener('mouseup', tinyMCEPopup._restoreSelection, false);
- }
- }
-
- t.restoreSelection();
- t.resizeToInnerSize();
-
- // Set inline title
- if (!t.isWindow) {
- t.editor.windowManager.setTitle(window, ti);
- } else {
- window.focus();
- }
-
- if (!tinymce.isIE && !t.isWindow) {
- t.dom.bind(document, 'focus', function () {
- t.editor.windowManager.focus(t.id);
- });
- }
-
- // Patch for accessibility
- tinymce.each(t.dom.select('select'), function (e) {
- e.onkeydown = tinyMCEPopup._accessHandler;
- });
-
- // Call onInit
- // Init must be called before focus so the selection won't get lost by the focus call
- tinymce.each(t.listeners, function (o) {
- o.func.call(o.scope, t.editor);
- });
-
- // Move focus to window
- if (t.getWindowArg('mce_auto_focus', true)) {
- window.focus();
-
- // Focus element with mceFocus class
- tinymce.each(document.forms, function (f) {
- tinymce.each(f.elements, function (e) {
- if (t.dom.hasClass(e, 'mceFocus') && !e.disabled) {
- e.focus();
- return false; // Break loop
- }
- });
- });
- }
-
- document.onkeyup = tinyMCEPopup._closeWinKeyHandler;
-
- if ('textContent' in document) {
- t.uiWindow.getEl('head').firstChild.textContent = document.title;
- } else {
- t.uiWindow.getEl('head').firstChild.innerText = document.title;
- }
- },
-
- _accessHandler: function (e) {
- e = e || window.event;
-
- if (e.keyCode == 13 || e.keyCode == 32) {
- var elm = e.target || e.srcElement;
-
- if (elm.onchange) {
- elm.onchange();
- }
-
- return tinymce.dom.Event.cancel(e);
- }
- },
-
- _closeWinKeyHandler: function (e) {
- e = e || window.event;
-
- if (e.keyCode == 27) {
- tinyMCEPopup.close();
- }
- },
-
- _eventProxy: function (id) {
- return function (evt) {
- tinyMCEPopup.dom.events.callNativeHandler(id, evt);
- };
- }
-};
-
-tinyMCEPopup.init();
-
-tinymce.util.Dispatcher = function (scope) {
- this.scope = scope || this;
- this.listeners = [];
-
- this.add = function (callback, scope) {
- this.listeners.push({ cb: callback, scope: scope || this.scope });
-
- return callback;
- };
-
- this.addToTop = function (callback, scope) {
- var self = this, listener = { cb: callback, scope: scope || self.scope };
-
- // Create new listeners if addToTop is executed in a dispatch loop
- if (self.inDispatch) {
- self.listeners = [listener].concat(self.listeners);
- } else {
- self.listeners.unshift(listener);
- }
-
- return callback;
- };
-
- this.remove = function (callback) {
- var listeners = this.listeners, output = null;
-
- tinymce.each(listeners, function (listener, i) {
- if (callback == listener.cb) {
- output = listener;
- listeners.splice(i, 1);
- return false;
- }
- });
-
- return output;
- };
-
- this.dispatch = function () {
- var self = this, returnValue, args = arguments, i, listeners = self.listeners, listener;
-
- self.inDispatch = true;
-
- // Needs to be a real loop since the listener count might change while looping
- // And this is also more efficient
- for (i = 0; i < listeners.length; i++) {
- listener = listeners[i];
- returnValue = listener.cb.apply(listener.scope, args.length > 0 ? args : [listener.scope]);
-
- if (returnValue === false) {
- break;
- }
- }
-
- self.inDispatch = false;
-
- return returnValue;
- };
-};
diff --git a/src/js/_enqueues/vendor/tinymce/tinymce.js b/src/js/_enqueues/vendor/tinymce/tinymce.js
index 657037e96fa49..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/tinymce.js
+++ b/src/js/_enqueues/vendor/tinymce/tinymce.js
@@ -1,27440 +0,0 @@
-// 4.9.11 (2020-07-13)
-(function () {
-(function (domGlobals) {
- 'use strict';
-
- var noop = function () {
- };
- var compose = function (fa, fb) {
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- return fa(fb.apply(null, args));
- };
- };
- var constant = function (value) {
- return function () {
- return value;
- };
- };
- var identity = function (x) {
- return x;
- };
- function curry(fn) {
- var initialArgs = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- initialArgs[_i - 1] = arguments[_i];
- }
- return function () {
- var restArgs = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- restArgs[_i] = arguments[_i];
- }
- var all = initialArgs.concat(restArgs);
- return fn.apply(null, all);
- };
- }
- var not = function (f) {
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- return !f.apply(null, args);
- };
- };
- var die = function (msg) {
- return function () {
- throw new Error(msg);
- };
- };
- var never = constant(false);
- var always = constant(true);
-
- var none = function () {
- return NONE;
- };
- var NONE = function () {
- var eq = function (o) {
- return o.isNone();
- };
- var call = function (thunk) {
- return thunk();
- };
- var id = function (n) {
- return n;
- };
- var me = {
- fold: function (n, s) {
- return n();
- },
- is: never,
- isSome: never,
- isNone: always,
- getOr: id,
- getOrThunk: call,
- getOrDie: function (msg) {
- throw new Error(msg || 'error: getOrDie called on none.');
- },
- getOrNull: constant(null),
- getOrUndefined: constant(undefined),
- or: id,
- orThunk: call,
- map: none,
- each: noop,
- bind: none,
- exists: never,
- forall: always,
- filter: none,
- equals: eq,
- equals_: eq,
- toArray: function () {
- return [];
- },
- toString: constant('none()')
- };
- if (Object.freeze) {
- Object.freeze(me);
- }
- return me;
- }();
- var some = function (a) {
- var constant_a = constant(a);
- var self = function () {
- return me;
- };
- var bind = function (f) {
- return f(a);
- };
- var me = {
- fold: function (n, s) {
- return s(a);
- },
- is: function (v) {
- return a === v;
- },
- isSome: always,
- isNone: never,
- getOr: constant_a,
- getOrThunk: constant_a,
- getOrDie: constant_a,
- getOrNull: constant_a,
- getOrUndefined: constant_a,
- or: self,
- orThunk: self,
- map: function (f) {
- return some(f(a));
- },
- each: function (f) {
- f(a);
- },
- bind: bind,
- exists: bind,
- forall: bind,
- filter: function (f) {
- return f(a) ? me : NONE;
- },
- toArray: function () {
- return [a];
- },
- toString: function () {
- return 'some(' + a + ')';
- },
- equals: function (o) {
- return o.is(a);
- },
- equals_: function (o, elementEq) {
- return o.fold(never, function (b) {
- return elementEq(a, b);
- });
- }
- };
- return me;
- };
- var from = function (value) {
- return value === null || value === undefined ? NONE : some(value);
- };
- var Option = {
- some: some,
- none: none,
- from: from
- };
-
- var typeOf = function (x) {
- if (x === null) {
- return 'null';
- }
- var t = typeof x;
- if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
- return 'array';
- }
- if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
- return 'string';
- }
- return t;
- };
- var isType = function (type) {
- return function (value) {
- return typeOf(value) === type;
- };
- };
- var isString = isType('string');
- var isObject = isType('object');
- var isArray = isType('array');
- var isNull = isType('null');
- var isBoolean = isType('boolean');
- var isFunction = isType('function');
- var isNumber = isType('number');
-
- var nativeSlice = Array.prototype.slice;
- var nativeIndexOf = Array.prototype.indexOf;
- var nativePush = Array.prototype.push;
- var rawIndexOf = function (ts, t) {
- return nativeIndexOf.call(ts, t);
- };
- var indexOf = function (xs, x) {
- var r = rawIndexOf(xs, x);
- return r === -1 ? Option.none() : Option.some(r);
- };
- var contains = function (xs, x) {
- return rawIndexOf(xs, x) > -1;
- };
- var exists = function (xs, pred) {
- for (var i = 0, len = xs.length; i < len; i++) {
- var x = xs[i];
- if (pred(x, i)) {
- return true;
- }
- }
- return false;
- };
- var map = function (xs, f) {
- var len = xs.length;
- var r = new Array(len);
- for (var i = 0; i < len; i++) {
- var x = xs[i];
- r[i] = f(x, i);
- }
- return r;
- };
- var each = function (xs, f) {
- for (var i = 0, len = xs.length; i < len; i++) {
- var x = xs[i];
- f(x, i);
- }
- };
- var eachr = function (xs, f) {
- for (var i = xs.length - 1; i >= 0; i--) {
- var x = xs[i];
- f(x, i);
- }
- };
- var partition = function (xs, pred) {
- var pass = [];
- var fail = [];
- for (var i = 0, len = xs.length; i < len; i++) {
- var x = xs[i];
- var arr = pred(x, i) ? pass : fail;
- arr.push(x);
- }
- return {
- pass: pass,
- fail: fail
- };
- };
- var filter = function (xs, pred) {
- var r = [];
- for (var i = 0, len = xs.length; i < len; i++) {
- var x = xs[i];
- if (pred(x, i)) {
- r.push(x);
- }
- }
- return r;
- };
- var foldr = function (xs, f, acc) {
- eachr(xs, function (x) {
- acc = f(acc, x);
- });
- return acc;
- };
- var foldl = function (xs, f, acc) {
- each(xs, function (x) {
- acc = f(acc, x);
- });
- return acc;
- };
- var find = function (xs, pred) {
- for (var i = 0, len = xs.length; i < len; i++) {
- var x = xs[i];
- if (pred(x, i)) {
- return Option.some(x);
- }
- }
- return Option.none();
- };
- var findIndex = function (xs, pred) {
- for (var i = 0, len = xs.length; i < len; i++) {
- var x = xs[i];
- if (pred(x, i)) {
- return Option.some(i);
- }
- }
- return Option.none();
- };
- var flatten = function (xs) {
- var r = [];
- for (var i = 0, len = xs.length; i < len; ++i) {
- if (!isArray(xs[i])) {
- throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
- }
- nativePush.apply(r, xs[i]);
- }
- return r;
- };
- var bind = function (xs, f) {
- var output = map(xs, f);
- return flatten(output);
- };
- var forall = function (xs, pred) {
- for (var i = 0, len = xs.length; i < len; ++i) {
- var x = xs[i];
- if (pred(x, i) !== true) {
- return false;
- }
- }
- return true;
- };
- var reverse = function (xs) {
- var r = nativeSlice.call(xs, 0);
- r.reverse();
- return r;
- };
- var difference = function (a1, a2) {
- return filter(a1, function (x) {
- return !contains(a2, x);
- });
- };
- var mapToObject = function (xs, f) {
- var r = {};
- for (var i = 0, len = xs.length; i < len; i++) {
- var x = xs[i];
- r[String(x)] = f(x, i);
- }
- return r;
- };
- var sort = function (xs, comparator) {
- var copy = nativeSlice.call(xs, 0);
- copy.sort(comparator);
- return copy;
- };
- var head = function (xs) {
- return xs.length === 0 ? Option.none() : Option.some(xs[0]);
- };
- var last = function (xs) {
- return xs.length === 0 ? Option.none() : Option.some(xs[xs.length - 1]);
- };
- var from$1 = isFunction(Array.from) ? Array.from : function (x) {
- return nativeSlice.call(x);
- };
-
- var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();
-
- var path = function (parts, scope) {
- var o = scope !== undefined && scope !== null ? scope : Global;
- for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) {
- o = o[parts[i]];
- }
- return o;
- };
- var resolve = function (p, scope) {
- var parts = p.split('.');
- return path(parts, scope);
- };
-
- var unsafe = function (name, scope) {
- return resolve(name, scope);
- };
- var getOrDie = function (name, scope) {
- var actual = unsafe(name, scope);
- if (actual === undefined || actual === null) {
- throw new Error(name + ' not available on this browser');
- }
- return actual;
- };
- var Global$1 = { getOrDie: getOrDie };
-
- var url = function () {
- return Global$1.getOrDie('URL');
- };
- var createObjectURL = function (blob) {
- return url().createObjectURL(blob);
- };
- var revokeObjectURL = function (u) {
- url().revokeObjectURL(u);
- };
- var URL = {
- createObjectURL: createObjectURL,
- revokeObjectURL: revokeObjectURL
- };
-
- var nav = domGlobals.navigator, userAgent = nav.userAgent;
- var opera, webkit, ie, ie11, ie12, gecko, mac, iDevice, android, fileApi, phone, tablet, windowsPhone;
- var matchMediaQuery = function (query) {
- return 'matchMedia' in domGlobals.window ? domGlobals.matchMedia(query).matches : false;
- };
- opera = false;
- android = /Android/.test(userAgent);
- webkit = /WebKit/.test(userAgent);
- ie = !webkit && !opera && /MSIE/gi.test(userAgent) && /Explorer/gi.test(nav.appName);
- ie = ie && /MSIE (\w+)\./.exec(userAgent)[1];
- ie11 = userAgent.indexOf('Trident/') !== -1 && (userAgent.indexOf('rv:') !== -1 || nav.appName.indexOf('Netscape') !== -1) ? 11 : false;
- ie12 = userAgent.indexOf('Edge/') !== -1 && !ie && !ie11 ? 12 : false;
- ie = ie || ie11 || ie12;
- gecko = !webkit && !ie11 && /Gecko/.test(userAgent);
- mac = userAgent.indexOf('Mac') !== -1;
- iDevice = /(iPad|iPhone)/.test(userAgent);
- fileApi = 'FormData' in domGlobals.window && 'FileReader' in domGlobals.window && 'URL' in domGlobals.window && !!URL.createObjectURL;
- phone = matchMediaQuery('only screen and (max-device-width: 480px)') && (android || iDevice);
- tablet = matchMediaQuery('only screen and (min-width: 800px)') && (android || iDevice);
- windowsPhone = userAgent.indexOf('Windows Phone') !== -1;
- if (ie12) {
- webkit = false;
- }
- var contentEditable = !iDevice || fileApi || parseInt(userAgent.match(/AppleWebKit\/(\d*)/)[1], 10) >= 534;
- var Env = {
- opera: opera,
- webkit: webkit,
- ie: ie,
- gecko: gecko,
- mac: mac,
- iOS: iDevice,
- android: android,
- contentEditable: contentEditable,
- transparentSrc: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
- caretAfter: ie !== 8,
- range: domGlobals.window.getSelection && 'Range' in domGlobals.window,
- documentMode: ie && !ie12 ? domGlobals.document.documentMode || 7 : 10,
- fileApi: fileApi,
- ceFalse: ie === false || ie > 8,
- cacheSuffix: null,
- container: null,
- overrideViewPort: null,
- experimentalShadowDom: false,
- canHaveCSP: ie === false || ie > 11,
- desktop: !phone && !tablet,
- windowsPhone: windowsPhone
- };
-
- var promise = function () {
- function bind(fn, thisArg) {
- return function () {
- fn.apply(thisArg, arguments);
- };
- }
- var isArray = Array.isArray || function (value) {
- return Object.prototype.toString.call(value) === '[object Array]';
- };
- var Promise = function (fn) {
- if (typeof this !== 'object') {
- throw new TypeError('Promises must be constructed via new');
- }
- if (typeof fn !== 'function') {
- throw new TypeError('not a function');
- }
- this._state = null;
- this._value = null;
- this._deferreds = [];
- doResolve(fn, bind(resolve, this), bind(reject, this));
- };
- var asap = Promise.immediateFn || typeof setImmediate === 'function' && setImmediate || function (fn) {
- setTimeout(fn, 1);
- };
- function handle(deferred) {
- var me = this;
- if (this._state === null) {
- this._deferreds.push(deferred);
- return;
- }
- asap(function () {
- var cb = me._state ? deferred.onFulfilled : deferred.onRejected;
- if (cb === null) {
- (me._state ? deferred.resolve : deferred.reject)(me._value);
- return;
- }
- var ret;
- try {
- ret = cb(me._value);
- } catch (e) {
- deferred.reject(e);
- return;
- }
- deferred.resolve(ret);
- });
- }
- function resolve(newValue) {
- try {
- if (newValue === this) {
- throw new TypeError('A promise cannot be resolved with itself.');
- }
- if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
- var then = newValue.then;
- if (typeof then === 'function') {
- doResolve(bind(then, newValue), bind(resolve, this), bind(reject, this));
- return;
- }
- }
- this._state = true;
- this._value = newValue;
- finale.call(this);
- } catch (e) {
- reject.call(this, e);
- }
- }
- function reject(newValue) {
- this._state = false;
- this._value = newValue;
- finale.call(this);
- }
- function finale() {
- for (var i = 0, len = this._deferreds.length; i < len; i++) {
- handle.call(this, this._deferreds[i]);
- }
- this._deferreds = null;
- }
- function Handler(onFulfilled, onRejected, resolve, reject) {
- this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
- this.onRejected = typeof onRejected === 'function' ? onRejected : null;
- this.resolve = resolve;
- this.reject = reject;
- }
- function doResolve(fn, onFulfilled, onRejected) {
- var done = false;
- try {
- fn(function (value) {
- if (done) {
- return;
- }
- done = true;
- onFulfilled(value);
- }, function (reason) {
- if (done) {
- return;
- }
- done = true;
- onRejected(reason);
- });
- } catch (ex) {
- if (done) {
- return;
- }
- done = true;
- onRejected(ex);
- }
- }
- Promise.prototype.catch = function (onRejected) {
- return this.then(null, onRejected);
- };
- Promise.prototype.then = function (onFulfilled, onRejected) {
- var me = this;
- return new Promise(function (resolve, reject) {
- handle.call(me, new Handler(onFulfilled, onRejected, resolve, reject));
- });
- };
- Promise.all = function () {
- var args = Array.prototype.slice.call(arguments.length === 1 && isArray(arguments[0]) ? arguments[0] : arguments);
- return new Promise(function (resolve, reject) {
- if (args.length === 0) {
- return resolve([]);
- }
- var remaining = args.length;
- function res(i, val) {
- try {
- if (val && (typeof val === 'object' || typeof val === 'function')) {
- var then = val.then;
- if (typeof then === 'function') {
- then.call(val, function (val) {
- res(i, val);
- }, reject);
- return;
- }
- }
- args[i] = val;
- if (--remaining === 0) {
- resolve(args);
- }
- } catch (ex) {
- reject(ex);
- }
- }
- for (var i = 0; i < args.length; i++) {
- res(i, args[i]);
- }
- });
- };
- Promise.resolve = function (value) {
- if (value && typeof value === 'object' && value.constructor === Promise) {
- return value;
- }
- return new Promise(function (resolve) {
- resolve(value);
- });
- };
- Promise.reject = function (value) {
- return new Promise(function (resolve, reject) {
- reject(value);
- });
- };
- Promise.race = function (values) {
- return new Promise(function (resolve, reject) {
- for (var i = 0, len = values.length; i < len; i++) {
- values[i].then(resolve, reject);
- }
- });
- };
- return Promise;
- };
- var promiseObj = window.Promise ? window.Promise : promise();
-
- var requestAnimationFramePromise;
- var requestAnimationFrame = function (callback, element) {
- var i, requestAnimationFrameFunc = domGlobals.window.requestAnimationFrame;
- var vendors = [
- 'ms',
- 'moz',
- 'webkit'
- ];
- var featurefill = function (callback) {
- domGlobals.window.setTimeout(callback, 0);
- };
- for (i = 0; i < vendors.length && !requestAnimationFrameFunc; i++) {
- requestAnimationFrameFunc = domGlobals.window[vendors[i] + 'RequestAnimationFrame'];
- }
- if (!requestAnimationFrameFunc) {
- requestAnimationFrameFunc = featurefill;
- }
- requestAnimationFrameFunc(callback, element);
- };
- var wrappedSetTimeout = function (callback, time) {
- if (typeof time !== 'number') {
- time = 0;
- }
- return setTimeout(callback, time);
- };
- var wrappedSetInterval = function (callback, time) {
- if (typeof time !== 'number') {
- time = 1;
- }
- return setInterval(callback, time);
- };
- var wrappedClearTimeout = function (id) {
- return clearTimeout(id);
- };
- var wrappedClearInterval = function (id) {
- return clearInterval(id);
- };
- var debounce = function (callback, time) {
- var timer, func;
- func = function () {
- var args = arguments;
- clearTimeout(timer);
- timer = wrappedSetTimeout(function () {
- callback.apply(this, args);
- }, time);
- };
- func.stop = function () {
- clearTimeout(timer);
- };
- return func;
- };
- var Delay = {
- requestAnimationFrame: function (callback, element) {
- if (requestAnimationFramePromise) {
- requestAnimationFramePromise.then(callback);
- return;
- }
- requestAnimationFramePromise = new promiseObj(function (resolve) {
- if (!element) {
- element = domGlobals.document.body;
- }
- requestAnimationFrame(resolve, element);
- }).then(callback);
- },
- setTimeout: wrappedSetTimeout,
- setInterval: wrappedSetInterval,
- setEditorTimeout: function (editor, callback, time) {
- return wrappedSetTimeout(function () {
- if (!editor.removed) {
- callback();
- }
- }, time);
- },
- setEditorInterval: function (editor, callback, time) {
- var timer;
- timer = wrappedSetInterval(function () {
- if (!editor.removed) {
- callback();
- } else {
- clearInterval(timer);
- }
- }, time);
- return timer;
- },
- debounce: debounce,
- throttle: debounce,
- clearInterval: wrappedClearInterval,
- clearTimeout: wrappedClearTimeout
- };
-
- var eventExpandoPrefix = 'mce-data-';
- var mouseEventRe = /^(?:mouse|contextmenu)|click/;
- var deprecated = {
- keyLocation: 1,
- layerX: 1,
- layerY: 1,
- returnValue: 1,
- webkitMovementX: 1,
- webkitMovementY: 1,
- keyIdentifier: 1
- };
- var hasIsDefaultPrevented = function (event) {
- return event.isDefaultPrevented === returnTrue || event.isDefaultPrevented === returnFalse;
- };
- var returnFalse = function () {
- return false;
- };
- var returnTrue = function () {
- return true;
- };
- var addEvent = function (target, name, callback, capture) {
- if (target.addEventListener) {
- target.addEventListener(name, callback, capture || false);
- } else if (target.attachEvent) {
- target.attachEvent('on' + name, callback);
- }
- };
- var removeEvent = function (target, name, callback, capture) {
- if (target.removeEventListener) {
- target.removeEventListener(name, callback, capture || false);
- } else if (target.detachEvent) {
- target.detachEvent('on' + name, callback);
- }
- };
- var getTargetFromShadowDom = function (event, defaultTarget) {
- if (event.composedPath) {
- var composedPath = event.composedPath();
- if (composedPath && composedPath.length > 0) {
- return composedPath[0];
- }
- }
- return defaultTarget;
- };
- var fix = function (originalEvent, data) {
- var name;
- var event = data || {};
- for (name in originalEvent) {
- if (!deprecated[name]) {
- event[name] = originalEvent[name];
- }
- }
- if (!event.target) {
- event.target = event.srcElement || domGlobals.document;
- }
- if (Env.experimentalShadowDom) {
- event.target = getTargetFromShadowDom(originalEvent, event.target);
- }
- if (originalEvent && mouseEventRe.test(originalEvent.type) && originalEvent.pageX === undefined && originalEvent.clientX !== undefined) {
- var eventDoc = event.target.ownerDocument || domGlobals.document;
- var doc = eventDoc.documentElement;
- var body = eventDoc.body;
- event.pageX = originalEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
- event.pageY = originalEvent.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
- }
- event.preventDefault = function () {
- event.isDefaultPrevented = returnTrue;
- if (originalEvent) {
- if (originalEvent.preventDefault) {
- originalEvent.preventDefault();
- } else {
- originalEvent.returnValue = false;
- }
- }
- };
- event.stopPropagation = function () {
- event.isPropagationStopped = returnTrue;
- if (originalEvent) {
- if (originalEvent.stopPropagation) {
- originalEvent.stopPropagation();
- } else {
- originalEvent.cancelBubble = true;
- }
- }
- };
- event.stopImmediatePropagation = function () {
- event.isImmediatePropagationStopped = returnTrue;
- event.stopPropagation();
- };
- if (hasIsDefaultPrevented(event) === false) {
- event.isDefaultPrevented = returnFalse;
- event.isPropagationStopped = returnFalse;
- event.isImmediatePropagationStopped = returnFalse;
- }
- if (typeof event.metaKey === 'undefined') {
- event.metaKey = false;
- }
- return event;
- };
- var bindOnReady = function (win, callback, eventUtils) {
- var doc = win.document, event = { type: 'ready' };
- if (eventUtils.domLoaded) {
- callback(event);
- return;
- }
- var isDocReady = function () {
- return doc.readyState === 'complete' || doc.readyState === 'interactive' && doc.body;
- };
- var readyHandler = function () {
- if (!eventUtils.domLoaded) {
- eventUtils.domLoaded = true;
- callback(event);
- }
- };
- var waitForDomLoaded = function () {
- if (isDocReady()) {
- removeEvent(doc, 'readystatechange', waitForDomLoaded);
- readyHandler();
- }
- };
- var tryScroll = function () {
- try {
- doc.documentElement.doScroll('left');
- } catch (ex) {
- Delay.setTimeout(tryScroll);
- return;
- }
- readyHandler();
- };
- if (doc.addEventListener && !(Env.ie && Env.ie < 11)) {
- if (isDocReady()) {
- readyHandler();
- } else {
- addEvent(win, 'DOMContentLoaded', readyHandler);
- }
- } else {
- addEvent(doc, 'readystatechange', waitForDomLoaded);
- if (doc.documentElement.doScroll && win.self === win.top) {
- tryScroll();
- }
- }
- addEvent(win, 'load', readyHandler);
- };
- var EventUtils = function () {
- var self = this;
- var events = {}, count, expando, hasFocusIn, hasMouseEnterLeave, mouseEnterLeave;
- expando = eventExpandoPrefix + (+new Date()).toString(32);
- hasMouseEnterLeave = 'onmouseenter' in domGlobals.document.documentElement;
- hasFocusIn = 'onfocusin' in domGlobals.document.documentElement;
- mouseEnterLeave = {
- mouseenter: 'mouseover',
- mouseleave: 'mouseout'
- };
- count = 1;
- self.domLoaded = false;
- self.events = events;
- var executeHandlers = function (evt, id) {
- var callbackList, i, l, callback;
- var container = events[id];
- callbackList = container && container[evt.type];
- if (callbackList) {
- for (i = 0, l = callbackList.length; i < l; i++) {
- callback = callbackList[i];
- if (callback && callback.func.call(callback.scope, evt) === false) {
- evt.preventDefault();
- }
- if (evt.isImmediatePropagationStopped()) {
- return;
- }
- }
- }
- };
- self.bind = function (target, names, callback, scope) {
- var id, callbackList, i, name, fakeName, nativeHandler, capture;
- var win = domGlobals.window;
- var defaultNativeHandler = function (evt) {
- executeHandlers(fix(evt || win.event), id);
- };
- if (!target || target.nodeType === 3 || target.nodeType === 8) {
- return;
- }
- if (!target[expando]) {
- id = count++;
- target[expando] = id;
- events[id] = {};
- } else {
- id = target[expando];
- }
- scope = scope || target;
- names = names.split(' ');
- i = names.length;
- while (i--) {
- name = names[i];
- nativeHandler = defaultNativeHandler;
- fakeName = capture = false;
- if (name === 'DOMContentLoaded') {
- name = 'ready';
- }
- if (self.domLoaded && name === 'ready' && target.readyState === 'complete') {
- callback.call(scope, fix({ type: name }));
- continue;
- }
- if (!hasMouseEnterLeave) {
- fakeName = mouseEnterLeave[name];
- if (fakeName) {
- nativeHandler = function (evt) {
- var current, related;
- current = evt.currentTarget;
- related = evt.relatedTarget;
- if (related && current.contains) {
- related = current.contains(related);
- } else {
- while (related && related !== current) {
- related = related.parentNode;
- }
- }
- if (!related) {
- evt = fix(evt || win.event);
- evt.type = evt.type === 'mouseout' ? 'mouseleave' : 'mouseenter';
- evt.target = current;
- executeHandlers(evt, id);
- }
- };
- }
- }
- if (!hasFocusIn && (name === 'focusin' || name === 'focusout')) {
- capture = true;
- fakeName = name === 'focusin' ? 'focus' : 'blur';
- nativeHandler = function (evt) {
- evt = fix(evt || win.event);
- evt.type = evt.type === 'focus' ? 'focusin' : 'focusout';
- executeHandlers(evt, id);
- };
- }
- callbackList = events[id][name];
- if (!callbackList) {
- events[id][name] = callbackList = [{
- func: callback,
- scope: scope
- }];
- callbackList.fakeName = fakeName;
- callbackList.capture = capture;
- callbackList.nativeHandler = nativeHandler;
- if (name === 'ready') {
- bindOnReady(target, nativeHandler, self);
- } else {
- addEvent(target, fakeName || name, nativeHandler, capture);
- }
- } else {
- if (name === 'ready' && self.domLoaded) {
- callback({ type: name });
- } else {
- callbackList.push({
- func: callback,
- scope: scope
- });
- }
- }
- }
- target = callbackList = 0;
- return callback;
- };
- self.unbind = function (target, names, callback) {
- var id, callbackList, i, ci, name, eventMap;
- if (!target || target.nodeType === 3 || target.nodeType === 8) {
- return self;
- }
- id = target[expando];
- if (id) {
- eventMap = events[id];
- if (names) {
- names = names.split(' ');
- i = names.length;
- while (i--) {
- name = names[i];
- callbackList = eventMap[name];
- if (callbackList) {
- if (callback) {
- ci = callbackList.length;
- while (ci--) {
- if (callbackList[ci].func === callback) {
- var nativeHandler = callbackList.nativeHandler;
- var fakeName = callbackList.fakeName, capture = callbackList.capture;
- callbackList = callbackList.slice(0, ci).concat(callbackList.slice(ci + 1));
- callbackList.nativeHandler = nativeHandler;
- callbackList.fakeName = fakeName;
- callbackList.capture = capture;
- eventMap[name] = callbackList;
- }
- }
- }
- if (!callback || callbackList.length === 0) {
- delete eventMap[name];
- removeEvent(target, callbackList.fakeName || name, callbackList.nativeHandler, callbackList.capture);
- }
- }
- }
- } else {
- for (name in eventMap) {
- callbackList = eventMap[name];
- removeEvent(target, callbackList.fakeName || name, callbackList.nativeHandler, callbackList.capture);
- }
- eventMap = {};
- }
- for (name in eventMap) {
- return self;
- }
- delete events[id];
- try {
- delete target[expando];
- } catch (ex) {
- target[expando] = null;
- }
- }
- return self;
- };
- self.fire = function (target, name, args) {
- var id;
- if (!target || target.nodeType === 3 || target.nodeType === 8) {
- return self;
- }
- args = fix(null, args);
- args.type = name;
- args.target = target;
- do {
- id = target[expando];
- if (id) {
- executeHandlers(args, id);
- }
- target = target.parentNode || target.ownerDocument || target.defaultView || target.parentWindow;
- } while (target && !args.isPropagationStopped());
- return self;
- };
- self.clean = function (target) {
- var i, children;
- var unbind = self.unbind;
- if (!target || target.nodeType === 3 || target.nodeType === 8) {
- return self;
- }
- if (target[expando]) {
- unbind(target);
- }
- if (!target.getElementsByTagName) {
- target = target.document;
- }
- if (target && target.getElementsByTagName) {
- unbind(target);
- children = target.getElementsByTagName('*');
- i = children.length;
- while (i--) {
- target = children[i];
- if (target[expando]) {
- unbind(target);
- }
- }
- }
- return self;
- };
- self.destroy = function () {
- events = {};
- };
- self.cancel = function (e) {
- if (e) {
- e.preventDefault();
- e.stopImmediatePropagation();
- }
- return false;
- };
- };
- EventUtils.Event = new EventUtils();
- EventUtils.Event.bind(domGlobals.window, 'ready', function () {
- });
-
- var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains$1, expando = 'sizzle' + -new Date(), preferredDoc = domGlobals.window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), sortOrder = function (a, b) {
- if (a === b) {
- hasDuplicate = true;
- }
- return 0;
- }, strundefined = typeof undefined, MAX_NEGATIVE = 1 << 31, hasOwn = {}.hasOwnProperty, arr = [], pop = arr.pop, push_native = arr.push, push = arr.push, slice = arr.slice, indexOf$1 = arr.indexOf || function (elem) {
- var i = 0, len = this.length;
- for (; i < len; i++) {
- if (this[i] === elem) {
- return i;
- }
- }
- return -1;
- }, booleans = 'checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped', whitespace = '[\\x20\\t\\r\\n\\f]', identifier = '(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+', attributes = '\\[' + whitespace + '*(' + identifier + ')(?:' + whitespace + '*([*^$|!~]?=)' + whitespace + '*(?:\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)"|(' + identifier + '))|)' + whitespace + '*\\]', pseudos = ':(' + identifier + ')(?:\\((' + '(\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)")|' + '((?:\\\\.|[^\\\\()[\\]]|' + attributes + ')*)|' + '.*' + ')\\)|)', rtrim = new RegExp('^' + whitespace + '+|((?:^|[^\\\\])(?:\\\\.)*)' + whitespace + '+$', 'g'), rcomma = new RegExp('^' + whitespace + '*,' + whitespace + '*'), rcombinators = new RegExp('^' + whitespace + '*([>+~]|' + whitespace + ')' + whitespace + '*'), rattributeQuotes = new RegExp('=' + whitespace + '*([^\\]\'"]*?)' + whitespace + '*\\]', 'g'), rpseudo = new RegExp(pseudos), ridentifier = new RegExp('^' + identifier + '$'), matchExpr = {
- ID: new RegExp('^#(' + identifier + ')'),
- CLASS: new RegExp('^\\.(' + identifier + ')'),
- TAG: new RegExp('^(' + identifier + '|[*])'),
- ATTR: new RegExp('^' + attributes),
- PSEUDO: new RegExp('^' + pseudos),
- CHILD: new RegExp('^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(' + whitespace + '*(even|odd|(([+-]|)(\\d*)n|)' + whitespace + '*(?:([+-]|)' + whitespace + '*(\\d+)|))' + whitespace + '*\\)|)', 'i'),
- bool: new RegExp('^(?:' + booleans + ')$', 'i'),
- needsContext: new RegExp('^' + whitespace + '*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(' + whitespace + '*((?:-\\d)?\\d*)' + whitespace + '*\\)|)(?=[^-]|$)', 'i')
- }, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, rescape = /'|\\/g, runescape = new RegExp('\\\\([\\da-f]{1,6}' + whitespace + '?|(' + whitespace + ')|.)', 'ig'), funescape = function (_, escaped, escapedWhitespace) {
- var high = '0x' + escaped - 65536;
- return high !== high || escapedWhitespace ? escaped : high < 0 ? String.fromCharCode(high + 65536) : String.fromCharCode(high >> 10 | 55296, high & 1023 | 56320);
- };
- try {
- push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes);
- arr[preferredDoc.childNodes.length].nodeType;
- } catch (e) {
- push = {
- apply: arr.length ? function (target, els) {
- push_native.apply(target, slice.call(els));
- } : function (target, els) {
- var j = target.length, i = 0;
- while (target[j++] = els[i++]) {
- }
- target.length = j - 1;
- }
- };
- }
- var Sizzle = function (selector, context, results, seed) {
- var match, elem, m, nodeType, i, groups, old, nid, newContext, newSelector;
- if ((context ? context.ownerDocument || context : preferredDoc) !== document) {
- setDocument(context);
- }
- context = context || document;
- results = results || [];
- if (!selector || typeof selector !== 'string') {
- return results;
- }
- if ((nodeType = context.nodeType) !== 1 && nodeType !== 9) {
- return [];
- }
- if (documentIsHTML && !seed) {
- if (match = rquickExpr.exec(selector)) {
- if (m = match[1]) {
- if (nodeType === 9) {
- elem = context.getElementById(m);
- if (elem && elem.parentNode) {
- if (elem.id === m) {
- results.push(elem);
- return results;
- }
- } else {
- return results;
- }
- } else {
- if (context.ownerDocument && (elem = context.ownerDocument.getElementById(m)) && contains$1(context, elem) && elem.id === m) {
- results.push(elem);
- return results;
- }
- }
- } else if (match[2]) {
- push.apply(results, context.getElementsByTagName(selector));
- return results;
- } else if ((m = match[3]) && support.getElementsByClassName) {
- push.apply(results, context.getElementsByClassName(m));
- return results;
- }
- }
- if (support.qsa && (!rbuggyQSA || !rbuggyQSA.test(selector))) {
- nid = old = expando;
- newContext = context;
- newSelector = nodeType === 9 && selector;
- if (nodeType === 1 && context.nodeName.toLowerCase() !== 'object') {
- groups = tokenize(selector);
- if (old = context.getAttribute('id')) {
- nid = old.replace(rescape, '\\$&');
- } else {
- context.setAttribute('id', nid);
- }
- nid = '[id=\'' + nid + '\'] ';
- i = groups.length;
- while (i--) {
- groups[i] = nid + toSelector(groups[i]);
- }
- newContext = rsibling.test(selector) && testContext(context.parentNode) || context;
- newSelector = groups.join(',');
- }
- if (newSelector) {
- try {
- push.apply(results, newContext.querySelectorAll(newSelector));
- return results;
- } catch (qsaError) {
- } finally {
- if (!old) {
- context.removeAttribute('id');
- }
- }
- }
- }
- }
- return select(selector.replace(rtrim, '$1'), context, results, seed);
- };
- function createCache() {
- var keys = [];
- function cache(key, value) {
- if (keys.push(key + ' ') > Expr.cacheLength) {
- delete cache[keys.shift()];
- }
- return cache[key + ' '] = value;
- }
- return cache;
- }
- function markFunction(fn) {
- fn[expando] = true;
- return fn;
- }
- function siblingCheck(a, b) {
- var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && (~b.sourceIndex || MAX_NEGATIVE) - (~a.sourceIndex || MAX_NEGATIVE);
- if (diff) {
- return diff;
- }
- if (cur) {
- while (cur = cur.nextSibling) {
- if (cur === b) {
- return -1;
- }
- }
- }
- return a ? 1 : -1;
- }
- function createInputPseudo(type) {
- return function (elem) {
- var name = elem.nodeName.toLowerCase();
- return name === 'input' && elem.type === type;
- };
- }
- function createButtonPseudo(type) {
- return function (elem) {
- var name = elem.nodeName.toLowerCase();
- return (name === 'input' || name === 'button') && elem.type === type;
- };
- }
- function createPositionalPseudo(fn) {
- return markFunction(function (argument) {
- argument = +argument;
- return markFunction(function (seed, matches) {
- var j, matchIndexes = fn([], seed.length, argument), i = matchIndexes.length;
- while (i--) {
- if (seed[j = matchIndexes[i]]) {
- seed[j] = !(matches[j] = seed[j]);
- }
- }
- });
- });
- }
- function testContext(context) {
- return context && typeof context.getElementsByTagName !== strundefined && context;
- }
- support = Sizzle.support = {};
- isXML = Sizzle.isXML = function (elem) {
- var documentElement = elem && (elem.ownerDocument || elem).documentElement;
- return documentElement ? documentElement.nodeName !== 'HTML' : false;
- };
- setDocument = Sizzle.setDocument = function (node) {
- var hasCompare, doc = node ? node.ownerDocument || node : preferredDoc, parent = doc.defaultView;
- function getTop(win) {
- try {
- return win.top;
- } catch (ex) {
- }
- return null;
- }
- if (doc === document || doc.nodeType !== 9 || !doc.documentElement) {
- return document;
- }
- document = doc;
- docElem = doc.documentElement;
- documentIsHTML = !isXML(doc);
- if (parent && parent !== getTop(parent)) {
- if (parent.addEventListener) {
- parent.addEventListener('unload', function () {
- setDocument();
- }, false);
- } else if (parent.attachEvent) {
- parent.attachEvent('onunload', function () {
- setDocument();
- });
- }
- }
- support.attributes = true;
- support.getElementsByTagName = true;
- support.getElementsByClassName = rnative.test(doc.getElementsByClassName);
- support.getById = true;
- Expr.find.ID = function (id, context) {
- if (typeof context.getElementById !== strundefined && documentIsHTML) {
- var m = context.getElementById(id);
- return m && m.parentNode ? [m] : [];
- }
- };
- Expr.filter.ID = function (id) {
- var attrId = id.replace(runescape, funescape);
- return function (elem) {
- return elem.getAttribute('id') === attrId;
- };
- };
- Expr.find.TAG = support.getElementsByTagName ? function (tag, context) {
- if (typeof context.getElementsByTagName !== strundefined) {
- return context.getElementsByTagName(tag);
- }
- } : function (tag, context) {
- var elem, tmp = [], i = 0, results = context.getElementsByTagName(tag);
- if (tag === '*') {
- while (elem = results[i++]) {
- if (elem.nodeType === 1) {
- tmp.push(elem);
- }
- }
- return tmp;
- }
- return results;
- };
- Expr.find.CLASS = support.getElementsByClassName && function (className, context) {
- if (documentIsHTML) {
- return context.getElementsByClassName(className);
- }
- };
- rbuggyMatches = [];
- rbuggyQSA = [];
- support.disconnectedMatch = true;
- rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join('|'));
- rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join('|'));
- hasCompare = rnative.test(docElem.compareDocumentPosition);
- contains$1 = hasCompare || rnative.test(docElem.contains) ? function (a, b) {
- var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode;
- return a === bup || !!(bup && bup.nodeType === 1 && (adown.contains ? adown.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));
- } : function (a, b) {
- if (b) {
- while (b = b.parentNode) {
- if (b === a) {
- return true;
- }
- }
- }
- return false;
- };
- sortOrder = hasCompare ? function (a, b) {
- if (a === b) {
- hasDuplicate = true;
- return 0;
- }
- var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
- if (compare) {
- return compare;
- }
- compare = (a.ownerDocument || a) === (b.ownerDocument || b) ? a.compareDocumentPosition(b) : 1;
- if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) {
- if (a === doc || a.ownerDocument === preferredDoc && contains$1(preferredDoc, a)) {
- return -1;
- }
- if (b === doc || b.ownerDocument === preferredDoc && contains$1(preferredDoc, b)) {
- return 1;
- }
- return sortInput ? indexOf$1.call(sortInput, a) - indexOf$1.call(sortInput, b) : 0;
- }
- return compare & 4 ? -1 : 1;
- } : function (a, b) {
- if (a === b) {
- hasDuplicate = true;
- return 0;
- }
- var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [a], bp = [b];
- if (!aup || !bup) {
- return a === doc ? -1 : b === doc ? 1 : aup ? -1 : bup ? 1 : sortInput ? indexOf$1.call(sortInput, a) - indexOf$1.call(sortInput, b) : 0;
- } else if (aup === bup) {
- return siblingCheck(a, b);
- }
- cur = a;
- while (cur = cur.parentNode) {
- ap.unshift(cur);
- }
- cur = b;
- while (cur = cur.parentNode) {
- bp.unshift(cur);
- }
- while (ap[i] === bp[i]) {
- i++;
- }
- return i ? siblingCheck(ap[i], bp[i]) : ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0;
- };
- return doc;
- };
- Sizzle.matches = function (expr, elements) {
- return Sizzle(expr, null, null, elements);
- };
- Sizzle.matchesSelector = function (elem, expr) {
- if ((elem.ownerDocument || elem) !== document) {
- setDocument(elem);
- }
- expr = expr.replace(rattributeQuotes, '=\'$1\']');
- if (support.matchesSelector && documentIsHTML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && (!rbuggyQSA || !rbuggyQSA.test(expr))) {
- try {
- var ret = matches.call(elem, expr);
- if (ret || support.disconnectedMatch || elem.document && elem.document.nodeType !== 11) {
- return ret;
- }
- } catch (e) {
- }
- }
- return Sizzle(expr, document, null, [elem]).length > 0;
- };
- Sizzle.contains = function (context, elem) {
- if ((context.ownerDocument || context) !== document) {
- setDocument(context);
- }
- return contains$1(context, elem);
- };
- Sizzle.attr = function (elem, name) {
- if ((elem.ownerDocument || elem) !== document) {
- setDocument(elem);
- }
- var fn = Expr.attrHandle[name.toLowerCase()], val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : undefined;
- return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute(name) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
- };
- Sizzle.error = function (msg) {
- throw new Error('Syntax error, unrecognized expression: ' + msg);
- };
- Sizzle.uniqueSort = function (results) {
- var elem, duplicates = [], j = 0, i = 0;
- hasDuplicate = !support.detectDuplicates;
- sortInput = !support.sortStable && results.slice(0);
- results.sort(sortOrder);
- if (hasDuplicate) {
- while (elem = results[i++]) {
- if (elem === results[i]) {
- j = duplicates.push(i);
- }
- }
- while (j--) {
- results.splice(duplicates[j], 1);
- }
- }
- sortInput = null;
- return results;
- };
- getText = Sizzle.getText = function (elem) {
- var node, ret = '', i = 0, nodeType = elem.nodeType;
- if (!nodeType) {
- while (node = elem[i++]) {
- ret += getText(node);
- }
- } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
- if (typeof elem.textContent === 'string') {
- return elem.textContent;
- } else {
- for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
- ret += getText(elem);
- }
- }
- } else if (nodeType === 3 || nodeType === 4) {
- return elem.nodeValue;
- }
- return ret;
- };
- Expr = Sizzle.selectors = {
- cacheLength: 50,
- createPseudo: markFunction,
- match: matchExpr,
- attrHandle: {},
- find: {},
- relative: {
- '>': {
- dir: 'parentNode',
- first: true
- },
- ' ': { dir: 'parentNode' },
- '+': {
- dir: 'previousSibling',
- first: true
- },
- '~': { dir: 'previousSibling' }
- },
- preFilter: {
- ATTR: function (match) {
- match[1] = match[1].replace(runescape, funescape);
- match[3] = (match[3] || match[4] || match[5] || '').replace(runescape, funescape);
- if (match[2] === '~=') {
- match[3] = ' ' + match[3] + ' ';
- }
- return match.slice(0, 4);
- },
- CHILD: function (match) {
- match[1] = match[1].toLowerCase();
- if (match[1].slice(0, 3) === 'nth') {
- if (!match[3]) {
- Sizzle.error(match[0]);
- }
- match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === 'even' || match[3] === 'odd'));
- match[5] = +(match[7] + match[8] || match[3] === 'odd');
- } else if (match[3]) {
- Sizzle.error(match[0]);
- }
- return match;
- },
- PSEUDO: function (match) {
- var excess, unquoted = !match[6] && match[2];
- if (matchExpr.CHILD.test(match[0])) {
- return null;
- }
- if (match[3]) {
- match[2] = match[4] || match[5] || '';
- } else if (unquoted && rpseudo.test(unquoted) && (excess = tokenize(unquoted, true)) && (excess = unquoted.indexOf(')', unquoted.length - excess) - unquoted.length)) {
- match[0] = match[0].slice(0, excess);
- match[2] = unquoted.slice(0, excess);
- }
- return match.slice(0, 3);
- }
- },
- filter: {
- TAG: function (nodeNameSelector) {
- var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();
- return nodeNameSelector === '*' ? function () {
- return true;
- } : function (elem) {
- return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
- };
- },
- CLASS: function (className) {
- var pattern = classCache[className + ' '];
- return pattern || (pattern = new RegExp('(^|' + whitespace + ')' + className + '(' + whitespace + '|$)')) && classCache(className, function (elem) {
- return pattern.test(typeof elem.className === 'string' && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute('class') || '');
- });
- },
- ATTR: function (name, operator, check) {
- return function (elem) {
- var result = Sizzle.attr(elem, name);
- if (result == null) {
- return operator === '!=';
- }
- if (!operator) {
- return true;
- }
- result += '';
- return operator === '=' ? result === check : operator === '!=' ? result !== check : operator === '^=' ? check && result.indexOf(check) === 0 : operator === '*=' ? check && result.indexOf(check) > -1 : operator === '$=' ? check && result.slice(-check.length) === check : operator === '~=' ? (' ' + result + ' ').indexOf(check) > -1 : operator === '|=' ? result === check || result.slice(0, check.length + 1) === check + '-' : false;
- };
- },
- CHILD: function (type, what, argument, first, last) {
- var simple = type.slice(0, 3) !== 'nth', forward = type.slice(-4) !== 'last', ofType = what === 'of-type';
- return first === 1 && last === 0 ? function (elem) {
- return !!elem.parentNode;
- } : function (elem, context, xml) {
- var cache, outerCache, node, diff, nodeIndex, start, dir = simple !== forward ? 'nextSibling' : 'previousSibling', parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType;
- if (parent) {
- if (simple) {
- while (dir) {
- node = elem;
- while (node = node[dir]) {
- if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) {
- return false;
- }
- }
- start = dir = type === 'only' && !start && 'nextSibling';
- }
- return true;
- }
- start = [forward ? parent.firstChild : parent.lastChild];
- if (forward && useCache) {
- outerCache = parent[expando] || (parent[expando] = {});
- cache = outerCache[type] || [];
- nodeIndex = cache[0] === dirruns && cache[1];
- diff = cache[0] === dirruns && cache[2];
- node = nodeIndex && parent.childNodes[nodeIndex];
- while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) {
- if (node.nodeType === 1 && ++diff && node === elem) {
- outerCache[type] = [
- dirruns,
- nodeIndex,
- diff
- ];
- break;
- }
- }
- } else if (useCache && (cache = (elem[expando] || (elem[expando] = {}))[type]) && cache[0] === dirruns) {
- diff = cache[1];
- } else {
- while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) {
- if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) {
- if (useCache) {
- (node[expando] || (node[expando] = {}))[type] = [
- dirruns,
- diff
- ];
- }
- if (node === elem) {
- break;
- }
- }
- }
- }
- diff -= last;
- return diff === first || diff % first === 0 && diff / first >= 0;
- }
- };
- },
- PSEUDO: function (pseudo, argument) {
- var args, fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || Sizzle.error('unsupported pseudo: ' + pseudo);
- if (fn[expando]) {
- return fn(argument);
- }
- if (fn.length > 1) {
- args = [
- pseudo,
- pseudo,
- '',
- argument
- ];
- return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function (seed, matches) {
- var idx, matched = fn(seed, argument), i = matched.length;
- while (i--) {
- idx = indexOf$1.call(seed, matched[i]);
- seed[idx] = !(matches[idx] = matched[i]);
- }
- }) : function (elem) {
- return fn(elem, 0, args);
- };
- }
- return fn;
- }
- },
- pseudos: {
- not: markFunction(function (selector) {
- var input = [], results = [], matcher = compile(selector.replace(rtrim, '$1'));
- return matcher[expando] ? markFunction(function (seed, matches, context, xml) {
- var elem, unmatched = matcher(seed, null, xml, []), i = seed.length;
- while (i--) {
- if (elem = unmatched[i]) {
- seed[i] = !(matches[i] = elem);
- }
- }
- }) : function (elem, context, xml) {
- input[0] = elem;
- matcher(input, null, xml, results);
- return !results.pop();
- };
- }),
- has: markFunction(function (selector) {
- return function (elem) {
- return Sizzle(selector, elem).length > 0;
- };
- }),
- contains: markFunction(function (text) {
- text = text.replace(runescape, funescape);
- return function (elem) {
- return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1;
- };
- }),
- lang: markFunction(function (lang) {
- if (!ridentifier.test(lang || '')) {
- Sizzle.error('unsupported lang: ' + lang);
- }
- lang = lang.replace(runescape, funescape).toLowerCase();
- return function (elem) {
- var elemLang;
- do {
- if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute('xml:lang') || elem.getAttribute('lang')) {
- elemLang = elemLang.toLowerCase();
- return elemLang === lang || elemLang.indexOf(lang + '-') === 0;
- }
- } while ((elem = elem.parentNode) && elem.nodeType === 1);
- return false;
- };
- }),
- target: function (elem) {
- var hash = domGlobals.window.location && domGlobals.window.location.hash;
- return hash && hash.slice(1) === elem.id;
- },
- root: function (elem) {
- return elem === docElem;
- },
- focus: function (elem) {
- return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
- },
- enabled: function (elem) {
- return elem.disabled === false;
- },
- disabled: function (elem) {
- return elem.disabled === true;
- },
- checked: function (elem) {
- var nodeName = elem.nodeName.toLowerCase();
- return nodeName === 'input' && !!elem.checked || nodeName === 'option' && !!elem.selected;
- },
- selected: function (elem) {
- if (elem.parentNode) {
- elem.parentNode.selectedIndex;
- }
- return elem.selected === true;
- },
- empty: function (elem) {
- for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
- if (elem.nodeType < 6) {
- return false;
- }
- }
- return true;
- },
- parent: function (elem) {
- return !Expr.pseudos.empty(elem);
- },
- header: function (elem) {
- return rheader.test(elem.nodeName);
- },
- input: function (elem) {
- return rinputs.test(elem.nodeName);
- },
- button: function (elem) {
- var name = elem.nodeName.toLowerCase();
- return name === 'input' && elem.type === 'button' || name === 'button';
- },
- text: function (elem) {
- var attr;
- return elem.nodeName.toLowerCase() === 'input' && elem.type === 'text' && ((attr = elem.getAttribute('type')) == null || attr.toLowerCase() === 'text');
- },
- first: createPositionalPseudo(function () {
- return [0];
- }),
- last: createPositionalPseudo(function (matchIndexes, length) {
- return [length - 1];
- }),
- eq: createPositionalPseudo(function (matchIndexes, length, argument) {
- return [argument < 0 ? argument + length : argument];
- }),
- even: createPositionalPseudo(function (matchIndexes, length) {
- var i = 0;
- for (; i < length; i += 2) {
- matchIndexes.push(i);
- }
- return matchIndexes;
- }),
- odd: createPositionalPseudo(function (matchIndexes, length) {
- var i = 1;
- for (; i < length; i += 2) {
- matchIndexes.push(i);
- }
- return matchIndexes;
- }),
- lt: createPositionalPseudo(function (matchIndexes, length, argument) {
- var i = argument < 0 ? argument + length : argument;
- for (; --i >= 0;) {
- matchIndexes.push(i);
- }
- return matchIndexes;
- }),
- gt: createPositionalPseudo(function (matchIndexes, length, argument) {
- var i = argument < 0 ? argument + length : argument;
- for (; ++i < length;) {
- matchIndexes.push(i);
- }
- return matchIndexes;
- })
- }
- };
- Expr.pseudos.nth = Expr.pseudos.eq;
- for (i in {
- radio: true,
- checkbox: true,
- file: true,
- password: true,
- image: true
- }) {
- Expr.pseudos[i] = createInputPseudo(i);
- }
- for (i in {
- submit: true,
- reset: true
- }) {
- Expr.pseudos[i] = createButtonPseudo(i);
- }
- function setFilters() {
- }
- setFilters.prototype = Expr.filters = Expr.pseudos;
- Expr.setFilters = new setFilters();
- tokenize = Sizzle.tokenize = function (selector, parseOnly) {
- var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[selector + ' '];
- if (cached) {
- return parseOnly ? 0 : cached.slice(0);
- }
- soFar = selector;
- groups = [];
- preFilters = Expr.preFilter;
- while (soFar) {
- if (!matched || (match = rcomma.exec(soFar))) {
- if (match) {
- soFar = soFar.slice(match[0].length) || soFar;
- }
- groups.push(tokens = []);
- }
- matched = false;
- if (match = rcombinators.exec(soFar)) {
- matched = match.shift();
- tokens.push({
- value: matched,
- type: match[0].replace(rtrim, ' ')
- });
- soFar = soFar.slice(matched.length);
- }
- for (type in Expr.filter) {
- if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) {
- matched = match.shift();
- tokens.push({
- value: matched,
- type: type,
- matches: match
- });
- soFar = soFar.slice(matched.length);
- }
- }
- if (!matched) {
- break;
- }
- }
- return parseOnly ? soFar.length : soFar ? Sizzle.error(selector) : tokenCache(selector, groups).slice(0);
- };
- function toSelector(tokens) {
- var i = 0, len = tokens.length, selector = '';
- for (; i < len; i++) {
- selector += tokens[i].value;
- }
- return selector;
- }
- function addCombinator(matcher, combinator, base) {
- var dir = combinator.dir, checkNonElements = base && dir === 'parentNode', doneName = done++;
- return combinator.first ? function (elem, context, xml) {
- while (elem = elem[dir]) {
- if (elem.nodeType === 1 || checkNonElements) {
- return matcher(elem, context, xml);
- }
- }
- } : function (elem, context, xml) {
- var oldCache, outerCache, newCache = [
- dirruns,
- doneName
- ];
- if (xml) {
- while (elem = elem[dir]) {
- if (elem.nodeType === 1 || checkNonElements) {
- if (matcher(elem, context, xml)) {
- return true;
- }
- }
- }
- } else {
- while (elem = elem[dir]) {
- if (elem.nodeType === 1 || checkNonElements) {
- outerCache = elem[expando] || (elem[expando] = {});
- if ((oldCache = outerCache[dir]) && oldCache[0] === dirruns && oldCache[1] === doneName) {
- return newCache[2] = oldCache[2];
- } else {
- outerCache[dir] = newCache;
- if (newCache[2] = matcher(elem, context, xml)) {
- return true;
- }
- }
- }
- }
- }
- };
- }
- function elementMatcher(matchers) {
- return matchers.length > 1 ? function (elem, context, xml) {
- var i = matchers.length;
- while (i--) {
- if (!matchers[i](elem, context, xml)) {
- return false;
- }
- }
- return true;
- } : matchers[0];
- }
- function multipleContexts(selector, contexts, results) {
- var i = 0, len = contexts.length;
- for (; i < len; i++) {
- Sizzle(selector, contexts[i], results);
- }
- return results;
- }
- function condense(unmatched, map, filter, context, xml) {
- var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null;
- for (; i < len; i++) {
- if (elem = unmatched[i]) {
- if (!filter || filter(elem, context, xml)) {
- newUnmatched.push(elem);
- if (mapped) {
- map.push(i);
- }
- }
- }
- }
- return newUnmatched;
- }
- function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
- if (postFilter && !postFilter[expando]) {
- postFilter = setMatcher(postFilter);
- }
- if (postFinder && !postFinder[expando]) {
- postFinder = setMatcher(postFinder, postSelector);
- }
- return markFunction(function (seed, results, context, xml) {
- var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, elems = seed || multipleContexts(selector || '*', context.nodeType ? [context] : context, []), matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems, matcherOut = matcher ? postFinder || (seed ? preFilter : preexisting || postFilter) ? [] : results : matcherIn;
- if (matcher) {
- matcher(matcherIn, matcherOut, context, xml);
- }
- if (postFilter) {
- temp = condense(matcherOut, postMap);
- postFilter(temp, [], context, xml);
- i = temp.length;
- while (i--) {
- if (elem = temp[i]) {
- matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);
- }
- }
- }
- if (seed) {
- if (postFinder || preFilter) {
- if (postFinder) {
- temp = [];
- i = matcherOut.length;
- while (i--) {
- if (elem = matcherOut[i]) {
- temp.push(matcherIn[i] = elem);
- }
- }
- postFinder(null, matcherOut = [], temp, xml);
- }
- i = matcherOut.length;
- while (i--) {
- if ((elem = matcherOut[i]) && (temp = postFinder ? indexOf$1.call(seed, elem) : preMap[i]) > -1) {
- seed[temp] = !(results[temp] = elem);
- }
- }
- }
- } else {
- matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut);
- if (postFinder) {
- postFinder(null, results, matcherOut, xml);
- } else {
- push.apply(results, matcherOut);
- }
- }
- });
- }
- function matcherFromTokens(tokens) {
- var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[tokens[0].type], implicitRelative = leadingRelative || Expr.relative[' '], i = leadingRelative ? 1 : 0, matchContext = addCombinator(function (elem) {
- return elem === checkContext;
- }, implicitRelative, true), matchAnyContext = addCombinator(function (elem) {
- return indexOf$1.call(checkContext, elem) > -1;
- }, implicitRelative, true), matchers = [function (elem, context, xml) {
- return !leadingRelative && (xml || context !== outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml));
- }];
- for (; i < len; i++) {
- if (matcher = Expr.relative[tokens[i].type]) {
- matchers = [addCombinator(elementMatcher(matchers), matcher)];
- } else {
- matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);
- if (matcher[expando]) {
- j = ++i;
- for (; j < len; j++) {
- if (Expr.relative[tokens[j].type]) {
- break;
- }
- }
- return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector(tokens.slice(0, i - 1).concat({ value: tokens[i - 2].type === ' ' ? '*' : '' })).replace(rtrim, '$1'), matcher, i < j && matcherFromTokens(tokens.slice(i, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens));
- }
- matchers.push(matcher);
- }
- }
- return elementMatcher(matchers);
- }
- function matcherFromGroupMatchers(elementMatchers, setMatchers) {
- var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function (seed, context, xml, results, outermost) {
- var elem, j, matcher, matchedCount = 0, i = '0', unmatched = seed && [], setMatched = [], contextBackup = outermostContext, elems = seed || byElement && Expr.find.TAG('*', outermost), dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1, len = elems.length;
- if (outermost) {
- outermostContext = context !== document && context;
- }
- for (; i !== len && (elem = elems[i]) != null; i++) {
- if (byElement && elem) {
- j = 0;
- while (matcher = elementMatchers[j++]) {
- if (matcher(elem, context, xml)) {
- results.push(elem);
- break;
- }
- }
- if (outermost) {
- dirruns = dirrunsUnique;
- }
- }
- if (bySet) {
- if (elem = !matcher && elem) {
- matchedCount--;
- }
- if (seed) {
- unmatched.push(elem);
- }
- }
- }
- matchedCount += i;
- if (bySet && i !== matchedCount) {
- j = 0;
- while (matcher = setMatchers[j++]) {
- matcher(unmatched, setMatched, context, xml);
- }
- if (seed) {
- if (matchedCount > 0) {
- while (i--) {
- if (!(unmatched[i] || setMatched[i])) {
- setMatched[i] = pop.call(results);
- }
- }
- }
- setMatched = condense(setMatched);
- }
- push.apply(results, setMatched);
- if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {
- Sizzle.uniqueSort(results);
- }
- }
- if (outermost) {
- dirruns = dirrunsUnique;
- outermostContext = contextBackup;
- }
- return unmatched;
- };
- return bySet ? markFunction(superMatcher) : superMatcher;
- }
- compile = Sizzle.compile = function (selector, match) {
- var i, setMatchers = [], elementMatchers = [], cached = compilerCache[selector + ' '];
- if (!cached) {
- if (!match) {
- match = tokenize(selector);
- }
- i = match.length;
- while (i--) {
- cached = matcherFromTokens(match[i]);
- if (cached[expando]) {
- setMatchers.push(cached);
- } else {
- elementMatchers.push(cached);
- }
- }
- cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));
- cached.selector = selector;
- }
- return cached;
- };
- select = Sizzle.select = function (selector, context, results, seed) {
- var i, tokens, token, type, find, compiled = typeof selector === 'function' && selector, match = !seed && tokenize(selector = compiled.selector || selector);
- results = results || [];
- if (match.length === 1) {
- tokens = match[0] = match[0].slice(0);
- if (tokens.length > 2 && (token = tokens[0]).type === 'ID' && support.getById && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {
- context = (Expr.find.ID(token.matches[0].replace(runescape, funescape), context) || [])[0];
- if (!context) {
- return results;
- } else if (compiled) {
- context = context.parentNode;
- }
- selector = selector.slice(tokens.shift().value.length);
- }
- i = matchExpr.needsContext.test(selector) ? 0 : tokens.length;
- while (i--) {
- token = tokens[i];
- if (Expr.relative[type = token.type]) {
- break;
- }
- if (find = Expr.find[type]) {
- if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testContext(context.parentNode) || context)) {
- tokens.splice(i, 1);
- selector = seed.length && toSelector(tokens);
- if (!selector) {
- push.apply(results, seed);
- return results;
- }
- break;
- }
- }
- }
- }
- (compiled || compile(selector, match))(seed, context, !documentIsHTML, results, rsibling.test(selector) && testContext(context.parentNode) || context);
- return results;
- };
- support.sortStable = expando.split('').sort(sortOrder).join('') === expando;
- support.detectDuplicates = !!hasDuplicate;
- setDocument();
- support.sortDetached = true;
-
- var isArray$1 = Array.isArray;
- var toArray = function (obj) {
- var array = obj, i, l;
- if (!isArray$1(obj)) {
- array = [];
- for (i = 0, l = obj.length; i < l; i++) {
- array[i] = obj[i];
- }
- }
- return array;
- };
- var each$1 = function (o, cb, s) {
- var n, l;
- if (!o) {
- return 0;
- }
- s = s || o;
- if (o.length !== undefined) {
- for (n = 0, l = o.length; n < l; n++) {
- if (cb.call(s, o[n], n, o) === false) {
- return 0;
- }
- }
- } else {
- for (n in o) {
- if (o.hasOwnProperty(n)) {
- if (cb.call(s, o[n], n, o) === false) {
- return 0;
- }
- }
- }
- }
- return 1;
- };
- var map$1 = function (array, callback) {
- var out = [];
- each$1(array, function (item, index) {
- out.push(callback(item, index, array));
- });
- return out;
- };
- var filter$1 = function (a, f) {
- var o = [];
- each$1(a, function (v, index) {
- if (!f || f(v, index, a)) {
- o.push(v);
- }
- });
- return o;
- };
- var indexOf$2 = function (a, v) {
- var i, l;
- if (a) {
- for (i = 0, l = a.length; i < l; i++) {
- if (a[i] === v) {
- return i;
- }
- }
- }
- return -1;
- };
- var reduce = function (collection, iteratee, accumulator, thisArg) {
- var i = 0;
- if (arguments.length < 3) {
- accumulator = collection[0];
- }
- for (; i < collection.length; i++) {
- accumulator = iteratee.call(thisArg, accumulator, collection[i], i);
- }
- return accumulator;
- };
- var findIndex$1 = function (array, predicate, thisArg) {
- var i, l;
- for (i = 0, l = array.length; i < l; i++) {
- if (predicate.call(thisArg, array[i], i, array)) {
- return i;
- }
- }
- return -1;
- };
- var find$1 = function (array, predicate, thisArg) {
- var idx = findIndex$1(array, predicate, thisArg);
- if (idx !== -1) {
- return array[idx];
- }
- return undefined;
- };
- var last$1 = function (collection) {
- return collection[collection.length - 1];
- };
- var ArrUtils = {
- isArray: isArray$1,
- toArray: toArray,
- each: each$1,
- map: map$1,
- filter: filter$1,
- indexOf: indexOf$2,
- reduce: reduce,
- findIndex: findIndex$1,
- find: find$1,
- last: last$1
- };
-
- var whiteSpaceRegExp = /^\s*|\s*$/g;
- var trim = function (str) {
- return str === null || str === undefined ? '' : ('' + str).replace(whiteSpaceRegExp, '');
- };
- var is = function (obj, type) {
- if (!type) {
- return obj !== undefined;
- }
- if (type === 'array' && ArrUtils.isArray(obj)) {
- return true;
- }
- return typeof obj === type;
- };
- var makeMap = function (items, delim, map) {
- var i;
- items = items || [];
- delim = delim || ',';
- if (typeof items === 'string') {
- items = items.split(delim);
- }
- map = map || {};
- i = items.length;
- while (i--) {
- map[items[i]] = {};
- }
- return map;
- };
- var hasOwnProperty = function (obj, prop) {
- return Object.prototype.hasOwnProperty.call(obj, prop);
- };
- var create = function (s, p, root) {
- var self = this;
- var sp, ns, cn, scn, c, de = 0;
- s = /^((static) )?([\w.]+)(:([\w.]+))?/.exec(s);
- cn = s[3].match(/(^|\.)(\w+)$/i)[2];
- ns = self.createNS(s[3].replace(/\.\w+$/, ''), root);
- if (ns[cn]) {
- return;
- }
- if (s[2] === 'static') {
- ns[cn] = p;
- if (this.onCreate) {
- this.onCreate(s[2], s[3], ns[cn]);
- }
- return;
- }
- if (!p[cn]) {
- p[cn] = function () {
- };
- de = 1;
- }
- ns[cn] = p[cn];
- self.extend(ns[cn].prototype, p);
- if (s[5]) {
- sp = self.resolve(s[5]).prototype;
- scn = s[5].match(/\.(\w+)$/i)[1];
- c = ns[cn];
- if (de) {
- ns[cn] = function () {
- return sp[scn].apply(this, arguments);
- };
- } else {
- ns[cn] = function () {
- this.parent = sp[scn];
- return c.apply(this, arguments);
- };
- }
- ns[cn].prototype[cn] = ns[cn];
- self.each(sp, function (f, n) {
- ns[cn].prototype[n] = sp[n];
- });
- self.each(p, function (f, n) {
- if (sp[n]) {
- ns[cn].prototype[n] = function () {
- this.parent = sp[n];
- return f.apply(this, arguments);
- };
- } else {
- if (n !== cn) {
- ns[cn].prototype[n] = f;
- }
- }
- });
- }
- self.each(p.static, function (f, n) {
- ns[cn][n] = f;
- });
- };
- var extend = function (obj, ext) {
- var x = [];
- for (var _i = 2; _i < arguments.length; _i++) {
- x[_i - 2] = arguments[_i];
- }
- var i, l, name;
- var args = arguments;
- var value;
- for (i = 1, l = args.length; i < l; i++) {
- ext = args[i];
- for (name in ext) {
- if (ext.hasOwnProperty(name)) {
- value = ext[name];
- if (value !== undefined) {
- obj[name] = value;
- }
- }
- }
- }
- return obj;
- };
- var walk = function (o, f, n, s) {
- s = s || this;
- if (o) {
- if (n) {
- o = o[n];
- }
- ArrUtils.each(o, function (o, i) {
- if (f.call(s, o, i, n) === false) {
- return false;
- }
- walk(o, f, n, s);
- });
- }
- };
- var createNS = function (n, o) {
- var i, v;
- o = o || domGlobals.window;
- n = n.split('.');
- for (i = 0; i < n.length; i++) {
- v = n[i];
- if (!o[v]) {
- o[v] = {};
- }
- o = o[v];
- }
- return o;
- };
- var resolve$1 = function (n, o) {
- var i, l;
- o = o || domGlobals.window;
- n = n.split('.');
- for (i = 0, l = n.length; i < l; i++) {
- o = o[n[i]];
- if (!o) {
- break;
- }
- }
- return o;
- };
- var explode = function (s, d) {
- if (!s || is(s, 'array')) {
- return s;
- }
- return ArrUtils.map(s.split(d || ','), trim);
- };
- var _addCacheSuffix = function (url) {
- var cacheSuffix = Env.cacheSuffix;
- if (cacheSuffix) {
- url += (url.indexOf('?') === -1 ? '?' : '&') + cacheSuffix;
- }
- return url;
- };
- var Tools = {
- trim: trim,
- isArray: ArrUtils.isArray,
- is: is,
- toArray: ArrUtils.toArray,
- makeMap: makeMap,
- each: ArrUtils.each,
- map: ArrUtils.map,
- grep: ArrUtils.filter,
- inArray: ArrUtils.indexOf,
- hasOwn: hasOwnProperty,
- extend: extend,
- create: create,
- walk: walk,
- createNS: createNS,
- resolve: resolve$1,
- explode: explode,
- _addCacheSuffix: _addCacheSuffix
- };
-
- var doc = domGlobals.document, push$1 = Array.prototype.push, slice$1 = Array.prototype.slice;
- var rquickExpr$1 = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/;
- var Event = EventUtils.Event;
- var skipUniques = Tools.makeMap('children,contents,next,prev');
- var isDefined = function (obj) {
- return typeof obj !== 'undefined';
- };
- var isString$1 = function (obj) {
- return typeof obj === 'string';
- };
- var isWindow = function (obj) {
- return obj && obj === obj.window;
- };
- var createFragment = function (html, fragDoc) {
- var frag, node, container;
- fragDoc = fragDoc || doc;
- container = fragDoc.createElement('div');
- frag = fragDoc.createDocumentFragment();
- container.innerHTML = html;
- while (node = container.firstChild) {
- frag.appendChild(node);
- }
- return frag;
- };
- var domManipulate = function (targetNodes, sourceItem, callback, reverse) {
- var i;
- if (isString$1(sourceItem)) {
- sourceItem = createFragment(sourceItem, getElementDocument(targetNodes[0]));
- } else if (sourceItem.length && !sourceItem.nodeType) {
- sourceItem = DomQuery.makeArray(sourceItem);
- if (reverse) {
- for (i = sourceItem.length - 1; i >= 0; i--) {
- domManipulate(targetNodes, sourceItem[i], callback, reverse);
- }
- } else {
- for (i = 0; i < sourceItem.length; i++) {
- domManipulate(targetNodes, sourceItem[i], callback, reverse);
- }
- }
- return targetNodes;
- }
- if (sourceItem.nodeType) {
- i = targetNodes.length;
- while (i--) {
- callback.call(targetNodes[i], sourceItem);
- }
- }
- return targetNodes;
- };
- var hasClass = function (node, className) {
- return node && className && (' ' + node.className + ' ').indexOf(' ' + className + ' ') !== -1;
- };
- var wrap = function (elements, wrapper, all) {
- var lastParent, newWrapper;
- wrapper = DomQuery(wrapper)[0];
- elements.each(function () {
- var self = this;
- if (!all || lastParent !== self.parentNode) {
- lastParent = self.parentNode;
- newWrapper = wrapper.cloneNode(false);
- self.parentNode.insertBefore(newWrapper, self);
- newWrapper.appendChild(self);
- } else {
- newWrapper.appendChild(self);
- }
- });
- return elements;
- };
- var numericCssMap = Tools.makeMap('fillOpacity fontWeight lineHeight opacity orphans widows zIndex zoom', ' ');
- var booleanMap = Tools.makeMap('checked compact declare defer disabled ismap multiple nohref noshade nowrap readonly selected', ' ');
- var propFix = {
- for: 'htmlFor',
- class: 'className',
- readonly: 'readOnly'
- };
- var cssFix = { float: 'cssFloat' };
- var attrHooks = {}, cssHooks = {};
- var DomQuery = function (selector, context) {
- return new DomQuery.fn.init(selector, context);
- };
- var inArray = function (item, array) {
- var i;
- if (array.indexOf) {
- return array.indexOf(item);
- }
- i = array.length;
- while (i--) {
- if (array[i] === item) {
- return i;
- }
- }
- return -1;
- };
- var whiteSpaceRegExp$1 = /^\s*|\s*$/g;
- var trim$1 = function (str) {
- return str === null || str === undefined ? '' : ('' + str).replace(whiteSpaceRegExp$1, '');
- };
- var each$2 = function (obj, callback) {
- var length, key, i, value;
- if (obj) {
- length = obj.length;
- if (length === undefined) {
- for (key in obj) {
- if (obj.hasOwnProperty(key)) {
- value = obj[key];
- if (callback.call(value, key, value) === false) {
- break;
- }
- }
- }
- } else {
- for (i = 0; i < length; i++) {
- value = obj[i];
- if (callback.call(value, i, value) === false) {
- break;
- }
- }
- }
- }
- return obj;
- };
- var grep = function (array, callback) {
- var out = [];
- each$2(array, function (i, item) {
- if (callback(item, i)) {
- out.push(item);
- }
- });
- return out;
- };
- var getElementDocument = function (element) {
- if (!element) {
- return doc;
- }
- if (element.nodeType === 9) {
- return element;
- }
- return element.ownerDocument;
- };
- DomQuery.fn = DomQuery.prototype = {
- constructor: DomQuery,
- selector: '',
- context: null,
- length: 0,
- init: function (selector, context) {
- var self = this;
- var match, node;
- if (!selector) {
- return self;
- }
- if (selector.nodeType) {
- self.context = self[0] = selector;
- self.length = 1;
- return self;
- }
- if (context && context.nodeType) {
- self.context = context;
- } else {
- if (context) {
- return DomQuery(selector).attr(context);
- }
- self.context = context = domGlobals.document;
- }
- if (isString$1(selector)) {
- self.selector = selector;
- if (selector.charAt(0) === '<' && selector.charAt(selector.length - 1) === '>' && selector.length >= 3) {
- match = [
- null,
- selector,
- null
- ];
- } else {
- match = rquickExpr$1.exec(selector);
- }
- if (match) {
- if (match[1]) {
- node = createFragment(selector, getElementDocument(context)).firstChild;
- while (node) {
- push$1.call(self, node);
- node = node.nextSibling;
- }
- } else {
- node = getElementDocument(context).getElementById(match[2]);
- if (!node) {
- return self;
- }
- if (node.id !== match[2]) {
- return self.find(selector);
- }
- self.length = 1;
- self[0] = node;
- }
- } else {
- return DomQuery(context).find(selector);
- }
- } else {
- this.add(selector, false);
- }
- return self;
- },
- toArray: function () {
- return Tools.toArray(this);
- },
- add: function (items, sort) {
- var self = this;
- var nodes, i;
- if (isString$1(items)) {
- return self.add(DomQuery(items));
- }
- if (sort !== false) {
- nodes = DomQuery.unique(self.toArray().concat(DomQuery.makeArray(items)));
- self.length = nodes.length;
- for (i = 0; i < nodes.length; i++) {
- self[i] = nodes[i];
- }
- } else {
- push$1.apply(self, DomQuery.makeArray(items));
- }
- return self;
- },
- attr: function (name, value) {
- var self = this;
- var hook;
- if (typeof name === 'object') {
- each$2(name, function (name, value) {
- self.attr(name, value);
- });
- } else if (isDefined(value)) {
- this.each(function () {
- var hook;
- if (this.nodeType === 1) {
- hook = attrHooks[name];
- if (hook && hook.set) {
- hook.set(this, value);
- return;
- }
- if (value === null) {
- this.removeAttribute(name, 2);
- } else {
- this.setAttribute(name, value, 2);
- }
- }
- });
- } else {
- if (self[0] && self[0].nodeType === 1) {
- hook = attrHooks[name];
- if (hook && hook.get) {
- return hook.get(self[0], name);
- }
- if (booleanMap[name]) {
- return self.prop(name) ? name : undefined;
- }
- value = self[0].getAttribute(name, 2);
- if (value === null) {
- value = undefined;
- }
- }
- return value;
- }
- return self;
- },
- removeAttr: function (name) {
- return this.attr(name, null);
- },
- prop: function (name, value) {
- var self = this;
- name = propFix[name] || name;
- if (typeof name === 'object') {
- each$2(name, function (name, value) {
- self.prop(name, value);
- });
- } else if (isDefined(value)) {
- this.each(function () {
- if (this.nodeType === 1) {
- this[name] = value;
- }
- });
- } else {
- if (self[0] && self[0].nodeType && name in self[0]) {
- return self[0][name];
- }
- return value;
- }
- return self;
- },
- css: function (name, value) {
- var self = this;
- var elm, hook;
- var camel = function (name) {
- return name.replace(/-(\D)/g, function (a, b) {
- return b.toUpperCase();
- });
- };
- var dashed = function (name) {
- return name.replace(/[A-Z]/g, function (a) {
- return '-' + a;
- });
- };
- if (typeof name === 'object') {
- each$2(name, function (name, value) {
- self.css(name, value);
- });
- } else {
- if (isDefined(value)) {
- name = camel(name);
- if (typeof value === 'number' && !numericCssMap[name]) {
- value = value.toString() + 'px';
- }
- self.each(function () {
- var style = this.style;
- hook = cssHooks[name];
- if (hook && hook.set) {
- hook.set(this, value);
- return;
- }
- try {
- this.style[cssFix[name] || name] = value;
- } catch (ex) {
- }
- if (value === null || value === '') {
- if (style.removeProperty) {
- style.removeProperty(dashed(name));
- } else {
- style.removeAttribute(name);
- }
- }
- });
- } else {
- elm = self[0];
- hook = cssHooks[name];
- if (hook && hook.get) {
- return hook.get(elm);
- }
- if (elm.ownerDocument.defaultView) {
- try {
- return elm.ownerDocument.defaultView.getComputedStyle(elm, null).getPropertyValue(dashed(name));
- } catch (ex) {
- return undefined;
- }
- } else if (elm.currentStyle) {
- return elm.currentStyle[camel(name)];
- } else {
- return '';
- }
- }
- }
- return self;
- },
- remove: function () {
- var self = this;
- var node, i = this.length;
- while (i--) {
- node = self[i];
- Event.clean(node);
- if (node.parentNode) {
- node.parentNode.removeChild(node);
- }
- }
- return this;
- },
- empty: function () {
- var self = this;
- var node, i = this.length;
- while (i--) {
- node = self[i];
- while (node.firstChild) {
- node.removeChild(node.firstChild);
- }
- }
- return this;
- },
- html: function (value) {
- var self = this;
- var i;
- if (isDefined(value)) {
- i = self.length;
- try {
- while (i--) {
- self[i].innerHTML = value;
- }
- } catch (ex) {
- DomQuery(self[i]).empty().append(value);
- }
- return self;
- }
- return self[0] ? self[0].innerHTML : '';
- },
- text: function (value) {
- var self = this;
- var i;
- if (isDefined(value)) {
- i = self.length;
- while (i--) {
- if ('innerText' in self[i]) {
- self[i].innerText = value;
- } else {
- self[0].textContent = value;
- }
- }
- return self;
- }
- return self[0] ? self[0].innerText || self[0].textContent : '';
- },
- append: function () {
- return domManipulate(this, arguments, function (node) {
- if (this.nodeType === 1 || this.host && this.host.nodeType === 1) {
- this.appendChild(node);
- }
- });
- },
- prepend: function () {
- return domManipulate(this, arguments, function (node) {
- if (this.nodeType === 1 || this.host && this.host.nodeType === 1) {
- this.insertBefore(node, this.firstChild);
- }
- }, true);
- },
- before: function () {
- var self = this;
- if (self[0] && self[0].parentNode) {
- return domManipulate(self, arguments, function (node) {
- this.parentNode.insertBefore(node, this);
- });
- }
- return self;
- },
- after: function () {
- var self = this;
- if (self[0] && self[0].parentNode) {
- return domManipulate(self, arguments, function (node) {
- this.parentNode.insertBefore(node, this.nextSibling);
- }, true);
- }
- return self;
- },
- appendTo: function (val) {
- DomQuery(val).append(this);
- return this;
- },
- prependTo: function (val) {
- DomQuery(val).prepend(this);
- return this;
- },
- replaceWith: function (content) {
- return this.before(content).remove();
- },
- wrap: function (content) {
- return wrap(this, content);
- },
- wrapAll: function (content) {
- return wrap(this, content, true);
- },
- wrapInner: function (content) {
- this.each(function () {
- DomQuery(this).contents().wrapAll(content);
- });
- return this;
- },
- unwrap: function () {
- return this.parent().each(function () {
- DomQuery(this).replaceWith(this.childNodes);
- });
- },
- clone: function () {
- var result = [];
- this.each(function () {
- result.push(this.cloneNode(true));
- });
- return DomQuery(result);
- },
- addClass: function (className) {
- return this.toggleClass(className, true);
- },
- removeClass: function (className) {
- return this.toggleClass(className, false);
- },
- toggleClass: function (className, state) {
- var self = this;
- if (typeof className !== 'string') {
- return self;
- }
- if (className.indexOf(' ') !== -1) {
- each$2(className.split(' '), function () {
- self.toggleClass(this, state);
- });
- } else {
- self.each(function (index, node) {
- var existingClassName, classState;
- classState = hasClass(node, className);
- if (classState !== state) {
- existingClassName = node.className;
- if (classState) {
- node.className = trim$1((' ' + existingClassName + ' ').replace(' ' + className + ' ', ' '));
- } else {
- node.className += existingClassName ? ' ' + className : className;
- }
- }
- });
- }
- return self;
- },
- hasClass: function (className) {
- return hasClass(this[0], className);
- },
- each: function (callback) {
- return each$2(this, callback);
- },
- on: function (name, callback) {
- return this.each(function () {
- Event.bind(this, name, callback);
- });
- },
- off: function (name, callback) {
- return this.each(function () {
- Event.unbind(this, name, callback);
- });
- },
- trigger: function (name) {
- return this.each(function () {
- if (typeof name === 'object') {
- Event.fire(this, name.type, name);
- } else {
- Event.fire(this, name);
- }
- });
- },
- show: function () {
- return this.css('display', '');
- },
- hide: function () {
- return this.css('display', 'none');
- },
- slice: function () {
- return new DomQuery(slice$1.apply(this, arguments));
- },
- eq: function (index) {
- return index === -1 ? this.slice(index) : this.slice(index, +index + 1);
- },
- first: function () {
- return this.eq(0);
- },
- last: function () {
- return this.eq(-1);
- },
- find: function (selector) {
- var i, l;
- var ret = [];
- for (i = 0, l = this.length; i < l; i++) {
- DomQuery.find(selector, this[i], ret);
- }
- return DomQuery(ret);
- },
- filter: function (selector) {
- if (typeof selector === 'function') {
- return DomQuery(grep(this.toArray(), function (item, i) {
- return selector(i, item);
- }));
- }
- return DomQuery(DomQuery.filter(selector, this.toArray()));
- },
- closest: function (selector) {
- var result = [];
- if (selector instanceof DomQuery) {
- selector = selector[0];
- }
- this.each(function (i, node) {
- while (node) {
- if (typeof selector === 'string' && DomQuery(node).is(selector)) {
- result.push(node);
- break;
- } else if (node === selector) {
- result.push(node);
- break;
- }
- node = node.parentNode;
- }
- });
- return DomQuery(result);
- },
- offset: function (offset) {
- var elm, doc, docElm;
- var x = 0, y = 0, pos;
- if (!offset) {
- elm = this[0];
- if (elm) {
- doc = elm.ownerDocument;
- docElm = doc.documentElement;
- if (elm.getBoundingClientRect) {
- pos = elm.getBoundingClientRect();
- x = pos.left + (docElm.scrollLeft || doc.body.scrollLeft) - docElm.clientLeft;
- y = pos.top + (docElm.scrollTop || doc.body.scrollTop) - docElm.clientTop;
- }
- }
- return {
- left: x,
- top: y
- };
- }
- return this.css(offset);
- },
- push: push$1,
- sort: [].sort,
- splice: [].splice
- };
- Tools.extend(DomQuery, {
- extend: Tools.extend,
- makeArray: function (object) {
- if (isWindow(object) || object.nodeType) {
- return [object];
- }
- return Tools.toArray(object);
- },
- inArray: inArray,
- isArray: Tools.isArray,
- each: each$2,
- trim: trim$1,
- grep: grep,
- find: Sizzle,
- expr: Sizzle.selectors,
- unique: Sizzle.uniqueSort,
- text: Sizzle.getText,
- contains: Sizzle.contains,
- filter: function (expr, elems, not) {
- var i = elems.length;
- if (not) {
- expr = ':not(' + expr + ')';
- }
- while (i--) {
- if (elems[i].nodeType !== 1) {
- elems.splice(i, 1);
- }
- }
- if (elems.length === 1) {
- elems = DomQuery.find.matchesSelector(elems[0], expr) ? [elems[0]] : [];
- } else {
- elems = DomQuery.find.matches(expr, elems);
- }
- return elems;
- }
- });
- var dir = function (el, prop, until) {
- var matched = [];
- var cur = el[prop];
- if (typeof until !== 'string' && until instanceof DomQuery) {
- until = until[0];
- }
- while (cur && cur.nodeType !== 9) {
- if (until !== undefined) {
- if (cur === until) {
- break;
- }
- if (typeof until === 'string' && DomQuery(cur).is(until)) {
- break;
- }
- }
- if (cur.nodeType === 1) {
- matched.push(cur);
- }
- cur = cur[prop];
- }
- return matched;
- };
- var sibling = function (node, siblingName, nodeType, until) {
- var result = [];
- if (until instanceof DomQuery) {
- until = until[0];
- }
- for (; node; node = node[siblingName]) {
- if (nodeType && node.nodeType !== nodeType) {
- continue;
- }
- if (until !== undefined) {
- if (node === until) {
- break;
- }
- if (typeof until === 'string' && DomQuery(node).is(until)) {
- break;
- }
- }
- result.push(node);
- }
- return result;
- };
- var firstSibling = function (node, siblingName, nodeType) {
- for (node = node[siblingName]; node; node = node[siblingName]) {
- if (node.nodeType === nodeType) {
- return node;
- }
- }
- return null;
- };
- each$2({
- parent: function (node) {
- var parent = node.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents: function (node) {
- return dir(node, 'parentNode');
- },
- next: function (node) {
- return firstSibling(node, 'nextSibling', 1);
- },
- prev: function (node) {
- return firstSibling(node, 'previousSibling', 1);
- },
- children: function (node) {
- return sibling(node.firstChild, 'nextSibling', 1);
- },
- contents: function (node) {
- return Tools.toArray((node.nodeName === 'iframe' ? node.contentDocument || node.contentWindow.document : node).childNodes);
- }
- }, function (name, fn) {
- DomQuery.fn[name] = function (selector) {
- var self = this;
- var result = [];
- self.each(function () {
- var nodes = fn.call(result, this, selector, result);
- if (nodes) {
- if (DomQuery.isArray(nodes)) {
- result.push.apply(result, nodes);
- } else {
- result.push(nodes);
- }
- }
- });
- if (this.length > 1) {
- if (!skipUniques[name]) {
- result = DomQuery.unique(result);
- }
- if (name.indexOf('parents') === 0) {
- result = result.reverse();
- }
- }
- result = DomQuery(result);
- if (selector) {
- return result.filter(selector);
- }
- return result;
- };
- });
- each$2({
- parentsUntil: function (node, until) {
- return dir(node, 'parentNode', until);
- },
- nextUntil: function (node, until) {
- return sibling(node, 'nextSibling', 1, until).slice(1);
- },
- prevUntil: function (node, until) {
- return sibling(node, 'previousSibling', 1, until).slice(1);
- }
- }, function (name, fn) {
- DomQuery.fn[name] = function (selector, filter) {
- var self = this;
- var result = [];
- self.each(function () {
- var nodes = fn.call(result, this, selector, result);
- if (nodes) {
- if (DomQuery.isArray(nodes)) {
- result.push.apply(result, nodes);
- } else {
- result.push(nodes);
- }
- }
- });
- if (this.length > 1) {
- result = DomQuery.unique(result);
- if (name.indexOf('parents') === 0 || name === 'prevUntil') {
- result = result.reverse();
- }
- }
- result = DomQuery(result);
- if (filter) {
- return result.filter(filter);
- }
- return result;
- };
- });
- DomQuery.fn.is = function (selector) {
- return !!selector && this.filter(selector).length > 0;
- };
- DomQuery.fn.init.prototype = DomQuery.fn;
- DomQuery.overrideDefaults = function (callback) {
- var defaults;
- var sub = function (selector, context) {
- defaults = defaults || callback();
- if (arguments.length === 0) {
- selector = defaults.element;
- }
- if (!context) {
- context = defaults.context;
- }
- return new sub.fn.init(selector, context);
- };
- DomQuery.extend(sub, this);
- return sub;
- };
- var appendHooks = function (targetHooks, prop, hooks) {
- each$2(hooks, function (name, func) {
- targetHooks[name] = targetHooks[name] || {};
- targetHooks[name][prop] = func;
- });
- };
- if (Env.ie && Env.ie < 8) {
- appendHooks(attrHooks, 'get', {
- maxlength: function (elm) {
- var value = elm.maxLength;
- if (value === 2147483647) {
- return undefined;
- }
- return value;
- },
- size: function (elm) {
- var value = elm.size;
- if (value === 20) {
- return undefined;
- }
- return value;
- },
- class: function (elm) {
- return elm.className;
- },
- style: function (elm) {
- var value = elm.style.cssText;
- if (value.length === 0) {
- return undefined;
- }
- return value;
- }
- });
- appendHooks(attrHooks, 'set', {
- class: function (elm, value) {
- elm.className = value;
- },
- style: function (elm, value) {
- elm.style.cssText = value;
- }
- });
- }
- if (Env.ie && Env.ie < 9) {
- cssFix.float = 'styleFloat';
- appendHooks(cssHooks, 'set', {
- opacity: function (elm, value) {
- var style = elm.style;
- if (value === null || value === '') {
- style.removeAttribute('filter');
- } else {
- style.zoom = 1;
- style.filter = 'alpha(opacity=' + value * 100 + ')';
- }
- }
- });
- }
- DomQuery.attrHooks = attrHooks;
- DomQuery.cssHooks = cssHooks;
-
- var cached = function (f) {
- var called = false;
- var r;
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (!called) {
- called = true;
- r = f.apply(null, args);
- }
- return r;
- };
- };
-
- var firstMatch = function (regexes, s) {
- for (var i = 0; i < regexes.length; i++) {
- var x = regexes[i];
- if (x.test(s)) {
- return x;
- }
- }
- return undefined;
- };
- var find$2 = function (regexes, agent) {
- var r = firstMatch(regexes, agent);
- if (!r) {
- return {
- major: 0,
- minor: 0
- };
- }
- var group = function (i) {
- return Number(agent.replace(r, '$' + i));
- };
- return nu(group(1), group(2));
- };
- var detect = function (versionRegexes, agent) {
- var cleanedAgent = String(agent).toLowerCase();
- if (versionRegexes.length === 0) {
- return unknown();
- }
- return find$2(versionRegexes, cleanedAgent);
- };
- var unknown = function () {
- return nu(0, 0);
- };
- var nu = function (major, minor) {
- return {
- major: major,
- minor: minor
- };
- };
- var Version = {
- nu: nu,
- detect: detect,
- unknown: unknown
- };
-
- var edge = 'Edge';
- var chrome = 'Chrome';
- var ie$1 = 'IE';
- var opera$1 = 'Opera';
- var firefox = 'Firefox';
- var safari = 'Safari';
- var isBrowser = function (name, current) {
- return function () {
- return current === name;
- };
- };
- var unknown$1 = function () {
- return nu$1({
- current: undefined,
- version: Version.unknown()
- });
- };
- var nu$1 = function (info) {
- var current = info.current;
- var version = info.version;
- return {
- current: current,
- version: version,
- isEdge: isBrowser(edge, current),
- isChrome: isBrowser(chrome, current),
- isIE: isBrowser(ie$1, current),
- isOpera: isBrowser(opera$1, current),
- isFirefox: isBrowser(firefox, current),
- isSafari: isBrowser(safari, current)
- };
- };
- var Browser = {
- unknown: unknown$1,
- nu: nu$1,
- edge: constant(edge),
- chrome: constant(chrome),
- ie: constant(ie$1),
- opera: constant(opera$1),
- firefox: constant(firefox),
- safari: constant(safari)
- };
-
- var windows = 'Windows';
- var ios = 'iOS';
- var android$1 = 'Android';
- var linux = 'Linux';
- var osx = 'OSX';
- var solaris = 'Solaris';
- var freebsd = 'FreeBSD';
- var isOS = function (name, current) {
- return function () {
- return current === name;
- };
- };
- var unknown$2 = function () {
- return nu$2({
- current: undefined,
- version: Version.unknown()
- });
- };
- var nu$2 = function (info) {
- var current = info.current;
- var version = info.version;
- return {
- current: current,
- version: version,
- isWindows: isOS(windows, current),
- isiOS: isOS(ios, current),
- isAndroid: isOS(android$1, current),
- isOSX: isOS(osx, current),
- isLinux: isOS(linux, current),
- isSolaris: isOS(solaris, current),
- isFreeBSD: isOS(freebsd, current)
- };
- };
- var OperatingSystem = {
- unknown: unknown$2,
- nu: nu$2,
- windows: constant(windows),
- ios: constant(ios),
- android: constant(android$1),
- linux: constant(linux),
- osx: constant(osx),
- solaris: constant(solaris),
- freebsd: constant(freebsd)
- };
-
- var DeviceType = function (os, browser, userAgent) {
- var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
- var isiPhone = os.isiOS() && !isiPad;
- var isAndroid3 = os.isAndroid() && os.version.major === 3;
- var isAndroid4 = os.isAndroid() && os.version.major === 4;
- var isTablet = isiPad || isAndroid3 || isAndroid4 && /mobile/i.test(userAgent) === true;
- var isTouch = os.isiOS() || os.isAndroid();
- var isPhone = isTouch && !isTablet;
- var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
- return {
- isiPad: constant(isiPad),
- isiPhone: constant(isiPhone),
- isTablet: constant(isTablet),
- isPhone: constant(isPhone),
- isTouch: constant(isTouch),
- isAndroid: os.isAndroid,
- isiOS: os.isiOS,
- isWebView: constant(iOSwebview)
- };
- };
-
- var detect$1 = function (candidates, userAgent) {
- var agent = String(userAgent).toLowerCase();
- return find(candidates, function (candidate) {
- return candidate.search(agent);
- });
- };
- var detectBrowser = function (browsers, userAgent) {
- return detect$1(browsers, userAgent).map(function (browser) {
- var version = Version.detect(browser.versionRegexes, userAgent);
- return {
- current: browser.name,
- version: version
- };
- });
- };
- var detectOs = function (oses, userAgent) {
- return detect$1(oses, userAgent).map(function (os) {
- var version = Version.detect(os.versionRegexes, userAgent);
- return {
- current: os.name,
- version: version
- };
- });
- };
- var UaString = {
- detectBrowser: detectBrowser,
- detectOs: detectOs
- };
-
- var contains$2 = function (str, substr) {
- return str.indexOf(substr) !== -1;
- };
- var trim$2 = function (str) {
- return str.replace(/^\s+|\s+$/g, '');
- };
- var lTrim = function (str) {
- return str.replace(/^\s+/g, '');
- };
- var rTrim = function (str) {
- return str.replace(/\s+$/g, '');
- };
-
- var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
- var checkContains = function (target) {
- return function (uastring) {
- return contains$2(uastring, target);
- };
- };
- var browsers = [
- {
- name: 'Edge',
- versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
- search: function (uastring) {
- return contains$2(uastring, 'edge/') && contains$2(uastring, 'chrome') && contains$2(uastring, 'safari') && contains$2(uastring, 'applewebkit');
- }
- },
- {
- name: 'Chrome',
- versionRegexes: [
- /.*?chrome\/([0-9]+)\.([0-9]+).*/,
- normalVersionRegex
- ],
- search: function (uastring) {
- return contains$2(uastring, 'chrome') && !contains$2(uastring, 'chromeframe');
- }
- },
- {
- name: 'IE',
- versionRegexes: [
- /.*?msie\ ?([0-9]+)\.([0-9]+).*/,
- /.*?rv:([0-9]+)\.([0-9]+).*/
- ],
- search: function (uastring) {
- return contains$2(uastring, 'msie') || contains$2(uastring, 'trident');
- }
- },
- {
- name: 'Opera',
- versionRegexes: [
- normalVersionRegex,
- /.*?opera\/([0-9]+)\.([0-9]+).*/
- ],
- search: checkContains('opera')
- },
- {
- name: 'Firefox',
- versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
- search: checkContains('firefox')
- },
- {
- name: 'Safari',
- versionRegexes: [
- normalVersionRegex,
- /.*?cpu os ([0-9]+)_([0-9]+).*/
- ],
- search: function (uastring) {
- return (contains$2(uastring, 'safari') || contains$2(uastring, 'mobile/')) && contains$2(uastring, 'applewebkit');
- }
- }
- ];
- var oses = [
- {
- name: 'Windows',
- search: checkContains('win'),
- versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
- },
- {
- name: 'iOS',
- search: function (uastring) {
- return contains$2(uastring, 'iphone') || contains$2(uastring, 'ipad');
- },
- versionRegexes: [
- /.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
- /.*cpu os ([0-9]+)_([0-9]+).*/,
- /.*cpu iphone os ([0-9]+)_([0-9]+).*/
- ]
- },
- {
- name: 'Android',
- search: checkContains('android'),
- versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
- },
- {
- name: 'OSX',
- search: checkContains('os x'),
- versionRegexes: [/.*?os\ x\ ?([0-9]+)_([0-9]+).*/]
- },
- {
- name: 'Linux',
- search: checkContains('linux'),
- versionRegexes: []
- },
- {
- name: 'Solaris',
- search: checkContains('sunos'),
- versionRegexes: []
- },
- {
- name: 'FreeBSD',
- search: checkContains('freebsd'),
- versionRegexes: []
- }
- ];
- var PlatformInfo = {
- browsers: constant(browsers),
- oses: constant(oses)
- };
-
- var detect$2 = function (userAgent) {
- var browsers = PlatformInfo.browsers();
- var oses = PlatformInfo.oses();
- var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu);
- var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
- var deviceType = DeviceType(os, browser, userAgent);
- return {
- browser: browser,
- os: os,
- deviceType: deviceType
- };
- };
- var PlatformDetection = { detect: detect$2 };
-
- var detect$3 = cached(function () {
- var userAgent = domGlobals.navigator.userAgent;
- return PlatformDetection.detect(userAgent);
- });
- var PlatformDetection$1 = { detect: detect$3 };
-
- var fromHtml = function (html, scope) {
- var doc = scope || domGlobals.document;
- var div = doc.createElement('div');
- div.innerHTML = html;
- if (!div.hasChildNodes() || div.childNodes.length > 1) {
- domGlobals.console.error('HTML does not have a single root node', html);
- throw new Error('HTML must have a single root node');
- }
- return fromDom(div.childNodes[0]);
- };
- var fromTag = function (tag, scope) {
- var doc = scope || domGlobals.document;
- var node = doc.createElement(tag);
- return fromDom(node);
- };
- var fromText = function (text, scope) {
- var doc = scope || domGlobals.document;
- var node = doc.createTextNode(text);
- return fromDom(node);
- };
- var fromDom = function (node) {
- if (node === null || node === undefined) {
- throw new Error('Node cannot be null or undefined');
- }
- return { dom: constant(node) };
- };
- var fromPoint = function (docElm, x, y) {
- var doc = docElm.dom();
- return Option.from(doc.elementFromPoint(x, y)).map(fromDom);
- };
- var Element = {
- fromHtml: fromHtml,
- fromTag: fromTag,
- fromText: fromText,
- fromDom: fromDom,
- fromPoint: fromPoint
- };
-
- var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;
- var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;
- var COMMENT = domGlobals.Node.COMMENT_NODE;
- var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;
- var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;
- var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;
- var ELEMENT = domGlobals.Node.ELEMENT_NODE;
- var TEXT = domGlobals.Node.TEXT_NODE;
- var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;
- var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;
- var ENTITY = domGlobals.Node.ENTITY_NODE;
- var NOTATION = domGlobals.Node.NOTATION_NODE;
-
- var name = function (element) {
- var r = element.dom().nodeName;
- return r.toLowerCase();
- };
- var type = function (element) {
- return element.dom().nodeType;
- };
- var isType$1 = function (t) {
- return function (element) {
- return type(element) === t;
- };
- };
- var isElement = isType$1(ELEMENT);
- var isText = isType$1(TEXT);
-
- var keys = Object.keys;
- var hasOwnProperty$1 = Object.hasOwnProperty;
- var each$3 = function (obj, f) {
- var props = keys(obj);
- for (var k = 0, len = props.length; k < len; k++) {
- var i = props[k];
- var x = obj[i];
- f(x, i);
- }
- };
- var map$2 = function (obj, f) {
- return tupleMap(obj, function (x, i) {
- return {
- k: i,
- v: f(x, i)
- };
- });
- };
- var tupleMap = function (obj, f) {
- var r = {};
- each$3(obj, function (x, i) {
- var tuple = f(x, i);
- r[tuple.k] = tuple.v;
- });
- return r;
- };
- var bifilter = function (obj, pred) {
- var t = {};
- var f = {};
- each$3(obj, function (x, i) {
- var branch = pred(x, i) ? t : f;
- branch[i] = x;
- });
- return {
- t: t,
- f: f
- };
- };
- var has = function (obj, key) {
- return hasOwnProperty$1.call(obj, key);
- };
-
- var isSupported = function (dom) {
- return dom.style !== undefined && isFunction(dom.style.getPropertyValue);
- };
-
- var inBody = function (element) {
- var dom = isText(element) ? element.dom().parentNode : element.dom();
- return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom);
- };
-
- var rawSet = function (dom, key, value) {
- if (isString(value) || isBoolean(value) || isNumber(value)) {
- dom.setAttribute(key, value + '');
- } else {
- domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom);
- throw new Error('Attribute value was not simple');
- }
- };
- var set = function (element, key, value) {
- rawSet(element.dom(), key, value);
- };
- var setAll = function (element, attrs) {
- var dom = element.dom();
- each$3(attrs, function (v, k) {
- rawSet(dom, k, v);
- });
- };
- var get = function (element, key) {
- var v = element.dom().getAttribute(key);
- return v === null ? undefined : v;
- };
- var has$1 = function (element, key) {
- var dom = element.dom();
- return dom && dom.hasAttribute ? dom.hasAttribute(key) : false;
- };
- var remove = function (element, key) {
- element.dom().removeAttribute(key);
- };
-
- var internalSet = function (dom, property, value) {
- if (!isString(value)) {
- domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
- throw new Error('CSS value must be a string: ' + value);
- }
- if (isSupported(dom)) {
- dom.style.setProperty(property, value);
- }
- };
- var setAll$1 = function (element, css) {
- var dom = element.dom();
- each$3(css, function (v, k) {
- internalSet(dom, k, v);
- });
- };
- var get$1 = function (element, property) {
- var dom = element.dom();
- var styles = domGlobals.window.getComputedStyle(dom);
- var r = styles.getPropertyValue(property);
- var v = r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;
- return v === null ? undefined : v;
- };
- var getUnsafeProperty = function (dom, property) {
- return isSupported(dom) ? dom.style.getPropertyValue(property) : '';
- };
- var getRaw = function (element, property) {
- var dom = element.dom();
- var raw = getUnsafeProperty(dom, property);
- return Option.from(raw).filter(function (r) {
- return r.length > 0;
- });
- };
- var getAllRaw = function (element) {
- var css = {};
- var dom = element.dom();
- if (isSupported(dom)) {
- for (var i = 0; i < dom.style.length; i++) {
- var ruleName = dom.style.item(i);
- css[ruleName] = dom.style[ruleName];
- }
- }
- return css;
- };
-
- var Immutable = function () {
- var fields = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- fields[_i] = arguments[_i];
- }
- return function () {
- var values = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- values[_i] = arguments[_i];
- }
- if (fields.length !== values.length) {
- throw new Error('Wrong number of arguments to struct. Expected "[' + fields.length + ']", got ' + values.length + ' arguments');
- }
- var struct = {};
- each(fields, function (name, i) {
- struct[name] = constant(values[i]);
- });
- return struct;
- };
- };
-
- var toArray$1 = function (target, f) {
- var r = [];
- var recurse = function (e) {
- r.push(e);
- return f(e);
- };
- var cur = f(target);
- do {
- cur = cur.bind(recurse);
- } while (cur.isSome());
- return r;
- };
- var Recurse = { toArray: toArray$1 };
-
- var node = function () {
- var f = Global$1.getOrDie('Node');
- return f;
- };
- var compareDocumentPosition = function (a, b, match) {
- return (a.compareDocumentPosition(b) & match) !== 0;
- };
- var documentPositionPreceding = function (a, b) {
- return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_PRECEDING);
- };
- var documentPositionContainedBy = function (a, b) {
- return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_CONTAINED_BY);
- };
- var Node = {
- documentPositionPreceding: documentPositionPreceding,
- documentPositionContainedBy: documentPositionContainedBy
- };
-
- var ELEMENT$1 = ELEMENT;
- var DOCUMENT$1 = DOCUMENT;
- var is$1 = function (element, selector) {
- var dom = element.dom();
- if (dom.nodeType !== ELEMENT$1) {
- return false;
- } else {
- var elem = dom;
- if (elem.matches !== undefined) {
- return elem.matches(selector);
- } else if (elem.msMatchesSelector !== undefined) {
- return elem.msMatchesSelector(selector);
- } else if (elem.webkitMatchesSelector !== undefined) {
- return elem.webkitMatchesSelector(selector);
- } else if (elem.mozMatchesSelector !== undefined) {
- return elem.mozMatchesSelector(selector);
- } else {
- throw new Error('Browser lacks native selectors');
- }
- }
- };
- var bypassSelector = function (dom) {
- return dom.nodeType !== ELEMENT$1 && dom.nodeType !== DOCUMENT$1 || dom.childElementCount === 0;
- };
- var all = function (selector, scope) {
- var base = scope === undefined ? domGlobals.document : scope.dom();
- return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), Element.fromDom);
- };
- var one = function (selector, scope) {
- var base = scope === undefined ? domGlobals.document : scope.dom();
- return bypassSelector(base) ? Option.none() : Option.from(base.querySelector(selector)).map(Element.fromDom);
- };
-
- var eq = function (e1, e2) {
- return e1.dom() === e2.dom();
- };
- var regularContains = function (e1, e2) {
- var d1 = e1.dom();
- var d2 = e2.dom();
- return d1 === d2 ? false : d1.contains(d2);
- };
- var ieContains = function (e1, e2) {
- return Node.documentPositionContainedBy(e1.dom(), e2.dom());
- };
- var browser = PlatformDetection$1.detect().browser;
- var contains$3 = browser.isIE() ? ieContains : regularContains;
-
- var owner = function (element) {
- return Element.fromDom(element.dom().ownerDocument);
- };
- var documentElement = function (element) {
- return Element.fromDom(element.dom().ownerDocument.documentElement);
- };
- var defaultView = function (element) {
- return Element.fromDom(element.dom().ownerDocument.defaultView);
- };
- var parent = function (element) {
- return Option.from(element.dom().parentNode).map(Element.fromDom);
- };
- var parents = function (element, isRoot) {
- var stop = isFunction(isRoot) ? isRoot : never;
- var dom = element.dom();
- var ret = [];
- while (dom.parentNode !== null && dom.parentNode !== undefined) {
- var rawParent = dom.parentNode;
- var p = Element.fromDom(rawParent);
- ret.push(p);
- if (stop(p) === true) {
- break;
- } else {
- dom = rawParent;
- }
- }
- return ret;
- };
- var prevSibling = function (element) {
- return Option.from(element.dom().previousSibling).map(Element.fromDom);
- };
- var nextSibling = function (element) {
- return Option.from(element.dom().nextSibling).map(Element.fromDom);
- };
- var prevSiblings = function (element) {
- return reverse(Recurse.toArray(element, prevSibling));
- };
- var nextSiblings = function (element) {
- return Recurse.toArray(element, nextSibling);
- };
- var children = function (element) {
- return map(element.dom().childNodes, Element.fromDom);
- };
- var child = function (element, index) {
- var cs = element.dom().childNodes;
- return Option.from(cs[index]).map(Element.fromDom);
- };
- var firstChild = function (element) {
- return child(element, 0);
- };
- var lastChild = function (element) {
- return child(element, element.dom().childNodes.length - 1);
- };
- var childNodesCount = function (element) {
- return element.dom().childNodes.length;
- };
- var spot = Immutable('element', 'offset');
-
- var browser$1 = PlatformDetection$1.detect().browser;
- var firstElement = function (nodes) {
- return find(nodes, isElement);
- };
- var getTableCaptionDeltaY = function (elm) {
- if (browser$1.isFirefox() && name(elm) === 'table') {
- return firstElement(children(elm)).filter(function (elm) {
- return name(elm) === 'caption';
- }).bind(function (caption) {
- return firstElement(nextSiblings(caption)).map(function (body) {
- var bodyTop = body.dom().offsetTop;
- var captionTop = caption.dom().offsetTop;
- var captionHeight = caption.dom().offsetHeight;
- return bodyTop <= captionTop ? -captionHeight : 0;
- });
- }).getOr(0);
- } else {
- return 0;
- }
- };
- var getPos = function (body, elm, rootElm) {
- var x = 0, y = 0, offsetParent;
- var doc = body.ownerDocument;
- var pos;
- rootElm = rootElm ? rootElm : body;
- if (elm) {
- if (rootElm === body && elm.getBoundingClientRect && get$1(Element.fromDom(body), 'position') === 'static') {
- pos = elm.getBoundingClientRect();
- x = pos.left + (doc.documentElement.scrollLeft || body.scrollLeft) - doc.documentElement.clientLeft;
- y = pos.top + (doc.documentElement.scrollTop || body.scrollTop) - doc.documentElement.clientTop;
- return {
- x: x,
- y: y
- };
- }
- offsetParent = elm;
- while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType) {
- x += offsetParent.offsetLeft || 0;
- y += offsetParent.offsetTop || 0;
- offsetParent = offsetParent.offsetParent;
- }
- offsetParent = elm.parentNode;
- while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType) {
- x -= offsetParent.scrollLeft || 0;
- y -= offsetParent.scrollTop || 0;
- offsetParent = offsetParent.parentNode;
- }
- y += getTableCaptionDeltaY(Element.fromDom(elm));
- }
- return {
- x: x,
- y: y
- };
- };
- var Position = { getPos: getPos };
-
- var exports$1 = {}, module$1 = { exports: exports$1 };
- (function (define, exports, module, require) {
- (function (f) {
- if (typeof exports === 'object' && typeof module !== 'undefined') {
- module.exports = f();
- } else if (typeof define === 'function' && define.amd) {
- define([], f);
- } else {
- var g;
- if (typeof window !== 'undefined') {
- g = window;
- } else if (typeof global !== 'undefined') {
- g = global;
- } else if (typeof self !== 'undefined') {
- g = self;
- } else {
- g = this;
- }
- g.EphoxContactWrapper = f();
- }
- }(function () {
- return function () {
- function r(e, n, t) {
- function o(i, f) {
- if (!n[i]) {
- if (!e[i]) {
- var c = 'function' == typeof require && require;
- if (!f && c)
- return c(i, !0);
- if (u)
- return u(i, !0);
- var a = new Error('Cannot find module \'' + i + '\'');
- throw a.code = 'MODULE_NOT_FOUND', a;
- }
- var p = n[i] = { exports: {} };
- e[i][0].call(p.exports, function (r) {
- var n = e[i][1][r];
- return o(n || r);
- }, p, p.exports, r, e, n, t);
- }
- return n[i].exports;
- }
- for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++)
- o(t[i]);
- return o;
- }
- return r;
- }()({
- 1: [
- function (require, module, exports) {
- var process = module.exports = {};
- var cachedSetTimeout;
- var cachedClearTimeout;
- function defaultSetTimout() {
- throw new Error('setTimeout has not been defined');
- }
- function defaultClearTimeout() {
- throw new Error('clearTimeout has not been defined');
- }
- (function () {
- try {
- if (typeof setTimeout === 'function') {
- cachedSetTimeout = setTimeout;
- } else {
- cachedSetTimeout = defaultSetTimout;
- }
- } catch (e) {
- cachedSetTimeout = defaultSetTimout;
- }
- try {
- if (typeof clearTimeout === 'function') {
- cachedClearTimeout = clearTimeout;
- } else {
- cachedClearTimeout = defaultClearTimeout;
- }
- } catch (e) {
- cachedClearTimeout = defaultClearTimeout;
- }
- }());
- function runTimeout(fun) {
- if (cachedSetTimeout === setTimeout) {
- return setTimeout(fun, 0);
- }
- if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
- cachedSetTimeout = setTimeout;
- return setTimeout(fun, 0);
- }
- try {
- return cachedSetTimeout(fun, 0);
- } catch (e) {
- try {
- return cachedSetTimeout.call(null, fun, 0);
- } catch (e) {
- return cachedSetTimeout.call(this, fun, 0);
- }
- }
- }
- function runClearTimeout(marker) {
- if (cachedClearTimeout === clearTimeout) {
- return clearTimeout(marker);
- }
- if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
- cachedClearTimeout = clearTimeout;
- return clearTimeout(marker);
- }
- try {
- return cachedClearTimeout(marker);
- } catch (e) {
- try {
- return cachedClearTimeout.call(null, marker);
- } catch (e) {
- return cachedClearTimeout.call(this, marker);
- }
- }
- }
- var queue = [];
- var draining = false;
- var currentQueue;
- var queueIndex = -1;
- function cleanUpNextTick() {
- if (!draining || !currentQueue) {
- return;
- }
- draining = false;
- if (currentQueue.length) {
- queue = currentQueue.concat(queue);
- } else {
- queueIndex = -1;
- }
- if (queue.length) {
- drainQueue();
- }
- }
- function drainQueue() {
- if (draining) {
- return;
- }
- var timeout = runTimeout(cleanUpNextTick);
- draining = true;
- var len = queue.length;
- while (len) {
- currentQueue = queue;
- queue = [];
- while (++queueIndex < len) {
- if (currentQueue) {
- currentQueue[queueIndex].run();
- }
- }
- queueIndex = -1;
- len = queue.length;
- }
- currentQueue = null;
- draining = false;
- runClearTimeout(timeout);
- }
- process.nextTick = function (fun) {
- var args = new Array(arguments.length - 1);
- if (arguments.length > 1) {
- for (var i = 1; i < arguments.length; i++) {
- args[i - 1] = arguments[i];
- }
- }
- queue.push(new Item(fun, args));
- if (queue.length === 1 && !draining) {
- runTimeout(drainQueue);
- }
- };
- function Item(fun, array) {
- this.fun = fun;
- this.array = array;
- }
- Item.prototype.run = function () {
- this.fun.apply(null, this.array);
- };
- process.title = 'browser';
- process.browser = true;
- process.env = {};
- process.argv = [];
- process.version = '';
- process.versions = {};
- function noop() {
- }
- process.on = noop;
- process.addListener = noop;
- process.once = noop;
- process.off = noop;
- process.removeListener = noop;
- process.removeAllListeners = noop;
- process.emit = noop;
- process.prependListener = noop;
- process.prependOnceListener = noop;
- process.listeners = function (name) {
- return [];
- };
- process.binding = function (name) {
- throw new Error('process.binding is not supported');
- };
- process.cwd = function () {
- return '/';
- };
- process.chdir = function (dir) {
- throw new Error('process.chdir is not supported');
- };
- process.umask = function () {
- return 0;
- };
- },
- {}
- ],
- 2: [
- function (require, module, exports) {
- (function (setImmediate) {
- (function (root) {
- var setTimeoutFunc = setTimeout;
- function noop() {
- }
- function bind(fn, thisArg) {
- return function () {
- fn.apply(thisArg, arguments);
- };
- }
- function Promise(fn) {
- if (typeof this !== 'object')
- throw new TypeError('Promises must be constructed via new');
- if (typeof fn !== 'function')
- throw new TypeError('not a function');
- this._state = 0;
- this._handled = false;
- this._value = undefined;
- this._deferreds = [];
- doResolve(fn, this);
- }
- function handle(self, deferred) {
- while (self._state === 3) {
- self = self._value;
- }
- if (self._state === 0) {
- self._deferreds.push(deferred);
- return;
- }
- self._handled = true;
- Promise._immediateFn(function () {
- var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
- if (cb === null) {
- (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
- return;
- }
- var ret;
- try {
- ret = cb(self._value);
- } catch (e) {
- reject(deferred.promise, e);
- return;
- }
- resolve(deferred.promise, ret);
- });
- }
- function resolve(self, newValue) {
- try {
- if (newValue === self)
- throw new TypeError('A promise cannot be resolved with itself.');
- if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
- var then = newValue.then;
- if (newValue instanceof Promise) {
- self._state = 3;
- self._value = newValue;
- finale(self);
- return;
- } else if (typeof then === 'function') {
- doResolve(bind(then, newValue), self);
- return;
- }
- }
- self._state = 1;
- self._value = newValue;
- finale(self);
- } catch (e) {
- reject(self, e);
- }
- }
- function reject(self, newValue) {
- self._state = 2;
- self._value = newValue;
- finale(self);
- }
- function finale(self) {
- if (self._state === 2 && self._deferreds.length === 0) {
- Promise._immediateFn(function () {
- if (!self._handled) {
- Promise._unhandledRejectionFn(self._value);
- }
- });
- }
- for (var i = 0, len = self._deferreds.length; i < len; i++) {
- handle(self, self._deferreds[i]);
- }
- self._deferreds = null;
- }
- function Handler(onFulfilled, onRejected, promise) {
- this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
- this.onRejected = typeof onRejected === 'function' ? onRejected : null;
- this.promise = promise;
- }
- function doResolve(fn, self) {
- var done = false;
- try {
- fn(function (value) {
- if (done)
- return;
- done = true;
- resolve(self, value);
- }, function (reason) {
- if (done)
- return;
- done = true;
- reject(self, reason);
- });
- } catch (ex) {
- if (done)
- return;
- done = true;
- reject(self, ex);
- }
- }
- Promise.prototype['catch'] = function (onRejected) {
- return this.then(null, onRejected);
- };
- Promise.prototype.then = function (onFulfilled, onRejected) {
- var prom = new this.constructor(noop);
- handle(this, new Handler(onFulfilled, onRejected, prom));
- return prom;
- };
- Promise.all = function (arr) {
- var args = Array.prototype.slice.call(arr);
- return new Promise(function (resolve, reject) {
- if (args.length === 0)
- return resolve([]);
- var remaining = args.length;
- function res(i, val) {
- try {
- if (val && (typeof val === 'object' || typeof val === 'function')) {
- var then = val.then;
- if (typeof then === 'function') {
- then.call(val, function (val) {
- res(i, val);
- }, reject);
- return;
- }
- }
- args[i] = val;
- if (--remaining === 0) {
- resolve(args);
- }
- } catch (ex) {
- reject(ex);
- }
- }
- for (var i = 0; i < args.length; i++) {
- res(i, args[i]);
- }
- });
- };
- Promise.resolve = function (value) {
- if (value && typeof value === 'object' && value.constructor === Promise) {
- return value;
- }
- return new Promise(function (resolve) {
- resolve(value);
- });
- };
- Promise.reject = function (value) {
- return new Promise(function (resolve, reject) {
- reject(value);
- });
- };
- Promise.race = function (values) {
- return new Promise(function (resolve, reject) {
- for (var i = 0, len = values.length; i < len; i++) {
- values[i].then(resolve, reject);
- }
- });
- };
- Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) {
- setImmediate(fn);
- } : function (fn) {
- setTimeoutFunc(fn, 0);
- };
- Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
- if (typeof console !== 'undefined' && console) {
- console.warn('Possible Unhandled Promise Rejection:', err);
- }
- };
- Promise._setImmediateFn = function _setImmediateFn(fn) {
- Promise._immediateFn = fn;
- };
- Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {
- Promise._unhandledRejectionFn = fn;
- };
- if (typeof module !== 'undefined' && module.exports) {
- module.exports = Promise;
- } else if (!root.Promise) {
- root.Promise = Promise;
- }
- }(this));
- }.call(this, require('timers').setImmediate));
- },
- { 'timers': 3 }
- ],
- 3: [
- function (require, module, exports) {
- (function (setImmediate, clearImmediate) {
- var nextTick = require('process/browser.js').nextTick;
- var apply = Function.prototype.apply;
- var slice = Array.prototype.slice;
- var immediateIds = {};
- var nextImmediateId = 0;
- exports.setTimeout = function () {
- return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);
- };
- exports.setInterval = function () {
- return new Timeout(apply.call(setInterval, window, arguments), clearInterval);
- };
- exports.clearTimeout = exports.clearInterval = function (timeout) {
- timeout.close();
- };
- function Timeout(id, clearFn) {
- this._id = id;
- this._clearFn = clearFn;
- }
- Timeout.prototype.unref = Timeout.prototype.ref = function () {
- };
- Timeout.prototype.close = function () {
- this._clearFn.call(window, this._id);
- };
- exports.enroll = function (item, msecs) {
- clearTimeout(item._idleTimeoutId);
- item._idleTimeout = msecs;
- };
- exports.unenroll = function (item) {
- clearTimeout(item._idleTimeoutId);
- item._idleTimeout = -1;
- };
- exports._unrefActive = exports.active = function (item) {
- clearTimeout(item._idleTimeoutId);
- var msecs = item._idleTimeout;
- if (msecs >= 0) {
- item._idleTimeoutId = setTimeout(function onTimeout() {
- if (item._onTimeout)
- item._onTimeout();
- }, msecs);
- }
- };
- exports.setImmediate = typeof setImmediate === 'function' ? setImmediate : function (fn) {
- var id = nextImmediateId++;
- var args = arguments.length < 2 ? false : slice.call(arguments, 1);
- immediateIds[id] = true;
- nextTick(function onNextTick() {
- if (immediateIds[id]) {
- if (args) {
- fn.apply(null, args);
- } else {
- fn.call(null);
- }
- exports.clearImmediate(id);
- }
- });
- return id;
- };
- exports.clearImmediate = typeof clearImmediate === 'function' ? clearImmediate : function (id) {
- delete immediateIds[id];
- };
- }.call(this, require('timers').setImmediate, require('timers').clearImmediate));
- },
- {
- 'process/browser.js': 1,
- 'timers': 3
- }
- ],
- 4: [
- function (require, module, exports) {
- var promisePolyfill = require('promise-polyfill');
- var Global = function () {
- if (typeof window !== 'undefined') {
- return window;
- } else {
- return Function('return this;')();
- }
- }();
- module.exports = { boltExport: Global.Promise || promisePolyfill };
- },
- { 'promise-polyfill': 2 }
- ]
- }, {}, [4])(4);
- }));
- }(undefined, exports$1, module$1, undefined));
- var Promise = module$1.exports.boltExport;
-
- var nu$3 = function (baseFn) {
- var data = Option.none();
- var callbacks = [];
- var map = function (f) {
- return nu$3(function (nCallback) {
- get(function (data) {
- nCallback(f(data));
- });
- });
- };
- var get = function (nCallback) {
- if (isReady()) {
- call(nCallback);
- } else {
- callbacks.push(nCallback);
- }
- };
- var set = function (x) {
- data = Option.some(x);
- run(callbacks);
- callbacks = [];
- };
- var isReady = function () {
- return data.isSome();
- };
- var run = function (cbs) {
- each(cbs, call);
- };
- var call = function (cb) {
- data.each(function (x) {
- domGlobals.setTimeout(function () {
- cb(x);
- }, 0);
- });
- };
- baseFn(set);
- return {
- get: get,
- map: map,
- isReady: isReady
- };
- };
- var pure = function (a) {
- return nu$3(function (callback) {
- callback(a);
- });
- };
- var LazyValue = {
- nu: nu$3,
- pure: pure
- };
-
- var errorReporter = function (err) {
- domGlobals.setTimeout(function () {
- throw err;
- }, 0);
- };
- var make = function (run) {
- var get = function (callback) {
- run().then(callback, errorReporter);
- };
- var map = function (fab) {
- return make(function () {
- return run().then(fab);
- });
- };
- var bind = function (aFutureB) {
- return make(function () {
- return run().then(function (v) {
- return aFutureB(v).toPromise();
- });
- });
- };
- var anonBind = function (futureB) {
- return make(function () {
- return run().then(function () {
- return futureB.toPromise();
- });
- });
- };
- var toLazy = function () {
- return LazyValue.nu(get);
- };
- var toCached = function () {
- var cache = null;
- return make(function () {
- if (cache === null) {
- cache = run();
- }
- return cache;
- });
- };
- var toPromise = run;
- return {
- map: map,
- bind: bind,
- anonBind: anonBind,
- toLazy: toLazy,
- toCached: toCached,
- toPromise: toPromise,
- get: get
- };
- };
- var nu$4 = function (baseFn) {
- return make(function () {
- return new Promise(baseFn);
- });
- };
- var pure$1 = function (a) {
- return make(function () {
- return Promise.resolve(a);
- });
- };
- var Future = {
- nu: nu$4,
- pure: pure$1
- };
-
- var par = function (asyncValues, nu) {
- return nu(function (callback) {
- var r = [];
- var count = 0;
- var cb = function (i) {
- return function (value) {
- r[i] = value;
- count++;
- if (count >= asyncValues.length) {
- callback(r);
- }
- };
- };
- if (asyncValues.length === 0) {
- callback([]);
- } else {
- each(asyncValues, function (asyncValue, i) {
- asyncValue.get(cb(i));
- });
- }
- });
- };
-
- var par$1 = function (futures) {
- return par(futures, Future.nu);
- };
-
- var value = function (o) {
- var is = function (v) {
- return o === v;
- };
- var or = function (opt) {
- return value(o);
- };
- var orThunk = function (f) {
- return value(o);
- };
- var map = function (f) {
- return value(f(o));
- };
- var mapError = function (f) {
- return value(o);
- };
- var each = function (f) {
- f(o);
- };
- var bind = function (f) {
- return f(o);
- };
- var fold = function (_, onValue) {
- return onValue(o);
- };
- var exists = function (f) {
- return f(o);
- };
- var forall = function (f) {
- return f(o);
- };
- var toOption = function () {
- return Option.some(o);
- };
- return {
- is: is,
- isValue: always,
- isError: never,
- getOr: constant(o),
- getOrThunk: constant(o),
- getOrDie: constant(o),
- or: or,
- orThunk: orThunk,
- fold: fold,
- map: map,
- mapError: mapError,
- each: each,
- bind: bind,
- exists: exists,
- forall: forall,
- toOption: toOption
- };
- };
- var error = function (message) {
- var getOrThunk = function (f) {
- return f();
- };
- var getOrDie = function () {
- return die(String(message))();
- };
- var or = function (opt) {
- return opt;
- };
- var orThunk = function (f) {
- return f();
- };
- var map = function (f) {
- return error(message);
- };
- var mapError = function (f) {
- return error(f(message));
- };
- var bind = function (f) {
- return error(message);
- };
- var fold = function (onError, _) {
- return onError(message);
- };
- return {
- is: never,
- isValue: never,
- isError: always,
- getOr: identity,
- getOrThunk: getOrThunk,
- getOrDie: getOrDie,
- or: or,
- orThunk: orThunk,
- fold: fold,
- map: map,
- mapError: mapError,
- each: noop,
- bind: bind,
- exists: never,
- forall: always,
- toOption: Option.none
- };
- };
- var fromOption = function (opt, err) {
- return opt.fold(function () {
- return error(err);
- }, value);
- };
- var Result = {
- value: value,
- error: error,
- fromOption: fromOption
- };
-
- function StyleSheetLoader(document, settings) {
- if (settings === void 0) {
- settings = {};
- }
- var idCount = 0;
- var loadedStates = {};
- var maxLoadTime;
- maxLoadTime = settings.maxLoadTime || 5000;
- var appendToHead = function (node) {
- document.getElementsByTagName('head')[0].appendChild(node);
- };
- var load = function (url, loadedCallback, errorCallback) {
- var link, style, startTime, state;
- var passed = function () {
- var callbacks = state.passed;
- var i = callbacks.length;
- while (i--) {
- callbacks[i]();
- }
- state.status = 2;
- state.passed = [];
- state.failed = [];
- };
- var failed = function () {
- var callbacks = state.failed;
- var i = callbacks.length;
- while (i--) {
- callbacks[i]();
- }
- state.status = 3;
- state.passed = [];
- state.failed = [];
- };
- var isOldWebKit = function () {
- var webKitChunks = domGlobals.navigator.userAgent.match(/WebKit\/(\d*)/);
- return !!(webKitChunks && parseInt(webKitChunks[1], 10) < 536);
- };
- var wait = function (testCallback, waitCallback) {
- if (!testCallback()) {
- if (new Date().getTime() - startTime < maxLoadTime) {
- Delay.setTimeout(waitCallback);
- } else {
- failed();
- }
- }
- };
- var waitForWebKitLinkLoaded = function () {
- wait(function () {
- var styleSheets = document.styleSheets;
- var styleSheet, i = styleSheets.length, owner;
- while (i--) {
- styleSheet = styleSheets[i];
- owner = styleSheet.ownerNode ? styleSheet.ownerNode : styleSheet.owningElement;
- if (owner && owner.id === link.id) {
- passed();
- return true;
- }
- }
- }, waitForWebKitLinkLoaded);
- };
- var waitForGeckoLinkLoaded = function () {
- wait(function () {
- try {
- var cssRules = style.sheet.cssRules;
- passed();
- return !!cssRules;
- } catch (ex) {
- }
- }, waitForGeckoLinkLoaded);
- };
- url = Tools._addCacheSuffix(url);
- if (!loadedStates[url]) {
- state = {
- passed: [],
- failed: []
- };
- loadedStates[url] = state;
- } else {
- state = loadedStates[url];
- }
- if (loadedCallback) {
- state.passed.push(loadedCallback);
- }
- if (errorCallback) {
- state.failed.push(errorCallback);
- }
- if (state.status === 1) {
- return;
- }
- if (state.status === 2) {
- passed();
- return;
- }
- if (state.status === 3) {
- failed();
- return;
- }
- state.status = 1;
- link = document.createElement('link');
- link.rel = 'stylesheet';
- link.type = 'text/css';
- link.id = 'u' + idCount++;
- link.async = false;
- link.defer = false;
- startTime = new Date().getTime();
- if (settings.contentCssCors) {
- link.crossOrigin = 'anonymous';
- }
- if ('onload' in link && !isOldWebKit()) {
- link.onload = waitForWebKitLinkLoaded;
- link.onerror = failed;
- } else {
- if (domGlobals.navigator.userAgent.indexOf('Firefox') > 0) {
- style = document.createElement('style');
- style.textContent = '@import "' + url + '"';
- waitForGeckoLinkLoaded();
- appendToHead(style);
- return;
- }
- waitForWebKitLinkLoaded();
- }
- appendToHead(link);
- link.href = url;
- };
- var loadF = function (url) {
- return Future.nu(function (resolve) {
- load(url, compose(resolve, constant(Result.value(url))), compose(resolve, constant(Result.error(url))));
- });
- };
- var unbox = function (result) {
- return result.fold(identity, identity);
- };
- var loadAll = function (urls, success, failure) {
- par$1(map(urls, loadF)).get(function (result) {
- var parts = partition(result, function (r) {
- return r.isValue();
- });
- if (parts.fail.length > 0) {
- failure(parts.fail.map(unbox));
- } else {
- success(parts.pass.map(unbox));
- }
- });
- };
- return {
- load: load,
- loadAll: loadAll
- };
- }
-
- function TreeWalker (startNode, rootNode) {
- var node = startNode;
- var findSibling = function (node, startName, siblingName, shallow) {
- var sibling, parent;
- if (node) {
- if (!shallow && node[startName]) {
- return node[startName];
- }
- if (node !== rootNode) {
- sibling = node[siblingName];
- if (sibling) {
- return sibling;
- }
- for (parent = node.parentNode; parent && parent !== rootNode; parent = parent.parentNode) {
- sibling = parent[siblingName];
- if (sibling) {
- return sibling;
- }
- }
- }
- }
- };
- var findPreviousNode = function (node, startName, siblingName, shallow) {
- var sibling, parent, child;
- if (node) {
- sibling = node[siblingName];
- if (rootNode && sibling === rootNode) {
- return;
- }
- if (sibling) {
- if (!shallow) {
- for (child = sibling[startName]; child; child = child[startName]) {
- if (!child[startName]) {
- return child;
- }
- }
- }
- return sibling;
- }
- parent = node.parentNode;
- if (parent && parent !== rootNode) {
- return parent;
- }
- }
- };
- this.current = function () {
- return node;
- };
- this.next = function (shallow) {
- node = findSibling(node, 'firstChild', 'nextSibling', shallow);
- return node;
- };
- this.prev = function (shallow) {
- node = findSibling(node, 'lastChild', 'previousSibling', shallow);
- return node;
- };
- this.prev2 = function (shallow) {
- node = findPreviousNode(node, 'lastChild', 'previousSibling', shallow);
- return node;
- };
- }
-
- var blocks = [
- 'article',
- 'aside',
- 'details',
- 'div',
- 'dt',
- 'figcaption',
- 'footer',
- 'form',
- 'fieldset',
- 'header',
- 'hgroup',
- 'html',
- 'main',
- 'nav',
- 'section',
- 'summary',
- 'body',
- 'p',
- 'dl',
- 'multicol',
- 'dd',
- 'figure',
- 'address',
- 'center',
- 'blockquote',
- 'h1',
- 'h2',
- 'h3',
- 'h4',
- 'h5',
- 'h6',
- 'listing',
- 'xmp',
- 'pre',
- 'plaintext',
- 'menu',
- 'dir',
- 'ul',
- 'ol',
- 'li',
- 'hr',
- 'table',
- 'tbody',
- 'thead',
- 'tfoot',
- 'th',
- 'tr',
- 'td',
- 'caption'
- ];
- var voids = [
- 'area',
- 'base',
- 'basefont',
- 'br',
- 'col',
- 'frame',
- 'hr',
- 'img',
- 'input',
- 'isindex',
- 'link',
- 'meta',
- 'param',
- 'embed',
- 'source',
- 'wbr',
- 'track'
- ];
- var tableCells = [
- 'td',
- 'th'
- ];
- var tableSections = [
- 'thead',
- 'tbody',
- 'tfoot'
- ];
- var textBlocks = [
- 'h1',
- 'h2',
- 'h3',
- 'h4',
- 'h5',
- 'h6',
- 'p',
- 'div',
- 'address',
- 'pre',
- 'form',
- 'blockquote',
- 'center',
- 'dir',
- 'fieldset',
- 'header',
- 'footer',
- 'article',
- 'section',
- 'hgroup',
- 'aside',
- 'nav',
- 'figure'
- ];
- var headings = [
- 'h1',
- 'h2',
- 'h3',
- 'h4',
- 'h5',
- 'h6'
- ];
- var listItems = [
- 'li',
- 'dd',
- 'dt'
- ];
- var lists = [
- 'ul',
- 'ol',
- 'dl'
- ];
- var wsElements = [
- 'pre',
- 'script',
- 'textarea',
- 'style'
- ];
- var lazyLookup = function (items) {
- var lookup;
- return function (node) {
- lookup = lookup ? lookup : mapToObject(items, constant(true));
- return lookup.hasOwnProperty(name(node));
- };
- };
- var isHeading = lazyLookup(headings);
- var isBlock = lazyLookup(blocks);
- var isInline = function (node) {
- return isElement(node) && !isBlock(node);
- };
- var isBr = function (node) {
- return isElement(node) && name(node) === 'br';
- };
- var isTextBlock = lazyLookup(textBlocks);
- var isList = lazyLookup(lists);
- var isListItem = lazyLookup(listItems);
- var isVoid = lazyLookup(voids);
- var isTableSection = lazyLookup(tableSections);
- var isTableCell = lazyLookup(tableCells);
- var isWsPreserveElement = lazyLookup(wsElements);
-
- var isNodeType = function (type) {
- return function (node) {
- return !!node && node.nodeType === type;
- };
- };
- var isRestrictedNode = function (node) {
- return !!node && !Object.getPrototypeOf(node);
- };
- var isElement$1 = isNodeType(1);
- var matchNodeNames = function (names) {
- var items = names.toLowerCase().split(' ');
- return function (node) {
- var i, name;
- if (node && node.nodeType) {
- name = node.nodeName.toLowerCase();
- for (i = 0; i < items.length; i++) {
- if (name === items[i]) {
- return true;
- }
- }
- }
- return false;
- };
- };
- var matchStyleValues = function (name, values) {
- var items = values.toLowerCase().split(' ');
- return function (node) {
- var i, cssValue;
- if (isElement$1(node)) {
- for (i = 0; i < items.length; i++) {
- var computed = node.ownerDocument.defaultView.getComputedStyle(node, null);
- cssValue = computed ? computed.getPropertyValue(name) : null;
- if (cssValue === items[i]) {
- return true;
- }
- }
- }
- return false;
- };
- };
- var hasPropValue = function (propName, propValue) {
- return function (node) {
- return isElement$1(node) && node[propName] === propValue;
- };
- };
- var hasAttribute = function (attrName, attrValue) {
- return function (node) {
- return isElement$1(node) && node.hasAttribute(attrName);
- };
- };
- var hasAttributeValue = function (attrName, attrValue) {
- return function (node) {
- return isElement$1(node) && node.getAttribute(attrName) === attrValue;
- };
- };
- var isBogus = function (node) {
- return isElement$1(node) && node.hasAttribute('data-mce-bogus');
- };
- var isBogusAll = function (node) {
- return isElement$1(node) && node.getAttribute('data-mce-bogus') === 'all';
- };
- var isTable = function (node) {
- return isElement$1(node) && node.tagName === 'TABLE';
- };
- var hasContentEditableState = function (value) {
- return function (node) {
- if (isElement$1(node)) {
- if (node.contentEditable === value) {
- return true;
- }
- if (node.getAttribute('data-mce-contenteditable') === value) {
- return true;
- }
- }
- return false;
- };
- };
- var isText$1 = isNodeType(3);
- var isComment = isNodeType(8);
- var isDocument = isNodeType(9);
- var isDocumentFragment = isNodeType(11);
- var isBr$1 = matchNodeNames('br');
- var isContentEditableTrue = hasContentEditableState('true');
- var isContentEditableFalse = hasContentEditableState('false');
- var NodeType = {
- isText: isText$1,
- isElement: isElement$1,
- isComment: isComment,
- isDocument: isDocument,
- isDocumentFragment: isDocumentFragment,
- isBr: isBr$1,
- isContentEditableTrue: isContentEditableTrue,
- isContentEditableFalse: isContentEditableFalse,
- isRestrictedNode: isRestrictedNode,
- matchNodeNames: matchNodeNames,
- hasPropValue: hasPropValue,
- hasAttribute: hasAttribute,
- hasAttributeValue: hasAttributeValue,
- matchStyleValues: matchStyleValues,
- isBogus: isBogus,
- isBogusAll: isBogusAll,
- isTable: isTable
- };
-
- var surroundedBySpans = function (node) {
- var previousIsSpan = node.previousSibling && node.previousSibling.nodeName === 'SPAN';
- var nextIsSpan = node.nextSibling && node.nextSibling.nodeName === 'SPAN';
- return previousIsSpan && nextIsSpan;
- };
- var isBookmarkNode = function (node) {
- return node && node.tagName === 'SPAN' && node.getAttribute('data-mce-type') === 'bookmark';
- };
- var trimNode = function (dom, node) {
- var i, children = node.childNodes;
- if (NodeType.isElement(node) && isBookmarkNode(node)) {
- return;
- }
- for (i = children.length - 1; i >= 0; i--) {
- trimNode(dom, children[i]);
- }
- if (NodeType.isDocument(node) === false) {
- if (NodeType.isText(node) && node.nodeValue.length > 0) {
- var trimmedLength = Tools.trim(node.nodeValue).length;
- if (dom.isBlock(node.parentNode) || trimmedLength > 0) {
- return;
- }
- if (trimmedLength === 0 && surroundedBySpans(node)) {
- return;
- }
- } else if (NodeType.isElement(node)) {
- children = node.childNodes;
- if (children.length === 1 && isBookmarkNode(children[0])) {
- node.parentNode.insertBefore(children[0], node);
- }
- if (children.length || isVoid(Element.fromDom(node))) {
- return;
- }
- }
- dom.remove(node);
- }
- return node;
- };
- var TrimNode = { trimNode: trimNode };
-
- var makeMap$1 = Tools.makeMap;
- var namedEntities, baseEntities, reverseEntities;
- var attrsCharsRegExp = /[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
- var textCharsRegExp = /[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
- var rawCharsRegExp = /[<>&\"\']/g;
- var entityRegExp = /([a-z0-9]+);?|&([a-z0-9]+);/gi;
- var asciiMap = {
- 128: '\u20AC',
- 130: '\u201A',
- 131: '\u0192',
- 132: '\u201E',
- 133: '\u2026',
- 134: '\u2020',
- 135: '\u2021',
- 136: '\u02c6',
- 137: '\u2030',
- 138: '\u0160',
- 139: '\u2039',
- 140: '\u0152',
- 142: '\u017d',
- 145: '\u2018',
- 146: '\u2019',
- 147: '\u201C',
- 148: '\u201D',
- 149: '\u2022',
- 150: '\u2013',
- 151: '\u2014',
- 152: '\u02DC',
- 153: '\u2122',
- 154: '\u0161',
- 155: '\u203A',
- 156: '\u0153',
- 158: '\u017e',
- 159: '\u0178'
- };
- baseEntities = {
- '"': '"',
- '\'': ''',
- '<': '<',
- '>': '>',
- '&': '&',
- '`': '`'
- };
- reverseEntities = {
- '<': '<',
- '>': '>',
- '&': '&',
- '"': '"',
- ''': '\''
- };
- var nativeDecode = function (text) {
- var elm;
- elm = Element.fromTag('div').dom();
- elm.innerHTML = text;
- return elm.textContent || elm.innerText || text;
- };
- var buildEntitiesLookup = function (items, radix) {
- var i, chr, entity;
- var lookup = {};
- if (items) {
- items = items.split(',');
- radix = radix || 10;
- for (i = 0; i < items.length; i += 2) {
- chr = String.fromCharCode(parseInt(items[i], radix));
- if (!baseEntities[chr]) {
- entity = '&' + items[i + 1] + ';';
- lookup[chr] = entity;
- lookup[entity] = chr;
- }
- }
- return lookup;
- }
- };
- namedEntities = buildEntitiesLookup('50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' + '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' + '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' + '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' + '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' + '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' + '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' + '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' + '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' + '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' + 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' + 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' + 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' + 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' + 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' + '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' + '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' + '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' + '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' + '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' + 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' + 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' + 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' + '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' + '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro', 32);
- var encodeRaw = function (text, attr) {
- return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function (chr) {
- return baseEntities[chr] || chr;
- });
- };
- var encodeAllRaw = function (text) {
- return ('' + text).replace(rawCharsRegExp, function (chr) {
- return baseEntities[chr] || chr;
- });
- };
- var encodeNumeric = function (text, attr) {
- return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function (chr) {
- if (chr.length > 1) {
- return '' + ((chr.charCodeAt(0) - 55296) * 1024 + (chr.charCodeAt(1) - 56320) + 65536) + ';';
- }
- return baseEntities[chr] || '' + chr.charCodeAt(0) + ';';
- });
- };
- var encodeNamed = function (text, attr, entities) {
- entities = entities || namedEntities;
- return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function (chr) {
- return baseEntities[chr] || entities[chr] || chr;
- });
- };
- var getEncodeFunc = function (name, entities) {
- var entitiesMap = buildEntitiesLookup(entities) || namedEntities;
- var encodeNamedAndNumeric = function (text, attr) {
- return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function (chr) {
- if (baseEntities[chr] !== undefined) {
- return baseEntities[chr];
- }
- if (entitiesMap[chr] !== undefined) {
- return entitiesMap[chr];
- }
- if (chr.length > 1) {
- return '' + ((chr.charCodeAt(0) - 55296) * 1024 + (chr.charCodeAt(1) - 56320) + 65536) + ';';
- }
- return '' + chr.charCodeAt(0) + ';';
- });
- };
- var encodeCustomNamed = function (text, attr) {
- return encodeNamed(text, attr, entitiesMap);
- };
- var nameMap = makeMap$1(name.replace(/\+/g, ','));
- if (nameMap.named && nameMap.numeric) {
- return encodeNamedAndNumeric;
- }
- if (nameMap.named) {
- if (entities) {
- return encodeCustomNamed;
- }
- return encodeNamed;
- }
- if (nameMap.numeric) {
- return encodeNumeric;
- }
- return encodeRaw;
- };
- var decode = function (text) {
- return text.replace(entityRegExp, function (all, numeric) {
- if (numeric) {
- if (numeric.charAt(0).toLowerCase() === 'x') {
- numeric = parseInt(numeric.substr(1), 16);
- } else {
- numeric = parseInt(numeric, 10);
- }
- if (numeric > 65535) {
- numeric -= 65536;
- return String.fromCharCode(55296 + (numeric >> 10), 56320 + (numeric & 1023));
- }
- return asciiMap[numeric] || String.fromCharCode(numeric);
- }
- return reverseEntities[all] || namedEntities[all] || nativeDecode(all);
- });
- };
- var Entities = {
- encodeRaw: encodeRaw,
- encodeAllRaw: encodeAllRaw,
- encodeNumeric: encodeNumeric,
- encodeNamed: encodeNamed,
- getEncodeFunc: getEncodeFunc,
- decode: decode
- };
-
- var mapCache = {}, dummyObj = {};
- var makeMap$2 = Tools.makeMap, each$4 = Tools.each, extend$1 = Tools.extend, explode$1 = Tools.explode, inArray$1 = Tools.inArray;
- var split = function (items, delim) {
- items = Tools.trim(items);
- return items ? items.split(delim || ' ') : [];
- };
- var compileSchema = function (type) {
- var schema = {};
- var globalAttributes, blockContent;
- var phrasingContent, flowContent, html4BlockContent, html4PhrasingContent;
- var add = function (name, attributes, children) {
- var ni, attributesOrder, element;
- var arrayToMap = function (array, obj) {
- var map = {};
- var i, l;
- for (i = 0, l = array.length; i < l; i++) {
- map[array[i]] = obj || {};
- }
- return map;
- };
- children = children || [];
- attributes = attributes || '';
- if (typeof children === 'string') {
- children = split(children);
- }
- name = split(name);
- ni = name.length;
- while (ni--) {
- attributesOrder = split([
- globalAttributes,
- attributes
- ].join(' '));
- element = {
- attributes: arrayToMap(attributesOrder),
- attributesOrder: attributesOrder,
- children: arrayToMap(children, dummyObj)
- };
- schema[name[ni]] = element;
- }
- };
- var addAttrs = function (name, attributes) {
- var ni, schemaItem, i, l;
- name = split(name);
- ni = name.length;
- attributes = split(attributes);
- while (ni--) {
- schemaItem = schema[name[ni]];
- for (i = 0, l = attributes.length; i < l; i++) {
- schemaItem.attributes[attributes[i]] = {};
- schemaItem.attributesOrder.push(attributes[i]);
- }
- }
- };
- if (mapCache[type]) {
- return mapCache[type];
- }
- globalAttributes = 'id accesskey class dir lang style tabindex title role';
- blockContent = 'address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul';
- phrasingContent = 'a abbr b bdo br button cite code del dfn em embed i iframe img input ins kbd ' + 'label map noscript object q s samp script select small span strong sub sup ' + 'textarea u var #text #comment';
- if (type !== 'html4') {
- globalAttributes += ' contenteditable contextmenu draggable dropzone ' + 'hidden spellcheck translate';
- blockContent += ' article aside details dialog figure main header footer hgroup section nav';
- phrasingContent += ' audio canvas command datalist mark meter output picture ' + 'progress time wbr video ruby bdi keygen';
- }
- if (type !== 'html5-strict') {
- globalAttributes += ' xml:lang';
- html4PhrasingContent = 'acronym applet basefont big font strike tt';
- phrasingContent = [
- phrasingContent,
- html4PhrasingContent
- ].join(' ');
- each$4(split(html4PhrasingContent), function (name) {
- add(name, '', phrasingContent);
- });
- html4BlockContent = 'center dir isindex noframes';
- blockContent = [
- blockContent,
- html4BlockContent
- ].join(' ');
- flowContent = [
- blockContent,
- phrasingContent
- ].join(' ');
- each$4(split(html4BlockContent), function (name) {
- add(name, '', flowContent);
- });
- }
- flowContent = flowContent || [
- blockContent,
- phrasingContent
- ].join(' ');
- add('html', 'manifest', 'head body');
- add('head', '', 'base command link meta noscript script style title');
- add('title hr noscript br');
- add('base', 'href target');
- add('link', 'href rel media hreflang type sizes hreflang');
- add('meta', 'name http-equiv content charset');
- add('style', 'media type scoped');
- add('script', 'src async defer type charset');
- add('body', 'onafterprint onbeforeprint onbeforeunload onblur onerror onfocus ' + 'onhashchange onload onmessage onoffline ononline onpagehide onpageshow ' + 'onpopstate onresize onscroll onstorage onunload', flowContent);
- add('address dt dd div caption', '', flowContent);
- add('h1 h2 h3 h4 h5 h6 pre p abbr code var samp kbd sub sup i b u bdo span legend em strong small s cite dfn', '', phrasingContent);
- add('blockquote', 'cite', flowContent);
- add('ol', 'reversed start type', 'li');
- add('ul', '', 'li');
- add('li', 'value', flowContent);
- add('dl', '', 'dt dd');
- add('a', 'href target rel media hreflang type', phrasingContent);
- add('q', 'cite', phrasingContent);
- add('ins del', 'cite datetime', flowContent);
- add('img', 'src sizes srcset alt usemap ismap width height');
- add('iframe', 'src name width height', flowContent);
- add('embed', 'src type width height');
- add('object', 'data type typemustmatch name usemap form width height', [
- flowContent,
- 'param'
- ].join(' '));
- add('param', 'name value');
- add('map', 'name', [
- flowContent,
- 'area'
- ].join(' '));
- add('area', 'alt coords shape href target rel media hreflang type');
- add('table', 'border', 'caption colgroup thead tfoot tbody tr' + (type === 'html4' ? ' col' : ''));
- add('colgroup', 'span', 'col');
- add('col', 'span');
- add('tbody thead tfoot', '', 'tr');
- add('tr', '', 'td th');
- add('td', 'colspan rowspan headers', flowContent);
- add('th', 'colspan rowspan headers scope abbr', flowContent);
- add('form', 'accept-charset action autocomplete enctype method name novalidate target', flowContent);
- add('fieldset', 'disabled form name', [
- flowContent,
- 'legend'
- ].join(' '));
- add('label', 'form for', phrasingContent);
- add('input', 'accept alt autocomplete checked dirname disabled form formaction formenctype formmethod formnovalidate ' + 'formtarget height list max maxlength min multiple name pattern readonly required size src step type value width');
- add('button', 'disabled form formaction formenctype formmethod formnovalidate formtarget name type value', type === 'html4' ? flowContent : phrasingContent);
- add('select', 'disabled form multiple name required size', 'option optgroup');
- add('optgroup', 'disabled label', 'option');
- add('option', 'disabled label selected value');
- add('textarea', 'cols dirname disabled form maxlength name readonly required rows wrap');
- add('menu', 'type label', [
- flowContent,
- 'li'
- ].join(' '));
- add('noscript', '', flowContent);
- if (type !== 'html4') {
- add('wbr');
- add('ruby', '', [
- phrasingContent,
- 'rt rp'
- ].join(' '));
- add('figcaption', '', flowContent);
- add('mark rt rp summary bdi', '', phrasingContent);
- add('canvas', 'width height', flowContent);
- add('video', 'src crossorigin poster preload autoplay mediagroup loop ' + 'muted controls width height buffered', [
- flowContent,
- 'track source'
- ].join(' '));
- add('audio', 'src crossorigin preload autoplay mediagroup loop muted controls ' + 'buffered volume', [
- flowContent,
- 'track source'
- ].join(' '));
- add('picture', '', 'img source');
- add('source', 'src srcset type media sizes');
- add('track', 'kind src srclang label default');
- add('datalist', '', [
- phrasingContent,
- 'option'
- ].join(' '));
- add('article section nav aside main header footer', '', flowContent);
- add('hgroup', '', 'h1 h2 h3 h4 h5 h6');
- add('figure', '', [
- flowContent,
- 'figcaption'
- ].join(' '));
- add('time', 'datetime', phrasingContent);
- add('dialog', 'open', flowContent);
- add('command', 'type label icon disabled checked radiogroup command');
- add('output', 'for form name', phrasingContent);
- add('progress', 'value max', phrasingContent);
- add('meter', 'value min max low high optimum', phrasingContent);
- add('details', 'open', [
- flowContent,
- 'summary'
- ].join(' '));
- add('keygen', 'autofocus challenge disabled form keytype name');
- }
- if (type !== 'html5-strict') {
- addAttrs('script', 'language xml:space');
- addAttrs('style', 'xml:space');
- addAttrs('object', 'declare classid code codebase codetype archive standby align border hspace vspace');
- addAttrs('embed', 'align name hspace vspace');
- addAttrs('param', 'valuetype type');
- addAttrs('a', 'charset name rev shape coords');
- addAttrs('br', 'clear');
- addAttrs('applet', 'codebase archive code object alt name width height align hspace vspace');
- addAttrs('img', 'name longdesc align border hspace vspace');
- addAttrs('iframe', 'longdesc frameborder marginwidth marginheight scrolling align');
- addAttrs('font basefont', 'size color face');
- addAttrs('input', 'usemap align');
- addAttrs('select', 'onchange');
- addAttrs('textarea');
- addAttrs('h1 h2 h3 h4 h5 h6 div p legend caption', 'align');
- addAttrs('ul', 'type compact');
- addAttrs('li', 'type');
- addAttrs('ol dl menu dir', 'compact');
- addAttrs('pre', 'width xml:space');
- addAttrs('hr', 'align noshade size width');
- addAttrs('isindex', 'prompt');
- addAttrs('table', 'summary width frame rules cellspacing cellpadding align bgcolor');
- addAttrs('col', 'width align char charoff valign');
- addAttrs('colgroup', 'width align char charoff valign');
- addAttrs('thead', 'align char charoff valign');
- addAttrs('tr', 'align char charoff valign bgcolor');
- addAttrs('th', 'axis align char charoff valign nowrap bgcolor width height');
- addAttrs('form', 'accept');
- addAttrs('td', 'abbr axis scope align char charoff valign nowrap bgcolor width height');
- addAttrs('tfoot', 'align char charoff valign');
- addAttrs('tbody', 'align char charoff valign');
- addAttrs('area', 'nohref');
- addAttrs('body', 'background bgcolor text link vlink alink');
- }
- if (type !== 'html4') {
- addAttrs('input button select textarea', 'autofocus');
- addAttrs('input textarea', 'placeholder');
- addAttrs('a', 'download');
- addAttrs('link script img', 'crossorigin');
- addAttrs('iframe', 'sandbox seamless allowfullscreen');
- }
- each$4(split('a form meter progress dfn'), function (name) {
- if (schema[name]) {
- delete schema[name].children[name];
- }
- });
- delete schema.caption.children.table;
- delete schema.script;
- mapCache[type] = schema;
- return schema;
- };
- var compileElementMap = function (value, mode) {
- var styles;
- if (value) {
- styles = {};
- if (typeof value === 'string') {
- value = { '*': value };
- }
- each$4(value, function (value, key) {
- styles[key] = styles[key.toUpperCase()] = mode === 'map' ? makeMap$2(value, /[, ]/) : explode$1(value, /[, ]/);
- });
- }
- return styles;
- };
- function Schema(settings) {
- var elements = {};
- var children = {};
- var patternElements = [];
- var validStyles;
- var invalidStyles;
- var schemaItems;
- var whiteSpaceElementsMap, selfClosingElementsMap, shortEndedElementsMap, boolAttrMap, validClasses;
- var blockElementsMap, nonEmptyElementsMap, moveCaretBeforeOnEnterElementsMap, textBlockElementsMap, textInlineElementsMap;
- var customElementsMap = {}, specialElements = {};
- var createLookupTable = function (option, defaultValue, extendWith) {
- var value = settings[option];
- if (!value) {
- value = mapCache[option];
- if (!value) {
- value = makeMap$2(defaultValue, ' ', makeMap$2(defaultValue.toUpperCase(), ' '));
- value = extend$1(value, extendWith);
- mapCache[option] = value;
- }
- } else {
- value = makeMap$2(value, /[, ]/, makeMap$2(value.toUpperCase(), /[, ]/));
- }
- return value;
- };
- settings = settings || {};
- schemaItems = compileSchema(settings.schema);
- if (settings.verify_html === false) {
- settings.valid_elements = '*[*]';
- }
- validStyles = compileElementMap(settings.valid_styles);
- invalidStyles = compileElementMap(settings.invalid_styles, 'map');
- validClasses = compileElementMap(settings.valid_classes, 'map');
- whiteSpaceElementsMap = createLookupTable('whitespace_elements', 'pre script noscript style textarea video audio iframe object code');
- selfClosingElementsMap = createLookupTable('self_closing_elements', 'colgroup dd dt li option p td tfoot th thead tr');
- shortEndedElementsMap = createLookupTable('short_ended_elements', 'area base basefont br col frame hr img input isindex link ' + 'meta param embed source wbr track');
- boolAttrMap = createLookupTable('boolean_attributes', 'checked compact declare defer disabled ismap multiple nohref noresize ' + 'noshade nowrap readonly selected autoplay loop controls');
- nonEmptyElementsMap = createLookupTable('non_empty_elements', 'td th iframe video audio object ' + 'script pre code', shortEndedElementsMap);
- moveCaretBeforeOnEnterElementsMap = createLookupTable('move_caret_before_on_enter_elements', 'table', nonEmptyElementsMap);
- textBlockElementsMap = createLookupTable('text_block_elements', 'h1 h2 h3 h4 h5 h6 p div address pre form ' + 'blockquote center dir fieldset header footer article section hgroup aside main nav figure');
- blockElementsMap = createLookupTable('block_elements', 'hr table tbody thead tfoot ' + 'th tr td li ol ul caption dl dt dd noscript menu isindex option ' + 'datalist select optgroup figcaption details summary', textBlockElementsMap);
- textInlineElementsMap = createLookupTable('text_inline_elements', 'span strong b em i font strike u var cite ' + 'dfn code mark q sup sub samp');
- each$4((settings.special || 'script noscript iframe noframes noembed title style textarea xmp').split(' '), function (name) {
- specialElements[name] = new RegExp('' + name + '[^>]*>', 'gi');
- });
- var patternToRegExp = function (str) {
- return new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$');
- };
- var addValidElements = function (validElements) {
- var ei, el, ai, al, matches, element, attr, attrData, elementName, attrName, attrType, attributes, attributesOrder, prefix, outputName, globalAttributes, globalAttributesOrder, key, value;
- var elementRuleRegExp = /^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)\])?$/, attrRuleRegExp = /^([!\-])?(\w+[\\:]:\w+|[^=:<]+)?(?:([=:<])(.*))?$/, hasPatternsRegExp = /[*?+]/;
- if (validElements) {
- validElements = split(validElements, ',');
- if (elements['@']) {
- globalAttributes = elements['@'].attributes;
- globalAttributesOrder = elements['@'].attributesOrder;
- }
- for (ei = 0, el = validElements.length; ei < el; ei++) {
- matches = elementRuleRegExp.exec(validElements[ei]);
- if (matches) {
- prefix = matches[1];
- elementName = matches[2];
- outputName = matches[3];
- attrData = matches[5];
- attributes = {};
- attributesOrder = [];
- element = {
- attributes: attributes,
- attributesOrder: attributesOrder
- };
- if (prefix === '#') {
- element.paddEmpty = true;
- }
- if (prefix === '-') {
- element.removeEmpty = true;
- }
- if (matches[4] === '!') {
- element.removeEmptyAttrs = true;
- }
- if (globalAttributes) {
- for (key in globalAttributes) {
- attributes[key] = globalAttributes[key];
- }
- attributesOrder.push.apply(attributesOrder, globalAttributesOrder);
- }
- if (attrData) {
- attrData = split(attrData, '|');
- for (ai = 0, al = attrData.length; ai < al; ai++) {
- matches = attrRuleRegExp.exec(attrData[ai]);
- if (matches) {
- attr = {};
- attrType = matches[1];
- attrName = matches[2].replace(/[\\:]:/g, ':');
- prefix = matches[3];
- value = matches[4];
- if (attrType === '!') {
- element.attributesRequired = element.attributesRequired || [];
- element.attributesRequired.push(attrName);
- attr.required = true;
- }
- if (attrType === '-') {
- delete attributes[attrName];
- attributesOrder.splice(inArray$1(attributesOrder, attrName), 1);
- continue;
- }
- if (prefix) {
- if (prefix === '=') {
- element.attributesDefault = element.attributesDefault || [];
- element.attributesDefault.push({
- name: attrName,
- value: value
- });
- attr.defaultValue = value;
- }
- if (prefix === ':') {
- element.attributesForced = element.attributesForced || [];
- element.attributesForced.push({
- name: attrName,
- value: value
- });
- attr.forcedValue = value;
- }
- if (prefix === '<') {
- attr.validValues = makeMap$2(value, '?');
- }
- }
- if (hasPatternsRegExp.test(attrName)) {
- element.attributePatterns = element.attributePatterns || [];
- attr.pattern = patternToRegExp(attrName);
- element.attributePatterns.push(attr);
- } else {
- if (!attributes[attrName]) {
- attributesOrder.push(attrName);
- }
- attributes[attrName] = attr;
- }
- }
- }
- }
- if (!globalAttributes && elementName === '@') {
- globalAttributes = attributes;
- globalAttributesOrder = attributesOrder;
- }
- if (outputName) {
- element.outputName = elementName;
- elements[outputName] = element;
- }
- if (hasPatternsRegExp.test(elementName)) {
- element.pattern = patternToRegExp(elementName);
- patternElements.push(element);
- } else {
- elements[elementName] = element;
- }
- }
- }
- }
- };
- var setValidElements = function (validElements) {
- elements = {};
- patternElements = [];
- addValidElements(validElements);
- each$4(schemaItems, function (element, name) {
- children[name] = element.children;
- });
- };
- var addCustomElements = function (customElements) {
- var customElementRegExp = /^(~)?(.+)$/;
- if (customElements) {
- mapCache.text_block_elements = mapCache.block_elements = null;
- each$4(split(customElements, ','), function (rule) {
- var matches = customElementRegExp.exec(rule), inline = matches[1] === '~', cloneName = inline ? 'span' : 'div', name = matches[2];
- children[name] = children[cloneName];
- customElementsMap[name] = cloneName;
- if (!inline) {
- blockElementsMap[name.toUpperCase()] = {};
- blockElementsMap[name] = {};
- }
- if (!elements[name]) {
- var customRule = elements[cloneName];
- customRule = extend$1({}, customRule);
- delete customRule.removeEmptyAttrs;
- delete customRule.removeEmpty;
- elements[name] = customRule;
- }
- each$4(children, function (element, elmName) {
- if (element[cloneName]) {
- children[elmName] = element = extend$1({}, children[elmName]);
- element[name] = element[cloneName];
- }
- });
- });
- }
- };
- var addValidChildren = function (validChildren) {
- var childRuleRegExp = /^([+\-]?)(\w+)\[([^\]]+)\]$/;
- mapCache[settings.schema] = null;
- if (validChildren) {
- each$4(split(validChildren, ','), function (rule) {
- var matches = childRuleRegExp.exec(rule);
- var parent, prefix;
- if (matches) {
- prefix = matches[1];
- if (prefix) {
- parent = children[matches[2]];
- } else {
- parent = children[matches[2]] = { '#comment': {} };
- }
- parent = children[matches[2]];
- each$4(split(matches[3], '|'), function (child) {
- if (prefix === '-') {
- delete parent[child];
- } else {
- parent[child] = {};
- }
- });
- }
- });
- }
- };
- var getElementRule = function (name) {
- var element = elements[name], i;
- if (element) {
- return element;
- }
- i = patternElements.length;
- while (i--) {
- element = patternElements[i];
- if (element.pattern.test(name)) {
- return element;
- }
- }
- };
- if (!settings.valid_elements) {
- each$4(schemaItems, function (element, name) {
- elements[name] = {
- attributes: element.attributes,
- attributesOrder: element.attributesOrder
- };
- children[name] = element.children;
- });
- if (settings.schema !== 'html5') {
- each$4(split('strong/b em/i'), function (item) {
- item = split(item, '/');
- elements[item[1]].outputName = item[0];
- });
- }
- each$4(split('ol ul sub sup blockquote span font a table tbody tr strong em b i'), function (name) {
- if (elements[name]) {
- elements[name].removeEmpty = true;
- }
- });
- each$4(split('p h1 h2 h3 h4 h5 h6 th td pre div address caption li'), function (name) {
- elements[name].paddEmpty = true;
- });
- each$4(split('span'), function (name) {
- elements[name].removeEmptyAttrs = true;
- });
- } else {
- setValidElements(settings.valid_elements);
- }
- addCustomElements(settings.custom_elements);
- addValidChildren(settings.valid_children);
- addValidElements(settings.extended_valid_elements);
- addValidChildren('+ol[ul|ol],+ul[ul|ol]');
- each$4({
- dd: 'dl',
- dt: 'dl',
- li: 'ul ol',
- td: 'tr',
- th: 'tr',
- tr: 'tbody thead tfoot',
- tbody: 'table',
- thead: 'table',
- tfoot: 'table',
- legend: 'fieldset',
- area: 'map',
- param: 'video audio object'
- }, function (parents, item) {
- if (elements[item]) {
- elements[item].parentsRequired = split(parents);
- }
- });
- if (settings.invalid_elements) {
- each$4(explode$1(settings.invalid_elements), function (item) {
- if (elements[item]) {
- delete elements[item];
- }
- });
- }
- if (!getElementRule('span')) {
- addValidElements('span[!data-mce-type|*]');
- }
- var getValidStyles = function () {
- return validStyles;
- };
- var getInvalidStyles = function () {
- return invalidStyles;
- };
- var getValidClasses = function () {
- return validClasses;
- };
- var getBoolAttrs = function () {
- return boolAttrMap;
- };
- var getBlockElements = function () {
- return blockElementsMap;
- };
- var getTextBlockElements = function () {
- return textBlockElementsMap;
- };
- var getTextInlineElements = function () {
- return textInlineElementsMap;
- };
- var getShortEndedElements = function () {
- return shortEndedElementsMap;
- };
- var getSelfClosingElements = function () {
- return selfClosingElementsMap;
- };
- var getNonEmptyElements = function () {
- return nonEmptyElementsMap;
- };
- var getMoveCaretBeforeOnEnterElements = function () {
- return moveCaretBeforeOnEnterElementsMap;
- };
- var getWhiteSpaceElements = function () {
- return whiteSpaceElementsMap;
- };
- var getSpecialElements = function () {
- return specialElements;
- };
- var isValidChild = function (name, child) {
- var parent = children[name.toLowerCase()];
- return !!(parent && parent[child.toLowerCase()]);
- };
- var isValid = function (name, attr) {
- var attrPatterns, i;
- var rule = getElementRule(name);
- if (rule) {
- if (attr) {
- if (rule.attributes[attr]) {
- return true;
- }
- attrPatterns = rule.attributePatterns;
- if (attrPatterns) {
- i = attrPatterns.length;
- while (i--) {
- if (attrPatterns[i].pattern.test(name)) {
- return true;
- }
- }
- }
- } else {
- return true;
- }
- }
- return false;
- };
- var getCustomElements = function () {
- return customElementsMap;
- };
- return {
- children: children,
- elements: elements,
- getValidStyles: getValidStyles,
- getValidClasses: getValidClasses,
- getBlockElements: getBlockElements,
- getInvalidStyles: getInvalidStyles,
- getShortEndedElements: getShortEndedElements,
- getTextBlockElements: getTextBlockElements,
- getTextInlineElements: getTextInlineElements,
- getBoolAttrs: getBoolAttrs,
- getElementRule: getElementRule,
- getSelfClosingElements: getSelfClosingElements,
- getNonEmptyElements: getNonEmptyElements,
- getMoveCaretBeforeOnEnterElements: getMoveCaretBeforeOnEnterElements,
- getWhiteSpaceElements: getWhiteSpaceElements,
- getSpecialElements: getSpecialElements,
- isValidChild: isValidChild,
- isValid: isValid,
- getCustomElements: getCustomElements,
- addValidElements: addValidElements,
- setValidElements: setValidElements,
- addCustomElements: addCustomElements,
- addValidChildren: addValidChildren
- };
- }
-
- var toHex = function (match, r, g, b) {
- var hex = function (val) {
- val = parseInt(val, 10).toString(16);
- return val.length > 1 ? val : '0' + val;
- };
- return '#' + hex(r) + hex(g) + hex(b);
- };
- function Styles(settings, schema) {
- var rgbRegExp = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi;
- var urlOrStrRegExp = /(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi;
- var styleRegExp = /\s*([^:]+):\s*([^;]+);?/g;
- var trimRightRegExp = /\s+$/;
- var i;
- var encodingLookup = {};
- var encodingItems;
- var validStyles;
- var invalidStyles;
- var invisibleChar = '\uFEFF';
- settings = settings || {};
- if (schema) {
- validStyles = schema.getValidStyles();
- invalidStyles = schema.getInvalidStyles();
- }
- encodingItems = ('\\" \\\' \\; \\: ; : ' + invisibleChar).split(' ');
- for (i = 0; i < encodingItems.length; i++) {
- encodingLookup[encodingItems[i]] = invisibleChar + i;
- encodingLookup[invisibleChar + i] = encodingItems[i];
- }
- return {
- toHex: function (color) {
- return color.replace(rgbRegExp, toHex);
- },
- parse: function (css) {
- var styles = {};
- var matches, name, value, isEncoded;
- var urlConverter = settings.url_converter;
- var urlConverterScope = settings.url_converter_scope || this;
- var compress = function (prefix, suffix, noJoin) {
- var top, right, bottom, left;
- top = styles[prefix + '-top' + suffix];
- if (!top) {
- return;
- }
- right = styles[prefix + '-right' + suffix];
- if (!right) {
- return;
- }
- bottom = styles[prefix + '-bottom' + suffix];
- if (!bottom) {
- return;
- }
- left = styles[prefix + '-left' + suffix];
- if (!left) {
- return;
- }
- var box = [
- top,
- right,
- bottom,
- left
- ];
- i = box.length - 1;
- while (i--) {
- if (box[i] !== box[i + 1]) {
- break;
- }
- }
- if (i > -1 && noJoin) {
- return;
- }
- styles[prefix + suffix] = i === -1 ? box[0] : box.join(' ');
- delete styles[prefix + '-top' + suffix];
- delete styles[prefix + '-right' + suffix];
- delete styles[prefix + '-bottom' + suffix];
- delete styles[prefix + '-left' + suffix];
- };
- var canCompress = function (key) {
- var value = styles[key], i;
- if (!value) {
- return;
- }
- value = value.split(' ');
- i = value.length;
- while (i--) {
- if (value[i] !== value[0]) {
- return false;
- }
- }
- styles[key] = value[0];
- return true;
- };
- var compress2 = function (target, a, b, c) {
- if (!canCompress(a)) {
- return;
- }
- if (!canCompress(b)) {
- return;
- }
- if (!canCompress(c)) {
- return;
- }
- styles[target] = styles[a] + ' ' + styles[b] + ' ' + styles[c];
- delete styles[a];
- delete styles[b];
- delete styles[c];
- };
- var encode = function (str) {
- isEncoded = true;
- return encodingLookup[str];
- };
- var decode = function (str, keepSlashes) {
- if (isEncoded) {
- str = str.replace(/\uFEFF[0-9]/g, function (str) {
- return encodingLookup[str];
- });
- }
- if (!keepSlashes) {
- str = str.replace(/\\([\'\";:])/g, '$1');
- }
- return str;
- };
- var decodeSingleHexSequence = function (escSeq) {
- return String.fromCharCode(parseInt(escSeq.slice(1), 16));
- };
- var decodeHexSequences = function (value) {
- return value.replace(/\\[0-9a-f]+/gi, decodeSingleHexSequence);
- };
- var processUrl = function (match, url, url2, url3, str, str2) {
- str = str || str2;
- if (str) {
- str = decode(str);
- return '\'' + str.replace(/\'/g, '\\\'') + '\'';
- }
- url = decode(url || url2 || url3);
- if (!settings.allow_script_urls) {
- var scriptUrl = url.replace(/[\s\r\n]+/g, '');
- if (/(java|vb)script:/i.test(scriptUrl)) {
- return '';
- }
- if (!settings.allow_svg_data_urls && /^data:image\/svg/i.test(scriptUrl)) {
- return '';
- }
- }
- if (urlConverter) {
- url = urlConverter.call(urlConverterScope, url, 'style');
- }
- return 'url(\'' + url.replace(/\'/g, '\\\'') + '\')';
- };
- if (css) {
- css = css.replace(/[\u0000-\u001F]/g, '');
- css = css.replace(/\\[\"\';:\uFEFF]/g, encode).replace(/\"[^\"]+\"|\'[^\']+\'/g, function (str) {
- return str.replace(/[;:]/g, encode);
- });
- while (matches = styleRegExp.exec(css)) {
- styleRegExp.lastIndex = matches.index + matches[0].length;
- name = matches[1].replace(trimRightRegExp, '').toLowerCase();
- value = matches[2].replace(trimRightRegExp, '');
- if (name && value) {
- name = decodeHexSequences(name);
- value = decodeHexSequences(value);
- if (name.indexOf(invisibleChar) !== -1 || name.indexOf('"') !== -1) {
- continue;
- }
- if (!settings.allow_script_urls && (name === 'behavior' || /expression\s*\(|\/\*|\*\//.test(value))) {
- continue;
- }
- if (name === 'font-weight' && value === '700') {
- value = 'bold';
- } else if (name === 'color' || name === 'background-color') {
- value = value.toLowerCase();
- }
- value = value.replace(rgbRegExp, toHex);
- value = value.replace(urlOrStrRegExp, processUrl);
- styles[name] = isEncoded ? decode(value, true) : value;
- }
- }
- compress('border', '', true);
- compress('border', '-width');
- compress('border', '-color');
- compress('border', '-style');
- compress('padding', '');
- compress('margin', '');
- compress2('border', 'border-width', 'border-style', 'border-color');
- if (styles.border === 'medium none') {
- delete styles.border;
- }
- if (styles['border-image'] === 'none') {
- delete styles['border-image'];
- }
- }
- return styles;
- },
- serialize: function (styles, elementName) {
- var css = '', name, value;
- var serializeStyles = function (name) {
- var styleList, i, l, value;
- styleList = validStyles[name];
- if (styleList) {
- for (i = 0, l = styleList.length; i < l; i++) {
- name = styleList[i];
- value = styles[name];
- if (value) {
- css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';
- }
- }
- }
- };
- var isValid = function (name, elementName) {
- var styleMap;
- styleMap = invalidStyles['*'];
- if (styleMap && styleMap[name]) {
- return false;
- }
- styleMap = invalidStyles[elementName];
- if (styleMap && styleMap[name]) {
- return false;
- }
- return true;
- };
- if (elementName && validStyles) {
- serializeStyles('*');
- serializeStyles(elementName);
- } else {
- for (name in styles) {
- value = styles[name];
- if (value && (!invalidStyles || isValid(name, elementName))) {
- css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';
- }
- }
- }
- return css;
- }
- };
- }
-
- var each$5 = Tools.each;
- var grep$1 = Tools.grep;
- var isIE = Env.ie;
- var simpleSelectorRe = /^([a-z0-9],?)+$/i;
- var whiteSpaceRegExp$2 = /^[ \t\r\n]*$/;
- var setupAttrHooks = function (styles, settings, getContext) {
- var attrHooks = {};
- var keepValues = settings.keep_values;
- var keepUrlHook = {
- set: function ($elm, value, name) {
- if (settings.url_converter) {
- value = settings.url_converter.call(settings.url_converter_scope || getContext(), value, name, $elm[0]);
- }
- $elm.attr('data-mce-' + name, value).attr(name, value);
- },
- get: function ($elm, name) {
- return $elm.attr('data-mce-' + name) || $elm.attr(name);
- }
- };
- attrHooks = {
- style: {
- set: function ($elm, value) {
- if (value !== null && typeof value === 'object') {
- $elm.css(value);
- return;
- }
- if (keepValues) {
- $elm.attr('data-mce-style', value);
- }
- $elm.attr('style', value);
- },
- get: function ($elm) {
- var value = $elm.attr('data-mce-style') || $elm.attr('style');
- value = styles.serialize(styles.parse(value), $elm[0].nodeName);
- return value;
- }
- }
- };
- if (keepValues) {
- attrHooks.href = attrHooks.src = keepUrlHook;
- }
- return attrHooks;
- };
- var updateInternalStyleAttr = function (styles, $elm) {
- var rawValue = $elm.attr('style');
- var value = styles.serialize(styles.parse(rawValue), $elm[0].nodeName);
- if (!value) {
- value = null;
- }
- $elm.attr('data-mce-style', value);
- };
- var findNodeIndex = function (node, normalized) {
- var idx = 0, lastNodeType, nodeType;
- if (node) {
- for (lastNodeType = node.nodeType, node = node.previousSibling; node; node = node.previousSibling) {
- nodeType = node.nodeType;
- if (normalized && nodeType === 3) {
- if (nodeType === lastNodeType || !node.nodeValue.length) {
- continue;
- }
- }
- idx++;
- lastNodeType = nodeType;
- }
- }
- return idx;
- };
- function DOMUtils(doc, settings) {
- var _this = this;
- if (settings === void 0) {
- settings = {};
- }
- var attrHooks;
- var addedStyles = {};
- var win = domGlobals.window;
- var files = {};
- var counter = 0;
- var stdMode = true;
- var boxModel = true;
- var styleSheetLoader = StyleSheetLoader(doc, { contentCssCors: settings.contentCssCors });
- var boundEvents = [];
- var schema = settings.schema ? settings.schema : Schema({});
- var styles = Styles({
- url_converter: settings.url_converter,
- url_converter_scope: settings.url_converter_scope
- }, settings.schema);
- var events = settings.ownEvents ? new EventUtils(settings.proxy) : EventUtils.Event;
- var blockElementsMap = schema.getBlockElements();
- var $ = DomQuery.overrideDefaults(function () {
- return {
- context: doc,
- element: self.getRoot()
- };
- });
- var isBlock = function (node) {
- if (typeof node === 'string') {
- return !!blockElementsMap[node];
- } else if (node) {
- var type = node.nodeType;
- if (type) {
- return !!(type === 1 && blockElementsMap[node.nodeName]);
- }
- }
- return false;
- };
- var get = function (elm) {
- if (elm && doc && typeof elm === 'string') {
- var node = doc.getElementById(elm);
- if (node && node.id !== elm) {
- return doc.getElementsByName(elm)[1];
- } else {
- return node;
- }
- }
- return elm;
- };
- var $$ = function (elm) {
- if (typeof elm === 'string') {
- elm = get(elm);
- }
- return $(elm);
- };
- var getAttrib = function (elm, name, defaultVal) {
- var hook, value;
- var $elm = $$(elm);
- if ($elm.length) {
- hook = attrHooks[name];
- if (hook && hook.get) {
- value = hook.get($elm, name);
- } else {
- value = $elm.attr(name);
- }
- }
- if (typeof value === 'undefined') {
- value = defaultVal || '';
- }
- return value;
- };
- var getAttribs = function (elm) {
- var node = get(elm);
- if (!node) {
- return [];
- }
- return node.attributes;
- };
- var setAttrib = function (elm, name, value) {
- var originalValue, hook;
- if (value === '') {
- value = null;
- }
- var $elm = $$(elm);
- originalValue = $elm.attr(name);
- if (!$elm.length) {
- return;
- }
- hook = attrHooks[name];
- if (hook && hook.set) {
- hook.set($elm, value, name);
- } else {
- $elm.attr(name, value);
- }
- if (originalValue !== value && settings.onSetAttrib) {
- settings.onSetAttrib({
- attrElm: $elm,
- attrName: name,
- attrValue: value
- });
- }
- };
- var clone = function (node, deep) {
- if (!isIE || node.nodeType !== 1 || deep) {
- return node.cloneNode(deep);
- }
- if (!deep) {
- var clone_1 = doc.createElement(node.nodeName);
- each$5(getAttribs(node), function (attr) {
- setAttrib(clone_1, attr.nodeName, getAttrib(node, attr.nodeName));
- });
- return clone_1;
- }
- return null;
- };
- var getRoot = function () {
- return settings.root_element || doc.body;
- };
- var getViewPort = function (argWin) {
- var actWin = !argWin ? win : argWin;
- var doc = actWin.document;
- var rootElm = doc.documentElement ;
- return {
- x: actWin.pageXOffset || rootElm.scrollLeft,
- y: actWin.pageYOffset || rootElm.scrollTop,
- w: actWin.innerWidth || rootElm.clientWidth,
- h: actWin.innerHeight || rootElm.clientHeight
- };
- };
- var getPos = function (elm, rootElm) {
- return Position.getPos(doc.body, get(elm), rootElm);
- };
- var setStyle = function (elm, name, value) {
- var $elm = $$(elm).css(name, value);
- if (settings.update_styles) {
- updateInternalStyleAttr(styles, $elm);
- }
- };
- var setStyles = function (elm, stylesArg) {
- var $elm = $$(elm).css(stylesArg);
- if (settings.update_styles) {
- updateInternalStyleAttr(styles, $elm);
- }
- };
- var getStyle = function (elm, name, computed) {
- var $elm = $$(elm);
- if (computed) {
- return $elm.css(name);
- }
- name = name.replace(/-(\D)/g, function (a, b) {
- return b.toUpperCase();
- });
- if (name === 'float') {
- name = Env.ie && Env.ie < 12 ? 'styleFloat' : 'cssFloat';
- }
- return $elm[0] && $elm[0].style ? $elm[0].style[name] : undefined;
- };
- var getSize = function (elm) {
- var w, h;
- elm = get(elm);
- w = getStyle(elm, 'width');
- h = getStyle(elm, 'height');
- if (w.indexOf('px') === -1) {
- w = 0;
- }
- if (h.indexOf('px') === -1) {
- h = 0;
- }
- return {
- w: parseInt(w, 10) || elm.offsetWidth || elm.clientWidth,
- h: parseInt(h, 10) || elm.offsetHeight || elm.clientHeight
- };
- };
- var getRect = function (elm) {
- var pos, size;
- elm = get(elm);
- pos = getPos(elm);
- size = getSize(elm);
- return {
- x: pos.x,
- y: pos.y,
- w: size.w,
- h: size.h
- };
- };
- var is = function (elm, selector) {
- var i;
- if (!elm) {
- return false;
- }
- if (!Array.isArray(elm)) {
- if (selector === '*') {
- return elm.nodeType === 1;
- }
- if (simpleSelectorRe.test(selector)) {
- var selectors = selector.toLowerCase().split(/,/);
- var elmName = elm.nodeName.toLowerCase();
- for (i = selectors.length - 1; i >= 0; i--) {
- if (selectors[i] === elmName) {
- return true;
- }
- }
- return false;
- }
- if (elm.nodeType && elm.nodeType !== 1) {
- return false;
- }
- }
- var elms = !Array.isArray(elm) ? [elm] : elm;
- return Sizzle(selector, elms[0].ownerDocument || elms[0], null, elms).length > 0;
- };
- var getParents = function (elm, selector, root, collect) {
- var result = [];
- var selectorVal;
- var node = get(elm);
- collect = collect === undefined;
- root = root || (getRoot().nodeName !== 'BODY' ? getRoot().parentNode : null);
- if (Tools.is(selector, 'string')) {
- selectorVal = selector;
- if (selector === '*') {
- selector = function (node) {
- return node.nodeType === 1;
- };
- } else {
- selector = function (node) {
- return is(node, selectorVal);
- };
- }
- }
- while (node) {
- if (node === root || !node.nodeType || node.nodeType === 9) {
- break;
- }
- if (!selector || typeof selector === 'function' && selector(node)) {
- if (collect) {
- result.push(node);
- } else {
- return [node];
- }
- }
- node = node.parentNode;
- }
- return collect ? result : null;
- };
- var getParent = function (node, selector, root) {
- var parents = getParents(node, selector, root, false);
- return parents && parents.length > 0 ? parents[0] : null;
- };
- var _findSib = function (node, selector, name) {
- var func = selector;
- if (node) {
- if (typeof selector === 'string') {
- func = function (node) {
- return is(node, selector);
- };
- }
- for (node = node[name]; node; node = node[name]) {
- if (typeof func === 'function' && func(node)) {
- return node;
- }
- }
- }
- return null;
- };
- var getNext = function (node, selector) {
- return _findSib(node, selector, 'nextSibling');
- };
- var getPrev = function (node, selector) {
- return _findSib(node, selector, 'previousSibling');
- };
- var select = function (selector, scope) {
- return Sizzle(selector, get(scope) || settings.root_element || doc, []);
- };
- var run = function (elm, func, scope) {
- var result;
- var node = typeof elm === 'string' ? get(elm) : elm;
- if (!node) {
- return false;
- }
- if (Tools.isArray(node) && (node.length || node.length === 0)) {
- result = [];
- each$5(node, function (elm, i) {
- if (elm) {
- if (typeof elm === 'string') {
- elm = get(elm);
- }
- result.push(func.call(scope, elm, i));
- }
- });
- return result;
- }
- var context = scope ? scope : _this;
- return func.call(context, node);
- };
- var setAttribs = function (elm, attrs) {
- $$(elm).each(function (i, node) {
- each$5(attrs, function (value, name) {
- setAttrib(node, name, value);
- });
- });
- };
- var setHTML = function (elm, html) {
- var $elm = $$(elm);
- if (isIE) {
- $elm.each(function (i, target) {
- if (target.canHaveHTML === false) {
- return;
- }
- while (target.firstChild) {
- target.removeChild(target.firstChild);
- }
- try {
- target.innerHTML = ' ' + html;
- target.removeChild(target.firstChild);
- } catch (ex) {
- DomQuery('
').html(' ' + html).contents().slice(1).appendTo(target);
- }
- return html;
- });
- } else {
- $elm.html(html);
- }
- };
- var add = function (parentElm, name, attrs, html, create) {
- return run(parentElm, function (parentElm) {
- var newElm = typeof name === 'string' ? doc.createElement(name) : name;
- setAttribs(newElm, attrs);
- if (html) {
- if (typeof html !== 'string' && html.nodeType) {
- newElm.appendChild(html);
- } else if (typeof html === 'string') {
- setHTML(newElm, html);
- }
- }
- return !create ? parentElm.appendChild(newElm) : newElm;
- });
- };
- var create = function (name, attrs, html) {
- return add(doc.createElement(name), name, attrs, html, true);
- };
- var decode = Entities.decode;
- var encode = Entities.encodeAllRaw;
- var createHTML = function (name, attrs, html) {
- var outHtml = '', key;
- outHtml += '<' + name;
- for (key in attrs) {
- if (attrs.hasOwnProperty(key) && attrs[key] !== null && typeof attrs[key] !== 'undefined') {
- outHtml += ' ' + key + '="' + encode(attrs[key]) + '"';
- }
- }
- if (typeof html !== 'undefined') {
- return outHtml + '>' + html + '' + name + '>';
- }
- return outHtml + ' />';
- };
- var createFragment = function (html) {
- var node;
- var container = doc.createElement('div');
- var frag = doc.createDocumentFragment();
- frag.appendChild(container);
- if (html) {
- container.innerHTML = html;
- }
- while (node = container.firstChild) {
- frag.appendChild(node);
- }
- frag.removeChild(container);
- return frag;
- };
- var remove = function (node, keepChildren) {
- var $node = $$(node);
- if (keepChildren) {
- $node.each(function () {
- var child;
- while (child = this.firstChild) {
- if (child.nodeType === 3 && child.data.length === 0) {
- this.removeChild(child);
- } else {
- this.parentNode.insertBefore(child, this);
- }
- }
- }).remove();
- } else {
- $node.remove();
- }
- return $node.length > 1 ? $node.toArray() : $node[0];
- };
- var removeAllAttribs = function (e) {
- return run(e, function (e) {
- var i;
- var attrs = e.attributes;
- for (i = attrs.length - 1; i >= 0; i--) {
- e.removeAttributeNode(attrs.item(i));
- }
- });
- };
- var parseStyle = function (cssText) {
- return styles.parse(cssText);
- };
- var serializeStyle = function (stylesArg, name) {
- return styles.serialize(stylesArg, name);
- };
- var addStyle = function (cssText) {
- var head, styleElm;
- if (self !== DOMUtils.DOM && doc === domGlobals.document) {
- if (addedStyles[cssText]) {
- return;
- }
- addedStyles[cssText] = true;
- }
- styleElm = doc.getElementById('mceDefaultStyles');
- if (!styleElm) {
- styleElm = doc.createElement('style');
- styleElm.id = 'mceDefaultStyles';
- styleElm.type = 'text/css';
- head = doc.getElementsByTagName('head')[0];
- if (head.firstChild) {
- head.insertBefore(styleElm, head.firstChild);
- } else {
- head.appendChild(styleElm);
- }
- }
- if (styleElm.styleSheet) {
- styleElm.styleSheet.cssText += cssText;
- } else {
- styleElm.appendChild(doc.createTextNode(cssText));
- }
- };
- var loadCSS = function (url) {
- var head;
- if (self !== DOMUtils.DOM && doc === domGlobals.document) {
- DOMUtils.DOM.loadCSS(url);
- return;
- }
- if (!url) {
- url = '';
- }
- head = doc.getElementsByTagName('head')[0];
- each$5(url.split(','), function (url) {
- var link;
- url = Tools._addCacheSuffix(url);
- if (files[url]) {
- return;
- }
- files[url] = true;
- link = create('link', {
- rel: 'stylesheet',
- href: url
- });
- head.appendChild(link);
- });
- };
- var toggleClass = function (elm, cls, state) {
- $$(elm).toggleClass(cls, state).each(function () {
- if (this.className === '') {
- DomQuery(this).attr('class', null);
- }
- });
- };
- var addClass = function (elm, cls) {
- $$(elm).addClass(cls);
- };
- var removeClass = function (elm, cls) {
- toggleClass(elm, cls, false);
- };
- var hasClass = function (elm, cls) {
- return $$(elm).hasClass(cls);
- };
- var show = function (elm) {
- $$(elm).show();
- };
- var hide = function (elm) {
- $$(elm).hide();
- };
- var isHidden = function (elm) {
- return $$(elm).css('display') === 'none';
- };
- var uniqueId = function (prefix) {
- return (!prefix ? 'mce_' : prefix) + counter++;
- };
- var getOuterHTML = function (elm) {
- var node = typeof elm === 'string' ? get(elm) : elm;
- return NodeType.isElement(node) ? node.outerHTML : DomQuery('
').append(DomQuery(node).clone()).html();
- };
- var setOuterHTML = function (elm, html) {
- $$(elm).each(function () {
- try {
- if ('outerHTML' in this) {
- this.outerHTML = html;
- return;
- }
- } catch (ex) {
- }
- remove(DomQuery(this).html(html), true);
- });
- };
- var insertAfter = function (node, reference) {
- var referenceNode = get(reference);
- return run(node, function (node) {
- var parent, nextSibling;
- parent = referenceNode.parentNode;
- nextSibling = referenceNode.nextSibling;
- if (nextSibling) {
- parent.insertBefore(node, nextSibling);
- } else {
- parent.appendChild(node);
- }
- return node;
- });
- };
- var replace = function (newElm, oldElm, keepChildren) {
- return run(oldElm, function (oldElm) {
- if (Tools.is(oldElm, 'array')) {
- newElm = newElm.cloneNode(true);
- }
- if (keepChildren) {
- each$5(grep$1(oldElm.childNodes), function (node) {
- newElm.appendChild(node);
- });
- }
- return oldElm.parentNode.replaceChild(newElm, oldElm);
- });
- };
- var rename = function (elm, name) {
- var newElm;
- if (elm.nodeName !== name.toUpperCase()) {
- newElm = create(name);
- each$5(getAttribs(elm), function (attrNode) {
- setAttrib(newElm, attrNode.nodeName, getAttrib(elm, attrNode.nodeName));
- });
- replace(newElm, elm, true);
- }
- return newElm || elm;
- };
- var findCommonAncestor = function (a, b) {
- var ps = a, pe;
- while (ps) {
- pe = b;
- while (pe && ps !== pe) {
- pe = pe.parentNode;
- }
- if (ps === pe) {
- break;
- }
- ps = ps.parentNode;
- }
- if (!ps && a.ownerDocument) {
- return a.ownerDocument.documentElement;
- }
- return ps;
- };
- var toHex = function (rgbVal) {
- return styles.toHex(Tools.trim(rgbVal));
- };
- var isEmpty = function (node, elements) {
- var i, attributes, type, whitespace, walker, name, brCount = 0;
- node = node.firstChild;
- if (node) {
- walker = new TreeWalker(node, node.parentNode);
- elements = elements || (schema ? schema.getNonEmptyElements() : null);
- whitespace = schema ? schema.getWhiteSpaceElements() : {};
- do {
- type = node.nodeType;
- if (NodeType.isElement(node)) {
- var bogusVal = node.getAttribute('data-mce-bogus');
- if (bogusVal) {
- node = walker.next(bogusVal === 'all');
- continue;
- }
- name = node.nodeName.toLowerCase();
- if (elements && elements[name]) {
- if (name === 'br') {
- brCount++;
- node = walker.next();
- continue;
- }
- return false;
- }
- attributes = getAttribs(node);
- i = attributes.length;
- while (i--) {
- name = attributes[i].nodeName;
- if (name === 'name' || name === 'data-mce-bookmark') {
- return false;
- }
- }
- }
- if (type === 8) {
- return false;
- }
- if (type === 3 && !whiteSpaceRegExp$2.test(node.nodeValue)) {
- return false;
- }
- if (type === 3 && node.parentNode && whitespace[node.parentNode.nodeName] && whiteSpaceRegExp$2.test(node.nodeValue)) {
- return false;
- }
- node = walker.next();
- } while (node);
- }
- return brCount <= 1;
- };
- var createRng = function () {
- return doc.createRange();
- };
- var split = function (parentElm, splitElm, replacementElm) {
- var r = createRng(), bef, aft, pa;
- if (parentElm && splitElm) {
- r.setStart(parentElm.parentNode, findNodeIndex(parentElm));
- r.setEnd(splitElm.parentNode, findNodeIndex(splitElm));
- bef = r.extractContents();
- r = createRng();
- r.setStart(splitElm.parentNode, findNodeIndex(splitElm) + 1);
- r.setEnd(parentElm.parentNode, findNodeIndex(parentElm) + 1);
- aft = r.extractContents();
- pa = parentElm.parentNode;
- pa.insertBefore(TrimNode.trimNode(self, bef), parentElm);
- if (replacementElm) {
- pa.insertBefore(replacementElm, parentElm);
- } else {
- pa.insertBefore(splitElm, parentElm);
- }
- pa.insertBefore(TrimNode.trimNode(self, aft), parentElm);
- remove(parentElm);
- return replacementElm || splitElm;
- }
- };
- var bind = function (target, name, func, scope) {
- if (Tools.isArray(target)) {
- var i = target.length;
- while (i--) {
- target[i] = bind(target[i], name, func, scope);
- }
- return target;
- }
- if (settings.collect && (target === doc || target === win)) {
- boundEvents.push([
- target,
- name,
- func,
- scope
- ]);
- }
- return events.bind(target, name, func, scope || self);
- };
- var unbind = function (target, name, func) {
- var i;
- if (Tools.isArray(target)) {
- i = target.length;
- while (i--) {
- target[i] = unbind(target[i], name, func);
- }
- return target;
- }
- if (boundEvents && (target === doc || target === win)) {
- i = boundEvents.length;
- while (i--) {
- var item = boundEvents[i];
- if (target === item[0] && (!name || name === item[1]) && (!func || func === item[2])) {
- events.unbind(item[0], item[1], item[2]);
- }
- }
- }
- return events.unbind(target, name, func);
- };
- var fire = function (target, name, evt) {
- return events.fire(target, name, evt);
- };
- var getContentEditable = function (node) {
- if (node && NodeType.isElement(node)) {
- var contentEditable = node.getAttribute('data-mce-contenteditable');
- if (contentEditable && contentEditable !== 'inherit') {
- return contentEditable;
- }
- return node.contentEditable !== 'inherit' ? node.contentEditable : null;
- } else {
- return null;
- }
- };
- var getContentEditableParent = function (node) {
- var root = getRoot();
- var state = null;
- for (; node && node !== root; node = node.parentNode) {
- state = getContentEditable(node);
- if (state !== null) {
- break;
- }
- }
- return state;
- };
- var destroy = function () {
- if (boundEvents) {
- var i = boundEvents.length;
- while (i--) {
- var item = boundEvents[i];
- events.unbind(item[0], item[1], item[2]);
- }
- }
- if (Sizzle.setDocument) {
- Sizzle.setDocument();
- }
- };
- var isChildOf = function (node, parent) {
- while (node) {
- if (parent === node) {
- return true;
- }
- node = node.parentNode;
- }
- return false;
- };
- var dumpRng = function (r) {
- return 'startContainer: ' + r.startContainer.nodeName + ', startOffset: ' + r.startOffset + ', endContainer: ' + r.endContainer.nodeName + ', endOffset: ' + r.endOffset;
- };
- var self = {
- doc: doc,
- settings: settings,
- win: win,
- files: files,
- stdMode: stdMode,
- boxModel: boxModel,
- styleSheetLoader: styleSheetLoader,
- boundEvents: boundEvents,
- styles: styles,
- schema: schema,
- events: events,
- isBlock: isBlock,
- $: $,
- $$: $$,
- root: null,
- clone: clone,
- getRoot: getRoot,
- getViewPort: getViewPort,
- getRect: getRect,
- getSize: getSize,
- getParent: getParent,
- getParents: getParents,
- get: get,
- getNext: getNext,
- getPrev: getPrev,
- select: select,
- is: is,
- add: add,
- create: create,
- createHTML: createHTML,
- createFragment: createFragment,
- remove: remove,
- setStyle: setStyle,
- getStyle: getStyle,
- setStyles: setStyles,
- removeAllAttribs: removeAllAttribs,
- setAttrib: setAttrib,
- setAttribs: setAttribs,
- getAttrib: getAttrib,
- getPos: getPos,
- parseStyle: parseStyle,
- serializeStyle: serializeStyle,
- addStyle: addStyle,
- loadCSS: loadCSS,
- addClass: addClass,
- removeClass: removeClass,
- hasClass: hasClass,
- toggleClass: toggleClass,
- show: show,
- hide: hide,
- isHidden: isHidden,
- uniqueId: uniqueId,
- setHTML: setHTML,
- getOuterHTML: getOuterHTML,
- setOuterHTML: setOuterHTML,
- decode: decode,
- encode: encode,
- insertAfter: insertAfter,
- replace: replace,
- rename: rename,
- findCommonAncestor: findCommonAncestor,
- toHex: toHex,
- run: run,
- getAttribs: getAttribs,
- isEmpty: isEmpty,
- createRng: createRng,
- nodeIndex: findNodeIndex,
- split: split,
- bind: bind,
- unbind: unbind,
- fire: fire,
- getContentEditable: getContentEditable,
- getContentEditableParent: getContentEditableParent,
- destroy: destroy,
- isChildOf: isChildOf,
- dumpRng: dumpRng
- };
- attrHooks = setupAttrHooks(styles, settings, function () {
- return self;
- });
- return self;
- }
- (function (DOMUtils) {
- DOMUtils.DOM = DOMUtils(domGlobals.document);
- DOMUtils.nodeIndex = findNodeIndex;
- }(DOMUtils || (DOMUtils = {})));
- var DOMUtils$1 = DOMUtils;
-
- var DOM = DOMUtils$1.DOM;
- var each$6 = Tools.each, grep$2 = Tools.grep;
- var isFunction$1 = function (f) {
- return typeof f === 'function';
- };
- var ScriptLoader = function () {
- var QUEUED = 0;
- var LOADING = 1;
- var LOADED = 2;
- var FAILED = 3;
- var states = {};
- var queue = [];
- var scriptLoadedCallbacks = {};
- var queueLoadedCallbacks = [];
- var loading = 0;
- var loadScript = function (url, success, failure) {
- var dom = DOM;
- var elm, id;
- var done = function () {
- dom.remove(id);
- if (elm) {
- elm.onreadystatechange = elm.onload = elm = null;
- }
- success();
- };
- var error = function () {
- if (isFunction$1(failure)) {
- failure();
- } else {
- if (typeof console !== 'undefined' && console.log) {
- console.log('Failed to load script: ' + url);
- }
- }
- };
- id = dom.uniqueId();
- elm = domGlobals.document.createElement('script');
- elm.id = id;
- elm.type = 'text/javascript';
- elm.src = Tools._addCacheSuffix(url);
- elm.onload = done;
- elm.onerror = error;
- (domGlobals.document.getElementsByTagName('head')[0] || domGlobals.document.body).appendChild(elm);
- };
- this.isDone = function (url) {
- return states[url] === LOADED;
- };
- this.markDone = function (url) {
- states[url] = LOADED;
- };
- this.add = this.load = function (url, success, scope, failure) {
- var state = states[url];
- if (state === undefined) {
- queue.push(url);
- states[url] = QUEUED;
- }
- if (success) {
- if (!scriptLoadedCallbacks[url]) {
- scriptLoadedCallbacks[url] = [];
- }
- scriptLoadedCallbacks[url].push({
- success: success,
- failure: failure,
- scope: scope || this
- });
- }
- };
- this.remove = function (url) {
- delete states[url];
- delete scriptLoadedCallbacks[url];
- };
- this.loadQueue = function (success, scope, failure) {
- this.loadScripts(queue, success, scope, failure);
- };
- this.loadScripts = function (scripts, success, scope, failure) {
- var loadScripts;
- var failures = [];
- var execCallbacks = function (name, url) {
- each$6(scriptLoadedCallbacks[url], function (callback) {
- if (isFunction$1(callback[name])) {
- callback[name].call(callback.scope);
- }
- });
- scriptLoadedCallbacks[url] = undefined;
- };
- queueLoadedCallbacks.push({
- success: success,
- failure: failure,
- scope: scope || this
- });
- loadScripts = function () {
- var loadingScripts = grep$2(scripts);
- scripts.length = 0;
- each$6(loadingScripts, function (url) {
- if (states[url] === LOADED) {
- execCallbacks('success', url);
- return;
- }
- if (states[url] === FAILED) {
- execCallbacks('failure', url);
- return;
- }
- if (states[url] !== LOADING) {
- states[url] = LOADING;
- loading++;
- loadScript(url, function () {
- states[url] = LOADED;
- loading--;
- execCallbacks('success', url);
- loadScripts();
- }, function () {
- states[url] = FAILED;
- loading--;
- failures.push(url);
- execCallbacks('failure', url);
- loadScripts();
- });
- }
- });
- if (!loading) {
- var notifyCallbacks = queueLoadedCallbacks.slice(0);
- queueLoadedCallbacks.length = 0;
- each$6(notifyCallbacks, function (callback) {
- if (failures.length === 0) {
- if (isFunction$1(callback.success)) {
- callback.success.call(callback.scope);
- }
- } else {
- if (isFunction$1(callback.failure)) {
- callback.failure.call(callback.scope, failures);
- }
- }
- });
- }
- };
- loadScripts();
- };
- };
- ScriptLoader.ScriptLoader = new ScriptLoader();
-
- var each$7 = Tools.each;
- function AddOnManager() {
- var _this = this;
- var items = [];
- var urls = {};
- var lookup = {};
- var _listeners = [];
- var get = function (name) {
- if (lookup[name]) {
- return lookup[name].instance;
- }
- return undefined;
- };
- var dependencies = function (name) {
- var result;
- if (lookup[name]) {
- result = lookup[name].dependencies;
- }
- return result || [];
- };
- var requireLangPack = function (name, languages) {
- var language = AddOnManager.language;
- if (language && AddOnManager.languageLoad !== false) {
- if (languages) {
- languages = ',' + languages + ',';
- if (languages.indexOf(',' + language.substr(0, 2) + ',') !== -1) {
- language = language.substr(0, 2);
- } else if (languages.indexOf(',' + language + ',') === -1) {
- return;
- }
- }
- ScriptLoader.ScriptLoader.add(urls[name] + '/langs/' + language + '.js');
- }
- };
- var add = function (id, addOn, dependencies) {
- items.push(addOn);
- lookup[id] = {
- instance: addOn,
- dependencies: dependencies
- };
- var result = partition(_listeners, function (listener) {
- return listener.name === id;
- });
- _listeners = result.fail;
- each$7(result.pass, function (listener) {
- listener.callback();
- });
- return addOn;
- };
- var remove = function (name) {
- delete urls[name];
- delete lookup[name];
- };
- var createUrl = function (baseUrl, dep) {
- if (typeof dep === 'object') {
- return dep;
- }
- return typeof baseUrl === 'string' ? {
- prefix: '',
- resource: dep,
- suffix: ''
- } : {
- prefix: baseUrl.prefix,
- resource: dep,
- suffix: baseUrl.suffix
- };
- };
- var addComponents = function (pluginName, scripts) {
- var pluginUrl = _this.urls[pluginName];
- each$7(scripts, function (script) {
- ScriptLoader.ScriptLoader.add(pluginUrl + '/' + script);
- });
- };
- var loadDependencies = function (name, addOnUrl, success, scope) {
- var deps = dependencies(name);
- each$7(deps, function (dep) {
- var newUrl = createUrl(addOnUrl, dep);
- load(newUrl.resource, newUrl, undefined, undefined);
- });
- if (success) {
- if (scope) {
- success.call(scope);
- } else {
- success.call(ScriptLoader);
- }
- }
- };
- var load = function (name, addOnUrl, success, scope, failure) {
- if (urls[name]) {
- return;
- }
- var urlString = typeof addOnUrl === 'string' ? addOnUrl : addOnUrl.prefix + addOnUrl.resource + addOnUrl.suffix;
- if (urlString.indexOf('/') !== 0 && urlString.indexOf('://') === -1) {
- urlString = AddOnManager.baseURL + '/' + urlString;
- }
- urls[name] = urlString.substring(0, urlString.lastIndexOf('/'));
- if (lookup[name]) {
- loadDependencies(name, addOnUrl, success, scope);
- } else {
- ScriptLoader.ScriptLoader.add(urlString, function () {
- return loadDependencies(name, addOnUrl, success, scope);
- }, scope, failure);
- }
- };
- var waitFor = function (name, callback) {
- if (lookup.hasOwnProperty(name)) {
- callback();
- } else {
- _listeners.push({
- name: name,
- callback: callback
- });
- }
- };
- return {
- items: items,
- urls: urls,
- lookup: lookup,
- _listeners: _listeners,
- get: get,
- dependencies: dependencies,
- requireLangPack: requireLangPack,
- add: add,
- remove: remove,
- createUrl: createUrl,
- addComponents: addComponents,
- load: load,
- waitFor: waitFor
- };
- }
- (function (AddOnManager) {
- AddOnManager.PluginManager = AddOnManager();
- AddOnManager.ThemeManager = AddOnManager();
- }(AddOnManager || (AddOnManager = {})));
-
- var before = function (marker, element) {
- var parent$1 = parent(marker);
- parent$1.each(function (v) {
- v.dom().insertBefore(element.dom(), marker.dom());
- });
- };
- var after = function (marker, element) {
- var sibling = nextSibling(marker);
- sibling.fold(function () {
- var parent$1 = parent(marker);
- parent$1.each(function (v) {
- append(v, element);
- });
- }, function (v) {
- before(v, element);
- });
- };
- var prepend = function (parent, element) {
- var firstChild$1 = firstChild(parent);
- firstChild$1.fold(function () {
- append(parent, element);
- }, function (v) {
- parent.dom().insertBefore(element.dom(), v.dom());
- });
- };
- var append = function (parent, element) {
- parent.dom().appendChild(element.dom());
- };
- var wrap$1 = function (element, wrapper) {
- before(element, wrapper);
- append(wrapper, element);
- };
-
- var before$1 = function (marker, elements) {
- each(elements, function (x) {
- before(marker, x);
- });
- };
- var append$1 = function (parent, elements) {
- each(elements, function (x) {
- append(parent, x);
- });
- };
-
- var empty = function (element) {
- element.dom().textContent = '';
- each(children(element), function (rogue) {
- remove$1(rogue);
- });
- };
- var remove$1 = function (element) {
- var dom = element.dom();
- if (dom.parentNode !== null) {
- dom.parentNode.removeChild(dom);
- }
- };
- var unwrap = function (wrapper) {
- var children$1 = children(wrapper);
- if (children$1.length > 0) {
- before$1(wrapper, children$1);
- }
- remove$1(wrapper);
- };
-
- var first = function (fn, rate) {
- var timer = null;
- var cancel = function () {
- if (timer !== null) {
- domGlobals.clearTimeout(timer);
- timer = null;
- }
- };
- var throttle = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (timer === null) {
- timer = domGlobals.setTimeout(function () {
- fn.apply(null, args);
- timer = null;
- }, rate);
- }
- };
- return {
- cancel: cancel,
- throttle: throttle
- };
- };
- var last$2 = function (fn, rate) {
- var timer = null;
- var cancel = function () {
- if (timer !== null) {
- domGlobals.clearTimeout(timer);
- timer = null;
- }
- };
- var throttle = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (timer !== null) {
- domGlobals.clearTimeout(timer);
- }
- timer = domGlobals.setTimeout(function () {
- fn.apply(null, args);
- timer = null;
- }, rate);
- };
- return {
- cancel: cancel,
- throttle: throttle
- };
- };
-
- var Cell = function (initial) {
- var value = initial;
- var get = function () {
- return value;
- };
- var set = function (v) {
- value = v;
- };
- var clone = function () {
- return Cell(get());
- };
- return {
- get: get,
- set: set,
- clone: clone
- };
- };
-
- var read = function (element, attr) {
- var value = get(element, attr);
- return value === undefined || value === '' ? [] : value.split(' ');
- };
- var add = function (element, attr, id) {
- var old = read(element, attr);
- var nu = old.concat([id]);
- set(element, attr, nu.join(' '));
- return true;
- };
- var remove$2 = function (element, attr, id) {
- var nu = filter(read(element, attr), function (v) {
- return v !== id;
- });
- if (nu.length > 0) {
- set(element, attr, nu.join(' '));
- } else {
- remove(element, attr);
- }
- return false;
- };
-
- var supports = function (element) {
- return element.dom().classList !== undefined;
- };
- var get$2 = function (element) {
- return read(element, 'class');
- };
- var add$1 = function (element, clazz) {
- return add(element, 'class', clazz);
- };
- var remove$3 = function (element, clazz) {
- return remove$2(element, 'class', clazz);
- };
-
- var add$2 = function (element, clazz) {
- if (supports(element)) {
- element.dom().classList.add(clazz);
- } else {
- add$1(element, clazz);
- }
- };
- var cleanClass = function (element) {
- var classList = supports(element) ? element.dom().classList : get$2(element);
- if (classList.length === 0) {
- remove(element, 'class');
- }
- };
- var remove$4 = function (element, clazz) {
- if (supports(element)) {
- var classList = element.dom().classList;
- classList.remove(clazz);
- } else {
- remove$3(element, clazz);
- }
- cleanClass(element);
- };
- var has$2 = function (element, clazz) {
- return supports(element) && element.dom().classList.contains(clazz);
- };
-
- var descendants = function (scope, predicate) {
- var result = [];
- each(children(scope), function (x) {
- if (predicate(x)) {
- result = result.concat([x]);
- }
- result = result.concat(descendants(x, predicate));
- });
- return result;
- };
-
- var descendants$1 = function (scope, selector) {
- return all(selector, scope);
- };
-
- function ClosestOrAncestor (is, ancestor, scope, a, isRoot) {
- return is(scope, a) ? Option.some(scope) : isFunction(isRoot) && isRoot(scope) ? Option.none() : ancestor(scope, a, isRoot);
- }
-
- var ancestor = function (scope, predicate, isRoot) {
- var element = scope.dom();
- var stop = isFunction(isRoot) ? isRoot : constant(false);
- while (element.parentNode) {
- element = element.parentNode;
- var el = Element.fromDom(element);
- if (predicate(el)) {
- return Option.some(el);
- } else if (stop(el)) {
- break;
- }
- }
- return Option.none();
- };
- var closest = function (scope, predicate, isRoot) {
- var is = function (s, test) {
- return test(s);
- };
- return ClosestOrAncestor(is, ancestor, scope, predicate, isRoot);
- };
-
- var ancestor$1 = function (scope, selector, isRoot) {
- return ancestor(scope, function (e) {
- return is$1(e, selector);
- }, isRoot);
- };
- var descendant = function (scope, selector) {
- return one(selector, scope);
- };
- var closest$1 = function (scope, selector, isRoot) {
- return ClosestOrAncestor(is$1, ancestor$1, scope, selector, isRoot);
- };
-
- var annotation = constant('mce-annotation');
- var dataAnnotation = constant('data-mce-annotation');
- var dataAnnotationId = constant('data-mce-annotation-uid');
-
- var identify = function (editor, annotationName) {
- var rng = editor.selection.getRng();
- var start = Element.fromDom(rng.startContainer);
- var root = Element.fromDom(editor.getBody());
- var selector = annotationName.fold(function () {
- return '.' + annotation();
- }, function (an) {
- return '[' + dataAnnotation() + '="' + an + '"]';
- });
- var newStart = child(start, rng.startOffset).getOr(start);
- var closest = closest$1(newStart, selector, function (n) {
- return eq(n, root);
- });
- var getAttr = function (c, property) {
- if (has$1(c, property)) {
- return Option.some(get(c, property));
- } else {
- return Option.none();
- }
- };
- return closest.bind(function (c) {
- return getAttr(c, '' + dataAnnotationId()).bind(function (uid) {
- return getAttr(c, '' + dataAnnotation()).map(function (name) {
- var elements = findMarkers(editor, uid);
- return {
- uid: uid,
- name: name,
- elements: elements
- };
- });
- });
- });
- };
- var isAnnotation = function (elem) {
- return isElement(elem) && has$2(elem, annotation());
- };
- var findMarkers = function (editor, uid) {
- var body = Element.fromDom(editor.getBody());
- return descendants$1(body, '[' + dataAnnotationId() + '="' + uid + '"]');
- };
- var findAll = function (editor, name) {
- var body = Element.fromDom(editor.getBody());
- var markers = descendants$1(body, '[' + dataAnnotation() + '="' + name + '"]');
- var directory = {};
- each(markers, function (m) {
- var uid = get(m, dataAnnotationId());
- var nodesAlready = directory.hasOwnProperty(uid) ? directory[uid] : [];
- directory[uid] = nodesAlready.concat([m]);
- });
- return directory;
- };
-
- var setup = function (editor, registry) {
- var changeCallbacks = Cell({});
- var initData = function () {
- return {
- listeners: [],
- previous: Cell(Option.none())
- };
- };
- var withCallbacks = function (name, f) {
- updateCallbacks(name, function (data) {
- f(data);
- return data;
- });
- };
- var updateCallbacks = function (name, f) {
- var callbackMap = changeCallbacks.get();
- var data = callbackMap.hasOwnProperty(name) ? callbackMap[name] : initData();
- var outputData = f(data);
- callbackMap[name] = outputData;
- changeCallbacks.set(callbackMap);
- };
- var fireCallbacks = function (name, uid, elements) {
- withCallbacks(name, function (data) {
- each(data.listeners, function (f) {
- return f(true, name, {
- uid: uid,
- nodes: map(elements, function (elem) {
- return elem.dom();
- })
- });
- });
- });
- };
- var fireNoAnnotation = function (name) {
- withCallbacks(name, function (data) {
- each(data.listeners, function (f) {
- return f(false, name);
- });
- });
- };
- var onNodeChange = last$2(function () {
- var callbackMap = changeCallbacks.get();
- var annotations = sort(keys(callbackMap));
- each(annotations, function (name) {
- updateCallbacks(name, function (data) {
- var prev = data.previous.get();
- identify(editor, Option.some(name)).fold(function () {
- if (prev.isSome()) {
- fireNoAnnotation(name);
- data.previous.set(Option.none());
- }
- }, function (_a) {
- var uid = _a.uid, name = _a.name, elements = _a.elements;
- if (!prev.is(uid)) {
- fireCallbacks(name, uid, elements);
- data.previous.set(Option.some(uid));
- }
- });
- return {
- previous: data.previous,
- listeners: data.listeners
- };
- });
- });
- }, 30);
- editor.on('remove', function () {
- onNodeChange.cancel();
- });
- editor.on('nodeChange', function () {
- onNodeChange.throttle();
- });
- var addListener = function (name, f) {
- updateCallbacks(name, function (data) {
- return {
- previous: data.previous,
- listeners: data.listeners.concat([f])
- };
- });
- };
- return { addListener: addListener };
- };
-
- var setup$1 = function (editor, registry) {
- var identifyParserNode = function (span) {
- var optAnnotation = Option.from(span.attributes.map[dataAnnotation()]);
- return optAnnotation.bind(registry.lookup);
- };
- editor.on('init', function () {
- editor.serializer.addNodeFilter('span', function (spans) {
- each(spans, function (span) {
- identifyParserNode(span).each(function (settings) {
- if (settings.persistent === false) {
- span.unwrap();
- }
- });
- });
- });
- });
- };
-
- var create$1 = function () {
- var annotations = {};
- var register = function (name, settings) {
- annotations[name] = {
- name: name,
- settings: settings
- };
- };
- var lookup = function (name) {
- return annotations.hasOwnProperty(name) ? Option.from(annotations[name]).map(function (a) {
- return a.settings;
- }) : Option.none();
- };
- return {
- register: register,
- lookup: lookup
- };
- };
-
- var __assign = function () {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s)
- if (Object.prototype.hasOwnProperty.call(s, p))
- t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
- function __rest(s, e) {
- var t = {};
- for (var p in s)
- if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
- t[p] = s[p];
- if (s != null && typeof Object.getOwnPropertySymbols === 'function')
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
- t[p[i]] = s[p[i]];
- }
- return t;
- }
- function __spreadArrays() {
- for (var s = 0, i = 0, il = arguments.length; i < il; i++)
- s += arguments[i].length;
- for (var r = Array(s), k = 0, i = 0; i < il; i++)
- for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
- r[k] = a[j];
- return r;
- }
-
- var unique = 0;
- var generate = function (prefix) {
- var date = new Date();
- var time = date.getTime();
- var random = Math.floor(Math.random() * 1000000000);
- unique++;
- return prefix + '_' + random + unique + String(time);
- };
-
- var add$3 = function (element, classes) {
- each(classes, function (x) {
- add$2(element, x);
- });
- };
-
- var clone = function (original, isDeep) {
- return Element.fromDom(original.dom().cloneNode(isDeep));
- };
- var shallow = function (original) {
- return clone(original, false);
- };
- var deep = function (original) {
- return clone(original, true);
- };
-
- var fromHtml$1 = function (html, scope) {
- var doc = scope || domGlobals.document;
- var div = doc.createElement('div');
- div.innerHTML = html;
- return children(Element.fromDom(div));
- };
-
- var get$3 = function (element) {
- return element.dom().innerHTML;
- };
- var set$1 = function (element, content) {
- var owner$1 = owner(element);
- var docDom = owner$1.dom();
- var fragment = Element.fromDom(docDom.createDocumentFragment());
- var contentElements = fromHtml$1(content, docDom);
- append$1(fragment, contentElements);
- empty(element);
- append(element, fragment);
- };
-
- var ZWSP = '\uFEFF';
- var isZwsp = function (chr) {
- return chr === ZWSP;
- };
- var trim$3 = function (text) {
- return text.replace(new RegExp(ZWSP, 'g'), '');
- };
- var Zwsp = {
- isZwsp: isZwsp,
- ZWSP: ZWSP,
- trim: trim$3
- };
-
- var isElement$2 = NodeType.isElement;
- var isText$2 = NodeType.isText;
- var isCaretContainerBlock = function (node) {
- if (isText$2(node)) {
- node = node.parentNode;
- }
- return isElement$2(node) && node.hasAttribute('data-mce-caret');
- };
- var isCaretContainerInline = function (node) {
- return isText$2(node) && Zwsp.isZwsp(node.data);
- };
- var isCaretContainer = function (node) {
- return isCaretContainerBlock(node) || isCaretContainerInline(node);
- };
- var hasContent = function (node) {
- return node.firstChild !== node.lastChild || !NodeType.isBr(node.firstChild);
- };
- var insertInline = function (node, before) {
- var doc, sibling, textNode, parentNode;
- doc = node.ownerDocument;
- textNode = doc.createTextNode(Zwsp.ZWSP);
- parentNode = node.parentNode;
- if (!before) {
- sibling = node.nextSibling;
- if (isText$2(sibling)) {
- if (isCaretContainer(sibling)) {
- return sibling;
- }
- if (startsWithCaretContainer(sibling)) {
- sibling.splitText(1);
- return sibling;
- }
- }
- if (node.nextSibling) {
- parentNode.insertBefore(textNode, node.nextSibling);
- } else {
- parentNode.appendChild(textNode);
- }
- } else {
- sibling = node.previousSibling;
- if (isText$2(sibling)) {
- if (isCaretContainer(sibling)) {
- return sibling;
- }
- if (endsWithCaretContainer(sibling)) {
- return sibling.splitText(sibling.data.length - 1);
- }
- }
- parentNode.insertBefore(textNode, node);
- }
- return textNode;
- };
- var isBeforeInline = function (pos) {
- var container = pos.container();
- if (!pos || !NodeType.isText(container)) {
- return false;
- }
- return container.data.charAt(pos.offset()) === Zwsp.ZWSP || pos.isAtStart() && isCaretContainerInline(container.previousSibling);
- };
- var isAfterInline = function (pos) {
- var container = pos.container();
- if (!pos || !NodeType.isText(container)) {
- return false;
- }
- return container.data.charAt(pos.offset() - 1) === Zwsp.ZWSP || pos.isAtEnd() && isCaretContainerInline(container.nextSibling);
- };
- var createBogusBr = function () {
- var br = domGlobals.document.createElement('br');
- br.setAttribute('data-mce-bogus', '1');
- return br;
- };
- var insertBlock = function (blockName, node, before) {
- var doc, blockNode, parentNode;
- doc = node.ownerDocument;
- blockNode = doc.createElement(blockName);
- blockNode.setAttribute('data-mce-caret', before ? 'before' : 'after');
- blockNode.setAttribute('data-mce-bogus', 'all');
- blockNode.appendChild(createBogusBr());
- parentNode = node.parentNode;
- if (!before) {
- if (node.nextSibling) {
- parentNode.insertBefore(blockNode, node.nextSibling);
- } else {
- parentNode.appendChild(blockNode);
- }
- } else {
- parentNode.insertBefore(blockNode, node);
- }
- return blockNode;
- };
- var startsWithCaretContainer = function (node) {
- return isText$2(node) && node.data[0] === Zwsp.ZWSP;
- };
- var endsWithCaretContainer = function (node) {
- return isText$2(node) && node.data[node.data.length - 1] === Zwsp.ZWSP;
- };
- var trimBogusBr = function (elm) {
- var brs = elm.getElementsByTagName('br');
- var lastBr = brs[brs.length - 1];
- if (NodeType.isBogus(lastBr)) {
- lastBr.parentNode.removeChild(lastBr);
- }
- };
- var showCaretContainerBlock = function (caretContainer) {
- if (caretContainer && caretContainer.hasAttribute('data-mce-caret')) {
- trimBogusBr(caretContainer);
- caretContainer.removeAttribute('data-mce-caret');
- caretContainer.removeAttribute('data-mce-bogus');
- caretContainer.removeAttribute('style');
- caretContainer.removeAttribute('_moz_abspos');
- return caretContainer;
- }
- return null;
- };
- var isRangeInCaretContainerBlock = function (range) {
- return isCaretContainerBlock(range.startContainer);
- };
-
- var isContentEditableTrue$1 = NodeType.isContentEditableTrue;
- var isContentEditableFalse$1 = NodeType.isContentEditableFalse;
- var isBr$2 = NodeType.isBr;
- var isText$3 = NodeType.isText;
- var isInvalidTextElement = NodeType.matchNodeNames('script style textarea');
- var isAtomicInline = NodeType.matchNodeNames('img input textarea hr iframe video audio object');
- var isTable$1 = NodeType.matchNodeNames('table');
- var isCaretContainer$1 = isCaretContainer;
- var isCaretCandidate = function (node) {
- if (isCaretContainer$1(node)) {
- return false;
- }
- if (isText$3(node)) {
- if (isInvalidTextElement(node.parentNode)) {
- return false;
- }
- return true;
- }
- return isAtomicInline(node) || isBr$2(node) || isTable$1(node) || isNonUiContentEditableFalse(node);
- };
- var isUnselectable = function (node) {
- return NodeType.isElement(node) && node.getAttribute('unselectable') === 'true';
- };
- var isNonUiContentEditableFalse = function (node) {
- return isUnselectable(node) === false && isContentEditableFalse$1(node);
- };
- var isInEditable = function (node, root) {
- for (node = node.parentNode; node && node !== root; node = node.parentNode) {
- if (isNonUiContentEditableFalse(node)) {
- return false;
- }
- if (isContentEditableTrue$1(node)) {
- return true;
- }
- }
- return true;
- };
- var isAtomicContentEditableFalse = function (node) {
- if (!isNonUiContentEditableFalse(node)) {
- return false;
- }
- return foldl(from$1(node.getElementsByTagName('*')), function (result, elm) {
- return result || isContentEditableTrue$1(elm);
- }, false) !== true;
- };
- var isAtomic = function (node) {
- return isAtomicInline(node) || isAtomicContentEditableFalse(node);
- };
- var isEditableCaretCandidate = function (node, root) {
- return isCaretCandidate(node) && isInEditable(node, root);
- };
-
- var round = Math.round;
- var clone$1 = function (rect) {
- if (!rect) {
- return {
- left: 0,
- top: 0,
- bottom: 0,
- right: 0,
- width: 0,
- height: 0
- };
- }
- return {
- left: round(rect.left),
- top: round(rect.top),
- bottom: round(rect.bottom),
- right: round(rect.right),
- width: round(rect.width),
- height: round(rect.height)
- };
- };
- var collapse = function (rect, toStart) {
- rect = clone$1(rect);
- if (toStart) {
- rect.right = rect.left;
- } else {
- rect.left = rect.left + rect.width;
- rect.right = rect.left;
- }
- rect.width = 0;
- return rect;
- };
- var isEqual = function (rect1, rect2) {
- return rect1.left === rect2.left && rect1.top === rect2.top && rect1.bottom === rect2.bottom && rect1.right === rect2.right;
- };
- var isValidOverflow = function (overflowY, rect1, rect2) {
- return overflowY >= 0 && overflowY <= Math.min(rect1.height, rect2.height) / 2;
- };
- var isAbove = function (rect1, rect2) {
- var halfHeight = Math.min(rect2.height / 2, rect1.height / 2);
- if (rect1.bottom - halfHeight < rect2.top) {
- return true;
- }
- if (rect1.top > rect2.bottom) {
- return false;
- }
- return isValidOverflow(rect2.top - rect1.bottom, rect1, rect2);
- };
- var isBelow = function (rect1, rect2) {
- if (rect1.top > rect2.bottom) {
- return true;
- }
- if (rect1.bottom < rect2.top) {
- return false;
- }
- return isValidOverflow(rect2.bottom - rect1.top, rect1, rect2);
- };
- var containsXY = function (rect, clientX, clientY) {
- return clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom;
- };
- var overflowX = function (outer, inner) {
- if (inner.left > outer.left && inner.right < outer.right) {
- return 0;
- } else {
- return inner.left < outer.left ? inner.left - outer.left : inner.right - outer.right;
- }
- };
- var overflowY = function (outer, inner) {
- if (inner.top > outer.top && inner.bottom < outer.bottom) {
- return 0;
- } else {
- return inner.top < outer.top ? inner.top - outer.top : inner.bottom - outer.bottom;
- }
- };
- var getOverflow = function (outer, inner) {
- return {
- x: overflowX(outer, inner),
- y: overflowY(outer, inner)
- };
- };
-
- var getSelectedNode = function (range) {
- var startContainer = range.startContainer, startOffset = range.startOffset;
- if (startContainer.hasChildNodes() && range.endOffset === startOffset + 1) {
- return startContainer.childNodes[startOffset];
- }
- return null;
- };
- var getNode = function (container, offset) {
- if (container.nodeType === 1 && container.hasChildNodes()) {
- if (offset >= container.childNodes.length) {
- offset = container.childNodes.length - 1;
- }
- container = container.childNodes[offset];
- }
- return container;
- };
-
- var extendingChars = new RegExp('[\u0300-\u036f\u0483-\u0487\u0488-\u0489\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a' + '\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0' + '\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e3-\u0902\u093a\u093c' + '\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2-\u09e3' + '\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc' + '\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57' + '\u0b62-\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56' + '\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc-\u0ccd\u0cd5-\u0cd6\u0ce2-\u0ce3\u0d01\u0d3e\u0d41-\u0d44' + '\u0d4d\u0d57\u0d62-\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9' + '\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97' + '\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074' + '\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5' + '\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18' + '\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1ABE\u1b00-\u1b03\u1b34' + '\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9' + '\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9' + '\u1dc0-\u1df5\u1dfc-\u1dff\u200c-\u200d\u20d0-\u20dc\u20DD-\u20E0\u20e1\u20E2-\u20E4\u20e5-\u20f0\u2cef-\u2cf1' + '\u2d7f\u2de0-\u2dff\u302a-\u302d\u302e-\u302f\u3099-\u309a\ua66f\uA670-\uA672\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1' + '\ua802\ua806\ua80b\ua825-\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc' + '\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1' + '\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\uff9e-\uff9f]');
- var isExtendingChar = function (ch) {
- return typeof ch === 'string' && ch.charCodeAt(0) >= 768 && extendingChars.test(ch);
- };
-
- var lift2 = function (oa, ob, f) {
- return oa.isSome() && ob.isSome() ? Option.some(f(oa.getOrDie(), ob.getOrDie())) : Option.none();
- };
- var lift3 = function (oa, ob, oc, f) {
- return oa.isSome() && ob.isSome() && oc.isSome() ? Option.some(f(oa.getOrDie(), ob.getOrDie(), oc.getOrDie())) : Option.none();
- };
-
- var slice$2 = [].slice;
- var or = function () {
- var x = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- x[_i] = arguments[_i];
- }
- var args = slice$2.call(arguments);
- return function (x) {
- for (var i = 0; i < args.length; i++) {
- if (args[i](x)) {
- return true;
- }
- }
- return false;
- };
- };
- var and = function () {
- var x = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- x[_i] = arguments[_i];
- }
- var args = slice$2.call(arguments);
- return function (x) {
- for (var i = 0; i < args.length; i++) {
- if (!args[i](x)) {
- return false;
- }
- }
- return true;
- };
- };
- var Predicate = {
- and: and,
- or: or
- };
-
- var isElement$3 = NodeType.isElement;
- var isCaretCandidate$1 = isCaretCandidate;
- var isBlock$1 = NodeType.matchStyleValues('display', 'block table');
- var isFloated = NodeType.matchStyleValues('float', 'left right');
- var isValidElementCaretCandidate = Predicate.and(isElement$3, isCaretCandidate$1, not(isFloated));
- var isNotPre = not(NodeType.matchStyleValues('white-space', 'pre pre-line pre-wrap'));
- var isText$4 = NodeType.isText;
- var isBr$3 = NodeType.isBr;
- var nodeIndex = DOMUtils$1.nodeIndex;
- var resolveIndex = getNode;
- var createRange = function (doc) {
- return 'createRange' in doc ? doc.createRange() : DOMUtils$1.DOM.createRng();
- };
- var isWhiteSpace = function (chr) {
- return chr && /[\r\n\t ]/.test(chr);
- };
- var isRange = function (rng) {
- return !!rng.setStart && !!rng.setEnd;
- };
- var isHiddenWhiteSpaceRange = function (range) {
- var container = range.startContainer;
- var offset = range.startOffset;
- var text;
- if (isWhiteSpace(range.toString()) && isNotPre(container.parentNode) && NodeType.isText(container)) {
- text = container.data;
- if (isWhiteSpace(text[offset - 1]) || isWhiteSpace(text[offset + 1])) {
- return true;
- }
- }
- return false;
- };
- var getBrClientRect = function (brNode) {
- var doc = brNode.ownerDocument;
- var rng = createRange(doc);
- var nbsp = doc.createTextNode('\xA0');
- var parentNode = brNode.parentNode;
- var clientRect;
- parentNode.insertBefore(nbsp, brNode);
- rng.setStart(nbsp, 0);
- rng.setEnd(nbsp, 1);
- clientRect = clone$1(rng.getBoundingClientRect());
- parentNode.removeChild(nbsp);
- return clientRect;
- };
- var getBoundingClientRectWebKitText = function (rng) {
- var sc = rng.startContainer;
- var ec = rng.endContainer;
- var so = rng.startOffset;
- var eo = rng.endOffset;
- if (sc === ec && NodeType.isText(ec) && so === 0 && eo === 1) {
- var newRng = rng.cloneRange();
- newRng.setEndAfter(ec);
- return getBoundingClientRect(newRng);
- } else {
- return null;
- }
- };
- var isZeroRect = function (r) {
- return r.left === 0 && r.right === 0 && r.top === 0 && r.bottom === 0;
- };
- var getBoundingClientRect = function (item) {
- var clientRect, clientRects;
- clientRects = item.getClientRects();
- if (clientRects.length > 0) {
- clientRect = clone$1(clientRects[0]);
- } else {
- clientRect = clone$1(item.getBoundingClientRect());
- }
- if (!isRange(item) && isBr$3(item) && isZeroRect(clientRect)) {
- return getBrClientRect(item);
- }
- if (isZeroRect(clientRect) && isRange(item)) {
- return getBoundingClientRectWebKitText(item);
- }
- return clientRect;
- };
- var collapseAndInflateWidth = function (clientRect, toStart) {
- var newClientRect = collapse(clientRect, toStart);
- newClientRect.width = 1;
- newClientRect.right = newClientRect.left + 1;
- return newClientRect;
- };
- var getCaretPositionClientRects = function (caretPosition) {
- var clientRects = [];
- var beforeNode, node;
- var addUniqueAndValidRect = function (clientRect) {
- if (clientRect.height === 0) {
- return;
- }
- if (clientRects.length > 0) {
- if (isEqual(clientRect, clientRects[clientRects.length - 1])) {
- return;
- }
- }
- clientRects.push(clientRect);
- };
- var addCharacterOffset = function (container, offset) {
- var range = createRange(container.ownerDocument);
- if (offset < container.data.length) {
- if (isExtendingChar(container.data[offset])) {
- return clientRects;
- }
- if (isExtendingChar(container.data[offset - 1])) {
- range.setStart(container, offset);
- range.setEnd(container, offset + 1);
- if (!isHiddenWhiteSpaceRange(range)) {
- addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(range), false));
- return clientRects;
- }
- }
- }
- if (offset > 0) {
- range.setStart(container, offset - 1);
- range.setEnd(container, offset);
- if (!isHiddenWhiteSpaceRange(range)) {
- addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(range), false));
- }
- }
- if (offset < container.data.length) {
- range.setStart(container, offset);
- range.setEnd(container, offset + 1);
- if (!isHiddenWhiteSpaceRange(range)) {
- addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(range), true));
- }
- }
- };
- if (isText$4(caretPosition.container())) {
- addCharacterOffset(caretPosition.container(), caretPosition.offset());
- return clientRects;
- }
- if (isElement$3(caretPosition.container())) {
- if (caretPosition.isAtEnd()) {
- node = resolveIndex(caretPosition.container(), caretPosition.offset());
- if (isText$4(node)) {
- addCharacterOffset(node, node.data.length);
- }
- if (isValidElementCaretCandidate(node) && !isBr$3(node)) {
- addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(node), false));
- }
- } else {
- node = resolveIndex(caretPosition.container(), caretPosition.offset());
- if (isText$4(node)) {
- addCharacterOffset(node, 0);
- }
- if (isValidElementCaretCandidate(node) && caretPosition.isAtEnd()) {
- addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(node), false));
- return clientRects;
- }
- beforeNode = resolveIndex(caretPosition.container(), caretPosition.offset() - 1);
- if (isValidElementCaretCandidate(beforeNode) && !isBr$3(beforeNode)) {
- if (isBlock$1(beforeNode) || isBlock$1(node) || !isValidElementCaretCandidate(node)) {
- addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(beforeNode), false));
- }
- }
- if (isValidElementCaretCandidate(node)) {
- addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(node), true));
- }
- }
- }
- return clientRects;
- };
- function CaretPosition(container, offset, clientRects) {
- var isAtStart = function () {
- if (isText$4(container)) {
- return offset === 0;
- }
- return offset === 0;
- };
- var isAtEnd = function () {
- if (isText$4(container)) {
- return offset >= container.data.length;
- }
- return offset >= container.childNodes.length;
- };
- var toRange = function () {
- var range;
- range = createRange(container.ownerDocument);
- range.setStart(container, offset);
- range.setEnd(container, offset);
- return range;
- };
- var getClientRects = function () {
- if (!clientRects) {
- clientRects = getCaretPositionClientRects(CaretPosition(container, offset));
- }
- return clientRects;
- };
- var isVisible = function () {
- return getClientRects().length > 0;
- };
- var isEqual = function (caretPosition) {
- return caretPosition && container === caretPosition.container() && offset === caretPosition.offset();
- };
- var getNode = function (before) {
- return resolveIndex(container, before ? offset - 1 : offset);
- };
- return {
- container: constant(container),
- offset: constant(offset),
- toRange: toRange,
- getClientRects: getClientRects,
- isVisible: isVisible,
- isAtStart: isAtStart,
- isAtEnd: isAtEnd,
- isEqual: isEqual,
- getNode: getNode
- };
- }
- (function (CaretPosition) {
- CaretPosition.fromRangeStart = function (range) {
- return CaretPosition(range.startContainer, range.startOffset);
- };
- CaretPosition.fromRangeEnd = function (range) {
- return CaretPosition(range.endContainer, range.endOffset);
- };
- CaretPosition.after = function (node) {
- return CaretPosition(node.parentNode, nodeIndex(node) + 1);
- };
- CaretPosition.before = function (node) {
- return CaretPosition(node.parentNode, nodeIndex(node));
- };
- CaretPosition.isAbove = function (pos1, pos2) {
- return lift2(head(pos2.getClientRects()), last(pos1.getClientRects()), isAbove).getOr(false);
- };
- CaretPosition.isBelow = function (pos1, pos2) {
- return lift2(last(pos2.getClientRects()), head(pos1.getClientRects()), isBelow).getOr(false);
- };
- CaretPosition.isAtStart = function (pos) {
- return pos ? pos.isAtStart() : false;
- };
- CaretPosition.isAtEnd = function (pos) {
- return pos ? pos.isAtEnd() : false;
- };
- CaretPosition.isTextPosition = function (pos) {
- return pos ? NodeType.isText(pos.container()) : false;
- };
- CaretPosition.isElementPosition = function (pos) {
- return CaretPosition.isTextPosition(pos) === false;
- };
- }(CaretPosition || (CaretPosition = {})));
- var CaretPosition$1 = CaretPosition;
-
- var isText$5 = NodeType.isText;
- var isBogus$1 = NodeType.isBogus;
- var nodeIndex$1 = DOMUtils$1.nodeIndex;
- var normalizedParent = function (node) {
- var parentNode = node.parentNode;
- if (isBogus$1(parentNode)) {
- return normalizedParent(parentNode);
- }
- return parentNode;
- };
- var getChildNodes = function (node) {
- if (!node) {
- return [];
- }
- return ArrUtils.reduce(node.childNodes, function (result, node) {
- if (isBogus$1(node) && node.nodeName !== 'BR') {
- result = result.concat(getChildNodes(node));
- } else {
- result.push(node);
- }
- return result;
- }, []);
- };
- var normalizedTextOffset = function (node, offset) {
- while (node = node.previousSibling) {
- if (!isText$5(node)) {
- break;
- }
- offset += node.data.length;
- }
- return offset;
- };
- var equal = function (a) {
- return function (b) {
- return a === b;
- };
- };
- var normalizedNodeIndex = function (node) {
- var nodes, index, numTextFragments;
- nodes = getChildNodes(normalizedParent(node));
- index = ArrUtils.findIndex(nodes, equal(node), node);
- nodes = nodes.slice(0, index + 1);
- numTextFragments = ArrUtils.reduce(nodes, function (result, node, i) {
- if (isText$5(node) && isText$5(nodes[i - 1])) {
- result++;
- }
- return result;
- }, 0);
- nodes = ArrUtils.filter(nodes, NodeType.matchNodeNames(node.nodeName));
- index = ArrUtils.findIndex(nodes, equal(node), node);
- return index - numTextFragments;
- };
- var createPathItem = function (node) {
- var name;
- if (isText$5(node)) {
- name = 'text()';
- } else {
- name = node.nodeName.toLowerCase();
- }
- return name + '[' + normalizedNodeIndex(node) + ']';
- };
- var parentsUntil = function (root, node, predicate) {
- var parents = [];
- for (node = node.parentNode; node !== root; node = node.parentNode) {
- if (predicate && predicate(node)) {
- break;
- }
- parents.push(node);
- }
- return parents;
- };
- var create$2 = function (root, caretPosition) {
- var container, offset, path = [], outputOffset, childNodes, parents;
- container = caretPosition.container();
- offset = caretPosition.offset();
- if (isText$5(container)) {
- outputOffset = normalizedTextOffset(container, offset);
- } else {
- childNodes = container.childNodes;
- if (offset >= childNodes.length) {
- outputOffset = 'after';
- offset = childNodes.length - 1;
- } else {
- outputOffset = 'before';
- }
- container = childNodes[offset];
- }
- path.push(createPathItem(container));
- parents = parentsUntil(root, container);
- parents = ArrUtils.filter(parents, not(NodeType.isBogus));
- path = path.concat(ArrUtils.map(parents, function (node) {
- return createPathItem(node);
- }));
- return path.reverse().join('/') + ',' + outputOffset;
- };
- var resolvePathItem = function (node, name, index) {
- var nodes = getChildNodes(node);
- nodes = ArrUtils.filter(nodes, function (node, index) {
- return !isText$5(node) || !isText$5(nodes[index - 1]);
- });
- nodes = ArrUtils.filter(nodes, NodeType.matchNodeNames(name));
- return nodes[index];
- };
- var findTextPosition = function (container, offset) {
- var node = container, targetOffset = 0, dataLen;
- while (isText$5(node)) {
- dataLen = node.data.length;
- if (offset >= targetOffset && offset <= targetOffset + dataLen) {
- container = node;
- offset = offset - targetOffset;
- break;
- }
- if (!isText$5(node.nextSibling)) {
- container = node;
- offset = dataLen;
- break;
- }
- targetOffset += dataLen;
- node = node.nextSibling;
- }
- if (isText$5(container) && offset > container.data.length) {
- offset = container.data.length;
- }
- return CaretPosition$1(container, offset);
- };
- var resolve$2 = function (root, path) {
- var parts, container, offset;
- if (!path) {
- return null;
- }
- parts = path.split(',');
- path = parts[0].split('/');
- offset = parts.length > 1 ? parts[1] : 'before';
- container = ArrUtils.reduce(path, function (result, value) {
- value = /([\w\-\(\)]+)\[([0-9]+)\]/.exec(value);
- if (!value) {
- return null;
- }
- if (value[1] === 'text()') {
- value[1] = '#text';
- }
- return resolvePathItem(result, value[1], parseInt(value[2], 10));
- }, root);
- if (!container) {
- return null;
- }
- if (!isText$5(container)) {
- if (offset === 'after') {
- offset = nodeIndex$1(container) + 1;
- } else {
- offset = nodeIndex$1(container);
- }
- return CaretPosition$1(container.parentNode, offset);
- }
- return findTextPosition(container, parseInt(offset, 10));
- };
-
- var trimEmptyTextNode = function (dom, node) {
- if (NodeType.isText(node) && node.data.length === 0) {
- dom.remove(node);
- }
- };
- var insertNode = function (dom, rng, node) {
- rng.insertNode(node);
- trimEmptyTextNode(dom, node.previousSibling);
- trimEmptyTextNode(dom, node.nextSibling);
- };
- var insertFragment = function (dom, rng, frag) {
- var firstChild = Option.from(frag.firstChild);
- var lastChild = Option.from(frag.lastChild);
- rng.insertNode(frag);
- firstChild.each(function (child) {
- return trimEmptyTextNode(dom, child.previousSibling);
- });
- lastChild.each(function (child) {
- return trimEmptyTextNode(dom, child.nextSibling);
- });
- };
- var rangeInsertNode = function (dom, rng, node) {
- if (NodeType.isDocumentFragment(node)) {
- insertFragment(dom, rng, node);
- } else {
- insertNode(dom, rng, node);
- }
- };
-
- var isContentEditableFalse$2 = NodeType.isContentEditableFalse;
- var getNormalizedTextOffset = function (trim, container, offset) {
- var node, trimmedOffset;
- trimmedOffset = trim(container.data.slice(0, offset)).length;
- for (node = container.previousSibling; node && NodeType.isText(node); node = node.previousSibling) {
- trimmedOffset += trim(node.data).length;
- }
- return trimmedOffset;
- };
- var getPoint = function (dom, trim, normalized, rng, start) {
- var container = rng[start ? 'startContainer' : 'endContainer'];
- var offset = rng[start ? 'startOffset' : 'endOffset'];
- var point = [];
- var childNodes, after = 0;
- var root = dom.getRoot();
- if (NodeType.isText(container)) {
- point.push(normalized ? getNormalizedTextOffset(trim, container, offset) : offset);
- } else {
- childNodes = container.childNodes;
- if (offset >= childNodes.length && childNodes.length) {
- after = 1;
- offset = Math.max(0, childNodes.length - 1);
- }
- point.push(dom.nodeIndex(childNodes[offset], normalized) + after);
- }
- for (; container && container !== root; container = container.parentNode) {
- point.push(dom.nodeIndex(container, normalized));
- }
- return point;
- };
- var getLocation = function (trim, selection, normalized, rng) {
- var dom = selection.dom, bookmark = {};
- bookmark.start = getPoint(dom, trim, normalized, rng, true);
- if (!selection.isCollapsed()) {
- bookmark.end = getPoint(dom, trim, normalized, rng, false);
- }
- return bookmark;
- };
- var findIndex$2 = function (dom, name, element) {
- var count = 0;
- Tools.each(dom.select(name), function (node) {
- if (node.getAttribute('data-mce-bogus') === 'all') {
- return;
- }
- if (node === element) {
- return false;
- }
- count++;
- });
- return count;
- };
- var moveEndPoint = function (rng, start) {
- var container, offset, childNodes;
- var prefix = start ? 'start' : 'end';
- container = rng[prefix + 'Container'];
- offset = rng[prefix + 'Offset'];
- if (NodeType.isElement(container) && container.nodeName === 'TR') {
- childNodes = container.childNodes;
- container = childNodes[Math.min(start ? offset : offset - 1, childNodes.length - 1)];
- if (container) {
- offset = start ? 0 : container.childNodes.length;
- rng['set' + (start ? 'Start' : 'End')](container, offset);
- }
- }
- };
- var normalizeTableCellSelection = function (rng) {
- moveEndPoint(rng, true);
- moveEndPoint(rng, false);
- return rng;
- };
- var findSibling = function (node, offset) {
- var sibling;
- if (NodeType.isElement(node)) {
- node = getNode(node, offset);
- if (isContentEditableFalse$2(node)) {
- return node;
- }
- }
- if (isCaretContainer(node)) {
- if (NodeType.isText(node) && isCaretContainerBlock(node)) {
- node = node.parentNode;
- }
- sibling = node.previousSibling;
- if (isContentEditableFalse$2(sibling)) {
- return sibling;
- }
- sibling = node.nextSibling;
- if (isContentEditableFalse$2(sibling)) {
- return sibling;
- }
- }
- };
- var findAdjacentContentEditableFalseElm = function (rng) {
- return findSibling(rng.startContainer, rng.startOffset) || findSibling(rng.endContainer, rng.endOffset);
- };
- var getOffsetBookmark = function (trim, normalized, selection) {
- var element = selection.getNode();
- var name = element ? element.nodeName : null;
- var rng = selection.getRng();
- if (isContentEditableFalse$2(element) || name === 'IMG') {
- return {
- name: name,
- index: findIndex$2(selection.dom, name, element)
- };
- }
- var sibling = findAdjacentContentEditableFalseElm(rng);
- if (sibling) {
- name = sibling.tagName;
- return {
- name: name,
- index: findIndex$2(selection.dom, name, sibling)
- };
- }
- return getLocation(trim, selection, normalized, rng);
- };
- var getCaretBookmark = function (selection) {
- var rng = selection.getRng();
- return {
- start: create$2(selection.dom.getRoot(), CaretPosition$1.fromRangeStart(rng)),
- end: create$2(selection.dom.getRoot(), CaretPosition$1.fromRangeEnd(rng))
- };
- };
- var getRangeBookmark = function (selection) {
- return { rng: selection.getRng() };
- };
- var createBookmarkSpan = function (dom, id, filled) {
- var args = {
- 'data-mce-type': 'bookmark',
- 'id': id,
- 'style': 'overflow:hidden;line-height:0px'
- };
- return filled ? dom.create('span', args, '') : dom.create('span', args);
- };
- var getPersistentBookmark = function (selection, filled) {
- var dom = selection.dom;
- var rng = selection.getRng();
- var id = dom.uniqueId();
- var collapsed = selection.isCollapsed();
- var element = selection.getNode();
- var name = element.nodeName;
- if (name === 'IMG') {
- return {
- name: name,
- index: findIndex$2(dom, name, element)
- };
- }
- var rng2 = normalizeTableCellSelection(rng.cloneRange());
- if (!collapsed) {
- rng2.collapse(false);
- var endBookmarkNode = createBookmarkSpan(dom, id + '_end', filled);
- rangeInsertNode(dom, rng2, endBookmarkNode);
- }
- rng = normalizeTableCellSelection(rng);
- rng.collapse(true);
- var startBookmarkNode = createBookmarkSpan(dom, id + '_start', filled);
- rangeInsertNode(dom, rng, startBookmarkNode);
- selection.moveToBookmark({
- id: id,
- keep: 1
- });
- return { id: id };
- };
- var getBookmark = function (selection, type, normalized) {
- if (type === 2) {
- return getOffsetBookmark(Zwsp.trim, normalized, selection);
- } else if (type === 3) {
- return getCaretBookmark(selection);
- } else if (type) {
- return getRangeBookmark(selection);
- } else {
- return getPersistentBookmark(selection, false);
- }
- };
- var GetBookmark = {
- getBookmark: getBookmark,
- getUndoBookmark: curry(getOffsetBookmark, identity, true),
- getPersistentBookmark: getPersistentBookmark
- };
-
- var CARET_ID = '_mce_caret';
- var isCaretNode = function (node) {
- return NodeType.isElement(node) && node.id === CARET_ID;
- };
- var getParentCaretContainer = function (body, node) {
- while (node && node !== body) {
- if (node.id === CARET_ID) {
- return node;
- }
- node = node.parentNode;
- }
- return null;
- };
-
- var isElement$4 = NodeType.isElement;
- var isText$6 = NodeType.isText;
- var removeNode = function (node) {
- var parentNode = node.parentNode;
- if (parentNode) {
- parentNode.removeChild(node);
- }
- };
- var getNodeValue = function (node) {
- try {
- return node.nodeValue;
- } catch (ex) {
- return '';
- }
- };
- var setNodeValue = function (node, text) {
- if (text.length === 0) {
- removeNode(node);
- } else {
- node.nodeValue = text;
- }
- };
- var trimCount = function (text) {
- var trimmedText = Zwsp.trim(text);
- return {
- count: text.length - trimmedText.length,
- text: trimmedText
- };
- };
- var removeUnchanged = function (caretContainer, pos) {
- remove$5(caretContainer);
- return pos;
- };
- var removeTextAndReposition = function (caretContainer, pos) {
- var before = trimCount(caretContainer.data.substr(0, pos.offset()));
- var after = trimCount(caretContainer.data.substr(pos.offset()));
- var text = before.text + after.text;
- if (text.length > 0) {
- setNodeValue(caretContainer, text);
- return CaretPosition$1(caretContainer, pos.offset() - before.count);
- } else {
- return pos;
- }
- };
- var removeElementAndReposition = function (caretContainer, pos) {
- var parentNode = pos.container();
- var newPosition = indexOf(from$1(parentNode.childNodes), caretContainer).map(function (index) {
- return index < pos.offset() ? CaretPosition$1(parentNode, pos.offset() - 1) : pos;
- }).getOr(pos);
- remove$5(caretContainer);
- return newPosition;
- };
- var removeTextCaretContainer = function (caretContainer, pos) {
- return isText$6(caretContainer) && pos.container() === caretContainer ? removeTextAndReposition(caretContainer, pos) : removeUnchanged(caretContainer, pos);
- };
- var removeElementCaretContainer = function (caretContainer, pos) {
- return pos.container() === caretContainer.parentNode ? removeElementAndReposition(caretContainer, pos) : removeUnchanged(caretContainer, pos);
- };
- var removeAndReposition = function (container, pos) {
- return CaretPosition$1.isTextPosition(pos) ? removeTextCaretContainer(container, pos) : removeElementCaretContainer(container, pos);
- };
- var remove$5 = function (caretContainerNode) {
- if (isElement$4(caretContainerNode) && isCaretContainer(caretContainerNode)) {
- if (hasContent(caretContainerNode)) {
- caretContainerNode.removeAttribute('data-mce-caret');
- } else {
- removeNode(caretContainerNode);
- }
- }
- if (isText$6(caretContainerNode)) {
- var text = Zwsp.trim(getNodeValue(caretContainerNode));
- setNodeValue(caretContainerNode, text);
- }
- };
- var CaretContainerRemove = {
- removeAndReposition: removeAndReposition,
- remove: remove$5
- };
-
- var browser$2 = PlatformDetection$1.detect().browser;
- var isContentEditableFalse$3 = NodeType.isContentEditableFalse;
- var isTableCell$1 = function (node) {
- return NodeType.isElement(node) && /^(TD|TH)$/i.test(node.tagName);
- };
- var getAbsoluteClientRect = function (root, element, before) {
- var clientRect = collapse(element.getBoundingClientRect(), before);
- var docElm, scrollX, scrollY, margin, rootRect;
- if (root.tagName === 'BODY') {
- docElm = root.ownerDocument.documentElement;
- scrollX = root.scrollLeft || docElm.scrollLeft;
- scrollY = root.scrollTop || docElm.scrollTop;
- } else {
- rootRect = root.getBoundingClientRect();
- scrollX = root.scrollLeft - rootRect.left;
- scrollY = root.scrollTop - rootRect.top;
- }
- clientRect.left += scrollX;
- clientRect.right += scrollX;
- clientRect.top += scrollY;
- clientRect.bottom += scrollY;
- clientRect.width = 1;
- margin = element.offsetWidth - element.clientWidth;
- if (margin > 0) {
- if (before) {
- margin *= -1;
- }
- clientRect.left += margin;
- clientRect.right += margin;
- }
- return clientRect;
- };
- var trimInlineCaretContainers = function (root) {
- var contentEditableFalseNodes, node, sibling, i, data;
- contentEditableFalseNodes = DomQuery('*[contentEditable=false]', root);
- for (i = 0; i < contentEditableFalseNodes.length; i++) {
- node = contentEditableFalseNodes[i];
- sibling = node.previousSibling;
- if (endsWithCaretContainer(sibling)) {
- data = sibling.data;
- if (data.length === 1) {
- sibling.parentNode.removeChild(sibling);
- } else {
- sibling.deleteData(data.length - 1, 1);
- }
- }
- sibling = node.nextSibling;
- if (startsWithCaretContainer(sibling)) {
- data = sibling.data;
- if (data.length === 1) {
- sibling.parentNode.removeChild(sibling);
- } else {
- sibling.deleteData(0, 1);
- }
- }
- }
- };
- var FakeCaret = function (root, isBlock, hasFocus) {
- var lastVisualCaret = Cell(Option.none());
- var cursorInterval, caretContainerNode;
- var show = function (before, element) {
- var clientRect, rng;
- hide();
- if (isTableCell$1(element)) {
- return null;
- }
- if (isBlock(element)) {
- caretContainerNode = insertBlock('p', element, before);
- clientRect = getAbsoluteClientRect(root, element, before);
- DomQuery(caretContainerNode).css('top', clientRect.top);
- var caret = DomQuery('
').css(clientRect).appendTo(root)[0];
- lastVisualCaret.set(Option.some({
- caret: caret,
- element: element,
- before: before
- }));
- lastVisualCaret.get().each(function (caretState) {
- if (before) {
- DomQuery(caretState.caret).addClass('mce-visual-caret-before');
- }
- });
- startBlink();
- rng = element.ownerDocument.createRange();
- rng.setStart(caretContainerNode, 0);
- rng.setEnd(caretContainerNode, 0);
- } else {
- caretContainerNode = insertInline(element, before);
- rng = element.ownerDocument.createRange();
- if (isContentEditableFalse$3(caretContainerNode.nextSibling)) {
- rng.setStart(caretContainerNode, 0);
- rng.setEnd(caretContainerNode, 0);
- } else {
- rng.setStart(caretContainerNode, 1);
- rng.setEnd(caretContainerNode, 1);
- }
- return rng;
- }
- return rng;
- };
- var hide = function () {
- trimInlineCaretContainers(root);
- if (caretContainerNode) {
- CaretContainerRemove.remove(caretContainerNode);
- caretContainerNode = null;
- }
- lastVisualCaret.get().each(function (caretState) {
- DomQuery(caretState.caret).remove();
- lastVisualCaret.set(Option.none());
- });
- clearInterval(cursorInterval);
- };
- var startBlink = function () {
- cursorInterval = Delay.setInterval(function () {
- if (hasFocus()) {
- DomQuery('div.mce-visual-caret', root).toggleClass('mce-visual-caret-hidden');
- } else {
- DomQuery('div.mce-visual-caret', root).addClass('mce-visual-caret-hidden');
- }
- }, 500);
- };
- var reposition = function () {
- lastVisualCaret.get().each(function (caretState) {
- var clientRect = getAbsoluteClientRect(root, caretState.element, caretState.before);
- DomQuery(caretState.caret).css(clientRect);
- });
- };
- var destroy = function () {
- return Delay.clearInterval(cursorInterval);
- };
- var getCss = function () {
- return '.mce-visual-caret {' + 'position: absolute;' + 'background-color: black;' + 'background-color: currentcolor;' + '}' + '.mce-visual-caret-hidden {' + 'display: none;' + '}' + '*[data-mce-caret] {' + 'position: absolute;' + 'left: -1000px;' + 'right: auto;' + 'top: 0;' + 'margin: 0;' + 'padding: 0;' + '}';
- };
- return {
- show: show,
- hide: hide,
- getCss: getCss,
- reposition: reposition,
- destroy: destroy
- };
- };
- var isFakeCaretTableBrowser = function () {
- return browser$2.isIE() || browser$2.isEdge() || browser$2.isFirefox();
- };
- var isFakeCaretTarget = function (node) {
- return isContentEditableFalse$3(node) || NodeType.isTable(node) && isFakeCaretTableBrowser();
- };
-
- var isContentEditableFalse$4 = NodeType.isContentEditableFalse;
- var isBlockLike = NodeType.matchStyleValues('display', 'block table table-cell table-caption list-item');
- var isCaretContainer$2 = isCaretContainer;
- var isCaretContainerBlock$1 = isCaretContainerBlock;
- var isElement$5 = NodeType.isElement;
- var isCaretCandidate$2 = isCaretCandidate;
- var isForwards = function (direction) {
- return direction > 0;
- };
- var isBackwards = function (direction) {
- return direction < 0;
- };
- var skipCaretContainers = function (walk, shallow) {
- var node;
- while (node = walk(shallow)) {
- if (!isCaretContainerBlock$1(node)) {
- return node;
- }
- }
- return null;
- };
- var findNode = function (node, direction, predicateFn, rootNode, shallow) {
- var walker = new TreeWalker(node, rootNode);
- if (isBackwards(direction)) {
- if (isContentEditableFalse$4(node) || isCaretContainerBlock$1(node)) {
- node = skipCaretContainers(walker.prev, true);
- if (predicateFn(node)) {
- return node;
- }
- }
- while (node = skipCaretContainers(walker.prev, shallow)) {
- if (predicateFn(node)) {
- return node;
- }
- }
- }
- if (isForwards(direction)) {
- if (isContentEditableFalse$4(node) || isCaretContainerBlock$1(node)) {
- node = skipCaretContainers(walker.next, true);
- if (predicateFn(node)) {
- return node;
- }
- }
- while (node = skipCaretContainers(walker.next, shallow)) {
- if (predicateFn(node)) {
- return node;
- }
- }
- }
- return null;
- };
- var getParentBlock = function (node, rootNode) {
- while (node && node !== rootNode) {
- if (isBlockLike(node)) {
- return node;
- }
- node = node.parentNode;
- }
- return null;
- };
- var isInSameBlock = function (caretPosition1, caretPosition2, rootNode) {
- return getParentBlock(caretPosition1.container(), rootNode) === getParentBlock(caretPosition2.container(), rootNode);
- };
- var getChildNodeAtRelativeOffset = function (relativeOffset, caretPosition) {
- var container, offset;
- if (!caretPosition) {
- return null;
- }
- container = caretPosition.container();
- offset = caretPosition.offset();
- if (!isElement$5(container)) {
- return null;
- }
- return container.childNodes[offset + relativeOffset];
- };
- var beforeAfter = function (before, node) {
- var range = node.ownerDocument.createRange();
- if (before) {
- range.setStartBefore(node);
- range.setEndBefore(node);
- } else {
- range.setStartAfter(node);
- range.setEndAfter(node);
- }
- return range;
- };
- var isNodesInSameBlock = function (root, node1, node2) {
- return getParentBlock(node1, root) === getParentBlock(node2, root);
- };
- var lean = function (left, root, node) {
- var sibling, siblingName;
- if (left) {
- siblingName = 'previousSibling';
- } else {
- siblingName = 'nextSibling';
- }
- while (node && node !== root) {
- sibling = node[siblingName];
- if (isCaretContainer$2(sibling)) {
- sibling = sibling[siblingName];
- }
- if (isContentEditableFalse$4(sibling)) {
- if (isNodesInSameBlock(root, sibling, node)) {
- return sibling;
- }
- break;
- }
- if (isCaretCandidate$2(sibling)) {
- break;
- }
- node = node.parentNode;
- }
- return null;
- };
- var before$2 = curry(beforeAfter, true);
- var after$1 = curry(beforeAfter, false);
- var normalizeRange = function (direction, root, range) {
- var node, container, offset, location;
- var leanLeft = curry(lean, true, root);
- var leanRight = curry(lean, false, root);
- container = range.startContainer;
- offset = range.startOffset;
- if (isCaretContainerBlock(container)) {
- if (!isElement$5(container)) {
- container = container.parentNode;
- }
- location = container.getAttribute('data-mce-caret');
- if (location === 'before') {
- node = container.nextSibling;
- if (isFakeCaretTarget(node)) {
- return before$2(node);
- }
- }
- if (location === 'after') {
- node = container.previousSibling;
- if (isFakeCaretTarget(node)) {
- return after$1(node);
- }
- }
- }
- if (!range.collapsed) {
- return range;
- }
- if (NodeType.isText(container)) {
- if (isCaretContainer$2(container)) {
- if (direction === 1) {
- node = leanRight(container);
- if (node) {
- return before$2(node);
- }
- node = leanLeft(container);
- if (node) {
- return after$1(node);
- }
- }
- if (direction === -1) {
- node = leanLeft(container);
- if (node) {
- return after$1(node);
- }
- node = leanRight(container);
- if (node) {
- return before$2(node);
- }
- }
- return range;
- }
- if (endsWithCaretContainer(container) && offset >= container.data.length - 1) {
- if (direction === 1) {
- node = leanRight(container);
- if (node) {
- return before$2(node);
- }
- }
- return range;
- }
- if (startsWithCaretContainer(container) && offset <= 1) {
- if (direction === -1) {
- node = leanLeft(container);
- if (node) {
- return after$1(node);
- }
- }
- return range;
- }
- if (offset === container.data.length) {
- node = leanRight(container);
- if (node) {
- return before$2(node);
- }
- return range;
- }
- if (offset === 0) {
- node = leanLeft(container);
- if (node) {
- return after$1(node);
- }
- return range;
- }
- }
- return range;
- };
- var getRelativeCefElm = function (forward, caretPosition) {
- return Option.from(getChildNodeAtRelativeOffset(forward ? 0 : -1, caretPosition)).filter(isContentEditableFalse$4);
- };
- var getNormalizedRangeEndPoint = function (direction, root, range) {
- var normalizedRange = normalizeRange(direction, root, range);
- if (direction === -1) {
- return CaretPosition.fromRangeStart(normalizedRange);
- }
- return CaretPosition.fromRangeEnd(normalizedRange);
- };
- var getElementFromPosition = function (pos) {
- return Option.from(pos.getNode()).map(Element.fromDom);
- };
- var getElementFromPrevPosition = function (pos) {
- return Option.from(pos.getNode(true)).map(Element.fromDom);
- };
- var getVisualCaretPosition = function (walkFn, caretPosition) {
- while (caretPosition = walkFn(caretPosition)) {
- if (caretPosition.isVisible()) {
- return caretPosition;
- }
- }
- return caretPosition;
- };
- var isMoveInsideSameBlock = function (from, to) {
- var inSameBlock = isInSameBlock(from, to);
- if (!inSameBlock && NodeType.isBr(from.getNode())) {
- return true;
- }
- return inSameBlock;
- };
-
- var HDirection;
- (function (HDirection) {
- HDirection[HDirection['Backwards'] = -1] = 'Backwards';
- HDirection[HDirection['Forwards'] = 1] = 'Forwards';
- }(HDirection || (HDirection = {})));
- var isContentEditableFalse$5 = NodeType.isContentEditableFalse;
- var isText$7 = NodeType.isText;
- var isElement$6 = NodeType.isElement;
- var isBr$4 = NodeType.isBr;
- var isCaretCandidate$3 = isCaretCandidate;
- var isAtomic$1 = isAtomic;
- var isEditableCaretCandidate$1 = isEditableCaretCandidate;
- var getParents = function (node, root) {
- var parents = [];
- while (node && node !== root) {
- parents.push(node);
- node = node.parentNode;
- }
- return parents;
- };
- var nodeAtIndex = function (container, offset) {
- if (container.hasChildNodes() && offset < container.childNodes.length) {
- return container.childNodes[offset];
- }
- return null;
- };
- var getCaretCandidatePosition = function (direction, node) {
- if (isForwards(direction)) {
- if (isCaretCandidate$3(node.previousSibling) && !isText$7(node.previousSibling)) {
- return CaretPosition$1.before(node);
- }
- if (isText$7(node)) {
- return CaretPosition$1(node, 0);
- }
- }
- if (isBackwards(direction)) {
- if (isCaretCandidate$3(node.nextSibling) && !isText$7(node.nextSibling)) {
- return CaretPosition$1.after(node);
- }
- if (isText$7(node)) {
- return CaretPosition$1(node, node.data.length);
- }
- }
- if (isBackwards(direction)) {
- if (isBr$4(node)) {
- return CaretPosition$1.before(node);
- }
- return CaretPosition$1.after(node);
- }
- return CaretPosition$1.before(node);
- };
- var moveForwardFromBr = function (root, nextNode) {
- var nextSibling = nextNode.nextSibling;
- if (nextSibling && isCaretCandidate$3(nextSibling)) {
- if (isText$7(nextSibling)) {
- return CaretPosition$1(nextSibling, 0);
- } else {
- return CaretPosition$1.before(nextSibling);
- }
- } else {
- return findCaretPosition(HDirection.Forwards, CaretPosition$1.after(nextNode), root);
- }
- };
- var findCaretPosition = function (direction, startPos, root) {
- var node, nextNode, innerNode;
- var rootContentEditableFalseElm, caretPosition;
- if (!isElement$6(root) || !startPos) {
- return null;
- }
- if (startPos.isEqual(CaretPosition$1.after(root)) && root.lastChild) {
- caretPosition = CaretPosition$1.after(root.lastChild);
- if (isBackwards(direction) && isCaretCandidate$3(root.lastChild) && isElement$6(root.lastChild)) {
- return isBr$4(root.lastChild) ? CaretPosition$1.before(root.lastChild) : caretPosition;
- }
- } else {
- caretPosition = startPos;
- }
- var container = caretPosition.container();
- var offset = caretPosition.offset();
- if (isText$7(container)) {
- if (isBackwards(direction) && offset > 0) {
- return CaretPosition$1(container, --offset);
- }
- if (isForwards(direction) && offset < container.length) {
- return CaretPosition$1(container, ++offset);
- }
- node = container;
- } else {
- if (isBackwards(direction) && offset > 0) {
- nextNode = nodeAtIndex(container, offset - 1);
- if (isCaretCandidate$3(nextNode)) {
- if (!isAtomic$1(nextNode)) {
- innerNode = findNode(nextNode, direction, isEditableCaretCandidate$1, nextNode);
- if (innerNode) {
- if (isText$7(innerNode)) {
- return CaretPosition$1(innerNode, innerNode.data.length);
- }
- return CaretPosition$1.after(innerNode);
- }
- }
- if (isText$7(nextNode)) {
- return CaretPosition$1(nextNode, nextNode.data.length);
- }
- return CaretPosition$1.before(nextNode);
- }
- }
- if (isForwards(direction) && offset < container.childNodes.length) {
- nextNode = nodeAtIndex(container, offset);
- if (isCaretCandidate$3(nextNode)) {
- if (isBr$4(nextNode)) {
- return moveForwardFromBr(root, nextNode);
- }
- if (!isAtomic$1(nextNode)) {
- innerNode = findNode(nextNode, direction, isEditableCaretCandidate$1, nextNode);
- if (innerNode) {
- if (isText$7(innerNode)) {
- return CaretPosition$1(innerNode, 0);
- }
- return CaretPosition$1.before(innerNode);
- }
- }
- if (isText$7(nextNode)) {
- return CaretPosition$1(nextNode, 0);
- }
- return CaretPosition$1.after(nextNode);
- }
- }
- node = nextNode ? nextNode : caretPosition.getNode();
- }
- if (isForwards(direction) && caretPosition.isAtEnd() || isBackwards(direction) && caretPosition.isAtStart()) {
- node = findNode(node, direction, constant(true), root, true);
- if (isEditableCaretCandidate$1(node, root)) {
- return getCaretCandidatePosition(direction, node);
- }
- }
- nextNode = findNode(node, direction, isEditableCaretCandidate$1, root);
- rootContentEditableFalseElm = ArrUtils.last(filter(getParents(container, root), isContentEditableFalse$5));
- if (rootContentEditableFalseElm && (!nextNode || !rootContentEditableFalseElm.contains(nextNode))) {
- if (isForwards(direction)) {
- caretPosition = CaretPosition$1.after(rootContentEditableFalseElm);
- } else {
- caretPosition = CaretPosition$1.before(rootContentEditableFalseElm);
- }
- return caretPosition;
- }
- if (nextNode) {
- return getCaretCandidatePosition(direction, nextNode);
- }
- return null;
- };
- var CaretWalker = function (root) {
- return {
- next: function (caretPosition) {
- return findCaretPosition(HDirection.Forwards, caretPosition, root);
- },
- prev: function (caretPosition) {
- return findCaretPosition(HDirection.Backwards, caretPosition, root);
- }
- };
- };
-
- var walkToPositionIn = function (forward, root, start) {
- var position = forward ? CaretPosition$1.before(start) : CaretPosition$1.after(start);
- return fromPosition(forward, root, position);
- };
- var afterElement = function (node) {
- return NodeType.isBr(node) ? CaretPosition$1.before(node) : CaretPosition$1.after(node);
- };
- var isBeforeOrStart = function (position) {
- if (CaretPosition$1.isTextPosition(position)) {
- return position.offset() === 0;
- } else {
- return isCaretCandidate(position.getNode());
- }
- };
- var isAfterOrEnd = function (position) {
- if (CaretPosition$1.isTextPosition(position)) {
- var container = position.container();
- return position.offset() === container.data.length;
- } else {
- return isCaretCandidate(position.getNode(true));
- }
- };
- var isBeforeAfterSameElement = function (from, to) {
- return !CaretPosition$1.isTextPosition(from) && !CaretPosition$1.isTextPosition(to) && from.getNode() === to.getNode(true);
- };
- var isAtBr = function (position) {
- return !CaretPosition$1.isTextPosition(position) && NodeType.isBr(position.getNode());
- };
- var shouldSkipPosition = function (forward, from, to) {
- if (forward) {
- return !isBeforeAfterSameElement(from, to) && !isAtBr(from) && isAfterOrEnd(from) && isBeforeOrStart(to);
- } else {
- return !isBeforeAfterSameElement(to, from) && isBeforeOrStart(from) && isAfterOrEnd(to);
- }
- };
- var fromPosition = function (forward, root, pos) {
- var walker = CaretWalker(root);
- return Option.from(forward ? walker.next(pos) : walker.prev(pos));
- };
- var navigate = function (forward, root, from) {
- return fromPosition(forward, root, from).bind(function (to) {
- if (isInSameBlock(from, to, root) && shouldSkipPosition(forward, from, to)) {
- return fromPosition(forward, root, to);
- } else {
- return Option.some(to);
- }
- });
- };
- var navigateIgnore = function (forward, root, from, ignoreFilter) {
- return navigate(forward, root, from).bind(function (pos) {
- return ignoreFilter(pos) ? navigateIgnore(forward, root, pos, ignoreFilter) : Option.some(pos);
- });
- };
- var positionIn = function (forward, element) {
- var startNode = forward ? element.firstChild : element.lastChild;
- if (NodeType.isText(startNode)) {
- return Option.some(CaretPosition$1(startNode, forward ? 0 : startNode.data.length));
- } else if (startNode) {
- if (isCaretCandidate(startNode)) {
- return Option.some(forward ? CaretPosition$1.before(startNode) : afterElement(startNode));
- } else {
- return walkToPositionIn(forward, element, startNode);
- }
- } else {
- return Option.none();
- }
- };
- var nextPosition = curry(fromPosition, true);
- var prevPosition = curry(fromPosition, false);
- var CaretFinder = {
- fromPosition: fromPosition,
- nextPosition: nextPosition,
- prevPosition: prevPosition,
- navigate: navigate,
- navigateIgnore: navigateIgnore,
- positionIn: positionIn,
- firstPositionIn: curry(positionIn, true),
- lastPositionIn: curry(positionIn, false)
- };
-
- var isStringPathBookmark = function (bookmark) {
- return typeof bookmark.start === 'string';
- };
- var isRangeBookmark = function (bookmark) {
- return bookmark.hasOwnProperty('rng');
- };
- var isIdBookmark = function (bookmark) {
- return bookmark.hasOwnProperty('id');
- };
- var isIndexBookmark = function (bookmark) {
- return bookmark.hasOwnProperty('name');
- };
- var isPathBookmark = function (bookmark) {
- return Tools.isArray(bookmark.start);
- };
-
- var addBogus = function (dom, node) {
- if (NodeType.isElement(node) && dom.isBlock(node) && !node.innerHTML && !Env.ie) {
- node.innerHTML = ' ';
- }
- return node;
- };
- var resolveCaretPositionBookmark = function (dom, bookmark) {
- var rng, pos;
- rng = dom.createRng();
- pos = resolve$2(dom.getRoot(), bookmark.start);
- rng.setStart(pos.container(), pos.offset());
- pos = resolve$2(dom.getRoot(), bookmark.end);
- rng.setEnd(pos.container(), pos.offset());
- return rng;
- };
- var insertZwsp = function (node, rng) {
- var textNode = node.ownerDocument.createTextNode(Zwsp.ZWSP);
- node.appendChild(textNode);
- rng.setStart(textNode, 0);
- rng.setEnd(textNode, 0);
- };
- var isEmpty = function (node) {
- return node.hasChildNodes() === false;
- };
- var tryFindRangePosition = function (node, rng) {
- return CaretFinder.lastPositionIn(node).fold(function () {
- return false;
- }, function (pos) {
- rng.setStart(pos.container(), pos.offset());
- rng.setEnd(pos.container(), pos.offset());
- return true;
- });
- };
- var padEmptyCaretContainer = function (root, node, rng) {
- if (isEmpty(node) && getParentCaretContainer(root, node)) {
- insertZwsp(node, rng);
- return true;
- } else {
- return false;
- }
- };
- var setEndPoint = function (dom, start, bookmark, rng) {
- var point = bookmark[start ? 'start' : 'end'];
- var i, node, offset, children;
- var root = dom.getRoot();
- if (point) {
- offset = point[0];
- for (node = root, i = point.length - 1; i >= 1; i--) {
- children = node.childNodes;
- if (padEmptyCaretContainer(root, node, rng)) {
- return true;
- }
- if (point[i] > children.length - 1) {
- if (padEmptyCaretContainer(root, node, rng)) {
- return true;
- }
- return tryFindRangePosition(node, rng);
- }
- node = children[point[i]];
- }
- if (node.nodeType === 3) {
- offset = Math.min(point[0], node.nodeValue.length);
- }
- if (node.nodeType === 1) {
- offset = Math.min(point[0], node.childNodes.length);
- }
- if (start) {
- rng.setStart(node, offset);
- } else {
- rng.setEnd(node, offset);
- }
- }
- return true;
- };
- var isValidTextNode = function (node) {
- return NodeType.isText(node) && node.data.length > 0;
- };
- var restoreEndPoint = function (dom, suffix, bookmark) {
- var marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev;
- var keep = bookmark.keep;
- var container, offset;
- if (marker) {
- node = marker.parentNode;
- if (suffix === 'start') {
- if (!keep) {
- idx = dom.nodeIndex(marker);
- } else {
- if (marker.hasChildNodes()) {
- node = marker.firstChild;
- idx = 1;
- } else if (isValidTextNode(marker.nextSibling)) {
- node = marker.nextSibling;
- idx = 0;
- } else if (isValidTextNode(marker.previousSibling)) {
- node = marker.previousSibling;
- idx = marker.previousSibling.data.length;
- } else {
- node = marker.parentNode;
- idx = dom.nodeIndex(marker) + 1;
- }
- }
- container = node;
- offset = idx;
- } else {
- if (!keep) {
- idx = dom.nodeIndex(marker);
- } else {
- if (marker.hasChildNodes()) {
- node = marker.firstChild;
- idx = 1;
- } else if (isValidTextNode(marker.previousSibling)) {
- node = marker.previousSibling;
- idx = marker.previousSibling.data.length;
- } else {
- node = marker.parentNode;
- idx = dom.nodeIndex(marker);
- }
- }
- container = node;
- offset = idx;
- }
- if (!keep) {
- prev = marker.previousSibling;
- next = marker.nextSibling;
- Tools.each(Tools.grep(marker.childNodes), function (node) {
- if (NodeType.isText(node)) {
- node.nodeValue = node.nodeValue.replace(/\uFEFF/g, '');
- }
- });
- while (marker = dom.get(bookmark.id + '_' + suffix)) {
- dom.remove(marker, true);
- }
- if (prev && next && prev.nodeType === next.nodeType && NodeType.isText(prev) && !Env.opera) {
- idx = prev.nodeValue.length;
- prev.appendData(next.nodeValue);
- dom.remove(next);
- if (suffix === 'start') {
- container = prev;
- offset = idx;
- } else {
- container = prev;
- offset = idx;
- }
- }
- }
- return Option.some(CaretPosition$1(container, offset));
- } else {
- return Option.none();
- }
- };
- var alt = function (o1, o2) {
- return o1.isSome() ? o1 : o2;
- };
- var resolvePaths = function (dom, bookmark) {
- var rng = dom.createRng();
- if (setEndPoint(dom, true, bookmark, rng) && setEndPoint(dom, false, bookmark, rng)) {
- return Option.some(rng);
- } else {
- return Option.none();
- }
- };
- var resolveId = function (dom, bookmark) {
- var startPos = restoreEndPoint(dom, 'start', bookmark);
- var endPos = restoreEndPoint(dom, 'end', bookmark);
- return lift2(startPos, alt(endPos, startPos), function (spos, epos) {
- var rng = dom.createRng();
- rng.setStart(addBogus(dom, spos.container()), spos.offset());
- rng.setEnd(addBogus(dom, epos.container()), epos.offset());
- return rng;
- });
- };
- var resolveIndex$1 = function (dom, bookmark) {
- return Option.from(dom.select(bookmark.name)[bookmark.index]).map(function (elm) {
- var rng = dom.createRng();
- rng.selectNode(elm);
- return rng;
- });
- };
- var resolve$3 = function (selection, bookmark) {
- var dom = selection.dom;
- if (bookmark) {
- if (isPathBookmark(bookmark)) {
- return resolvePaths(dom, bookmark);
- } else if (isStringPathBookmark(bookmark)) {
- return Option.some(resolveCaretPositionBookmark(dom, bookmark));
- } else if (isIdBookmark(bookmark)) {
- return resolveId(dom, bookmark);
- } else if (isIndexBookmark(bookmark)) {
- return resolveIndex$1(dom, bookmark);
- } else if (isRangeBookmark(bookmark)) {
- return Option.some(bookmark.rng);
- }
- }
- return Option.none();
- };
- var ResolveBookmark = { resolve: resolve$3 };
-
- var getBookmark$1 = function (selection, type, normalized) {
- return GetBookmark.getBookmark(selection, type, normalized);
- };
- var moveToBookmark = function (selection, bookmark) {
- ResolveBookmark.resolve(selection, bookmark).each(function (rng) {
- selection.setRng(rng);
- });
- };
- var isBookmarkNode$1 = function (node) {
- return NodeType.isElement(node) && node.tagName === 'SPAN' && node.getAttribute('data-mce-type') === 'bookmark';
- };
- var Bookmarks = {
- getBookmark: getBookmark$1,
- moveToBookmark: moveToBookmark,
- isBookmarkNode: isBookmarkNode$1
- };
-
- var isInlineBlock = function (node) {
- return node && /^(IMG)$/.test(node.nodeName);
- };
- var moveStart = function (dom, selection, rng) {
- var offset = rng.startOffset;
- var container = rng.startContainer, walker, node, nodes;
- if (rng.startContainer === rng.endContainer) {
- if (isInlineBlock(rng.startContainer.childNodes[rng.startOffset])) {
- return;
- }
- }
- if (container.nodeType === 1) {
- nodes = container.childNodes;
- if (offset < nodes.length) {
- container = nodes[offset];
- walker = new TreeWalker(container, dom.getParent(container, dom.isBlock));
- } else {
- container = nodes[nodes.length - 1];
- walker = new TreeWalker(container, dom.getParent(container, dom.isBlock));
- walker.next(true);
- }
- for (node = walker.current(); node; node = walker.next()) {
- if (node.nodeType === 3 && !isWhiteSpaceNode(node)) {
- rng.setStart(node, 0);
- selection.setRng(rng);
- return;
- }
- }
- }
- };
- var getNonWhiteSpaceSibling = function (node, next, inc) {
- if (node) {
- next = next ? 'nextSibling' : 'previousSibling';
- for (node = inc ? node : node[next]; node; node = node[next]) {
- if (node.nodeType === 1 || !isWhiteSpaceNode(node)) {
- return node;
- }
- }
- }
- };
- var isTextBlock$1 = function (editor, name) {
- if (name.nodeType) {
- name = name.nodeName;
- }
- return !!editor.schema.getTextBlockElements()[name.toLowerCase()];
- };
- var isValid = function (ed, parent, child) {
- return ed.schema.isValidChild(parent, child);
- };
- var isWhiteSpaceNode = function (node) {
- return node && node.nodeType === 3 && /^([\t \r\n]+|)$/.test(node.nodeValue);
- };
- var replaceVars = function (value, vars) {
- if (typeof value !== 'string') {
- value = value(vars);
- } else if (vars) {
- value = value.replace(/%(\w+)/g, function (str, name) {
- return vars[name] || str;
- });
- }
- return value;
- };
- var isEq = function (str1, str2) {
- str1 = str1 || '';
- str2 = str2 || '';
- str1 = '' + (str1.nodeName || str1);
- str2 = '' + (str2.nodeName || str2);
- return str1.toLowerCase() === str2.toLowerCase();
- };
- var normalizeStyleValue = function (dom, value, name) {
- if (name === 'color' || name === 'backgroundColor') {
- value = dom.toHex(value);
- }
- if (name === 'fontWeight' && value === 700) {
- value = 'bold';
- }
- if (name === 'fontFamily') {
- value = value.replace(/[\'\"]/g, '').replace(/,\s+/g, ',');
- }
- return '' + value;
- };
- var getStyle = function (dom, node, name) {
- return normalizeStyleValue(dom, dom.getStyle(node, name), name);
- };
- var getTextDecoration = function (dom, node) {
- var decoration;
- dom.getParent(node, function (n) {
- decoration = dom.getStyle(n, 'text-decoration');
- return decoration && decoration !== 'none';
- });
- return decoration;
- };
- var getParents$1 = function (dom, node, selector) {
- return dom.getParents(node, selector, dom.getRoot());
- };
- var FormatUtils = {
- isInlineBlock: isInlineBlock,
- moveStart: moveStart,
- getNonWhiteSpaceSibling: getNonWhiteSpaceSibling,
- isTextBlock: isTextBlock$1,
- isValid: isValid,
- isWhiteSpaceNode: isWhiteSpaceNode,
- replaceVars: replaceVars,
- isEq: isEq,
- normalizeStyleValue: normalizeStyleValue,
- getStyle: getStyle,
- getTextDecoration: getTextDecoration,
- getParents: getParents$1
- };
-
- var isBookmarkNode$2 = Bookmarks.isBookmarkNode;
- var getParents$2 = FormatUtils.getParents, isWhiteSpaceNode$1 = FormatUtils.isWhiteSpaceNode, isTextBlock$2 = FormatUtils.isTextBlock;
- var findLeaf = function (node, offset) {
- if (typeof offset === 'undefined') {
- offset = node.nodeType === 3 ? node.length : node.childNodes.length;
- }
- while (node && node.hasChildNodes()) {
- node = node.childNodes[offset];
- if (node) {
- offset = node.nodeType === 3 ? node.length : node.childNodes.length;
- }
- }
- return {
- node: node,
- offset: offset
- };
- };
- var excludeTrailingWhitespace = function (endContainer, endOffset) {
- var leaf = findLeaf(endContainer, endOffset);
- if (leaf.node) {
- while (leaf.node && leaf.offset === 0 && leaf.node.previousSibling) {
- leaf = findLeaf(leaf.node.previousSibling);
- }
- if (leaf.node && leaf.offset > 0 && leaf.node.nodeType === 3 && leaf.node.nodeValue.charAt(leaf.offset - 1) === ' ') {
- if (leaf.offset > 1) {
- endContainer = leaf.node;
- endContainer.splitText(leaf.offset - 1);
- }
- }
- }
- return endContainer;
- };
- var isBogusBr = function (node) {
- return node.nodeName === 'BR' && node.getAttribute('data-mce-bogus') && !node.nextSibling;
- };
- var findParentContentEditable = function (dom, node) {
- var parent = node;
- while (parent) {
- if (parent.nodeType === 1 && dom.getContentEditable(parent)) {
- return dom.getContentEditable(parent) === 'false' ? parent : node;
- }
- parent = parent.parentNode;
- }
- return node;
- };
- var findSpace = function (start, remove, node, offset) {
- var pos, pos2;
- var str = node.nodeValue;
- if (typeof offset === 'undefined') {
- offset = start ? str.length : 0;
- }
- if (start) {
- pos = str.lastIndexOf(' ', offset);
- pos2 = str.lastIndexOf('\xA0', offset);
- pos = pos > pos2 ? pos : pos2;
- if (pos !== -1 && !remove && (pos < offset || !start) && pos <= str.length) {
- pos++;
- }
- } else {
- pos = str.indexOf(' ', offset);
- pos2 = str.indexOf('\xA0', offset);
- pos = pos !== -1 && (pos2 === -1 || pos < pos2) ? pos : pos2;
- }
- return pos;
- };
- var findWordEndPoint = function (dom, body, container, offset, start, remove) {
- var walker, node, pos, lastTextNode;
- if (container.nodeType === 3) {
- pos = findSpace(start, remove, container, offset);
- if (pos !== -1) {
- return {
- container: container,
- offset: pos
- };
- }
- lastTextNode = container;
- }
- walker = new TreeWalker(container, dom.getParent(container, dom.isBlock) || body);
- while (node = walker[start ? 'prev' : 'next']()) {
- if (node.nodeType === 3 && !isBookmarkNode$2(node.parentNode)) {
- lastTextNode = node;
- pos = findSpace(start, remove, node);
- if (pos !== -1) {
- return {
- container: node,
- offset: pos
- };
- }
- } else if (dom.isBlock(node) || FormatUtils.isEq(node, 'BR')) {
- break;
- }
- }
- if (lastTextNode) {
- if (start) {
- offset = 0;
- } else {
- offset = lastTextNode.length;
- }
- return {
- container: lastTextNode,
- offset: offset
- };
- }
- };
- var findSelectorEndPoint = function (dom, format, rng, container, siblingName) {
- var parents, i, y, curFormat;
- if (container.nodeType === 3 && container.nodeValue.length === 0 && container[siblingName]) {
- container = container[siblingName];
- }
- parents = getParents$2(dom, container);
- for (i = 0; i < parents.length; i++) {
- for (y = 0; y < format.length; y++) {
- curFormat = format[y];
- if ('collapsed' in curFormat && curFormat.collapsed !== rng.collapsed) {
- continue;
- }
- if (dom.is(parents[i], curFormat.selector)) {
- return parents[i];
- }
- }
- }
- return container;
- };
- var findBlockEndPoint = function (editor, format, container, siblingName) {
- var node;
- var dom = editor.dom;
- var root = dom.getRoot();
- if (!format[0].wrapper) {
- node = dom.getParent(container, format[0].block, root);
- }
- if (!node) {
- var scopeRoot = dom.getParent(container, 'LI,TD,TH');
- node = dom.getParent(container.nodeType === 3 ? container.parentNode : container, function (node) {
- return node !== root && isTextBlock$2(editor, node);
- }, scopeRoot);
- }
- if (node && format[0].wrapper) {
- node = getParents$2(dom, node, 'ul,ol').reverse()[0] || node;
- }
- if (!node) {
- node = container;
- while (node[siblingName] && !dom.isBlock(node[siblingName])) {
- node = node[siblingName];
- if (FormatUtils.isEq(node, 'br')) {
- break;
- }
- }
- }
- return node || container;
- };
- var findParentContainer = function (dom, format, startContainer, startOffset, endContainer, endOffset, start) {
- var container, parent, sibling, siblingName, root;
- container = parent = start ? startContainer : endContainer;
- siblingName = start ? 'previousSibling' : 'nextSibling';
- root = dom.getRoot();
- if (container.nodeType === 3 && !isWhiteSpaceNode$1(container)) {
- if (start ? startOffset > 0 : endOffset < container.nodeValue.length) {
- return container;
- }
- }
- while (true) {
- if (!format[0].block_expand && dom.isBlock(parent)) {
- return parent;
- }
- for (sibling = parent[siblingName]; sibling; sibling = sibling[siblingName]) {
- if (!isBookmarkNode$2(sibling) && !isWhiteSpaceNode$1(sibling) && !isBogusBr(sibling)) {
- return parent;
- }
- }
- if (parent === root || parent.parentNode === root) {
- container = parent;
- break;
- }
- parent = parent.parentNode;
- }
- return container;
- };
- var expandRng = function (editor, rng, format, remove) {
- var endPoint, startContainer = rng.startContainer, startOffset = rng.startOffset, endContainer = rng.endContainer, endOffset = rng.endOffset;
- var dom = editor.dom;
- if (startContainer.nodeType === 1 && startContainer.hasChildNodes()) {
- startContainer = getNode(startContainer, startOffset);
- if (startContainer.nodeType === 3) {
- startOffset = 0;
- }
- }
- if (endContainer.nodeType === 1 && endContainer.hasChildNodes()) {
- endContainer = getNode(endContainer, rng.collapsed ? endOffset : endOffset - 1);
- if (endContainer.nodeType === 3) {
- endOffset = endContainer.nodeValue.length;
- }
- }
- startContainer = findParentContentEditable(dom, startContainer);
- endContainer = findParentContentEditable(dom, endContainer);
- if (isBookmarkNode$2(startContainer.parentNode) || isBookmarkNode$2(startContainer)) {
- startContainer = isBookmarkNode$2(startContainer) ? startContainer : startContainer.parentNode;
- if (rng.collapsed) {
- startContainer = startContainer.previousSibling || startContainer;
- } else {
- startContainer = startContainer.nextSibling || startContainer;
- }
- if (startContainer.nodeType === 3) {
- startOffset = rng.collapsed ? startContainer.length : 0;
- }
- }
- if (isBookmarkNode$2(endContainer.parentNode) || isBookmarkNode$2(endContainer)) {
- endContainer = isBookmarkNode$2(endContainer) ? endContainer : endContainer.parentNode;
- if (rng.collapsed) {
- endContainer = endContainer.nextSibling || endContainer;
- } else {
- endContainer = endContainer.previousSibling || endContainer;
- }
- if (endContainer.nodeType === 3) {
- endOffset = rng.collapsed ? 0 : endContainer.length;
- }
- }
- if (rng.collapsed) {
- endPoint = findWordEndPoint(dom, editor.getBody(), startContainer, startOffset, true, remove);
- if (endPoint) {
- startContainer = endPoint.container;
- startOffset = endPoint.offset;
- }
- endPoint = findWordEndPoint(dom, editor.getBody(), endContainer, endOffset, false, remove);
- if (endPoint) {
- endContainer = endPoint.container;
- endOffset = endPoint.offset;
- }
- }
- if (format[0].inline) {
- endContainer = remove ? endContainer : excludeTrailingWhitespace(endContainer, endOffset);
- }
- if (format[0].inline || format[0].block_expand) {
- if (!format[0].inline || (startContainer.nodeType !== 3 || startOffset === 0)) {
- startContainer = findParentContainer(dom, format, startContainer, startOffset, endContainer, endOffset, true);
- }
- if (!format[0].inline || (endContainer.nodeType !== 3 || endOffset === endContainer.nodeValue.length)) {
- endContainer = findParentContainer(dom, format, startContainer, startOffset, endContainer, endOffset, false);
- }
- }
- if (format[0].selector && format[0].expand !== false && !format[0].inline) {
- startContainer = findSelectorEndPoint(dom, format, rng, startContainer, 'previousSibling');
- endContainer = findSelectorEndPoint(dom, format, rng, endContainer, 'nextSibling');
- }
- if (format[0].block || format[0].selector) {
- startContainer = findBlockEndPoint(editor, format, startContainer, 'previousSibling');
- endContainer = findBlockEndPoint(editor, format, endContainer, 'nextSibling');
- if (format[0].block) {
- if (!dom.isBlock(startContainer)) {
- startContainer = findParentContainer(dom, format, startContainer, startOffset, endContainer, endOffset, true);
- }
- if (!dom.isBlock(endContainer)) {
- endContainer = findParentContainer(dom, format, startContainer, startOffset, endContainer, endOffset, false);
- }
- }
- }
- if (startContainer.nodeType === 1) {
- startOffset = dom.nodeIndex(startContainer);
- startContainer = startContainer.parentNode;
- }
- if (endContainer.nodeType === 1) {
- endOffset = dom.nodeIndex(endContainer) + 1;
- endContainer = endContainer.parentNode;
- }
- return {
- startContainer: startContainer,
- startOffset: startOffset,
- endContainer: endContainer,
- endOffset: endOffset
- };
- };
- var ExpandRange = { expandRng: expandRng };
-
- var each$8 = Tools.each;
- var getEndChild = function (container, index) {
- var childNodes = container.childNodes;
- index--;
- if (index > childNodes.length - 1) {
- index = childNodes.length - 1;
- } else if (index < 0) {
- index = 0;
- }
- return childNodes[index] || container;
- };
- var walk$1 = function (dom, rng, callback) {
- var startContainer = rng.startContainer;
- var startOffset = rng.startOffset;
- var endContainer = rng.endContainer;
- var endOffset = rng.endOffset;
- var ancestor;
- var startPoint;
- var endPoint;
- var node;
- var parent;
- var siblings;
- var nodes;
- nodes = dom.select('td[data-mce-selected],th[data-mce-selected]');
- if (nodes.length > 0) {
- each$8(nodes, function (node) {
- callback([node]);
- });
- return;
- }
- var exclude = function (nodes) {
- var node;
- node = nodes[0];
- if (node.nodeType === 3 && node === startContainer && startOffset >= node.nodeValue.length) {
- nodes.splice(0, 1);
- }
- node = nodes[nodes.length - 1];
- if (endOffset === 0 && nodes.length > 0 && node === endContainer && node.nodeType === 3) {
- nodes.splice(nodes.length - 1, 1);
- }
- return nodes;
- };
- var collectSiblings = function (node, name, endNode) {
- var siblings = [];
- for (; node && node !== endNode; node = node[name]) {
- siblings.push(node);
- }
- return siblings;
- };
- var findEndPoint = function (node, root) {
- do {
- if (node.parentNode === root) {
- return node;
- }
- node = node.parentNode;
- } while (node);
- };
- var walkBoundary = function (startNode, endNode, next) {
- var siblingName = next ? 'nextSibling' : 'previousSibling';
- for (node = startNode, parent = node.parentNode; node && node !== endNode; node = parent) {
- parent = node.parentNode;
- siblings = collectSiblings(node === startNode ? node : node[siblingName], siblingName);
- if (siblings.length) {
- if (!next) {
- siblings.reverse();
- }
- callback(exclude(siblings));
- }
- }
- };
- if (startContainer.nodeType === 1 && startContainer.hasChildNodes()) {
- startContainer = startContainer.childNodes[startOffset];
- }
- if (endContainer.nodeType === 1 && endContainer.hasChildNodes()) {
- endContainer = getEndChild(endContainer, endOffset);
- }
- if (startContainer === endContainer) {
- return callback(exclude([startContainer]));
- }
- ancestor = dom.findCommonAncestor(startContainer, endContainer);
- for (node = startContainer; node; node = node.parentNode) {
- if (node === endContainer) {
- return walkBoundary(startContainer, ancestor, true);
- }
- if (node === ancestor) {
- break;
- }
- }
- for (node = endContainer; node; node = node.parentNode) {
- if (node === startContainer) {
- return walkBoundary(endContainer, ancestor);
- }
- if (node === ancestor) {
- break;
- }
- }
- startPoint = findEndPoint(startContainer, ancestor) || startContainer;
- endPoint = findEndPoint(endContainer, ancestor) || endContainer;
- walkBoundary(startContainer, startPoint, true);
- siblings = collectSiblings(startPoint === startContainer ? startPoint : startPoint.nextSibling, 'nextSibling', endPoint === endContainer ? endPoint.nextSibling : endPoint);
- if (siblings.length) {
- callback(exclude(siblings));
- }
- walkBoundary(endContainer, endPoint);
- };
- var RangeWalk = { walk: walk$1 };
-
- var zeroWidth = function () {
- return '\uFEFF';
- };
-
- function NodeValue (is, name) {
- var get = function (element) {
- if (!is(element)) {
- throw new Error('Can only get ' + name + ' value of a ' + name + ' node');
- }
- return getOption(element).getOr('');
- };
- var getOption = function (element) {
- return is(element) ? Option.from(element.dom().nodeValue) : Option.none();
- };
- var set = function (element, value) {
- if (!is(element)) {
- throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');
- }
- element.dom().nodeValue = value;
- };
- return {
- get: get,
- getOption: getOption,
- set: set
- };
- }
-
- var api = NodeValue(isText, 'text');
- var get$4 = function (element) {
- return api.get(element);
- };
-
- var isZeroWidth = function (elem) {
- return isText(elem) && get$4(elem) === zeroWidth();
- };
- var context = function (editor, elem, wrapName, nodeName) {
- return parent(elem).fold(function () {
- return 'skipping';
- }, function (parent) {
- if (nodeName === 'br' || isZeroWidth(elem)) {
- return 'valid';
- } else if (isAnnotation(elem)) {
- return 'existing';
- } else if (isCaretNode(elem)) {
- return 'caret';
- } else if (!FormatUtils.isValid(editor, wrapName, nodeName) || !FormatUtils.isValid(editor, name(parent), wrapName)) {
- return 'invalid-child';
- } else {
- return 'valid';
- }
- });
- };
-
- var shouldApplyToTrailingSpaces = function (rng) {
- return rng.startContainer.nodeType === 3 && rng.startContainer.nodeValue.length >= rng.startOffset && rng.startContainer.nodeValue[rng.startOffset] === '\xA0';
- };
- var applyWordGrab = function (editor, rng) {
- var r = ExpandRange.expandRng(editor, rng, [{ inline: true }], shouldApplyToTrailingSpaces(rng));
- rng.setStart(r.startContainer, r.startOffset);
- rng.setEnd(r.endContainer, r.endOffset);
- editor.selection.setRng(rng);
- };
- var makeAnnotation = function (eDoc, _a, annotationName, decorate) {
- var _b = _a.uid, uid = _b === void 0 ? generate('mce-annotation') : _b, data = __rest(_a, ['uid']);
- var master = Element.fromTag('span', eDoc);
- add$2(master, annotation());
- set(master, '' + dataAnnotationId(), uid);
- set(master, '' + dataAnnotation(), annotationName);
- var _c = decorate(uid, data), _d = _c.attributes, attributes = _d === void 0 ? {} : _d, _e = _c.classes, classes = _e === void 0 ? [] : _e;
- setAll(master, attributes);
- add$3(master, classes);
- return master;
- };
- var annotate = function (editor, rng, annotationName, decorate, data) {
- var newWrappers = [];
- var master = makeAnnotation(editor.getDoc(), data, annotationName, decorate);
- var wrapper = Cell(Option.none());
- var finishWrapper = function () {
- wrapper.set(Option.none());
- };
- var getOrOpenWrapper = function () {
- return wrapper.get().getOrThunk(function () {
- var nu = shallow(master);
- newWrappers.push(nu);
- wrapper.set(Option.some(nu));
- return nu;
- });
- };
- var processElements = function (elems) {
- each(elems, processElement);
- };
- var processElement = function (elem) {
- var ctx = context(editor, elem, 'span', name(elem));
- switch (ctx) {
- case 'invalid-child': {
- finishWrapper();
- var children$1 = children(elem);
- processElements(children$1);
- finishWrapper();
- break;
- }
- case 'valid': {
- var w = getOrOpenWrapper();
- wrap$1(elem, w);
- break;
- }
- case 'skipping':
- case 'existing':
- case 'caret':
- }
- };
- var processNodes = function (nodes) {
- var elems = map(nodes, Element.fromDom);
- processElements(elems);
- };
- RangeWalk.walk(editor.dom, rng, function (nodes) {
- finishWrapper();
- processNodes(nodes);
- });
- return newWrappers;
- };
- var annotateWithBookmark = function (editor, name, settings, data) {
- editor.undoManager.transact(function () {
- var initialRng = editor.selection.getRng();
- if (initialRng.collapsed) {
- applyWordGrab(editor, initialRng);
- }
- if (editor.selection.getRng().collapsed) {
- var wrapper = makeAnnotation(editor.getDoc(), data, name, settings.decorate);
- set$1(wrapper, '\xA0');
- editor.selection.getRng().insertNode(wrapper.dom());
- editor.selection.select(wrapper.dom());
- } else {
- var bookmark = GetBookmark.getPersistentBookmark(editor.selection, false);
- var rng = editor.selection.getRng();
- annotate(editor, rng, name, settings.decorate, data);
- editor.selection.moveToBookmark(bookmark);
- }
- });
- };
-
- function Annotator (editor) {
- var registry = create$1();
- setup$1(editor, registry);
- var changes = setup(editor);
- return {
- register: function (name, settings) {
- registry.register(name, settings);
- },
- annotate: function (name, data) {
- registry.lookup(name).each(function (settings) {
- annotateWithBookmark(editor, name, settings, data);
- });
- },
- annotationChanged: function (name, callback) {
- changes.addListener(name, callback);
- },
- remove: function (name) {
- identify(editor, Option.some(name)).each(function (_a) {
- var elements = _a.elements;
- each(elements, unwrap);
- });
- },
- getAll: function (name) {
- var directory = findAll(editor, name);
- return map$2(directory, function (elems) {
- return map(elems, function (elem) {
- return elem.dom();
- });
- });
- }
- };
- }
-
- var hasOnlyOneChild = function (node) {
- return node.firstChild && node.firstChild === node.lastChild;
- };
- var isPaddingNode = function (node) {
- return node.name === 'br' || node.value === '\xA0';
- };
- var isPaddedEmptyBlock = function (schema, node) {
- var blockElements = schema.getBlockElements();
- return blockElements[node.name] && hasOnlyOneChild(node) && isPaddingNode(node.firstChild);
- };
- var isEmptyFragmentElement = function (schema, node) {
- var nonEmptyElements = schema.getNonEmptyElements();
- return node && (node.isEmpty(nonEmptyElements) || isPaddedEmptyBlock(schema, node));
- };
- var isListFragment = function (schema, fragment) {
- var firstChild = fragment.firstChild;
- var lastChild = fragment.lastChild;
- if (firstChild && firstChild.name === 'meta') {
- firstChild = firstChild.next;
- }
- if (lastChild && lastChild.attr('id') === 'mce_marker') {
- lastChild = lastChild.prev;
- }
- if (isEmptyFragmentElement(schema, lastChild)) {
- lastChild = lastChild.prev;
- }
- if (!firstChild || firstChild !== lastChild) {
- return false;
- }
- return firstChild.name === 'ul' || firstChild.name === 'ol';
- };
- var cleanupDomFragment = function (domFragment) {
- var firstChild = domFragment.firstChild;
- var lastChild = domFragment.lastChild;
- if (firstChild && firstChild.nodeName === 'META') {
- firstChild.parentNode.removeChild(firstChild);
- }
- if (lastChild && lastChild.id === 'mce_marker') {
- lastChild.parentNode.removeChild(lastChild);
- }
- return domFragment;
- };
- var toDomFragment = function (dom, serializer, fragment) {
- var html = serializer.serialize(fragment);
- var domFragment = dom.createFragment(html);
- return cleanupDomFragment(domFragment);
- };
- var listItems$1 = function (elm) {
- return Tools.grep(elm.childNodes, function (child) {
- return child.nodeName === 'LI';
- });
- };
- var isPadding = function (node) {
- return node.data === '\xA0' || NodeType.isBr(node);
- };
- var isListItemPadded = function (node) {
- return node && node.firstChild && node.firstChild === node.lastChild && isPadding(node.firstChild);
- };
- var isEmptyOrPadded = function (elm) {
- return !elm.firstChild || isListItemPadded(elm);
- };
- var trimListItems = function (elms) {
- return elms.length > 0 && isEmptyOrPadded(elms[elms.length - 1]) ? elms.slice(0, -1) : elms;
- };
- var getParentLi = function (dom, node) {
- var parentBlock = dom.getParent(node, dom.isBlock);
- return parentBlock && parentBlock.nodeName === 'LI' ? parentBlock : null;
- };
- var isParentBlockLi = function (dom, node) {
- return !!getParentLi(dom, node);
- };
- var getSplit = function (parentNode, rng) {
- var beforeRng = rng.cloneRange();
- var afterRng = rng.cloneRange();
- beforeRng.setStartBefore(parentNode);
- afterRng.setEndAfter(parentNode);
- return [
- beforeRng.cloneContents(),
- afterRng.cloneContents()
- ];
- };
- var findFirstIn = function (node, rootNode) {
- var caretPos = CaretPosition$1.before(node);
- var caretWalker = CaretWalker(rootNode);
- var newCaretPos = caretWalker.next(caretPos);
- return newCaretPos ? newCaretPos.toRange() : null;
- };
- var findLastOf = function (node, rootNode) {
- var caretPos = CaretPosition$1.after(node);
- var caretWalker = CaretWalker(rootNode);
- var newCaretPos = caretWalker.prev(caretPos);
- return newCaretPos ? newCaretPos.toRange() : null;
- };
- var insertMiddle = function (target, elms, rootNode, rng) {
- var parts = getSplit(target, rng);
- var parentElm = target.parentNode;
- parentElm.insertBefore(parts[0], target);
- Tools.each(elms, function (li) {
- parentElm.insertBefore(li, target);
- });
- parentElm.insertBefore(parts[1], target);
- parentElm.removeChild(target);
- return findLastOf(elms[elms.length - 1], rootNode);
- };
- var insertBefore = function (target, elms, rootNode) {
- var parentElm = target.parentNode;
- Tools.each(elms, function (elm) {
- parentElm.insertBefore(elm, target);
- });
- return findFirstIn(target, rootNode);
- };
- var insertAfter = function (target, elms, rootNode, dom) {
- dom.insertAfter(elms.reverse(), target);
- return findLastOf(elms[0], rootNode);
- };
- var insertAtCaret = function (serializer, dom, rng, fragment) {
- var domFragment = toDomFragment(dom, serializer, fragment);
- var liTarget = getParentLi(dom, rng.startContainer);
- var liElms = trimListItems(listItems$1(domFragment.firstChild));
- var BEGINNING = 1, END = 2;
- var rootNode = dom.getRoot();
- var isAt = function (location) {
- var caretPos = CaretPosition$1.fromRangeStart(rng);
- var caretWalker = CaretWalker(dom.getRoot());
- var newPos = location === BEGINNING ? caretWalker.prev(caretPos) : caretWalker.next(caretPos);
- return newPos ? getParentLi(dom, newPos.getNode()) !== liTarget : true;
- };
- if (isAt(BEGINNING)) {
- return insertBefore(liTarget, liElms, rootNode);
- } else if (isAt(END)) {
- return insertAfter(liTarget, liElms, rootNode, dom);
- }
- return insertMiddle(liTarget, liElms, rootNode, rng);
- };
- var InsertList = {
- isListFragment: isListFragment,
- insertAtCaret: insertAtCaret,
- isParentBlockLi: isParentBlockLi,
- trimListItems: trimListItems,
- listItems: listItems$1
- };
-
- var each$9 = Tools.each;
- var ElementUtils = function (dom) {
- this.compare = function (node1, node2) {
- if (node1.nodeName !== node2.nodeName) {
- return false;
- }
- var getAttribs = function (node) {
- var attribs = {};
- each$9(dom.getAttribs(node), function (attr) {
- var name = attr.nodeName.toLowerCase();
- if (name.indexOf('_') !== 0 && name !== 'style' && name.indexOf('data-') !== 0) {
- attribs[name] = dom.getAttrib(node, name);
- }
- });
- return attribs;
- };
- var compareObjects = function (obj1, obj2) {
- var value, name;
- for (name in obj1) {
- if (obj1.hasOwnProperty(name)) {
- value = obj2[name];
- if (typeof value === 'undefined') {
- return false;
- }
- if (obj1[name] !== value) {
- return false;
- }
- delete obj2[name];
- }
- }
- for (name in obj2) {
- if (obj2.hasOwnProperty(name)) {
- return false;
- }
- }
- return true;
- };
- if (!compareObjects(getAttribs(node1), getAttribs(node2))) {
- return false;
- }
- if (!compareObjects(dom.parseStyle(dom.getAttrib(node1, 'style')), dom.parseStyle(dom.getAttrib(node2, 'style')))) {
- return false;
- }
- return !Bookmarks.isBookmarkNode(node1) && !Bookmarks.isBookmarkNode(node2);
- };
- };
-
- var getLastChildren = function (elm) {
- var children = [];
- var rawNode = elm.dom();
- while (rawNode) {
- children.push(Element.fromDom(rawNode));
- rawNode = rawNode.lastChild;
- }
- return children;
- };
- var removeTrailingBr = function (elm) {
- var allBrs = descendants$1(elm, 'br');
- var brs = filter(getLastChildren(elm).slice(-1), isBr);
- if (allBrs.length === brs.length) {
- each(brs, remove$1);
- }
- };
- var fillWithPaddingBr = function (elm) {
- empty(elm);
- append(elm, Element.fromHtml(' '));
- };
- var isPaddingContents = function (elm) {
- return isText(elm) ? get$4(elm) === '\xA0' : isBr(elm);
- };
- var isPaddedElement = function (elm) {
- return filter(children(elm), isPaddingContents).length === 1;
- };
- var trimBlockTrailingBr = function (elm) {
- lastChild(elm).each(function (lastChild) {
- prevSibling(lastChild).each(function (lastChildPrevSibling) {
- if (isBlock(elm) && isBr(lastChild) && isBlock(lastChildPrevSibling)) {
- remove$1(lastChild);
- }
- });
- });
- };
- var PaddingBr = {
- removeTrailingBr: removeTrailingBr,
- fillWithPaddingBr: fillWithPaddingBr,
- isPaddedElement: isPaddedElement,
- trimBlockTrailingBr: trimBlockTrailingBr
- };
-
- var makeMap$3 = Tools.makeMap;
- function Writer (settings) {
- var html = [];
- var indent, indentBefore, indentAfter, encode, htmlOutput;
- settings = settings || {};
- indent = settings.indent;
- indentBefore = makeMap$3(settings.indent_before || '');
- indentAfter = makeMap$3(settings.indent_after || '');
- encode = Entities.getEncodeFunc(settings.entity_encoding || 'raw', settings.entities);
- htmlOutput = settings.element_format === 'html';
- return {
- start: function (name, attrs, empty) {
- var i, l, attr, value;
- if (indent && indentBefore[name] && html.length > 0) {
- value = html[html.length - 1];
- if (value.length > 0 && value !== '\n') {
- html.push('\n');
- }
- }
- html.push('<', name);
- if (attrs) {
- for (i = 0, l = attrs.length; i < l; i++) {
- attr = attrs[i];
- html.push(' ', attr.name, '="', encode(attr.value, true), '"');
- }
- }
- if (!empty || htmlOutput) {
- html[html.length] = '>';
- } else {
- html[html.length] = ' />';
- }
- if (empty && indent && indentAfter[name] && html.length > 0) {
- value = html[html.length - 1];
- if (value.length > 0 && value !== '\n') {
- html.push('\n');
- }
- }
- },
- end: function (name) {
- var value;
- html.push('', name, '>');
- if (indent && indentAfter[name] && html.length > 0) {
- value = html[html.length - 1];
- if (value.length > 0 && value !== '\n') {
- html.push('\n');
- }
- }
- },
- text: function (text, raw) {
- if (text.length > 0) {
- html[html.length] = raw ? text : encode(text);
- }
- },
- cdata: function (text) {
- html.push('');
- },
- comment: function (text) {
- html.push('');
- },
- pi: function (name, text) {
- if (text) {
- html.push('', name, ' ', encode(text), '?>');
- } else {
- html.push('', name, '?>');
- }
- if (indent) {
- html.push('\n');
- }
- },
- doctype: function (text) {
- html.push('', indent ? '\n' : '');
- },
- reset: function () {
- html.length = 0;
- },
- getContent: function () {
- return html.join('').replace(/\n$/, '');
- }
- };
- }
-
- function HtmlSerializer (settings, schema) {
- if (schema === void 0) {
- schema = Schema();
- }
- var writer = Writer(settings);
- settings = settings || {};
- settings.validate = 'validate' in settings ? settings.validate : true;
- var serialize = function (node) {
- var handlers, validate;
- validate = settings.validate;
- handlers = {
- 3: function (node) {
- writer.text(node.value, node.raw);
- },
- 8: function (node) {
- writer.comment(node.value);
- },
- 7: function (node) {
- writer.pi(node.name, node.value);
- },
- 10: function (node) {
- writer.doctype(node.value);
- },
- 4: function (node) {
- writer.cdata(node.value);
- },
- 11: function (node) {
- if (node = node.firstChild) {
- do {
- walk(node);
- } while (node = node.next);
- }
- }
- };
- writer.reset();
- var walk = function (node) {
- var handler = handlers[node.type];
- var name, isEmpty, attrs, attrName, attrValue, sortedAttrs, i, l, elementRule;
- if (!handler) {
- name = node.name;
- isEmpty = node.shortEnded;
- attrs = node.attributes;
- if (validate && attrs && attrs.length > 1) {
- sortedAttrs = [];
- sortedAttrs.map = {};
- elementRule = schema.getElementRule(node.name);
- if (elementRule) {
- for (i = 0, l = elementRule.attributesOrder.length; i < l; i++) {
- attrName = elementRule.attributesOrder[i];
- if (attrName in attrs.map) {
- attrValue = attrs.map[attrName];
- sortedAttrs.map[attrName] = attrValue;
- sortedAttrs.push({
- name: attrName,
- value: attrValue
- });
- }
- }
- for (i = 0, l = attrs.length; i < l; i++) {
- attrName = attrs[i].name;
- if (!(attrName in sortedAttrs.map)) {
- attrValue = attrs.map[attrName];
- sortedAttrs.map[attrName] = attrValue;
- sortedAttrs.push({
- name: attrName,
- value: attrValue
- });
- }
- }
- attrs = sortedAttrs;
- }
- }
- writer.start(node.name, attrs, isEmpty);
- if (!isEmpty) {
- if (node = node.firstChild) {
- do {
- walk(node);
- } while (node = node.next);
- }
- writer.end(name);
- }
- } else {
- handler(node);
- }
- };
- if (node.type === 1 && !settings.inner) {
- walk(node);
- } else {
- handlers[11](node);
- }
- return writer.getContent();
- };
- return { serialize: serialize };
- }
-
- var createRange$1 = function (sc, so, ec, eo) {
- var rng = domGlobals.document.createRange();
- rng.setStart(sc, so);
- rng.setEnd(ec, eo);
- return rng;
- };
- var normalizeBlockSelectionRange = function (rng) {
- var startPos = CaretPosition$1.fromRangeStart(rng);
- var endPos = CaretPosition$1.fromRangeEnd(rng);
- var rootNode = rng.commonAncestorContainer;
- return CaretFinder.fromPosition(false, rootNode, endPos).map(function (newEndPos) {
- if (!isInSameBlock(startPos, endPos, rootNode) && isInSameBlock(startPos, newEndPos, rootNode)) {
- return createRange$1(startPos.container(), startPos.offset(), newEndPos.container(), newEndPos.offset());
- } else {
- return rng;
- }
- }).getOr(rng);
- };
- var normalize = function (rng) {
- return rng.collapsed ? rng : normalizeBlockSelectionRange(rng);
- };
- var RangeNormalizer = { normalize: normalize };
-
- var isAfterNbsp = function (container, offset) {
- return NodeType.isText(container) && container.nodeValue[offset - 1] === '\xA0';
- };
- var trimOrPadLeftRight = function (rng, html) {
- var container, offset;
- container = rng.startContainer;
- offset = rng.startOffset;
- var hasSiblingText = function (siblingName) {
- return container[siblingName] && container[siblingName].nodeType === 3;
- };
- if (container.nodeType === 3) {
- if (offset > 0) {
- html = html.replace(/^ /, ' ');
- } else if (!hasSiblingText('previousSibling')) {
- html = html.replace(/^ /, ' ');
- }
- if (offset < container.length) {
- html = html.replace(/ ( |)$/, ' ');
- } else if (!hasSiblingText('nextSibling')) {
- html = html.replace(/( | )( |)$/, ' ');
- }
- }
- return html;
- };
- var trimNbspAfterDeleteAndPadValue = function (rng, value) {
- var container, offset;
- container = rng.startContainer;
- offset = rng.startOffset;
- if (container.nodeType === 3 && rng.collapsed) {
- if (container.data[offset] === '\xA0') {
- container.deleteData(offset, 1);
- if (!/[\u00a0| ]$/.test(value)) {
- value += ' ';
- }
- } else if (container.data[offset - 1] === '\xA0') {
- container.deleteData(offset - 1, 1);
- if (!/[\u00a0| ]$/.test(value)) {
- value = ' ' + value;
- }
- }
- }
- return value;
- };
-
- var isTableCell$2 = NodeType.matchNodeNames('td th');
- var selectionSetContent = function (editor, content) {
- var rng = editor.selection.getRng();
- var container = rng.startContainer;
- var offset = rng.startOffset;
- if (rng.collapsed && isAfterNbsp(container, offset) && NodeType.isText(container)) {
- container.insertData(offset - 1, ' ');
- container.deleteData(offset, 1);
- rng.setStart(container, offset);
- rng.setEnd(container, offset);
- editor.selection.setRng(rng);
- }
- editor.selection.setContent(content);
- };
- var validInsertion = function (editor, value, parentNode) {
- if (parentNode.getAttribute('data-mce-bogus') === 'all') {
- parentNode.parentNode.insertBefore(editor.dom.createFragment(value), parentNode);
- } else {
- var node = parentNode.firstChild;
- var node2 = parentNode.lastChild;
- if (!node || node === node2 && node.nodeName === 'BR') {
- editor.dom.setHTML(parentNode, value);
- } else {
- selectionSetContent(editor, value);
- }
- }
- };
- var trimBrsFromTableCell = function (dom, elm) {
- Option.from(dom.getParent(elm, 'td,th')).map(Element.fromDom).each(PaddingBr.trimBlockTrailingBr);
- };
- var reduceInlineTextElements = function (editor, merge) {
- var textInlineElements = editor.schema.getTextInlineElements();
- var dom = editor.dom;
- if (merge) {
- var root_1 = editor.getBody(), elementUtils_1 = new ElementUtils(dom);
- Tools.each(dom.select('*[data-mce-fragment]'), function (node) {
- for (var testNode = node.parentNode; testNode && testNode !== root_1; testNode = testNode.parentNode) {
- if (textInlineElements[node.nodeName.toLowerCase()] && elementUtils_1.compare(testNode, node)) {
- dom.remove(node, true);
- }
- }
- });
- }
- };
- var markFragmentElements = function (fragment) {
- var node = fragment;
- while (node = node.walk()) {
- if (node.type === 1) {
- node.attr('data-mce-fragment', '1');
- }
- }
- };
- var umarkFragmentElements = function (elm) {
- Tools.each(elm.getElementsByTagName('*'), function (elm) {
- elm.removeAttribute('data-mce-fragment');
- });
- };
- var isPartOfFragment = function (node) {
- return !!node.getAttribute('data-mce-fragment');
- };
- var canHaveChildren = function (editor, node) {
- return node && !editor.schema.getShortEndedElements()[node.nodeName];
- };
- var moveSelectionToMarker = function (editor, marker) {
- var parentEditableFalseElm, parentBlock, nextRng;
- var dom = editor.dom, selection = editor.selection;
- var node, node2;
- var getContentEditableFalseParent = function (node) {
- var root = editor.getBody();
- for (; node && node !== root; node = node.parentNode) {
- if (editor.dom.getContentEditable(node) === 'false') {
- return node;
- }
- }
- return null;
- };
- if (!marker) {
- return;
- }
- editor.selection.scrollIntoView(marker);
- parentEditableFalseElm = getContentEditableFalseParent(marker);
- if (parentEditableFalseElm) {
- dom.remove(marker);
- selection.select(parentEditableFalseElm);
- return;
- }
- var rng = dom.createRng();
- node = marker.previousSibling;
- if (node && node.nodeType === 3) {
- rng.setStart(node, node.nodeValue.length);
- if (!Env.ie) {
- node2 = marker.nextSibling;
- if (node2 && node2.nodeType === 3) {
- node.appendData(node2.data);
- node2.parentNode.removeChild(node2);
- }
- }
- } else {
- rng.setStartBefore(marker);
- rng.setEndBefore(marker);
- }
- var findNextCaretRng = function (rng) {
- var caretPos = CaretPosition$1.fromRangeStart(rng);
- var caretWalker = CaretWalker(editor.getBody());
- caretPos = caretWalker.next(caretPos);
- if (caretPos) {
- return caretPos.toRange();
- }
- };
- parentBlock = dom.getParent(marker, dom.isBlock);
- dom.remove(marker);
- if (parentBlock && dom.isEmpty(parentBlock)) {
- editor.$(parentBlock).empty();
- rng.setStart(parentBlock, 0);
- rng.setEnd(parentBlock, 0);
- if (!isTableCell$2(parentBlock) && !isPartOfFragment(parentBlock) && (nextRng = findNextCaretRng(rng))) {
- rng = nextRng;
- dom.remove(parentBlock);
- } else {
- dom.add(parentBlock, dom.create('br', { 'data-mce-bogus': '1' }));
- }
- }
- selection.setRng(rng);
- };
- var insertHtmlAtCaret = function (editor, value, details) {
- var parser, serializer, parentNode, rootNode, fragment, args;
- var marker, rng, node, bookmarkHtml, merge;
- var selection = editor.selection, dom = editor.dom;
- if (/^ | $/.test(value)) {
- value = trimOrPadLeftRight(selection.getRng(), value);
- }
- parser = editor.parser;
- merge = details.merge;
- serializer = HtmlSerializer({ validate: editor.settings.validate }, editor.schema);
- bookmarkHtml = ' ';
- args = {
- content: value,
- format: 'html',
- selection: true,
- paste: details.paste
- };
- args = editor.fire('BeforeSetContent', args);
- if (args.isDefaultPrevented()) {
- editor.fire('SetContent', {
- content: args.content,
- format: 'html',
- selection: true,
- paste: details.paste
- });
- return;
- }
- value = args.content;
- if (value.indexOf('{$caret}') === -1) {
- value += '{$caret}';
- }
- value = value.replace(/\{\$caret\}/, bookmarkHtml);
- rng = selection.getRng();
- var caretElement = rng.startContainer || (rng.parentElement ? rng.parentElement() : null);
- var body = editor.getBody();
- if (caretElement === body && selection.isCollapsed()) {
- if (dom.isBlock(body.firstChild) && canHaveChildren(editor, body.firstChild) && dom.isEmpty(body.firstChild)) {
- rng = dom.createRng();
- rng.setStart(body.firstChild, 0);
- rng.setEnd(body.firstChild, 0);
- selection.setRng(rng);
- }
- }
- if (!selection.isCollapsed()) {
- editor.selection.setRng(RangeNormalizer.normalize(editor.selection.getRng()));
- editor.getDoc().execCommand('Delete', false, null);
- value = trimNbspAfterDeleteAndPadValue(editor.selection.getRng(), value);
- }
- parentNode = selection.getNode();
- var parserArgs = {
- context: parentNode.nodeName.toLowerCase(),
- data: details.data,
- insert: true
- };
- fragment = parser.parse(value, parserArgs);
- if (details.paste === true && InsertList.isListFragment(editor.schema, fragment) && InsertList.isParentBlockLi(dom, parentNode)) {
- rng = InsertList.insertAtCaret(serializer, dom, editor.selection.getRng(), fragment);
- editor.selection.setRng(rng);
- editor.fire('SetContent', args);
- return;
- }
- markFragmentElements(fragment);
- node = fragment.lastChild;
- if (node.attr('id') === 'mce_marker') {
- marker = node;
- for (node = node.prev; node; node = node.walk(true)) {
- if (node.type === 3 || !dom.isBlock(node.name)) {
- if (editor.schema.isValidChild(node.parent.name, 'span')) {
- node.parent.insert(marker, node, node.name === 'br');
- }
- break;
- }
- }
- }
- editor._selectionOverrides.showBlockCaretContainer(parentNode);
- if (!parserArgs.invalid) {
- value = serializer.serialize(fragment);
- validInsertion(editor, value, parentNode);
- } else {
- selectionSetContent(editor, bookmarkHtml);
- parentNode = selection.getNode();
- rootNode = editor.getBody();
- if (parentNode.nodeType === 9) {
- parentNode = node = rootNode;
- } else {
- node = parentNode;
- }
- while (node !== rootNode) {
- parentNode = node;
- node = node.parentNode;
- }
- value = parentNode === rootNode ? rootNode.innerHTML : dom.getOuterHTML(parentNode);
- value = serializer.serialize(parser.parse(value.replace(//i, function () {
- return serializer.serialize(fragment);
- })));
- if (parentNode === rootNode) {
- dom.setHTML(rootNode, value);
- } else {
- dom.setOuterHTML(parentNode, value);
- }
- }
- reduceInlineTextElements(editor, merge);
- moveSelectionToMarker(editor, dom.get('mce_marker'));
- umarkFragmentElements(editor.getBody());
- trimBrsFromTableCell(editor.dom, editor.selection.getStart());
- editor.fire('SetContent', args);
- editor.addVisual();
- };
- var processValue = function (value) {
- var details;
- if (typeof value !== 'string') {
- details = Tools.extend({
- paste: value.paste,
- data: { paste: value.paste }
- }, value);
- return {
- content: value.content,
- details: details
- };
- }
- return {
- content: value,
- details: {}
- };
- };
- var insertAtCaret$1 = function (editor, value) {
- var result = processValue(value);
- insertHtmlAtCaret(editor, result.content, result.details);
- };
- var InsertContent = { insertAtCaret: insertAtCaret$1 };
-
- var strongRtl = /[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/;
- var hasStrongRtl = function (text) {
- return strongRtl.test(text);
- };
-
- var getBodySetting = function (editor, name, defaultValue) {
- var value = editor.getParam(name, defaultValue);
- if (value.indexOf('=') !== -1) {
- var bodyObj = editor.getParam(name, '', 'hash');
- return bodyObj.hasOwnProperty(editor.id) ? bodyObj[editor.id] : defaultValue;
- } else {
- return value;
- }
- };
- var getIframeAttrs = function (editor) {
- return editor.getParam('iframe_attrs', {});
- };
- var getDocType = function (editor) {
- return editor.getParam('doctype', '');
- };
- var getDocumentBaseUrl = function (editor) {
- return editor.getParam('document_base_url', '');
- };
- var getBodyId = function (editor) {
- return getBodySetting(editor, 'body_id', 'tinymce');
- };
- var getBodyClass = function (editor) {
- return getBodySetting(editor, 'body_class', '');
- };
- var getContentSecurityPolicy = function (editor) {
- return editor.getParam('content_security_policy', '');
- };
- var shouldPutBrInPre = function (editor) {
- return editor.getParam('br_in_pre', true);
- };
- var getForcedRootBlock = function (editor) {
- if (editor.getParam('force_p_newlines', false)) {
- return 'p';
- }
- var block = editor.getParam('forced_root_block', 'p');
- return block === false ? '' : block;
- };
- var getForcedRootBlockAttrs = function (editor) {
- return editor.getParam('forced_root_block_attrs', {});
- };
- var getBrNewLineSelector = function (editor) {
- return editor.getParam('br_newline_selector', '.mce-toc h2,figcaption,caption');
- };
- var getNoNewLineSelector = function (editor) {
- return editor.getParam('no_newline_selector', '');
- };
- var shouldKeepStyles = function (editor) {
- return editor.getParam('keep_styles', true);
- };
- var shouldEndContainerOnEmptyBlock = function (editor) {
- return editor.getParam('end_container_on_empty_block', false);
- };
- var getFontStyleValues = function (editor) {
- return Tools.explode(editor.getParam('font_size_style_values', ''));
- };
- var getFontSizeClasses = function (editor) {
- return Tools.explode(editor.getParam('font_size_classes', ''));
- };
- var getImagesDataImgFilter = function (editor) {
- return editor.getParam('images_dataimg_filter', constant(true), 'function');
- };
- var isAutomaticUploadsEnabled = function (editor) {
- return editor.getParam('automatic_uploads', true, 'boolean');
- };
- var shouldReuseFileName = function (editor) {
- return editor.getParam('images_reuse_filename', false, 'boolean');
- };
- var shouldReplaceBlobUris = function (editor) {
- return editor.getParam('images_replace_blob_uris', true, 'boolean');
- };
- var getImageUploadUrl = function (editor) {
- return editor.getParam('images_upload_url', '', 'string');
- };
- var getImageUploadBasePath = function (editor) {
- return editor.getParam('images_upload_base_path', '', 'string');
- };
- var getImagesUploadCredentials = function (editor) {
- return editor.getParam('images_upload_credentials', false, 'boolean');
- };
- var getImagesUploadHandler = function (editor) {
- return editor.getParam('images_upload_handler', null, 'function');
- };
- var shouldUseContentCssCors = function (editor) {
- return editor.getParam('content_css_cors', false, 'boolean');
- };
- var getInlineBoundarySelector = function (editor) {
- return editor.getParam('inline_boundaries_selector', 'a[href],code,.mce-annotation', 'string');
- };
- var Settings = {
- getIframeAttrs: getIframeAttrs,
- getDocType: getDocType,
- getDocumentBaseUrl: getDocumentBaseUrl,
- getBodyId: getBodyId,
- getBodyClass: getBodyClass,
- getContentSecurityPolicy: getContentSecurityPolicy,
- shouldPutBrInPre: shouldPutBrInPre,
- getForcedRootBlock: getForcedRootBlock,
- getForcedRootBlockAttrs: getForcedRootBlockAttrs,
- getBrNewLineSelector: getBrNewLineSelector,
- getNoNewLineSelector: getNoNewLineSelector,
- shouldKeepStyles: shouldKeepStyles,
- shouldEndContainerOnEmptyBlock: shouldEndContainerOnEmptyBlock,
- getFontStyleValues: getFontStyleValues,
- getFontSizeClasses: getFontSizeClasses,
- getImagesDataImgFilter: getImagesDataImgFilter,
- isAutomaticUploadsEnabled: isAutomaticUploadsEnabled,
- shouldReuseFileName: shouldReuseFileName,
- shouldReplaceBlobUris: shouldReplaceBlobUris,
- getImageUploadUrl: getImageUploadUrl,
- getImageUploadBasePath: getImageUploadBasePath,
- getImagesUploadCredentials: getImagesUploadCredentials,
- getImagesUploadHandler: getImagesUploadHandler,
- shouldUseContentCssCors: shouldUseContentCssCors,
- getInlineBoundarySelector: getInlineBoundarySelector
- };
-
- var isInlineTarget = function (editor, elm) {
- return is$1(Element.fromDom(elm), Settings.getInlineBoundarySelector(editor));
- };
- var isRtl = function (element) {
- return DOMUtils$1.DOM.getStyle(element, 'direction', true) === 'rtl' || hasStrongRtl(element.textContent);
- };
- var findInlineParents = function (isInlineTarget, rootNode, pos) {
- return filter(DOMUtils$1.DOM.getParents(pos.container(), '*', rootNode), isInlineTarget);
- };
- var findRootInline = function (isInlineTarget, rootNode, pos) {
- var parents = findInlineParents(isInlineTarget, rootNode, pos);
- return Option.from(parents[parents.length - 1]);
- };
- var hasSameParentBlock = function (rootNode, node1, node2) {
- var block1 = getParentBlock(node1, rootNode);
- var block2 = getParentBlock(node2, rootNode);
- return block1 && block1 === block2;
- };
- var isAtZwsp = function (pos) {
- return isBeforeInline(pos) || isAfterInline(pos);
- };
- var normalizePosition = function (forward, pos) {
- if (!pos) {
- return pos;
- }
- var container = pos.container(), offset = pos.offset();
- if (forward) {
- if (isCaretContainerInline(container)) {
- if (NodeType.isText(container.nextSibling)) {
- return CaretPosition$1(container.nextSibling, 0);
- } else {
- return CaretPosition$1.after(container);
- }
- } else {
- return isBeforeInline(pos) ? CaretPosition$1(container, offset + 1) : pos;
- }
- } else {
- if (isCaretContainerInline(container)) {
- if (NodeType.isText(container.previousSibling)) {
- return CaretPosition$1(container.previousSibling, container.previousSibling.data.length);
- } else {
- return CaretPosition$1.before(container);
- }
- } else {
- return isAfterInline(pos) ? CaretPosition$1(container, offset - 1) : pos;
- }
- }
- };
- var normalizeForwards = curry(normalizePosition, true);
- var normalizeBackwards = curry(normalizePosition, false);
- var InlineUtils = {
- isInlineTarget: isInlineTarget,
- findRootInline: findRootInline,
- isRtl: isRtl,
- isAtZwsp: isAtZwsp,
- normalizePosition: normalizePosition,
- normalizeForwards: normalizeForwards,
- normalizeBackwards: normalizeBackwards,
- hasSameParentBlock: hasSameParentBlock
- };
-
- var isBeforeRoot = function (rootNode) {
- return function (elm) {
- return eq(rootNode, Element.fromDom(elm.dom().parentNode));
- };
- };
- var getParentBlock$1 = function (rootNode, elm) {
- return contains$3(rootNode, elm) ? closest(elm, function (element) {
- return isTextBlock(element) || isListItem(element);
- }, isBeforeRoot(rootNode)) : Option.none();
- };
- var placeCaretInEmptyBody = function (editor) {
- var body = editor.getBody();
- var node = body.firstChild && editor.dom.isBlock(body.firstChild) ? body.firstChild : body;
- editor.selection.setCursorLocation(node, 0);
- };
- var paddEmptyBody = function (editor) {
- if (editor.dom.isEmpty(editor.getBody())) {
- editor.setContent('');
- placeCaretInEmptyBody(editor);
- }
- };
- var willDeleteLastPositionInElement = function (forward, fromPos, elm) {
- return lift2(CaretFinder.firstPositionIn(elm), CaretFinder.lastPositionIn(elm), function (firstPos, lastPos) {
- var normalizedFirstPos = InlineUtils.normalizePosition(true, firstPos);
- var normalizedLastPos = InlineUtils.normalizePosition(false, lastPos);
- var normalizedFromPos = InlineUtils.normalizePosition(false, fromPos);
- if (forward) {
- return CaretFinder.nextPosition(elm, normalizedFromPos).map(function (nextPos) {
- return nextPos.isEqual(normalizedLastPos) && fromPos.isEqual(normalizedFirstPos);
- }).getOr(false);
- } else {
- return CaretFinder.prevPosition(elm, normalizedFromPos).map(function (prevPos) {
- return prevPos.isEqual(normalizedFirstPos) && fromPos.isEqual(normalizedLastPos);
- }).getOr(false);
- }
- }).getOr(true);
- };
- var DeleteUtils = {
- getParentBlock: getParentBlock$1,
- paddEmptyBody: paddEmptyBody,
- willDeleteLastPositionInElement: willDeleteLastPositionInElement
- };
-
- var ancestor$2 = function (scope, selector, isRoot) {
- return ancestor$1(scope, selector, isRoot).isSome();
- };
-
- var hasWhitespacePreserveParent = function (rootNode, node) {
- var rootElement = Element.fromDom(rootNode);
- var startNode = Element.fromDom(node);
- return ancestor$2(startNode, 'pre,code', curry(eq, rootElement));
- };
- var isWhitespace = function (rootNode, node) {
- return NodeType.isText(node) && /^[ \t\r\n]*$/.test(node.data) && hasWhitespacePreserveParent(rootNode, node) === false;
- };
- var isNamedAnchor = function (node) {
- return NodeType.isElement(node) && node.nodeName === 'A' && node.hasAttribute('name');
- };
- var isContent = function (rootNode, node) {
- return isCaretCandidate(node) && isWhitespace(rootNode, node) === false || isNamedAnchor(node) || isBookmark(node);
- };
- var isBookmark = NodeType.hasAttribute('data-mce-bookmark');
- var isBogus$2 = NodeType.hasAttribute('data-mce-bogus');
- var isBogusAll$1 = NodeType.hasAttributeValue('data-mce-bogus', 'all');
- var isEmptyNode = function (targetNode) {
- var walker, node, brCount = 0;
- if (isContent(targetNode, targetNode)) {
- return false;
- } else {
- node = targetNode.firstChild;
- if (!node) {
- return true;
- }
- walker = new TreeWalker(node, targetNode);
- do {
- if (isBogusAll$1(node)) {
- node = walker.next(true);
- continue;
- }
- if (isBogus$2(node)) {
- node = walker.next();
- continue;
- }
- if (NodeType.isBr(node)) {
- brCount++;
- node = walker.next();
- continue;
- }
- if (isContent(targetNode, node)) {
- return false;
- }
- node = walker.next();
- } while (node);
- return brCount <= 1;
- }
- };
- var isEmpty$1 = function (elm) {
- return isEmptyNode(elm.dom());
- };
- var Empty = { isEmpty: isEmpty$1 };
-
- var BlockPosition = Immutable('block', 'position');
- var BlockBoundary = Immutable('from', 'to');
- var getBlockPosition = function (rootNode, pos) {
- var rootElm = Element.fromDom(rootNode);
- var containerElm = Element.fromDom(pos.container());
- return DeleteUtils.getParentBlock(rootElm, containerElm).map(function (block) {
- return BlockPosition(block, pos);
- });
- };
- var isDifferentBlocks = function (blockBoundary) {
- return eq(blockBoundary.from().block(), blockBoundary.to().block()) === false;
- };
- var hasSameParent = function (blockBoundary) {
- return parent(blockBoundary.from().block()).bind(function (parent1) {
- return parent(blockBoundary.to().block()).filter(function (parent2) {
- return eq(parent1, parent2);
- });
- }).isSome();
- };
- var isEditable = function (blockBoundary) {
- return NodeType.isContentEditableFalse(blockBoundary.from().block().dom()) === false && NodeType.isContentEditableFalse(blockBoundary.to().block().dom()) === false;
- };
- var skipLastBr = function (rootNode, forward, blockPosition) {
- if (NodeType.isBr(blockPosition.position().getNode()) && Empty.isEmpty(blockPosition.block()) === false) {
- return CaretFinder.positionIn(false, blockPosition.block().dom()).bind(function (lastPositionInBlock) {
- if (lastPositionInBlock.isEqual(blockPosition.position())) {
- return CaretFinder.fromPosition(forward, rootNode, lastPositionInBlock).bind(function (to) {
- return getBlockPosition(rootNode, to);
- });
- } else {
- return Option.some(blockPosition);
- }
- }).getOr(blockPosition);
- } else {
- return blockPosition;
- }
- };
- var readFromRange = function (rootNode, forward, rng) {
- var fromBlockPos = getBlockPosition(rootNode, CaretPosition$1.fromRangeStart(rng));
- var toBlockPos = fromBlockPos.bind(function (blockPos) {
- return CaretFinder.fromPosition(forward, rootNode, blockPos.position()).bind(function (to) {
- return getBlockPosition(rootNode, to).map(function (blockPos) {
- return skipLastBr(rootNode, forward, blockPos);
- });
- });
- });
- return lift2(fromBlockPos, toBlockPos, BlockBoundary).filter(function (blockBoundary) {
- return isDifferentBlocks(blockBoundary) && hasSameParent(blockBoundary) && isEditable(blockBoundary);
- });
- };
- var read$1 = function (rootNode, forward, rng) {
- return rng.collapsed ? readFromRange(rootNode, forward, rng) : Option.none();
- };
- var BlockMergeBoundary = { read: read$1 };
-
- var dropLast = function (xs) {
- return xs.slice(0, -1);
- };
- var parentsUntil$1 = function (start, root, predicate) {
- if (contains$3(root, start)) {
- return dropLast(parents(start, function (elm) {
- return predicate(elm) || eq(elm, root);
- }));
- } else {
- return [];
- }
- };
- var parents$1 = function (start, root) {
- return parentsUntil$1(start, root, constant(false));
- };
- var parentsAndSelf = function (start, root) {
- return [start].concat(parents$1(start, root));
- };
- var Parents = {
- parentsUntil: parentsUntil$1,
- parents: parents$1,
- parentsAndSelf: parentsAndSelf
- };
-
- var getChildrenUntilBlockBoundary = function (block) {
- var children$1 = children(block);
- return findIndex(children$1, isBlock).fold(function () {
- return children$1;
- }, function (index) {
- return children$1.slice(0, index);
- });
- };
- var extractChildren = function (block) {
- var children = getChildrenUntilBlockBoundary(block);
- each(children, remove$1);
- return children;
- };
- var removeEmptyRoot = function (rootNode, block) {
- var parents = Parents.parentsAndSelf(block, rootNode);
- return find(parents.reverse(), Empty.isEmpty).each(remove$1);
- };
- var isEmptyBefore = function (el) {
- return filter(prevSiblings(el), function (el) {
- return !Empty.isEmpty(el);
- }).length === 0;
- };
- var nestedBlockMerge = function (rootNode, fromBlock, toBlock, insertionPoint) {
- if (Empty.isEmpty(toBlock)) {
- PaddingBr.fillWithPaddingBr(toBlock);
- return CaretFinder.firstPositionIn(toBlock.dom());
- }
- if (isEmptyBefore(insertionPoint) && Empty.isEmpty(fromBlock)) {
- before(insertionPoint, Element.fromTag('br'));
- }
- var position = CaretFinder.prevPosition(toBlock.dom(), CaretPosition$1.before(insertionPoint.dom()));
- each(extractChildren(fromBlock), function (child) {
- before(insertionPoint, child);
- });
- removeEmptyRoot(rootNode, fromBlock);
- return position;
- };
- var sidelongBlockMerge = function (rootNode, fromBlock, toBlock) {
- if (Empty.isEmpty(toBlock)) {
- remove$1(toBlock);
- if (Empty.isEmpty(fromBlock)) {
- PaddingBr.fillWithPaddingBr(fromBlock);
- }
- return CaretFinder.firstPositionIn(fromBlock.dom());
- }
- var position = CaretFinder.lastPositionIn(toBlock.dom());
- each(extractChildren(fromBlock), function (child) {
- append(toBlock, child);
- });
- removeEmptyRoot(rootNode, fromBlock);
- return position;
- };
- var findInsertionPoint = function (toBlock, block) {
- var parentsAndSelf = Parents.parentsAndSelf(block, toBlock);
- return Option.from(parentsAndSelf[parentsAndSelf.length - 1]);
- };
- var getInsertionPoint = function (fromBlock, toBlock) {
- return contains$3(toBlock, fromBlock) ? findInsertionPoint(toBlock, fromBlock) : Option.none();
- };
- var trimBr = function (first, block) {
- CaretFinder.positionIn(first, block.dom()).map(function (position) {
- return position.getNode();
- }).map(Element.fromDom).filter(isBr).each(remove$1);
- };
- var mergeBlockInto = function (rootNode, fromBlock, toBlock) {
- trimBr(true, fromBlock);
- trimBr(false, toBlock);
- return getInsertionPoint(fromBlock, toBlock).fold(curry(sidelongBlockMerge, rootNode, fromBlock, toBlock), curry(nestedBlockMerge, rootNode, fromBlock, toBlock));
- };
- var mergeBlocks = function (rootNode, forward, block1, block2) {
- return forward ? mergeBlockInto(rootNode, block2, block1) : mergeBlockInto(rootNode, block1, block2);
- };
- var MergeBlocks = { mergeBlocks: mergeBlocks };
-
- var backspaceDelete = function (editor, forward) {
- var position;
- var rootNode = Element.fromDom(editor.getBody());
- position = BlockMergeBoundary.read(rootNode.dom(), forward, editor.selection.getRng()).bind(function (blockBoundary) {
- return MergeBlocks.mergeBlocks(rootNode, forward, blockBoundary.from().block(), blockBoundary.to().block());
- });
- position.each(function (pos) {
- editor.selection.setRng(pos.toRange());
- });
- return position.isSome();
- };
- var BlockBoundaryDelete = { backspaceDelete: backspaceDelete };
-
- var deleteRangeMergeBlocks = function (rootNode, selection) {
- var rng = selection.getRng();
- return lift2(DeleteUtils.getParentBlock(rootNode, Element.fromDom(rng.startContainer)), DeleteUtils.getParentBlock(rootNode, Element.fromDom(rng.endContainer)), function (block1, block2) {
- if (eq(block1, block2) === false) {
- rng.deleteContents();
- MergeBlocks.mergeBlocks(rootNode, true, block1, block2).each(function (pos) {
- selection.setRng(pos.toRange());
- });
- return true;
- } else {
- return false;
- }
- }).getOr(false);
- };
- var isRawNodeInTable = function (root, rawNode) {
- var node = Element.fromDom(rawNode);
- var isRoot = curry(eq, root);
- return ancestor(node, isTableCell, isRoot).isSome();
- };
- var isSelectionInTable = function (root, rng) {
- return isRawNodeInTable(root, rng.startContainer) || isRawNodeInTable(root, rng.endContainer);
- };
- var isEverythingSelected = function (root, rng) {
- var noPrevious = CaretFinder.prevPosition(root.dom(), CaretPosition$1.fromRangeStart(rng)).isNone();
- var noNext = CaretFinder.nextPosition(root.dom(), CaretPosition$1.fromRangeEnd(rng)).isNone();
- return !isSelectionInTable(root, rng) && noPrevious && noNext;
- };
- var emptyEditor = function (editor) {
- editor.setContent('');
- editor.selection.setCursorLocation();
- return true;
- };
- var deleteRange = function (editor) {
- var rootNode = Element.fromDom(editor.getBody());
- var rng = editor.selection.getRng();
- return isEverythingSelected(rootNode, rng) ? emptyEditor(editor) : deleteRangeMergeBlocks(rootNode, editor.selection);
- };
- var backspaceDelete$1 = function (editor, forward) {
- return editor.selection.isCollapsed() ? false : deleteRange(editor);
- };
- var BlockRangeDelete = { backspaceDelete: backspaceDelete$1 };
-
- var generate$1 = function (cases) {
- if (!isArray(cases)) {
- throw new Error('cases must be an array');
- }
- if (cases.length === 0) {
- throw new Error('there must be at least one case');
- }
- var constructors = [];
- var adt = {};
- each(cases, function (acase, count) {
- var keys$1 = keys(acase);
- if (keys$1.length !== 1) {
- throw new Error('one and only one name per case');
- }
- var key = keys$1[0];
- var value = acase[key];
- if (adt[key] !== undefined) {
- throw new Error('duplicate key detected:' + key);
- } else if (key === 'cata') {
- throw new Error('cannot have a case named cata (sorry)');
- } else if (!isArray(value)) {
- throw new Error('case arguments must be an array');
- }
- constructors.push(key);
- adt[key] = function () {
- var argLength = arguments.length;
- if (argLength !== value.length) {
- throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);
- }
- var args = new Array(argLength);
- for (var i = 0; i < args.length; i++) {
- args[i] = arguments[i];
- }
- var match = function (branches) {
- var branchKeys = keys(branches);
- if (constructors.length !== branchKeys.length) {
- throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(','));
- }
- var allReqd = forall(constructors, function (reqKey) {
- return contains(branchKeys, reqKey);
- });
- if (!allReqd) {
- throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', '));
- }
- return branches[key].apply(null, args);
- };
- return {
- fold: function () {
- if (arguments.length !== cases.length) {
- throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + arguments.length);
- }
- var target = arguments[count];
- return target.apply(null, args);
- },
- match: match,
- log: function (label) {
- domGlobals.console.log(label, {
- constructors: constructors,
- constructor: key,
- params: args
- });
- }
- };
- };
- });
- return adt;
- };
- var Adt = { generate: generate$1 };
-
- var isBr$5 = function (pos) {
- return getElementFromPosition(pos).exists(isBr);
- };
- var findBr = function (forward, root, pos) {
- var parentBlocks = filter(Parents.parentsAndSelf(Element.fromDom(pos.container()), root), isBlock);
- var scope = head(parentBlocks).getOr(root);
- return CaretFinder.fromPosition(forward, scope.dom(), pos).filter(isBr$5);
- };
- var isBeforeBr = function (root, pos) {
- return getElementFromPosition(pos).exists(isBr) || findBr(true, root, pos).isSome();
- };
- var isAfterBr = function (root, pos) {
- return getElementFromPrevPosition(pos).exists(isBr) || findBr(false, root, pos).isSome();
- };
- var findPreviousBr = curry(findBr, false);
- var findNextBr = curry(findBr, true);
-
- var is$2 = function (expected) {
- return function (actual) {
- return expected === actual;
- };
- };
- var isNbsp = is$2('\xA0');
- var isWhiteSpace$1 = function (chr) {
- return /^[\r\n\t ]$/.test(chr);
- };
- var isContent$1 = function (chr) {
- return !isWhiteSpace$1(chr) && !isNbsp(chr);
- };
-
- var isChar = function (forward, predicate, pos) {
- return Option.from(pos.container()).filter(NodeType.isText).exists(function (text) {
- var delta = forward ? 0 : -1;
- return predicate(text.data.charAt(pos.offset() + delta));
- });
- };
- var isBeforeSpace = curry(isChar, true, isWhiteSpace$1);
- var isAfterSpace = curry(isChar, false, isWhiteSpace$1);
- var isEmptyText = function (pos) {
- var container = pos.container();
- return NodeType.isText(container) && container.data.length === 0;
- };
- var isNextToContentEditableFalse = function (relativeOffset, caretPosition) {
- var node = getChildNodeAtRelativeOffset(relativeOffset, caretPosition);
- return NodeType.isContentEditableFalse(node) && !NodeType.isBogusAll(node);
- };
- var isBeforeContentEditableFalse = curry(isNextToContentEditableFalse, 0);
- var isAfterContentEditableFalse = curry(isNextToContentEditableFalse, -1);
- var isNextToTable = function (relativeOffset, caretPosition) {
- return NodeType.isTable(getChildNodeAtRelativeOffset(relativeOffset, caretPosition));
- };
- var isBeforeTable = curry(isNextToTable, 0);
- var isAfterTable = curry(isNextToTable, -1);
-
- var isCompoundElement = function (node) {
- return isTableCell(Element.fromDom(node)) || isListItem(Element.fromDom(node));
- };
- var DeleteAction = Adt.generate([
- { remove: ['element'] },
- { moveToElement: ['element'] },
- { moveToPosition: ['position'] }
- ]);
- var isAtContentEditableBlockCaret = function (forward, from) {
- var elm = from.getNode(forward === false);
- var caretLocation = forward ? 'after' : 'before';
- return NodeType.isElement(elm) && elm.getAttribute('data-mce-caret') === caretLocation;
- };
- var isDeleteFromCefDifferentBlocks = function (root, forward, from, to) {
- var inSameBlock = function (elm) {
- return isInline(Element.fromDom(elm)) && !isInSameBlock(from, to, root);
- };
- return getRelativeCefElm(!forward, from).fold(function () {
- return getRelativeCefElm(forward, to).fold(constant(false), inSameBlock);
- }, inSameBlock);
- };
- var deleteEmptyBlockOrMoveToCef = function (root, forward, from, to) {
- var toCefElm = to.getNode(forward === false);
- return DeleteUtils.getParentBlock(Element.fromDom(root), Element.fromDom(from.getNode())).map(function (blockElm) {
- return Empty.isEmpty(blockElm) ? DeleteAction.remove(blockElm.dom()) : DeleteAction.moveToElement(toCefElm);
- }).orThunk(function () {
- return Option.some(DeleteAction.moveToElement(toCefElm));
- });
- };
- var findCefPosition = function (root, forward, from) {
- return CaretFinder.fromPosition(forward, root, from).bind(function (to) {
- if (isCompoundElement(to.getNode())) {
- return Option.none();
- } else if (isDeleteFromCefDifferentBlocks(root, forward, from, to)) {
- return Option.none();
- } else if (forward && NodeType.isContentEditableFalse(to.getNode())) {
- return deleteEmptyBlockOrMoveToCef(root, forward, from, to);
- } else if (forward === false && NodeType.isContentEditableFalse(to.getNode(true))) {
- return deleteEmptyBlockOrMoveToCef(root, forward, from, to);
- } else if (forward && isAfterContentEditableFalse(from)) {
- return Option.some(DeleteAction.moveToPosition(to));
- } else if (forward === false && isBeforeContentEditableFalse(from)) {
- return Option.some(DeleteAction.moveToPosition(to));
- } else {
- return Option.none();
- }
- });
- };
- var getContentEditableBlockAction = function (forward, elm) {
- if (forward && NodeType.isContentEditableFalse(elm.nextSibling)) {
- return Option.some(DeleteAction.moveToElement(elm.nextSibling));
- } else if (forward === false && NodeType.isContentEditableFalse(elm.previousSibling)) {
- return Option.some(DeleteAction.moveToElement(elm.previousSibling));
- } else {
- return Option.none();
- }
- };
- var skipMoveToActionFromInlineCefToContent = function (root, from, deleteAction) {
- return deleteAction.fold(function (elm) {
- return Option.some(DeleteAction.remove(elm));
- }, function (elm) {
- return Option.some(DeleteAction.moveToElement(elm));
- }, function (to) {
- if (isInSameBlock(from, to, root)) {
- return Option.none();
- } else {
- return Option.some(DeleteAction.moveToPosition(to));
- }
- });
- };
- var getContentEditableAction = function (root, forward, from) {
- if (isAtContentEditableBlockCaret(forward, from)) {
- return getContentEditableBlockAction(forward, from.getNode(forward === false)).fold(function () {
- return findCefPosition(root, forward, from);
- }, Option.some);
- } else {
- return findCefPosition(root, forward, from).bind(function (deleteAction) {
- return skipMoveToActionFromInlineCefToContent(root, from, deleteAction);
- });
- }
- };
- var read$2 = function (root, forward, rng) {
- var normalizedRange = normalizeRange(forward ? 1 : -1, root, rng);
- var from = CaretPosition$1.fromRangeStart(normalizedRange);
- var rootElement = Element.fromDom(root);
- if (forward === false && isAfterContentEditableFalse(from)) {
- return Option.some(DeleteAction.remove(from.getNode(true)));
- } else if (forward && isBeforeContentEditableFalse(from)) {
- return Option.some(DeleteAction.remove(from.getNode()));
- } else if (forward === false && isBeforeContentEditableFalse(from) && isAfterBr(rootElement, from)) {
- return findPreviousBr(rootElement, from).map(function (br) {
- return DeleteAction.remove(br.getNode());
- });
- } else if (forward && isAfterContentEditableFalse(from) && isBeforeBr(rootElement, from)) {
- return findNextBr(rootElement, from).map(function (br) {
- return DeleteAction.remove(br.getNode());
- });
- } else {
- return getContentEditableAction(root, forward, from);
- }
- };
-
- var isCollapsibleWhitespace = function (c) {
- return ' \f\n\r\t\x0B'.indexOf(c) !== -1;
- };
- var normalizeContent = function (content, isStartOfContent, isEndOfContent) {
- var result = foldl(content.split(''), function (acc, c) {
- if (isCollapsibleWhitespace(c) || c === '\xA0') {
- if (acc.previousCharIsSpace || acc.str === '' && isStartOfContent || acc.str.length === content.length - 1 && isEndOfContent) {
- return {
- previousCharIsSpace: false,
- str: acc.str + '\xA0'
- };
- } else {
- return {
- previousCharIsSpace: true,
- str: acc.str + ' '
- };
- }
- } else {
- return {
- previousCharIsSpace: false,
- str: acc.str + c
- };
- }
- }, {
- previousCharIsSpace: false,
- str: ''
- });
- return result.str;
- };
- var normalize$1 = function (node, offset, count) {
- if (count === 0) {
- return;
- }
- var whitespace = node.data.slice(offset, offset + count);
- var isEndOfContent = offset + count >= node.data.length;
- var isStartOfContent = offset === 0;
- node.replaceData(offset, count, normalizeContent(whitespace, isStartOfContent, isEndOfContent));
- };
- var normalizeWhitespaceAfter = function (node, offset) {
- var content = node.data.slice(offset);
- var whitespaceCount = content.length - lTrim(content).length;
- return normalize$1(node, offset, whitespaceCount);
- };
- var normalizeWhitespaceBefore = function (node, offset) {
- var content = node.data.slice(0, offset);
- var whitespaceCount = content.length - rTrim(content).length;
- return normalize$1(node, offset - whitespaceCount, whitespaceCount);
- };
- var mergeTextNodes = function (prevNode, nextNode, normalizeWhitespace) {
- var whitespaceOffset = rTrim(prevNode.data).length;
- prevNode.appendData(nextNode.data);
- remove$1(Element.fromDom(nextNode));
- if (normalizeWhitespace) {
- normalizeWhitespaceAfter(prevNode, whitespaceOffset);
- }
- return prevNode;
- };
-
- var needsReposition = function (pos, elm) {
- var container = pos.container();
- var offset = pos.offset();
- return CaretPosition$1.isTextPosition(pos) === false && container === elm.parentNode && offset > CaretPosition$1.before(elm).offset();
- };
- var reposition = function (elm, pos) {
- return needsReposition(pos, elm) ? CaretPosition$1(pos.container(), pos.offset() - 1) : pos;
- };
- var beforeOrStartOf = function (node) {
- return NodeType.isText(node) ? CaretPosition$1(node, 0) : CaretPosition$1.before(node);
- };
- var afterOrEndOf = function (node) {
- return NodeType.isText(node) ? CaretPosition$1(node, node.data.length) : CaretPosition$1.after(node);
- };
- var getPreviousSiblingCaretPosition = function (elm) {
- if (isCaretCandidate(elm.previousSibling)) {
- return Option.some(afterOrEndOf(elm.previousSibling));
- } else {
- return elm.previousSibling ? CaretFinder.lastPositionIn(elm.previousSibling) : Option.none();
- }
- };
- var getNextSiblingCaretPosition = function (elm) {
- if (isCaretCandidate(elm.nextSibling)) {
- return Option.some(beforeOrStartOf(elm.nextSibling));
- } else {
- return elm.nextSibling ? CaretFinder.firstPositionIn(elm.nextSibling) : Option.none();
- }
- };
- var findCaretPositionBackwardsFromElm = function (rootElement, elm) {
- var startPosition = CaretPosition$1.before(elm.previousSibling ? elm.previousSibling : elm.parentNode);
- return CaretFinder.prevPosition(rootElement, startPosition).fold(function () {
- return CaretFinder.nextPosition(rootElement, CaretPosition$1.after(elm));
- }, Option.some);
- };
- var findCaretPositionForwardsFromElm = function (rootElement, elm) {
- return CaretFinder.nextPosition(rootElement, CaretPosition$1.after(elm)).fold(function () {
- return CaretFinder.prevPosition(rootElement, CaretPosition$1.before(elm));
- }, Option.some);
- };
- var findCaretPositionBackwards = function (rootElement, elm) {
- return getPreviousSiblingCaretPosition(elm).orThunk(function () {
- return getNextSiblingCaretPosition(elm);
- }).orThunk(function () {
- return findCaretPositionBackwardsFromElm(rootElement, elm);
- });
- };
- var findCaretPositionForward = function (rootElement, elm) {
- return getNextSiblingCaretPosition(elm).orThunk(function () {
- return getPreviousSiblingCaretPosition(elm);
- }).orThunk(function () {
- return findCaretPositionForwardsFromElm(rootElement, elm);
- });
- };
- var findCaretPosition$1 = function (forward, rootElement, elm) {
- return forward ? findCaretPositionForward(rootElement, elm) : findCaretPositionBackwards(rootElement, elm);
- };
- var findCaretPosOutsideElmAfterDelete = function (forward, rootElement, elm) {
- return findCaretPosition$1(forward, rootElement, elm).map(curry(reposition, elm));
- };
- var setSelection = function (editor, forward, pos) {
- pos.fold(function () {
- editor.focus();
- }, function (pos) {
- editor.selection.setRng(pos.toRange(), forward);
- });
- };
- var eqRawNode = function (rawNode) {
- return function (elm) {
- return elm.dom() === rawNode;
- };
- };
- var isBlock$2 = function (editor, elm) {
- return elm && editor.schema.getBlockElements().hasOwnProperty(name(elm));
- };
- var paddEmptyBlock = function (elm) {
- if (Empty.isEmpty(elm)) {
- var br = Element.fromHtml(' ');
- empty(elm);
- append(elm, br);
- return Option.some(CaretPosition$1.before(br.dom()));
- } else {
- return Option.none();
- }
- };
- var deleteNormalized = function (elm, afterDeletePosOpt, normalizeWhitespace) {
- var prevTextOpt = prevSibling(elm).filter(isText);
- var nextTextOpt = nextSibling(elm).filter(isText);
- remove$1(elm);
- return lift3(prevTextOpt, nextTextOpt, afterDeletePosOpt, function (prev, next, pos) {
- var prevNode = prev.dom(), nextNode = next.dom();
- var offset = prevNode.data.length;
- mergeTextNodes(prevNode, nextNode, normalizeWhitespace);
- return pos.container() === nextNode ? CaretPosition$1(prevNode, offset) : pos;
- }).orThunk(function () {
- if (normalizeWhitespace) {
- prevTextOpt.each(function (elm) {
- return normalizeWhitespaceBefore(elm.dom(), elm.dom().length);
- });
- nextTextOpt.each(function (elm) {
- return normalizeWhitespaceAfter(elm.dom(), 0);
- });
- }
- return afterDeletePosOpt;
- });
- };
- var isInlineElement = function (editor, element) {
- return has(editor.schema.getTextInlineElements(), name(element));
- };
- var deleteElement = function (editor, forward, elm, moveCaret) {
- if (moveCaret === void 0) {
- moveCaret = true;
- }
- var afterDeletePos = findCaretPosOutsideElmAfterDelete(forward, editor.getBody(), elm.dom());
- var parentBlock = ancestor(elm, curry(isBlock$2, editor), eqRawNode(editor.getBody()));
- var normalizedAfterDeletePos = deleteNormalized(elm, afterDeletePos, isInlineElement(editor, elm));
- if (editor.dom.isEmpty(editor.getBody())) {
- editor.setContent('');
- editor.selection.setCursorLocation();
- } else {
- parentBlock.bind(paddEmptyBlock).fold(function () {
- if (moveCaret) {
- setSelection(editor, forward, normalizedAfterDeletePos);
- }
- }, function (paddPos) {
- if (moveCaret) {
- setSelection(editor, forward, Option.some(paddPos));
- }
- });
- }
- };
- var DeleteElement = { deleteElement: deleteElement };
-
- var deleteElement$1 = function (editor, forward) {
- return function (element) {
- editor._selectionOverrides.hideFakeCaret();
- DeleteElement.deleteElement(editor, forward, Element.fromDom(element));
- return true;
- };
- };
- var moveToElement = function (editor, forward) {
- return function (element) {
- var pos = forward ? CaretPosition$1.before(element) : CaretPosition$1.after(element);
- editor.selection.setRng(pos.toRange());
- return true;
- };
- };
- var moveToPosition = function (editor) {
- return function (pos) {
- editor.selection.setRng(pos.toRange());
- return true;
- };
- };
- var backspaceDeleteCaret = function (editor, forward) {
- var result = read$2(editor.getBody(), forward, editor.selection.getRng()).map(function (deleteAction) {
- return deleteAction.fold(deleteElement$1(editor, forward), moveToElement(editor, forward), moveToPosition(editor));
- });
- return result.getOr(false);
- };
- var deleteOffscreenSelection = function (rootElement) {
- each(descendants$1(rootElement, '.mce-offscreen-selection'), remove$1);
- };
- var backspaceDeleteRange = function (editor, forward) {
- var selectedElement = editor.selection.getNode();
- if (NodeType.isContentEditableFalse(selectedElement)) {
- deleteOffscreenSelection(Element.fromDom(editor.getBody()));
- DeleteElement.deleteElement(editor, forward, Element.fromDom(editor.selection.getNode()));
- DeleteUtils.paddEmptyBody(editor);
- return true;
- } else {
- return false;
- }
- };
- var getContentEditableRoot = function (root, node) {
- while (node && node !== root) {
- if (NodeType.isContentEditableTrue(node) || NodeType.isContentEditableFalse(node)) {
- return node;
- }
- node = node.parentNode;
- }
- return null;
- };
- var paddEmptyElement = function (editor) {
- var br;
- var ceRoot = getContentEditableRoot(editor.getBody(), editor.selection.getNode());
- if (NodeType.isContentEditableTrue(ceRoot) && editor.dom.isBlock(ceRoot) && editor.dom.isEmpty(ceRoot)) {
- br = editor.dom.create('br', { 'data-mce-bogus': '1' });
- editor.dom.setHTML(ceRoot, '');
- ceRoot.appendChild(br);
- editor.selection.setRng(CaretPosition$1.before(br).toRange());
- }
- return true;
- };
- var backspaceDelete$2 = function (editor, forward) {
- if (editor.selection.isCollapsed()) {
- return backspaceDeleteCaret(editor, forward);
- } else {
- return backspaceDeleteRange(editor, forward);
- }
- };
- var CefDelete = {
- backspaceDelete: backspaceDelete$2,
- paddEmptyElement: paddEmptyElement
- };
-
- var isText$8 = NodeType.isText;
- var startsWithCaretContainer$1 = function (node) {
- return isText$8(node) && node.data[0] === Zwsp.ZWSP;
- };
- var endsWithCaretContainer$1 = function (node) {
- return isText$8(node) && node.data[node.data.length - 1] === Zwsp.ZWSP;
- };
- var createZwsp = function (node) {
- return node.ownerDocument.createTextNode(Zwsp.ZWSP);
- };
- var insertBefore$1 = function (node) {
- if (isText$8(node.previousSibling)) {
- if (endsWithCaretContainer$1(node.previousSibling)) {
- return node.previousSibling;
- } else {
- node.previousSibling.appendData(Zwsp.ZWSP);
- return node.previousSibling;
- }
- } else if (isText$8(node)) {
- if (startsWithCaretContainer$1(node)) {
- return node;
- } else {
- node.insertData(0, Zwsp.ZWSP);
- return node;
- }
- } else {
- var newNode = createZwsp(node);
- node.parentNode.insertBefore(newNode, node);
- return newNode;
- }
- };
- var insertAfter$1 = function (node) {
- if (isText$8(node.nextSibling)) {
- if (startsWithCaretContainer$1(node.nextSibling)) {
- return node.nextSibling;
- } else {
- node.nextSibling.insertData(0, Zwsp.ZWSP);
- return node.nextSibling;
- }
- } else if (isText$8(node)) {
- if (endsWithCaretContainer$1(node)) {
- return node;
- } else {
- node.appendData(Zwsp.ZWSP);
- return node;
- }
- } else {
- var newNode = createZwsp(node);
- if (node.nextSibling) {
- node.parentNode.insertBefore(newNode, node.nextSibling);
- } else {
- node.parentNode.appendChild(newNode);
- }
- return newNode;
- }
- };
- var insertInline$1 = function (before, node) {
- return before ? insertBefore$1(node) : insertAfter$1(node);
- };
- var insertInlineBefore = curry(insertInline$1, true);
- var insertInlineAfter = curry(insertInline$1, false);
-
- var insertInlinePos = function (pos, before) {
- if (NodeType.isText(pos.container())) {
- return insertInline$1(before, pos.container());
- } else {
- return insertInline$1(before, pos.getNode());
- }
- };
- var isPosCaretContainer = function (pos, caret) {
- var caretNode = caret.get();
- return caretNode && pos.container() === caretNode && isCaretContainerInline(caretNode);
- };
- var renderCaret = function (caret, location) {
- return location.fold(function (element) {
- CaretContainerRemove.remove(caret.get());
- var text = insertInlineBefore(element);
- caret.set(text);
- return Option.some(CaretPosition$1(text, text.length - 1));
- }, function (element) {
- return CaretFinder.firstPositionIn(element).map(function (pos) {
- if (!isPosCaretContainer(pos, caret)) {
- CaretContainerRemove.remove(caret.get());
- var text = insertInlinePos(pos, true);
- caret.set(text);
- return CaretPosition$1(text, 1);
- } else {
- return CaretPosition$1(caret.get(), 1);
- }
- });
- }, function (element) {
- return CaretFinder.lastPositionIn(element).map(function (pos) {
- if (!isPosCaretContainer(pos, caret)) {
- CaretContainerRemove.remove(caret.get());
- var text = insertInlinePos(pos, false);
- caret.set(text);
- return CaretPosition$1(text, text.length - 1);
- } else {
- return CaretPosition$1(caret.get(), caret.get().length - 1);
- }
- });
- }, function (element) {
- CaretContainerRemove.remove(caret.get());
- var text = insertInlineAfter(element);
- caret.set(text);
- return Option.some(CaretPosition$1(text, 1));
- });
- };
- var BoundaryCaret = { renderCaret: renderCaret };
-
- var evaluateUntil = function (fns, args) {
- for (var i = 0; i < fns.length; i++) {
- var result = fns[i].apply(null, args);
- if (result.isSome()) {
- return result;
- }
- }
- return Option.none();
- };
- var LazyEvaluator = { evaluateUntil: evaluateUntil };
-
- var Location = Adt.generate([
- { before: ['element'] },
- { start: ['element'] },
- { end: ['element'] },
- { after: ['element'] }
- ]);
- var rescope = function (rootNode, node) {
- var parentBlock = getParentBlock(node, rootNode);
- return parentBlock ? parentBlock : rootNode;
- };
- var before$3 = function (isInlineTarget, rootNode, pos) {
- var nPos = InlineUtils.normalizeForwards(pos);
- var scope = rescope(rootNode, nPos.container());
- return InlineUtils.findRootInline(isInlineTarget, scope, nPos).fold(function () {
- return CaretFinder.nextPosition(scope, nPos).bind(curry(InlineUtils.findRootInline, isInlineTarget, scope)).map(function (inline) {
- return Location.before(inline);
- });
- }, Option.none);
- };
- var isNotInsideFormatCaretContainer = function (rootNode, elm) {
- return getParentCaretContainer(rootNode, elm) === null;
- };
- var findInsideRootInline = function (isInlineTarget, rootNode, pos) {
- return InlineUtils.findRootInline(isInlineTarget, rootNode, pos).filter(curry(isNotInsideFormatCaretContainer, rootNode));
- };
- var start = function (isInlineTarget, rootNode, pos) {
- var nPos = InlineUtils.normalizeBackwards(pos);
- return findInsideRootInline(isInlineTarget, rootNode, nPos).bind(function (inline) {
- var prevPos = CaretFinder.prevPosition(inline, nPos);
- return prevPos.isNone() ? Option.some(Location.start(inline)) : Option.none();
- });
- };
- var end = function (isInlineTarget, rootNode, pos) {
- var nPos = InlineUtils.normalizeForwards(pos);
- return findInsideRootInline(isInlineTarget, rootNode, nPos).bind(function (inline) {
- var nextPos = CaretFinder.nextPosition(inline, nPos);
- return nextPos.isNone() ? Option.some(Location.end(inline)) : Option.none();
- });
- };
- var after$2 = function (isInlineTarget, rootNode, pos) {
- var nPos = InlineUtils.normalizeBackwards(pos);
- var scope = rescope(rootNode, nPos.container());
- return InlineUtils.findRootInline(isInlineTarget, scope, nPos).fold(function () {
- return CaretFinder.prevPosition(scope, nPos).bind(curry(InlineUtils.findRootInline, isInlineTarget, scope)).map(function (inline) {
- return Location.after(inline);
- });
- }, Option.none);
- };
- var isValidLocation = function (location) {
- return InlineUtils.isRtl(getElement(location)) === false;
- };
- var readLocation = function (isInlineTarget, rootNode, pos) {
- var location = LazyEvaluator.evaluateUntil([
- before$3,
- start,
- end,
- after$2
- ], [
- isInlineTarget,
- rootNode,
- pos
- ]);
- return location.filter(isValidLocation);
- };
- var getElement = function (location) {
- return location.fold(identity, identity, identity, identity);
- };
- var getName = function (location) {
- return location.fold(constant('before'), constant('start'), constant('end'), constant('after'));
- };
- var outside = function (location) {
- return location.fold(Location.before, Location.before, Location.after, Location.after);
- };
- var inside = function (location) {
- return location.fold(Location.start, Location.start, Location.end, Location.end);
- };
- var isEq$1 = function (location1, location2) {
- return getName(location1) === getName(location2) && getElement(location1) === getElement(location2);
- };
- var betweenInlines = function (forward, isInlineTarget, rootNode, from, to, location) {
- return lift2(InlineUtils.findRootInline(isInlineTarget, rootNode, from), InlineUtils.findRootInline(isInlineTarget, rootNode, to), function (fromInline, toInline) {
- if (fromInline !== toInline && InlineUtils.hasSameParentBlock(rootNode, fromInline, toInline)) {
- return Location.after(forward ? fromInline : toInline);
- } else {
- return location;
- }
- }).getOr(location);
- };
- var skipNoMovement = function (fromLocation, toLocation) {
- return fromLocation.fold(constant(true), function (fromLocation) {
- return !isEq$1(fromLocation, toLocation);
- });
- };
- var findLocationTraverse = function (forward, isInlineTarget, rootNode, fromLocation, pos) {
- var from = InlineUtils.normalizePosition(forward, pos);
- var to = CaretFinder.fromPosition(forward, rootNode, from).map(curry(InlineUtils.normalizePosition, forward));
- var location = to.fold(function () {
- return fromLocation.map(outside);
- }, function (to) {
- return readLocation(isInlineTarget, rootNode, to).map(curry(betweenInlines, forward, isInlineTarget, rootNode, from, to)).filter(curry(skipNoMovement, fromLocation));
- });
- return location.filter(isValidLocation);
- };
- var findLocationSimple = function (forward, location) {
- if (forward) {
- return location.fold(compose(Option.some, Location.start), Option.none, compose(Option.some, Location.after), Option.none);
- } else {
- return location.fold(Option.none, compose(Option.some, Location.before), Option.none, compose(Option.some, Location.end));
- }
- };
- var findLocation = function (forward, isInlineTarget, rootNode, pos) {
- var from = InlineUtils.normalizePosition(forward, pos);
- var fromLocation = readLocation(isInlineTarget, rootNode, from);
- return readLocation(isInlineTarget, rootNode, from).bind(curry(findLocationSimple, forward)).orThunk(function () {
- return findLocationTraverse(forward, isInlineTarget, rootNode, fromLocation, pos);
- });
- };
- var BoundaryLocation = {
- readLocation: readLocation,
- findLocation: findLocation,
- prevLocation: curry(findLocation, false),
- nextLocation: curry(findLocation, true),
- getElement: getElement,
- outside: outside,
- inside: inside
- };
-
- var hasSelectionModifyApi = function (editor) {
- return isFunction(editor.selection.getSel().modify);
- };
- var moveRel = function (forward, selection, pos) {
- var delta = forward ? 1 : -1;
- selection.setRng(CaretPosition$1(pos.container(), pos.offset() + delta).toRange());
- selection.getSel().modify('move', forward ? 'forward' : 'backward', 'word');
- return true;
- };
- var moveByWord = function (forward, editor) {
- var rng = editor.selection.getRng();
- var pos = forward ? CaretPosition$1.fromRangeEnd(rng) : CaretPosition$1.fromRangeStart(rng);
- if (!hasSelectionModifyApi(editor)) {
- return false;
- } else if (forward && isBeforeInline(pos)) {
- return moveRel(true, editor.selection, pos);
- } else if (!forward && isAfterInline(pos)) {
- return moveRel(false, editor.selection, pos);
- } else {
- return false;
- }
- };
- var WordSelection = {
- hasSelectionModifyApi: hasSelectionModifyApi,
- moveByWord: moveByWord
- };
-
- var setCaretPosition = function (editor, pos) {
- var rng = editor.dom.createRng();
- rng.setStart(pos.container(), pos.offset());
- rng.setEnd(pos.container(), pos.offset());
- editor.selection.setRng(rng);
- };
- var isFeatureEnabled = function (editor) {
- return editor.settings.inline_boundaries !== false;
- };
- var setSelected = function (state, elm) {
- if (state) {
- elm.setAttribute('data-mce-selected', 'inline-boundary');
- } else {
- elm.removeAttribute('data-mce-selected');
- }
- };
- var renderCaretLocation = function (editor, caret, location) {
- return BoundaryCaret.renderCaret(caret, location).map(function (pos) {
- setCaretPosition(editor, pos);
- return location;
- });
- };
- var findLocation$1 = function (editor, caret, forward) {
- var rootNode = editor.getBody();
- var from = CaretPosition$1.fromRangeStart(editor.selection.getRng());
- var isInlineTarget = curry(InlineUtils.isInlineTarget, editor);
- var location = BoundaryLocation.findLocation(forward, isInlineTarget, rootNode, from);
- return location.bind(function (location) {
- return renderCaretLocation(editor, caret, location);
- });
- };
- var toggleInlines = function (isInlineTarget, dom, elms) {
- var selectedInlines = filter(dom.select('*[data-mce-selected="inline-boundary"]'), isInlineTarget);
- var targetInlines = filter(elms, isInlineTarget);
- each(difference(selectedInlines, targetInlines), curry(setSelected, false));
- each(difference(targetInlines, selectedInlines), curry(setSelected, true));
- };
- var safeRemoveCaretContainer = function (editor, caret) {
- if (editor.selection.isCollapsed() && editor.composing !== true && caret.get()) {
- var pos = CaretPosition$1.fromRangeStart(editor.selection.getRng());
- if (CaretPosition$1.isTextPosition(pos) && InlineUtils.isAtZwsp(pos) === false) {
- setCaretPosition(editor, CaretContainerRemove.removeAndReposition(caret.get(), pos));
- caret.set(null);
- }
- }
- };
- var renderInsideInlineCaret = function (isInlineTarget, editor, caret, elms) {
- if (editor.selection.isCollapsed()) {
- var inlines = filter(elms, isInlineTarget);
- each(inlines, function (inline) {
- var pos = CaretPosition$1.fromRangeStart(editor.selection.getRng());
- BoundaryLocation.readLocation(isInlineTarget, editor.getBody(), pos).bind(function (location) {
- return renderCaretLocation(editor, caret, location);
- });
- });
- }
- };
- var move = function (editor, caret, forward) {
- return function () {
- return isFeatureEnabled(editor) ? findLocation$1(editor, caret, forward).isSome() : false;
- };
- };
- var moveWord = function (forward, editor, caret) {
- return function () {
- return isFeatureEnabled(editor) ? WordSelection.moveByWord(forward, editor) : false;
- };
- };
- var setupSelectedState = function (editor) {
- var caret = Cell(null);
- var isInlineTarget = curry(InlineUtils.isInlineTarget, editor);
- editor.on('NodeChange', function (e) {
- if (isFeatureEnabled(editor)) {
- toggleInlines(isInlineTarget, editor.dom, e.parents);
- safeRemoveCaretContainer(editor, caret);
- renderInsideInlineCaret(isInlineTarget, editor, caret, e.parents);
- }
- });
- return caret;
- };
- var moveNextWord = curry(moveWord, true);
- var movePrevWord = curry(moveWord, false);
- var BoundarySelection = {
- move: move,
- moveNextWord: moveNextWord,
- movePrevWord: movePrevWord,
- setupSelectedState: setupSelectedState,
- setCaretPosition: setCaretPosition
- };
-
- var isFeatureEnabled$1 = function (editor) {
- return editor.settings.inline_boundaries !== false;
- };
- var rangeFromPositions = function (from, to) {
- var range = domGlobals.document.createRange();
- range.setStart(from.container(), from.offset());
- range.setEnd(to.container(), to.offset());
- return range;
- };
- var hasOnlyTwoOrLessPositionsLeft = function (elm) {
- return lift2(CaretFinder.firstPositionIn(elm), CaretFinder.lastPositionIn(elm), function (firstPos, lastPos) {
- var normalizedFirstPos = InlineUtils.normalizePosition(true, firstPos);
- var normalizedLastPos = InlineUtils.normalizePosition(false, lastPos);
- return CaretFinder.nextPosition(elm, normalizedFirstPos).map(function (pos) {
- return pos.isEqual(normalizedLastPos);
- }).getOr(true);
- }).getOr(true);
- };
- var setCaretLocation = function (editor, caret) {
- return function (location) {
- return BoundaryCaret.renderCaret(caret, location).map(function (pos) {
- BoundarySelection.setCaretPosition(editor, pos);
- return true;
- }).getOr(false);
- };
- };
- var deleteFromTo = function (editor, caret, from, to) {
- var rootNode = editor.getBody();
- var isInlineTarget = curry(InlineUtils.isInlineTarget, editor);
- editor.undoManager.ignore(function () {
- editor.selection.setRng(rangeFromPositions(from, to));
- editor.execCommand('Delete');
- BoundaryLocation.readLocation(isInlineTarget, rootNode, CaretPosition$1.fromRangeStart(editor.selection.getRng())).map(BoundaryLocation.inside).map(setCaretLocation(editor, caret));
- });
- editor.nodeChanged();
- };
- var rescope$1 = function (rootNode, node) {
- var parentBlock = getParentBlock(node, rootNode);
- return parentBlock ? parentBlock : rootNode;
- };
- var backspaceDeleteCollapsed = function (editor, caret, forward, from) {
- var rootNode = rescope$1(editor.getBody(), from.container());
- var isInlineTarget = curry(InlineUtils.isInlineTarget, editor);
- var fromLocation = BoundaryLocation.readLocation(isInlineTarget, rootNode, from);
- return fromLocation.bind(function (location) {
- if (forward) {
- return location.fold(constant(Option.some(BoundaryLocation.inside(location))), Option.none, constant(Option.some(BoundaryLocation.outside(location))), Option.none);
- } else {
- return location.fold(Option.none, constant(Option.some(BoundaryLocation.outside(location))), Option.none, constant(Option.some(BoundaryLocation.inside(location))));
- }
- }).map(setCaretLocation(editor, caret)).getOrThunk(function () {
- var toPosition = CaretFinder.navigate(forward, rootNode, from);
- var toLocation = toPosition.bind(function (pos) {
- return BoundaryLocation.readLocation(isInlineTarget, rootNode, pos);
- });
- if (fromLocation.isSome() && toLocation.isSome()) {
- return InlineUtils.findRootInline(isInlineTarget, rootNode, from).map(function (elm) {
- if (hasOnlyTwoOrLessPositionsLeft(elm)) {
- DeleteElement.deleteElement(editor, forward, Element.fromDom(elm));
- return true;
- } else {
- return false;
- }
- }).getOr(false);
- } else {
- return toLocation.bind(function (_) {
- return toPosition.map(function (to) {
- if (forward) {
- deleteFromTo(editor, caret, from, to);
- } else {
- deleteFromTo(editor, caret, to, from);
- }
- return true;
- });
- }).getOr(false);
- }
- });
- };
- var backspaceDelete$3 = function (editor, caret, forward) {
- if (editor.selection.isCollapsed() && isFeatureEnabled$1(editor)) {
- var from = CaretPosition$1.fromRangeStart(editor.selection.getRng());
- return backspaceDeleteCollapsed(editor, caret, forward, from);
- }
- return false;
- };
- var InlineBoundaryDelete = { backspaceDelete: backspaceDelete$3 };
-
- var tableCellRng = Immutable('start', 'end');
- var tableSelection = Immutable('rng', 'table', 'cells');
- var deleteAction = Adt.generate([
- { removeTable: ['element'] },
- { emptyCells: ['cells'] }
- ]);
- var isRootFromElement = function (root) {
- return curry(eq, root);
- };
- var getClosestCell = function (container, isRoot) {
- return closest$1(Element.fromDom(container), 'td,th', isRoot);
- };
- var getClosestTable = function (cell, isRoot) {
- return ancestor$1(cell, 'table', isRoot);
- };
- var isExpandedCellRng = function (cellRng) {
- return eq(cellRng.start(), cellRng.end()) === false;
- };
- var getTableFromCellRng = function (cellRng, isRoot) {
- return getClosestTable(cellRng.start(), isRoot).bind(function (startParentTable) {
- return getClosestTable(cellRng.end(), isRoot).bind(function (endParentTable) {
- return eq(startParentTable, endParentTable) ? Option.some(startParentTable) : Option.none();
- });
- });
- };
- var getTableCells = function (table) {
- return descendants$1(table, 'td,th');
- };
- var getCellRangeFromStartTable = function (cellRng, isRoot) {
- return getClosestTable(cellRng.start(), isRoot).bind(function (table) {
- return last(getTableCells(table)).map(function (endCell) {
- return tableCellRng(cellRng.start(), endCell);
- });
- });
- };
- var partialSelection = function (isRoot, rng) {
- var startCell = getClosestCell(rng.startContainer, isRoot);
- var endCell = getClosestCell(rng.endContainer, isRoot);
- return rng.collapsed ? Option.none() : lift2(startCell, endCell, tableCellRng).fold(function () {
- return startCell.fold(function () {
- return endCell.bind(function (endCell) {
- return getClosestTable(endCell, isRoot).bind(function (table) {
- return head(getTableCells(table)).map(function (startCell) {
- return tableCellRng(startCell, endCell);
- });
- });
- });
- }, function (startCell) {
- return getClosestTable(startCell, isRoot).bind(function (table) {
- return last(getTableCells(table)).map(function (endCell) {
- return tableCellRng(startCell, endCell);
- });
- });
- });
- }, function (cellRng) {
- return isWithinSameTable(isRoot, cellRng) ? Option.none() : getCellRangeFromStartTable(cellRng, isRoot);
- });
- };
- var isWithinSameTable = function (isRoot, cellRng) {
- return getTableFromCellRng(cellRng, isRoot).isSome();
- };
- var getCellRng = function (rng, isRoot) {
- var startCell = getClosestCell(rng.startContainer, isRoot);
- var endCell = getClosestCell(rng.endContainer, isRoot);
- return lift2(startCell, endCell, tableCellRng).filter(isExpandedCellRng).filter(function (cellRng) {
- return isWithinSameTable(isRoot, cellRng);
- }).orThunk(function () {
- return partialSelection(isRoot, rng);
- });
- };
- var getTableSelectionFromCellRng = function (cellRng, isRoot) {
- return getTableFromCellRng(cellRng, isRoot).map(function (table) {
- return tableSelection(cellRng, table, getTableCells(table));
- });
- };
- var getTableSelectionFromRng = function (root, rng) {
- var isRoot = isRootFromElement(root);
- return getCellRng(rng, isRoot).bind(function (cellRng) {
- return getTableSelectionFromCellRng(cellRng, isRoot);
- });
- };
- var getCellIndex = function (cells, cell) {
- return findIndex(cells, function (x) {
- return eq(x, cell);
- });
- };
- var getSelectedCells = function (tableSelection) {
- return lift2(getCellIndex(tableSelection.cells(), tableSelection.rng().start()), getCellIndex(tableSelection.cells(), tableSelection.rng().end()), function (startIndex, endIndex) {
- return tableSelection.cells().slice(startIndex, endIndex + 1);
- });
- };
- var getAction = function (tableSelection) {
- return getSelectedCells(tableSelection).map(function (selected) {
- var cells = tableSelection.cells();
- return selected.length === cells.length ? deleteAction.removeTable(tableSelection.table()) : deleteAction.emptyCells(selected);
- });
- };
- var getActionFromCells = function (cells) {
- return deleteAction.emptyCells(cells);
- };
- var getActionFromRange = function (root, rng) {
- return getTableSelectionFromRng(root, rng).bind(getAction);
- };
- var TableDeleteAction = {
- getActionFromRange: getActionFromRange,
- getActionFromCells: getActionFromCells
- };
-
- var getRanges = function (selection) {
- var ranges = [];
- if (selection) {
- for (var i = 0; i < selection.rangeCount; i++) {
- ranges.push(selection.getRangeAt(i));
- }
- }
- return ranges;
- };
- var getSelectedNodes = function (ranges) {
- return bind(ranges, function (range) {
- var node = getSelectedNode(range);
- return node ? [Element.fromDom(node)] : [];
- });
- };
- var hasMultipleRanges = function (selection) {
- return getRanges(selection).length > 1;
- };
- var MultiRange = {
- getRanges: getRanges,
- getSelectedNodes: getSelectedNodes,
- hasMultipleRanges: hasMultipleRanges
- };
-
- var getCellsFromRanges = function (ranges) {
- return filter(MultiRange.getSelectedNodes(ranges), isTableCell);
- };
- var getCellsFromElement = function (elm) {
- var selectedCells = descendants$1(elm, 'td[data-mce-selected],th[data-mce-selected]');
- return selectedCells;
- };
- var getCellsFromElementOrRanges = function (ranges, element) {
- var selectedCells = getCellsFromElement(element);
- var rangeCells = getCellsFromRanges(ranges);
- return selectedCells.length > 0 ? selectedCells : rangeCells;
- };
- var getCellsFromEditor = function (editor) {
- return getCellsFromElementOrRanges(MultiRange.getRanges(editor.selection.getSel()), Element.fromDom(editor.getBody()));
- };
- var TableCellSelection = {
- getCellsFromRanges: getCellsFromRanges,
- getCellsFromElement: getCellsFromElement,
- getCellsFromElementOrRanges: getCellsFromElementOrRanges,
- getCellsFromEditor: getCellsFromEditor
- };
-
- var emptyCells = function (editor, cells) {
- each(cells, PaddingBr.fillWithPaddingBr);
- editor.selection.setCursorLocation(cells[0].dom(), 0);
- return true;
- };
- var deleteTableElement = function (editor, table) {
- DeleteElement.deleteElement(editor, false, table);
- return true;
- };
- var deleteCellRange = function (editor, rootElm, rng) {
- return TableDeleteAction.getActionFromRange(rootElm, rng).map(function (action) {
- return action.fold(curry(deleteTableElement, editor), curry(emptyCells, editor));
- });
- };
- var deleteCaptionRange = function (editor, caption) {
- return emptyElement(editor, caption);
- };
- var deleteTableRange = function (editor, rootElm, rng, startElm) {
- return getParentCaption(rootElm, startElm).fold(function () {
- return deleteCellRange(editor, rootElm, rng);
- }, function (caption) {
- return deleteCaptionRange(editor, caption);
- }).getOr(false);
- };
- var deleteRange$1 = function (editor, startElm) {
- var rootNode = Element.fromDom(editor.getBody());
- var rng = editor.selection.getRng();
- var selectedCells = TableCellSelection.getCellsFromEditor(editor);
- return selectedCells.length !== 0 ? emptyCells(editor, selectedCells) : deleteTableRange(editor, rootNode, rng, startElm);
- };
- var getParentCell = function (rootElm, elm) {
- return find(Parents.parentsAndSelf(elm, rootElm), isTableCell);
- };
- var getParentCaption = function (rootElm, elm) {
- return find(Parents.parentsAndSelf(elm, rootElm), function (elm) {
- return name(elm) === 'caption';
- });
- };
- var deleteBetweenCells = function (editor, rootElm, forward, fromCell, from) {
- return CaretFinder.navigate(forward, editor.getBody(), from).bind(function (to) {
- return getParentCell(rootElm, Element.fromDom(to.getNode())).map(function (toCell) {
- return eq(toCell, fromCell) === false;
- });
- });
- };
- var emptyElement = function (editor, elm) {
- PaddingBr.fillWithPaddingBr(elm);
- editor.selection.setCursorLocation(elm.dom(), 0);
- return Option.some(true);
- };
- var isDeleteOfLastCharPos = function (fromCaption, forward, from, to) {
- return CaretFinder.firstPositionIn(fromCaption.dom()).bind(function (first) {
- return CaretFinder.lastPositionIn(fromCaption.dom()).map(function (last) {
- return forward ? from.isEqual(first) && to.isEqual(last) : from.isEqual(last) && to.isEqual(first);
- });
- }).getOr(true);
- };
- var emptyCaretCaption = function (editor, elm) {
- return emptyElement(editor, elm);
- };
- var validateCaretCaption = function (rootElm, fromCaption, to) {
- return getParentCaption(rootElm, Element.fromDom(to.getNode())).map(function (toCaption) {
- return eq(toCaption, fromCaption) === false;
- });
- };
- var deleteCaretInsideCaption = function (editor, rootElm, forward, fromCaption, from) {
- return CaretFinder.navigate(forward, editor.getBody(), from).bind(function (to) {
- return isDeleteOfLastCharPos(fromCaption, forward, from, to) ? emptyCaretCaption(editor, fromCaption) : validateCaretCaption(rootElm, fromCaption, to);
- }).or(Option.some(true));
- };
- var deleteCaretCells = function (editor, forward, rootElm, startElm) {
- var from = CaretPosition$1.fromRangeStart(editor.selection.getRng());
- return getParentCell(rootElm, startElm).bind(function (fromCell) {
- return Empty.isEmpty(fromCell) ? emptyElement(editor, fromCell) : deleteBetweenCells(editor, rootElm, forward, fromCell, from);
- });
- };
- var deleteCaretCaption = function (editor, forward, rootElm, fromCaption) {
- var from = CaretPosition$1.fromRangeStart(editor.selection.getRng());
- return Empty.isEmpty(fromCaption) ? emptyElement(editor, fromCaption) : deleteCaretInsideCaption(editor, rootElm, forward, fromCaption, from);
- };
- var deleteCaret = function (editor, forward, startElm) {
- var rootElm = Element.fromDom(editor.getBody());
- return getParentCaption(rootElm, startElm).fold(function () {
- return deleteCaretCells(editor, forward, rootElm, startElm);
- }, function (fromCaption) {
- return deleteCaretCaption(editor, forward, rootElm, fromCaption);
- }).getOr(false);
- };
- var backspaceDelete$4 = function (editor, forward) {
- var startElm = Element.fromDom(editor.selection.getStart(true));
- var cells = TableCellSelection.getCellsFromEditor(editor);
- return editor.selection.isCollapsed() && cells.length === 0 ? deleteCaret(editor, forward, startElm) : deleteRange$1(editor, startElm);
- };
- var TableDelete = { backspaceDelete: backspaceDelete$4 };
-
- var isEq$2 = FormatUtils.isEq;
- var matchesUnInheritedFormatSelector = function (ed, node, name) {
- var formatList = ed.formatter.get(name);
- if (formatList) {
- for (var i = 0; i < formatList.length; i++) {
- if (formatList[i].inherit === false && ed.dom.is(node, formatList[i].selector)) {
- return true;
- }
- }
- }
- return false;
- };
- var matchParents = function (editor, node, name, vars) {
- var root = editor.dom.getRoot();
- if (node === root) {
- return false;
- }
- node = editor.dom.getParent(node, function (node) {
- if (matchesUnInheritedFormatSelector(editor, node, name)) {
- return true;
- }
- return node.parentNode === root || !!matchNode(editor, node, name, vars, true);
- });
- return matchNode(editor, node, name, vars);
- };
- var matchName = function (dom, node, format) {
- if (isEq$2(node, format.inline)) {
- return true;
- }
- if (isEq$2(node, format.block)) {
- return true;
- }
- if (format.selector) {
- return node.nodeType === 1 && dom.is(node, format.selector);
- }
- };
- var matchItems = function (dom, node, format, itemName, similar, vars) {
- var key, value;
- var items = format[itemName];
- var i;
- if (format.onmatch) {
- return format.onmatch(node, format, itemName);
- }
- if (items) {
- if (typeof items.length === 'undefined') {
- for (key in items) {
- if (items.hasOwnProperty(key)) {
- if (itemName === 'attributes') {
- value = dom.getAttrib(node, key);
- } else {
- value = FormatUtils.getStyle(dom, node, key);
- }
- if (similar && !value && !format.exact) {
- return;
- }
- if ((!similar || format.exact) && !isEq$2(value, FormatUtils.normalizeStyleValue(dom, FormatUtils.replaceVars(items[key], vars), key))) {
- return;
- }
- }
- }
- } else {
- for (i = 0; i < items.length; i++) {
- if (itemName === 'attributes' ? dom.getAttrib(node, items[i]) : FormatUtils.getStyle(dom, node, items[i])) {
- return format;
- }
- }
- }
- }
- return format;
- };
- var matchNode = function (ed, node, name, vars, similar) {
- var formatList = ed.formatter.get(name);
- var format, i, x, classes;
- var dom = ed.dom;
- if (formatList && node) {
- for (i = 0; i < formatList.length; i++) {
- format = formatList[i];
- if (matchName(ed.dom, node, format) && matchItems(dom, node, format, 'attributes', similar, vars) && matchItems(dom, node, format, 'styles', similar, vars)) {
- if (classes = format.classes) {
- for (x = 0; x < classes.length; x++) {
- if (!ed.dom.hasClass(node, classes[x])) {
- return;
- }
- }
- }
- return format;
- }
- }
- }
- };
- var match = function (editor, name, vars, node) {
- var startNode;
- if (node) {
- return matchParents(editor, node, name, vars);
- }
- node = editor.selection.getNode();
- if (matchParents(editor, node, name, vars)) {
- return true;
- }
- startNode = editor.selection.getStart();
- if (startNode !== node) {
- if (matchParents(editor, startNode, name, vars)) {
- return true;
- }
- }
- return false;
- };
- var matchAll = function (editor, names, vars) {
- var startElement;
- var matchedFormatNames = [];
- var checkedMap = {};
- startElement = editor.selection.getStart();
- editor.dom.getParent(startElement, function (node) {
- var i, name;
- for (i = 0; i < names.length; i++) {
- name = names[i];
- if (!checkedMap[name] && matchNode(editor, node, name, vars)) {
- checkedMap[name] = true;
- matchedFormatNames.push(name);
- }
- }
- }, editor.dom.getRoot());
- return matchedFormatNames;
- };
- var canApply = function (editor, name) {
- var formatList = editor.formatter.get(name);
- var startNode, parents, i, x, selector;
- var dom = editor.dom;
- if (formatList) {
- startNode = editor.selection.getStart();
- parents = FormatUtils.getParents(dom, startNode);
- for (x = formatList.length - 1; x >= 0; x--) {
- selector = formatList[x].selector;
- if (!selector || formatList[x].defaultBlock) {
- return true;
- }
- for (i = parents.length - 1; i >= 0; i--) {
- if (dom.is(parents[i], selector)) {
- return true;
- }
- }
- }
- }
- return false;
- };
- var MatchFormat = {
- matchNode: matchNode,
- matchName: matchName,
- match: match,
- matchAll: matchAll,
- canApply: canApply,
- matchesUnInheritedFormatSelector: matchesUnInheritedFormatSelector
- };
-
- var splitText = function (node, offset) {
- return node.splitText(offset);
- };
- var split$1 = function (rng) {
- var startContainer = rng.startContainer, startOffset = rng.startOffset, endContainer = rng.endContainer, endOffset = rng.endOffset;
- if (startContainer === endContainer && NodeType.isText(startContainer)) {
- if (startOffset > 0 && startOffset < startContainer.nodeValue.length) {
- endContainer = splitText(startContainer, startOffset);
- startContainer = endContainer.previousSibling;
- if (endOffset > startOffset) {
- endOffset = endOffset - startOffset;
- startContainer = endContainer = splitText(endContainer, endOffset).previousSibling;
- endOffset = endContainer.nodeValue.length;
- startOffset = 0;
- } else {
- endOffset = 0;
- }
- }
- } else {
- if (NodeType.isText(startContainer) && startOffset > 0 && startOffset < startContainer.nodeValue.length) {
- startContainer = splitText(startContainer, startOffset);
- startOffset = 0;
- }
- if (NodeType.isText(endContainer) && endOffset > 0 && endOffset < endContainer.nodeValue.length) {
- endContainer = splitText(endContainer, endOffset).previousSibling;
- endOffset = endContainer.nodeValue.length;
- }
- }
- return {
- startContainer: startContainer,
- startOffset: startOffset,
- endContainer: endContainer,
- endOffset: endOffset
- };
- };
- var SplitRange = { split: split$1 };
-
- var ZWSP$1 = Zwsp.ZWSP, CARET_ID$1 = '_mce_caret';
- var importNode = function (ownerDocument, node) {
- return ownerDocument.importNode(node, true);
- };
- var getEmptyCaretContainers = function (node) {
- var nodes = [];
- while (node) {
- if (node.nodeType === 3 && node.nodeValue !== ZWSP$1 || node.childNodes.length > 1) {
- return [];
- }
- if (node.nodeType === 1) {
- nodes.push(node);
- }
- node = node.firstChild;
- }
- return nodes;
- };
- var isCaretContainerEmpty = function (node) {
- return getEmptyCaretContainers(node).length > 0;
- };
- var findFirstTextNode = function (node) {
- var walker;
- if (node) {
- walker = new TreeWalker(node, node);
- for (node = walker.current(); node; node = walker.next()) {
- if (node.nodeType === 3) {
- return node;
- }
- }
- }
- return null;
- };
- var createCaretContainer = function (fill) {
- var caretContainer = Element.fromTag('span');
- setAll(caretContainer, {
- 'id': CARET_ID$1,
- 'data-mce-bogus': '1',
- 'data-mce-type': 'format-caret'
- });
- if (fill) {
- append(caretContainer, Element.fromText(ZWSP$1));
- }
- return caretContainer;
- };
- var trimZwspFromCaretContainer = function (caretContainerNode) {
- var textNode = findFirstTextNode(caretContainerNode);
- if (textNode && textNode.nodeValue.charAt(0) === ZWSP$1) {
- textNode.deleteData(0, 1);
- }
- return textNode;
- };
- var removeCaretContainerNode = function (editor, node, moveCaret) {
- if (moveCaret === void 0) {
- moveCaret = true;
- }
- var dom = editor.dom, selection = editor.selection;
- if (isCaretContainerEmpty(node)) {
- DeleteElement.deleteElement(editor, false, Element.fromDom(node), moveCaret);
- } else {
- var rng = selection.getRng();
- var block = dom.getParent(node, dom.isBlock);
- var textNode = trimZwspFromCaretContainer(node);
- if (rng.startContainer === textNode && rng.startOffset > 0) {
- rng.setStart(textNode, rng.startOffset - 1);
- }
- if (rng.endContainer === textNode && rng.endOffset > 0) {
- rng.setEnd(textNode, rng.endOffset - 1);
- }
- dom.remove(node, true);
- if (block && dom.isEmpty(block)) {
- PaddingBr.fillWithPaddingBr(Element.fromDom(block));
- }
- selection.setRng(rng);
- }
- };
- var removeCaretContainer = function (editor, node, moveCaret) {
- if (moveCaret === void 0) {
- moveCaret = true;
- }
- var dom = editor.dom, selection = editor.selection;
- if (!node) {
- node = getParentCaretContainer(editor.getBody(), selection.getStart());
- if (!node) {
- while (node = dom.get(CARET_ID$1)) {
- removeCaretContainerNode(editor, node, false);
- }
- }
- } else {
- removeCaretContainerNode(editor, node, moveCaret);
- }
- };
- var insertCaretContainerNode = function (editor, caretContainer, formatNode) {
- var dom = editor.dom, block = dom.getParent(formatNode, curry(FormatUtils.isTextBlock, editor));
- if (block && dom.isEmpty(block)) {
- formatNode.parentNode.replaceChild(caretContainer, formatNode);
- } else {
- PaddingBr.removeTrailingBr(Element.fromDom(formatNode));
- if (dom.isEmpty(formatNode)) {
- formatNode.parentNode.replaceChild(caretContainer, formatNode);
- } else {
- dom.insertAfter(caretContainer, formatNode);
- }
- }
- };
- var appendNode = function (parentNode, node) {
- parentNode.appendChild(node);
- return node;
- };
- var insertFormatNodesIntoCaretContainer = function (formatNodes, caretContainer) {
- var innerMostFormatNode = foldr(formatNodes, function (parentNode, formatNode) {
- return appendNode(parentNode, formatNode.cloneNode(false));
- }, caretContainer);
- return appendNode(innerMostFormatNode, innerMostFormatNode.ownerDocument.createTextNode(ZWSP$1));
- };
- var applyCaretFormat = function (editor, name, vars) {
- var rng, caretContainer, textNode, offset, bookmark, container, text;
- var selection = editor.selection;
- rng = selection.getRng(true);
- offset = rng.startOffset;
- container = rng.startContainer;
- text = container.nodeValue;
- caretContainer = getParentCaretContainer(editor.getBody(), selection.getStart());
- if (caretContainer) {
- textNode = findFirstTextNode(caretContainer);
- }
- var wordcharRegex = /[^\s\u00a0\u00ad\u200b\ufeff]/;
- if (text && offset > 0 && offset < text.length && wordcharRegex.test(text.charAt(offset)) && wordcharRegex.test(text.charAt(offset - 1))) {
- bookmark = selection.getBookmark();
- rng.collapse(true);
- rng = ExpandRange.expandRng(editor, rng, editor.formatter.get(name));
- rng = SplitRange.split(rng);
- editor.formatter.apply(name, vars, rng);
- selection.moveToBookmark(bookmark);
- } else {
- if (!caretContainer || textNode.nodeValue !== ZWSP$1) {
- caretContainer = importNode(editor.getDoc(), createCaretContainer(true).dom());
- textNode = caretContainer.firstChild;
- rng.insertNode(caretContainer);
- offset = 1;
- editor.formatter.apply(name, vars, caretContainer);
- } else {
- editor.formatter.apply(name, vars, caretContainer);
- }
- selection.setCursorLocation(textNode, offset);
- }
- };
- var removeCaretFormat = function (editor, name, vars, similar) {
- var dom = editor.dom, selection = editor.selection;
- var container, offset, bookmark;
- var hasContentAfter, node, formatNode;
- var parents = [], rng = selection.getRng();
- var caretContainer;
- container = rng.startContainer;
- offset = rng.startOffset;
- node = container;
- if (container.nodeType === 3) {
- if (offset !== container.nodeValue.length) {
- hasContentAfter = true;
- }
- node = node.parentNode;
- }
- while (node) {
- if (MatchFormat.matchNode(editor, node, name, vars, similar)) {
- formatNode = node;
- break;
- }
- if (node.nextSibling) {
- hasContentAfter = true;
- }
- parents.push(node);
- node = node.parentNode;
- }
- if (!formatNode) {
- return;
- }
- if (hasContentAfter) {
- bookmark = selection.getBookmark();
- rng.collapse(true);
- var expandedRng = ExpandRange.expandRng(editor, rng, editor.formatter.get(name), true);
- expandedRng = SplitRange.split(expandedRng);
- editor.formatter.remove(name, vars, expandedRng);
- selection.moveToBookmark(bookmark);
- } else {
- caretContainer = getParentCaretContainer(editor.getBody(), formatNode);
- var newCaretContainer = createCaretContainer(false).dom();
- var caretNode = insertFormatNodesIntoCaretContainer(parents, newCaretContainer);
- if (caretContainer) {
- insertCaretContainerNode(editor, newCaretContainer, caretContainer);
- } else {
- insertCaretContainerNode(editor, newCaretContainer, formatNode);
- }
- removeCaretContainerNode(editor, caretContainer, false);
- selection.setCursorLocation(caretNode, 1);
- if (dom.isEmpty(formatNode)) {
- dom.remove(formatNode);
- }
- }
- };
- var disableCaretContainer = function (editor, keyCode) {
- var selection = editor.selection, body = editor.getBody();
- removeCaretContainer(editor, null, false);
- if ((keyCode === 8 || keyCode === 46) && selection.isCollapsed() && selection.getStart().innerHTML === ZWSP$1) {
- removeCaretContainer(editor, getParentCaretContainer(body, selection.getStart()));
- }
- if (keyCode === 37 || keyCode === 39) {
- removeCaretContainer(editor, getParentCaretContainer(body, selection.getStart()));
- }
- };
- var setup$2 = function (editor) {
- editor.on('mouseup keydown', function (e) {
- disableCaretContainer(editor, e.keyCode);
- });
- };
- var replaceWithCaretFormat = function (targetNode, formatNodes) {
- var caretContainer = createCaretContainer(false);
- var innerMost = insertFormatNodesIntoCaretContainer(formatNodes, caretContainer.dom());
- before(Element.fromDom(targetNode), caretContainer);
- remove$1(Element.fromDom(targetNode));
- return CaretPosition$1(innerMost, 0);
- };
- var isFormatElement = function (editor, element) {
- var inlineElements = editor.schema.getTextInlineElements();
- return inlineElements.hasOwnProperty(name(element)) && !isCaretNode(element.dom()) && !NodeType.isBogus(element.dom());
- };
- var isEmptyCaretFormatElement = function (element) {
- return isCaretNode(element.dom()) && isCaretContainerEmpty(element.dom());
- };
-
- var getParentInlines = function (rootElm, startElm) {
- var parents = Parents.parentsAndSelf(startElm, rootElm);
- return findIndex(parents, isBlock).fold(constant(parents), function (index) {
- return parents.slice(0, index);
- });
- };
- var hasOnlyOneChild$1 = function (elm) {
- return children(elm).length === 1;
- };
- var deleteLastPosition = function (forward, editor, target, parentInlines) {
- var isFormatElement$1 = curry(isFormatElement, editor);
- var formatNodes = map(filter(parentInlines, isFormatElement$1), function (elm) {
- return elm.dom();
- });
- if (formatNodes.length === 0) {
- DeleteElement.deleteElement(editor, forward, target);
- } else {
- var pos = replaceWithCaretFormat(target.dom(), formatNodes);
- editor.selection.setRng(pos.toRange());
- }
- };
- var deleteCaret$1 = function (editor, forward) {
- var rootElm = Element.fromDom(editor.getBody());
- var startElm = Element.fromDom(editor.selection.getStart());
- var parentInlines = filter(getParentInlines(rootElm, startElm), hasOnlyOneChild$1);
- return last(parentInlines).map(function (target) {
- var fromPos = CaretPosition$1.fromRangeStart(editor.selection.getRng());
- if (DeleteUtils.willDeleteLastPositionInElement(forward, fromPos, target.dom()) && !isEmptyCaretFormatElement(target)) {
- deleteLastPosition(forward, editor, target, parentInlines);
- return true;
- } else {
- return false;
- }
- }).getOr(false);
- };
- var backspaceDelete$5 = function (editor, forward) {
- return editor.selection.isCollapsed() ? deleteCaret$1(editor, forward) : false;
- };
- var InlineFormatDelete = { backspaceDelete: backspaceDelete$5 };
-
- var getPos$1 = function (elm) {
- var x = 0, y = 0;
- var offsetParent = elm;
- while (offsetParent && offsetParent.nodeType) {
- x += offsetParent.offsetLeft || 0;
- y += offsetParent.offsetTop || 0;
- offsetParent = offsetParent.offsetParent;
- }
- return {
- x: x,
- y: y
- };
- };
- var fireScrollIntoViewEvent = function (editor, elm, alignToTop) {
- var scrollEvent = {
- elm: elm,
- alignToTop: alignToTop
- };
- editor.fire('scrollIntoView', scrollEvent);
- return scrollEvent.isDefaultPrevented();
- };
- var scrollElementIntoView = function (editor, elm, alignToTop) {
- var y, viewPort;
- var dom = editor.dom;
- var root = dom.getRoot();
- var viewPortY, viewPortH, offsetY = 0;
- if (fireScrollIntoViewEvent(editor, elm, alignToTop)) {
- return;
- }
- if (!NodeType.isElement(elm)) {
- return;
- }
- if (alignToTop === false) {
- offsetY = elm.offsetHeight;
- }
- if (root.nodeName !== 'BODY') {
- var scrollContainer = editor.selection.getScrollContainer();
- if (scrollContainer) {
- y = getPos$1(elm).y - getPos$1(scrollContainer).y + offsetY;
- viewPortH = scrollContainer.clientHeight;
- viewPortY = scrollContainer.scrollTop;
- if (y < viewPortY || y + 25 > viewPortY + viewPortH) {
- scrollContainer.scrollTop = y < viewPortY ? y : y - viewPortH + 25;
- }
- return;
- }
- }
- viewPort = dom.getViewPort(editor.getWin());
- y = dom.getPos(elm).y + offsetY;
- viewPortY = viewPort.y;
- viewPortH = viewPort.h;
- if (y < viewPort.y || y + 25 > viewPortY + viewPortH) {
- editor.getWin().scrollTo(0, y < viewPortY ? y : y - viewPortH + 25);
- }
- };
- var getViewPortRect = function (editor) {
- if (editor.inline) {
- return editor.getBody().getBoundingClientRect();
- } else {
- var win = editor.getWin();
- return {
- left: 0,
- right: win.innerWidth,
- top: 0,
- bottom: win.innerHeight,
- width: win.innerWidth,
- height: win.innerHeight
- };
- }
- };
- var scrollBy = function (editor, dx, dy) {
- if (editor.inline) {
- editor.getBody().scrollLeft += dx;
- editor.getBody().scrollTop += dy;
- } else {
- editor.getWin().scrollBy(dx, dy);
- }
- };
- var scrollRangeIntoView = function (editor, rng) {
- head(CaretPosition.fromRangeStart(rng).getClientRects()).each(function (rngRect) {
- var bodyRect = getViewPortRect(editor);
- var overflow = getOverflow(bodyRect, rngRect);
- var margin = 4;
- var dx = overflow.x > 0 ? overflow.x + margin : overflow.x - margin;
- var dy = overflow.y > 0 ? overflow.y + margin : overflow.y - margin;
- scrollBy(editor, overflow.x !== 0 ? dx : 0, overflow.y !== 0 ? dy : 0);
- });
- };
- var ScrollIntoView = {
- scrollElementIntoView: scrollElementIntoView,
- scrollRangeIntoView: scrollRangeIntoView
- };
-
- var isContentEditableTrue$2 = NodeType.isContentEditableTrue;
- var isContentEditableFalse$6 = NodeType.isContentEditableFalse;
- var showCaret = function (direction, editor, node, before, scrollIntoView) {
- return editor._selectionOverrides.showCaret(direction, node, before, scrollIntoView);
- };
- var getNodeRange = function (node) {
- var rng = node.ownerDocument.createRange();
- rng.selectNode(node);
- return rng;
- };
- var selectNode = function (editor, node) {
- var e = editor.fire('BeforeObjectSelected', { target: node });
- if (e.isDefaultPrevented()) {
- return null;
- }
- return getNodeRange(node);
- };
- var renderCaretAtRange = function (editor, range, scrollIntoView) {
- var normalizedRange = normalizeRange(1, editor.getBody(), range);
- var caretPosition = CaretPosition$1.fromRangeStart(normalizedRange);
- var caretPositionNode = caretPosition.getNode();
- if (isContentEditableFalse$6(caretPositionNode)) {
- return showCaret(1, editor, caretPositionNode, !caretPosition.isAtEnd(), false);
- }
- var caretPositionBeforeNode = caretPosition.getNode(true);
- if (isContentEditableFalse$6(caretPositionBeforeNode)) {
- return showCaret(1, editor, caretPositionBeforeNode, false, false);
- }
- var ceRoot = editor.dom.getParent(caretPosition.getNode(), function (node) {
- return isContentEditableFalse$6(node) || isContentEditableTrue$2(node);
- });
- if (isContentEditableFalse$6(ceRoot)) {
- return showCaret(1, editor, ceRoot, false, scrollIntoView);
- }
- return null;
- };
- var renderRangeCaret = function (editor, range, scrollIntoView) {
- if (!range || !range.collapsed) {
- return range;
- }
- var caretRange = renderCaretAtRange(editor, range, scrollIntoView);
- if (caretRange) {
- return caretRange;
- }
- return range;
- };
- var moveToRange = function (editor, rng) {
- editor.selection.setRng(rng);
- ScrollIntoView.scrollRangeIntoView(editor, editor.selection.getRng());
- };
-
- var trimEmptyTextNode$1 = function (dom, node) {
- if (NodeType.isText(node) && node.data.length === 0) {
- dom.remove(node);
- }
- };
- var deleteContentAndShowCaret = function (editor, range, node, direction, forward, peekCaretPosition) {
- var caretRange = showCaret(direction, editor, peekCaretPosition.getNode(!forward), forward, true);
- if (range.collapsed) {
- var deleteRange = range.cloneRange();
- if (forward) {
- deleteRange.setEnd(caretRange.startContainer, caretRange.startOffset);
- } else {
- deleteRange.setStart(caretRange.endContainer, caretRange.endOffset);
- }
- deleteRange.deleteContents();
- } else {
- range.deleteContents();
- }
- editor.selection.setRng(caretRange);
- trimEmptyTextNode$1(editor.dom, node);
- return true;
- };
- var deleteCefBoundaryText = function (editor, forward) {
- var range = editor.selection.getRng();
- if (!NodeType.isText(range.commonAncestorContainer)) {
- return false;
- }
- var direction = forward ? HDirection.Forwards : HDirection.Backwards;
- var caretWalker = CaretWalker(editor.getBody());
- var getNextVisualCaretPosition = curry(getVisualCaretPosition, caretWalker.next);
- var getPrevVisualCaretPosition = curry(getVisualCaretPosition, caretWalker.prev);
- var getNextPosFn = forward ? getNextVisualCaretPosition : getPrevVisualCaretPosition;
- var isBeforeContentEditableFalseFn = forward ? isBeforeContentEditableFalse : isAfterContentEditableFalse;
- var caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);
- var nextCaretPosition = InlineUtils.normalizePosition(forward, getNextPosFn(caretPosition));
- if (!nextCaretPosition) {
- return false;
- } else if (isBeforeContentEditableFalseFn(nextCaretPosition)) {
- return deleteContentAndShowCaret(editor, range, caretPosition.getNode(), direction, forward, nextCaretPosition);
- }
- var peekCaretPosition = getNextPosFn(nextCaretPosition);
- if (peekCaretPosition && isBeforeContentEditableFalseFn(peekCaretPosition)) {
- if (isMoveInsideSameBlock(nextCaretPosition, peekCaretPosition)) {
- return deleteContentAndShowCaret(editor, range, caretPosition.getNode(), direction, forward, peekCaretPosition);
- }
- }
- return false;
- };
- var backspaceDelete$6 = function (editor, forward) {
- return deleteCefBoundaryText(editor, forward);
- };
- var CefBoundaryDelete = { backspaceDelete: backspaceDelete$6 };
-
- var nativeCommand = function (editor, command) {
- editor.getDoc().execCommand(command, false, null);
- };
- var deleteCommand = function (editor) {
- if (CefDelete.backspaceDelete(editor, false)) {
- return;
- } else if (CefBoundaryDelete.backspaceDelete(editor, false)) {
- return;
- } else if (InlineBoundaryDelete.backspaceDelete(editor, false)) {
- return;
- } else if (BlockBoundaryDelete.backspaceDelete(editor, false)) {
- return;
- } else if (TableDelete.backspaceDelete(editor)) {
- return;
- } else if (BlockRangeDelete.backspaceDelete(editor, false)) {
- return;
- } else if (InlineFormatDelete.backspaceDelete(editor, false)) {
- return;
- } else {
- nativeCommand(editor, 'Delete');
- DeleteUtils.paddEmptyBody(editor);
- }
- };
- var forwardDeleteCommand = function (editor) {
- if (CefDelete.backspaceDelete(editor, true)) {
- return;
- } else if (CefBoundaryDelete.backspaceDelete(editor, true)) {
- return;
- } else if (InlineBoundaryDelete.backspaceDelete(editor, true)) {
- return;
- } else if (BlockBoundaryDelete.backspaceDelete(editor, true)) {
- return;
- } else if (TableDelete.backspaceDelete(editor)) {
- return;
- } else if (BlockRangeDelete.backspaceDelete(editor, true)) {
- return;
- } else if (InlineFormatDelete.backspaceDelete(editor, true)) {
- return;
- } else {
- nativeCommand(editor, 'ForwardDelete');
- }
- };
- var DeleteCommands = {
- deleteCommand: deleteCommand,
- forwardDeleteCommand: forwardDeleteCommand
- };
-
- var getSpecifiedFontProp = function (propName, rootElm, elm) {
- var getProperty = function (elm) {
- return getRaw(elm, propName);
- };
- var isRoot = function (elm) {
- return eq(Element.fromDom(rootElm), elm);
- };
- return closest(Element.fromDom(elm), function (elm) {
- return getProperty(elm).isSome();
- }, isRoot).bind(getProperty);
- };
- var round$1 = function (number, precision) {
- var factor = Math.pow(10, precision);
- return Math.round(number * factor) / factor;
- };
- var toPt = function (fontSize, precision) {
- if (/[0-9.]+px$/.test(fontSize)) {
- return round$1(parseInt(fontSize, 10) * 72 / 96, precision || 0) + 'pt';
- }
- return fontSize;
- };
- var normalizeFontFamily = function (fontFamily) {
- return fontFamily.replace(/[\'\"\\]/g, '').replace(/,\s+/g, ',');
- };
- var getComputedFontProp = function (propName, elm) {
- return Option.from(DOMUtils$1.DOM.getStyle(elm, propName, true));
- };
- var getFontProp = function (propName) {
- return function (rootElm, elm) {
- return Option.from(elm).map(Element.fromDom).filter(isElement).bind(function (element) {
- return getSpecifiedFontProp(propName, rootElm, element.dom()).or(getComputedFontProp(propName, element.dom()));
- }).getOr('');
- };
- };
- var FontInfo = {
- getFontSize: getFontProp('font-size'),
- getFontFamily: compose(normalizeFontFamily, getFontProp('font-family')),
- toPt: toPt
- };
-
- var findFirstCaretElement = function (editor) {
- return CaretFinder.firstPositionIn(editor.getBody()).map(function (caret) {
- var container = caret.container();
- return NodeType.isText(container) ? container.parentNode : container;
- });
- };
- var isRangeAtStartOfNode = function (rng, root) {
- return rng.startContainer === root && rng.startOffset === 0;
- };
- var getCaretElement = function (editor) {
- return Option.from(editor.selection.getRng()).bind(function (rng) {
- var root = editor.getBody();
- return isRangeAtStartOfNode(rng, root) ? Option.none() : Option.from(editor.selection.getStart(true));
- });
- };
- var fromFontSizeNumber = function (editor, value) {
- if (/^[0-9\.]+$/.test(value)) {
- var fontSizeNumber = parseInt(value, 10);
- if (fontSizeNumber >= 1 && fontSizeNumber <= 7) {
- var fontSizes = Settings.getFontStyleValues(editor);
- var fontClasses = Settings.getFontSizeClasses(editor);
- if (fontClasses) {
- return fontClasses[fontSizeNumber - 1] || value;
- } else {
- return fontSizes[fontSizeNumber - 1] || value;
- }
- } else {
- return value;
- }
- } else {
- return value;
- }
- };
- var fontNameAction = function (editor, value) {
- editor.formatter.toggle('fontname', { value: fromFontSizeNumber(editor, value) });
- editor.nodeChanged();
- };
- var fontNameQuery = function (editor) {
- return getCaretElement(editor).fold(function () {
- return findFirstCaretElement(editor).map(function (caretElement) {
- return FontInfo.getFontFamily(editor.getBody(), caretElement);
- }).getOr('');
- }, function (caretElement) {
- return FontInfo.getFontFamily(editor.getBody(), caretElement);
- });
- };
- var fontSizeAction = function (editor, value) {
- editor.formatter.toggle('fontsize', { value: fromFontSizeNumber(editor, value) });
- editor.nodeChanged();
- };
- var fontSizeQuery = function (editor) {
- return getCaretElement(editor).fold(function () {
- return findFirstCaretElement(editor).map(function (caretElement) {
- return FontInfo.getFontSize(editor.getBody(), caretElement);
- }).getOr('');
- }, function (caretElement) {
- return FontInfo.getFontSize(editor.getBody(), caretElement);
- });
- };
-
- var isEq$3 = function (rng1, rng2) {
- return rng1 && rng2 && (rng1.startContainer === rng2.startContainer && rng1.startOffset === rng2.startOffset) && (rng1.endContainer === rng2.endContainer && rng1.endOffset === rng2.endOffset);
- };
- var RangeCompare = { isEq: isEq$3 };
-
- var findParent = function (node, rootNode, predicate) {
- while (node && node !== rootNode) {
- if (predicate(node)) {
- return node;
- }
- node = node.parentNode;
- }
- return null;
- };
- var hasParent = function (node, rootNode, predicate) {
- return findParent(node, rootNode, predicate) !== null;
- };
- var hasParentWithName = function (node, rootNode, name) {
- return hasParent(node, rootNode, function (node) {
- return node.nodeName === name;
- });
- };
- var isTable$2 = function (node) {
- return node && node.nodeName === 'TABLE';
- };
- var isTableCell$3 = function (node) {
- return node && /^(TD|TH|CAPTION)$/.test(node.nodeName);
- };
- var isCeFalseCaretContainer = function (node, rootNode) {
- return isCaretContainer(node) && hasParent(node, rootNode, isCaretNode) === false;
- };
- var hasBrBeforeAfter = function (dom, node, left) {
- var walker = new TreeWalker(node, dom.getParent(node.parentNode, dom.isBlock) || dom.getRoot());
- while (node = walker[left ? 'prev' : 'next']()) {
- if (NodeType.isBr(node)) {
- return true;
- }
- }
- };
- var isPrevNode = function (node, name) {
- return node.previousSibling && node.previousSibling.nodeName === name;
- };
- var hasContentEditableFalseParent = function (body, node) {
- while (node && node !== body) {
- if (NodeType.isContentEditableFalse(node)) {
- return true;
- }
- node = node.parentNode;
- }
- return false;
- };
- var findTextNodeRelative = function (dom, isAfterNode, collapsed, left, startNode) {
- var walker, lastInlineElement, parentBlockContainer;
- var body = dom.getRoot();
- var node;
- var nonEmptyElementsMap = dom.schema.getNonEmptyElements();
- parentBlockContainer = dom.getParent(startNode.parentNode, dom.isBlock) || body;
- if (left && NodeType.isBr(startNode) && isAfterNode && dom.isEmpty(parentBlockContainer)) {
- return Option.some(CaretPosition(startNode.parentNode, dom.nodeIndex(startNode)));
- }
- walker = new TreeWalker(startNode, parentBlockContainer);
- while (node = walker[left ? 'prev' : 'next']()) {
- if (dom.getContentEditableParent(node) === 'false' || isCeFalseCaretContainer(node, body)) {
- return Option.none();
- }
- if (NodeType.isText(node) && node.nodeValue.length > 0) {
- if (hasParentWithName(node, body, 'A') === false) {
- return Option.some(CaretPosition(node, left ? node.nodeValue.length : 0));
- }
- return Option.none();
- }
- if (dom.isBlock(node) || nonEmptyElementsMap[node.nodeName.toLowerCase()]) {
- return Option.none();
- }
- lastInlineElement = node;
- }
- if (collapsed && lastInlineElement) {
- return Option.some(CaretPosition(lastInlineElement, 0));
- }
- return Option.none();
- };
- var normalizeEndPoint = function (dom, collapsed, start, rng) {
- var container, offset, walker;
- var body = dom.getRoot();
- var node, nonEmptyElementsMap;
- var directionLeft, isAfterNode, normalized = false;
- container = rng[(start ? 'start' : 'end') + 'Container'];
- offset = rng[(start ? 'start' : 'end') + 'Offset'];
- isAfterNode = NodeType.isElement(container) && offset === container.childNodes.length;
- nonEmptyElementsMap = dom.schema.getNonEmptyElements();
- directionLeft = start;
- if (isCaretContainer(container)) {
- return Option.none();
- }
- if (NodeType.isElement(container) && offset > container.childNodes.length - 1) {
- directionLeft = false;
- }
- if (NodeType.isDocument(container)) {
- container = body;
- offset = 0;
- }
- if (container === body) {
- if (directionLeft) {
- node = container.childNodes[offset > 0 ? offset - 1 : 0];
- if (node) {
- if (isCaretContainer(node)) {
- return Option.none();
- }
- if (nonEmptyElementsMap[node.nodeName] || isTable$2(node)) {
- return Option.none();
- }
- }
- }
- if (container.hasChildNodes()) {
- offset = Math.min(!directionLeft && offset > 0 ? offset - 1 : offset, container.childNodes.length - 1);
- container = container.childNodes[offset];
- offset = NodeType.isText(container) && isAfterNode ? container.data.length : 0;
- if (!collapsed && container === body.lastChild && isTable$2(container)) {
- return Option.none();
- }
- if (hasContentEditableFalseParent(body, container) || isCaretContainer(container)) {
- return Option.none();
- }
- if (container.hasChildNodes() && isTable$2(container) === false) {
- node = container;
- walker = new TreeWalker(container, body);
- do {
- if (NodeType.isContentEditableFalse(node) || isCaretContainer(node)) {
- normalized = false;
- break;
- }
- if (NodeType.isText(node) && node.nodeValue.length > 0) {
- offset = directionLeft ? 0 : node.nodeValue.length;
- container = node;
- normalized = true;
- break;
- }
- if (nonEmptyElementsMap[node.nodeName.toLowerCase()] && !isTableCell$3(node)) {
- offset = dom.nodeIndex(node);
- container = node.parentNode;
- if (!directionLeft) {
- offset++;
- }
- normalized = true;
- break;
- }
- } while (node = directionLeft ? walker.next() : walker.prev());
- }
- }
- }
- if (collapsed) {
- if (NodeType.isText(container) && offset === 0) {
- findTextNodeRelative(dom, isAfterNode, collapsed, true, container).each(function (pos) {
- container = pos.container();
- offset = pos.offset();
- normalized = true;
- });
- }
- if (NodeType.isElement(container)) {
- node = container.childNodes[offset];
- if (!node) {
- node = container.childNodes[offset - 1];
- }
- if (node && NodeType.isBr(node) && !isPrevNode(node, 'A') && !hasBrBeforeAfter(dom, node, false) && !hasBrBeforeAfter(dom, node, true)) {
- findTextNodeRelative(dom, isAfterNode, collapsed, true, node).each(function (pos) {
- container = pos.container();
- offset = pos.offset();
- normalized = true;
- });
- }
- }
- }
- if (directionLeft && !collapsed && NodeType.isText(container) && offset === container.nodeValue.length) {
- findTextNodeRelative(dom, isAfterNode, collapsed, false, container).each(function (pos) {
- container = pos.container();
- offset = pos.offset();
- normalized = true;
- });
- }
- return normalized ? Option.some(CaretPosition(container, offset)) : Option.none();
- };
- var normalize$2 = function (dom, rng) {
- var collapsed = rng.collapsed, normRng = rng.cloneRange();
- var startPos = CaretPosition.fromRangeStart(rng);
- normalizeEndPoint(dom, collapsed, true, normRng).each(function (pos) {
- if (!collapsed || !CaretPosition.isAbove(startPos, pos)) {
- normRng.setStart(pos.container(), pos.offset());
- }
- });
- if (!collapsed) {
- normalizeEndPoint(dom, collapsed, false, normRng).each(function (pos) {
- normRng.setEnd(pos.container(), pos.offset());
- });
- }
- if (collapsed) {
- normRng.collapse(true);
- }
- return RangeCompare.isEq(rng, normRng) ? Option.none() : Option.some(normRng);
- };
- var NormalizeRange = { normalize: normalize$2 };
-
- var hasRightSideContent = function (schema, container, parentBlock) {
- var walker = new TreeWalker(container, parentBlock);
- var node;
- var nonEmptyElementsMap = schema.getNonEmptyElements();
- while (node = walker.next()) {
- if (nonEmptyElementsMap[node.nodeName.toLowerCase()] || node.length > 0) {
- return true;
- }
- }
- };
- var scrollToBr = function (dom, selection, brElm) {
- var marker = dom.create('span', {}, ' ');
- brElm.parentNode.insertBefore(marker, brElm);
- selection.scrollIntoView(marker);
- dom.remove(marker);
- };
- var moveSelectionToBr = function (dom, selection, brElm, extraBr) {
- var rng = dom.createRng();
- if (!extraBr) {
- rng.setStartAfter(brElm);
- rng.setEndAfter(brElm);
- } else {
- rng.setStartBefore(brElm);
- rng.setEndBefore(brElm);
- }
- selection.setRng(rng);
- };
- var insertBrAtCaret = function (editor, evt) {
- var selection = editor.selection;
- var dom = editor.dom;
- var rng = selection.getRng();
- var brElm;
- var extraBr;
- NormalizeRange.normalize(dom, rng).each(function (normRng) {
- rng.setStart(normRng.startContainer, normRng.startOffset);
- rng.setEnd(normRng.endContainer, normRng.endOffset);
- });
- var offset = rng.startOffset;
- var container = rng.startContainer;
- if (container.nodeType === 1 && container.hasChildNodes()) {
- var isAfterLastNodeInContainer = offset > container.childNodes.length - 1;
- container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;
- if (isAfterLastNodeInContainer && container.nodeType === 3) {
- offset = container.nodeValue.length;
- } else {
- offset = 0;
- }
- }
- var parentBlock = dom.getParent(container, dom.isBlock);
- var containerBlock = parentBlock ? dom.getParent(parentBlock.parentNode, dom.isBlock) : null;
- var containerBlockName = containerBlock ? containerBlock.nodeName.toUpperCase() : '';
- var isControlKey = evt && evt.ctrlKey;
- if (containerBlockName === 'LI' && !isControlKey) {
- parentBlock = containerBlock;
- }
- if (container && container.nodeType === 3 && offset >= container.nodeValue.length) {
- if (!hasRightSideContent(editor.schema, container, parentBlock)) {
- brElm = dom.create('br');
- rng.insertNode(brElm);
- rng.setStartAfter(brElm);
- rng.setEndAfter(brElm);
- extraBr = true;
- }
- }
- brElm = dom.create('br');
- rangeInsertNode(dom, rng, brElm);
- scrollToBr(dom, selection, brElm);
- moveSelectionToBr(dom, selection, brElm, extraBr);
- editor.undoManager.add();
- };
- var insertBrBefore = function (editor, inline) {
- var br = Element.fromTag('br');
- before(Element.fromDom(inline), br);
- editor.undoManager.add();
- };
- var insertBrAfter = function (editor, inline) {
- if (!hasBrAfter(editor.getBody(), inline)) {
- after(Element.fromDom(inline), Element.fromTag('br'));
- }
- var br = Element.fromTag('br');
- after(Element.fromDom(inline), br);
- scrollToBr(editor.dom, editor.selection, br.dom());
- moveSelectionToBr(editor.dom, editor.selection, br.dom(), false);
- editor.undoManager.add();
- };
- var isBeforeBr$1 = function (pos) {
- return NodeType.isBr(pos.getNode());
- };
- var hasBrAfter = function (rootNode, startNode) {
- if (isBeforeBr$1(CaretPosition$1.after(startNode))) {
- return true;
- } else {
- return CaretFinder.nextPosition(rootNode, CaretPosition$1.after(startNode)).map(function (pos) {
- return NodeType.isBr(pos.getNode());
- }).getOr(false);
- }
- };
- var isAnchorLink = function (elm) {
- return elm && elm.nodeName === 'A' && 'href' in elm;
- };
- var isInsideAnchor = function (location) {
- return location.fold(constant(false), isAnchorLink, isAnchorLink, constant(false));
- };
- var readInlineAnchorLocation = function (editor) {
- var isInlineTarget = curry(InlineUtils.isInlineTarget, editor);
- var position = CaretPosition$1.fromRangeStart(editor.selection.getRng());
- return BoundaryLocation.readLocation(isInlineTarget, editor.getBody(), position).filter(isInsideAnchor);
- };
- var insertBrOutsideAnchor = function (editor, location) {
- location.fold(noop, curry(insertBrBefore, editor), curry(insertBrAfter, editor), noop);
- };
- var insert = function (editor, evt) {
- var anchorLocation = readInlineAnchorLocation(editor);
- if (anchorLocation.isSome()) {
- anchorLocation.each(curry(insertBrOutsideAnchor, editor));
- } else {
- insertBrAtCaret(editor, evt);
- }
- };
- var InsertBr = { insert: insert };
-
- var create$3 = Immutable('start', 'soffset', 'finish', 'foffset');
- var SimRange = { create: create$3 };
-
- var adt = Adt.generate([
- { before: ['element'] },
- {
- on: [
- 'element',
- 'offset'
- ]
- },
- { after: ['element'] }
- ]);
- var cata = function (subject, onBefore, onOn, onAfter) {
- return subject.fold(onBefore, onOn, onAfter);
- };
- var getStart = function (situ) {
- return situ.fold(identity, identity, identity);
- };
- var before$4 = adt.before;
- var on = adt.on;
- var after$3 = adt.after;
- var Situ = {
- before: before$4,
- on: on,
- after: after$3,
- cata: cata,
- getStart: getStart
- };
-
- var adt$1 = Adt.generate([
- { domRange: ['rng'] },
- {
- relative: [
- 'startSitu',
- 'finishSitu'
- ]
- },
- {
- exact: [
- 'start',
- 'soffset',
- 'finish',
- 'foffset'
- ]
- }
- ]);
- var exactFromRange = function (simRange) {
- return adt$1.exact(simRange.start(), simRange.soffset(), simRange.finish(), simRange.foffset());
- };
- var getStart$1 = function (selection) {
- return selection.match({
- domRange: function (rng) {
- return Element.fromDom(rng.startContainer);
- },
- relative: function (startSitu, finishSitu) {
- return Situ.getStart(startSitu);
- },
- exact: function (start, soffset, finish, foffset) {
- return start;
- }
- });
- };
- var domRange = adt$1.domRange;
- var relative = adt$1.relative;
- var exact = adt$1.exact;
- var getWin = function (selection) {
- var start = getStart$1(selection);
- return defaultView(start);
- };
- var range = SimRange.create;
- var Selection = {
- domRange: domRange,
- relative: relative,
- exact: exact,
- exactFromRange: exactFromRange,
- getWin: getWin,
- range: range
- };
-
- var browser$3 = PlatformDetection$1.detect().browser;
- var clamp = function (offset, element) {
- var max = isText(element) ? get$4(element).length : children(element).length + 1;
- if (offset > max) {
- return max;
- } else if (offset < 0) {
- return 0;
- }
- return offset;
- };
- var normalizeRng = function (rng) {
- return Selection.range(rng.start(), clamp(rng.soffset(), rng.start()), rng.finish(), clamp(rng.foffset(), rng.finish()));
- };
- var isOrContains = function (root, elm) {
- return !NodeType.isRestrictedNode(elm.dom()) && (contains$3(root, elm) || eq(root, elm));
- };
- var isRngInRoot = function (root) {
- return function (rng) {
- return isOrContains(root, rng.start()) && isOrContains(root, rng.finish());
- };
- };
- var shouldStore = function (editor) {
- return editor.inline === true || browser$3.isIE();
- };
- var nativeRangeToSelectionRange = function (r) {
- return Selection.range(Element.fromDom(r.startContainer), r.startOffset, Element.fromDom(r.endContainer), r.endOffset);
- };
- var readRange = function (win) {
- var selection = win.getSelection();
- var rng = !selection || selection.rangeCount === 0 ? Option.none() : Option.from(selection.getRangeAt(0));
- return rng.map(nativeRangeToSelectionRange);
- };
- var getBookmark$2 = function (root) {
- var win = defaultView(root);
- return readRange(win.dom()).filter(isRngInRoot(root));
- };
- var validate = function (root, bookmark) {
- return Option.from(bookmark).filter(isRngInRoot(root)).map(normalizeRng);
- };
- var bookmarkToNativeRng = function (bookmark) {
- var rng = domGlobals.document.createRange();
- try {
- rng.setStart(bookmark.start().dom(), bookmark.soffset());
- rng.setEnd(bookmark.finish().dom(), bookmark.foffset());
- return Option.some(rng);
- } catch (_) {
- return Option.none();
- }
- };
- var store = function (editor) {
- var newBookmark = shouldStore(editor) ? getBookmark$2(Element.fromDom(editor.getBody())) : Option.none();
- editor.bookmark = newBookmark.isSome() ? newBookmark : editor.bookmark;
- };
- var storeNative = function (editor, rng) {
- var root = Element.fromDom(editor.getBody());
- var range = shouldStore(editor) ? Option.from(rng) : Option.none();
- var newBookmark = range.map(nativeRangeToSelectionRange).filter(isRngInRoot(root));
- editor.bookmark = newBookmark.isSome() ? newBookmark : editor.bookmark;
- };
- var getRng = function (editor) {
- var bookmark = editor.bookmark ? editor.bookmark : Option.none();
- return bookmark.bind(curry(validate, Element.fromDom(editor.getBody()))).bind(bookmarkToNativeRng);
- };
- var restore = function (editor) {
- getRng(editor).each(function (rng) {
- editor.selection.setRng(rng);
- });
- };
- var SelectionBookmark = {
- store: store,
- storeNative: storeNative,
- readRange: readRange,
- restore: restore,
- getRng: getRng,
- getBookmark: getBookmark$2,
- validate: validate
- };
-
- var indentElement = function (dom, command, useMargin, value, unit, element) {
- if (dom.getContentEditable(element) === 'false') {
- return;
- }
- var indentStyleName = useMargin ? 'margin' : 'padding';
- indentStyleName = element.nodeName === 'TABLE' ? 'margin' : indentStyleName;
- indentStyleName += dom.getStyle(element, 'direction', true) === 'rtl' ? 'Right' : 'Left';
- if (command === 'outdent') {
- var styleValue = Math.max(0, parseInt(element.style[indentStyleName] || 0, 10) - value);
- dom.setStyle(element, indentStyleName, styleValue ? styleValue + unit : '');
- } else {
- var styleValue = parseInt(element.style[indentStyleName] || 0, 10) + value + unit;
- dom.setStyle(element, indentStyleName, styleValue);
- }
- };
- var isListComponent = function (el) {
- return isList(el) || isListItem(el);
- };
- var parentIsListComponent = function (el) {
- return parent(el).map(isListComponent).getOr(false);
- };
- var getBlocksToIndent = function (editor) {
- return filter(map(editor.selection.getSelectedBlocks(), Element.fromDom), function (el) {
- return !isListComponent(el) && !parentIsListComponent(el);
- });
- };
- var handle = function (editor, command) {
- var settings = editor.settings, dom = editor.dom, selection = editor.selection, formatter = editor.formatter;
- var indentUnit = /[a-z%]+$/i.exec(settings.indentation)[0];
- var indentValue = parseInt(settings.indentation, 10);
- var useMargin = editor.getParam('indent_use_margin', false);
- if (!editor.queryCommandState('InsertUnorderedList') && !editor.queryCommandState('InsertOrderedList')) {
- if (!settings.forced_root_block && !dom.getParent(selection.getNode(), dom.isBlock)) {
- formatter.apply('div');
- }
- }
- each(getBlocksToIndent(editor), function (block) {
- indentElement(dom, command, useMargin, indentValue, indentUnit, block.dom());
- });
- };
-
- var each$a = Tools.each, extend$2 = Tools.extend;
- var map$3 = Tools.map, inArray$2 = Tools.inArray;
- function EditorCommands (editor) {
- var dom, selection, formatter;
- var commands = {
- state: {},
- exec: {},
- value: {}
- };
- var settings = editor.settings, bookmark;
- editor.on('PreInit', function () {
- dom = editor.dom;
- selection = editor.selection;
- settings = editor.settings;
- formatter = editor.formatter;
- });
- var execCommand = function (command, ui, value, args) {
- var func, customCommand, state = false;
- if (editor.removed) {
- return;
- }
- if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(command) && (!args || !args.skip_focus)) {
- editor.focus();
- } else {
- SelectionBookmark.restore(editor);
- }
- args = editor.fire('BeforeExecCommand', {
- command: command,
- ui: ui,
- value: value
- });
- if (args.isDefaultPrevented()) {
- return false;
- }
- customCommand = command.toLowerCase();
- if (func = commands.exec[customCommand]) {
- func(customCommand, ui, value);
- editor.fire('ExecCommand', {
- command: command,
- ui: ui,
- value: value
- });
- return true;
- }
- each$a(editor.plugins, function (p) {
- if (p.execCommand && p.execCommand(command, ui, value)) {
- editor.fire('ExecCommand', {
- command: command,
- ui: ui,
- value: value
- });
- state = true;
- return false;
- }
- });
- if (state) {
- return state;
- }
- if (editor.theme && editor.theme.execCommand && editor.theme.execCommand(command, ui, value)) {
- editor.fire('ExecCommand', {
- command: command,
- ui: ui,
- value: value
- });
- return true;
- }
- try {
- state = editor.getDoc().execCommand(command, ui, value);
- } catch (ex) {
- }
- if (state) {
- editor.fire('ExecCommand', {
- command: command,
- ui: ui,
- value: value
- });
- return true;
- }
- return false;
- };
- var queryCommandState = function (command) {
- var func;
- if (editor.quirks.isHidden() || editor.removed) {
- return;
- }
- command = command.toLowerCase();
- if (func = commands.state[command]) {
- return func(command);
- }
- try {
- return editor.getDoc().queryCommandState(command);
- } catch (ex) {
- }
- return false;
- };
- var queryCommandValue = function (command) {
- var func;
- if (editor.quirks.isHidden() || editor.removed) {
- return;
- }
- command = command.toLowerCase();
- if (func = commands.value[command]) {
- return func(command);
- }
- try {
- return editor.getDoc().queryCommandValue(command);
- } catch (ex) {
- }
- };
- var addCommands = function (commandList, type) {
- type = type || 'exec';
- each$a(commandList, function (callback, command) {
- each$a(command.toLowerCase().split(','), function (command) {
- commands[type][command] = callback;
- });
- });
- };
- var addCommand = function (command, callback, scope) {
- command = command.toLowerCase();
- commands.exec[command] = function (command, ui, value, args) {
- return callback.call(scope || editor, ui, value, args);
- };
- };
- var queryCommandSupported = function (command) {
- command = command.toLowerCase();
- if (commands.exec[command]) {
- return true;
- }
- try {
- return editor.getDoc().queryCommandSupported(command);
- } catch (ex) {
- }
- return false;
- };
- var addQueryStateHandler = function (command, callback, scope) {
- command = command.toLowerCase();
- commands.state[command] = function () {
- return callback.call(scope || editor);
- };
- };
- var addQueryValueHandler = function (command, callback, scope) {
- command = command.toLowerCase();
- commands.value[command] = function () {
- return callback.call(scope || editor);
- };
- };
- var hasCustomCommand = function (command) {
- command = command.toLowerCase();
- return !!commands.exec[command];
- };
- extend$2(this, {
- execCommand: execCommand,
- queryCommandState: queryCommandState,
- queryCommandValue: queryCommandValue,
- queryCommandSupported: queryCommandSupported,
- addCommands: addCommands,
- addCommand: addCommand,
- addQueryStateHandler: addQueryStateHandler,
- addQueryValueHandler: addQueryValueHandler,
- hasCustomCommand: hasCustomCommand
- });
- var execNativeCommand = function (command, ui, value) {
- if (ui === undefined) {
- ui = false;
- }
- if (value === undefined) {
- value = null;
- }
- return editor.getDoc().execCommand(command, ui, value);
- };
- var isFormatMatch = function (name) {
- return formatter.match(name);
- };
- var toggleFormat = function (name, value) {
- formatter.toggle(name, value ? { value: value } : undefined);
- editor.nodeChanged();
- };
- var storeSelection = function (type) {
- bookmark = selection.getBookmark(type);
- };
- var restoreSelection = function () {
- selection.moveToBookmark(bookmark);
- };
- addCommands({
- 'mceResetDesignMode,mceBeginUndoLevel': function () {
- },
- 'mceEndUndoLevel,mceAddUndoLevel': function () {
- editor.undoManager.add();
- },
- 'Cut,Copy,Paste': function (command) {
- var doc = editor.getDoc();
- var failed;
- try {
- execNativeCommand(command);
- } catch (ex) {
- failed = true;
- }
- if (command === 'paste' && !doc.queryCommandEnabled(command)) {
- failed = true;
- }
- if (failed || !doc.queryCommandSupported(command)) {
- var msg = editor.translate('Your browser doesn\'t support direct access to the clipboard. ' + 'Please use the Ctrl+X/C/V keyboard shortcuts instead.');
- if (Env.mac) {
- msg = msg.replace(/Ctrl\+/g, '\u2318+');
- }
- editor.notificationManager.open({
- text: msg,
- type: 'error'
- });
- }
- },
- 'unlink': function () {
- if (selection.isCollapsed()) {
- var elm = editor.dom.getParent(editor.selection.getStart(), 'a');
- if (elm) {
- editor.dom.remove(elm, true);
- }
- return;
- }
- formatter.remove('link');
- },
- 'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull,JustifyNone': function (command) {
- var align = command.substring(7);
- if (align === 'full') {
- align = 'justify';
- }
- each$a('left,center,right,justify'.split(','), function (name) {
- if (align !== name) {
- formatter.remove('align' + name);
- }
- });
- if (align !== 'none') {
- toggleFormat('align' + align);
- }
- },
- 'InsertUnorderedList,InsertOrderedList': function (command) {
- var listElm, listParent;
- execNativeCommand(command);
- listElm = dom.getParent(selection.getNode(), 'ol,ul');
- if (listElm) {
- listParent = listElm.parentNode;
- if (/^(H[1-6]|P|ADDRESS|PRE)$/.test(listParent.nodeName)) {
- storeSelection();
- dom.split(listParent, listElm);
- restoreSelection();
- }
- }
- },
- 'Bold,Italic,Underline,Strikethrough,Superscript,Subscript': function (command) {
- toggleFormat(command);
- },
- 'ForeColor,HiliteColor': function (command, ui, value) {
- toggleFormat(command, value);
- },
- 'FontName': function (command, ui, value) {
- fontNameAction(editor, value);
- },
- 'FontSize': function (command, ui, value) {
- fontSizeAction(editor, value);
- },
- 'RemoveFormat': function (command) {
- formatter.remove(command);
- },
- 'mceBlockQuote': function () {
- toggleFormat('blockquote');
- },
- 'FormatBlock': function (command, ui, value) {
- return toggleFormat(value || 'p');
- },
- 'mceCleanup': function () {
- var bookmark = selection.getBookmark();
- editor.setContent(editor.getContent());
- selection.moveToBookmark(bookmark);
- },
- 'mceRemoveNode': function (command, ui, value) {
- var node = value || selection.getNode();
- if (node !== editor.getBody()) {
- storeSelection();
- editor.dom.remove(node, true);
- restoreSelection();
- }
- },
- 'mceSelectNodeDepth': function (command, ui, value) {
- var counter = 0;
- dom.getParent(selection.getNode(), function (node) {
- if (node.nodeType === 1 && counter++ === value) {
- selection.select(node);
- return false;
- }
- }, editor.getBody());
- },
- 'mceSelectNode': function (command, ui, value) {
- selection.select(value);
- },
- 'mceInsertContent': function (command, ui, value) {
- InsertContent.insertAtCaret(editor, value);
- },
- 'mceInsertRawHTML': function (command, ui, value) {
- selection.setContent('tiny_mce_marker');
- var content = editor.getContent();
- editor.setContent(content.replace(/tiny_mce_marker/g, function () {
- return value;
- }));
- },
- 'mceToggleFormat': function (command, ui, value) {
- toggleFormat(value);
- },
- 'mceSetContent': function (command, ui, value) {
- editor.setContent(value);
- },
- 'Indent,Outdent': function (command) {
- handle(editor, command);
- },
- 'mceRepaint': function () {
- },
- 'InsertHorizontalRule': function () {
- editor.execCommand('mceInsertContent', false, ' ');
- },
- 'mceToggleVisualAid': function () {
- editor.hasVisual = !editor.hasVisual;
- editor.addVisual();
- },
- 'mceReplaceContent': function (command, ui, value) {
- editor.execCommand('mceInsertContent', false, value.replace(/\{\$selection\}/g, selection.getContent({ format: 'text' })));
- },
- 'mceInsertLink': function (command, ui, value) {
- var anchor;
- if (typeof value === 'string') {
- value = { href: value };
- }
- anchor = dom.getParent(selection.getNode(), 'a');
- value.href = value.href.replace(' ', '%20');
- if (!anchor || !value.href) {
- formatter.remove('link');
- }
- if (value.href) {
- formatter.apply('link', value, anchor);
- }
- },
- 'selectAll': function () {
- var editingHost = dom.getParent(selection.getStart(), NodeType.isContentEditableTrue);
- if (editingHost) {
- var rng = dom.createRng();
- rng.selectNodeContents(editingHost);
- selection.setRng(rng);
- }
- },
- 'delete': function () {
- DeleteCommands.deleteCommand(editor);
- },
- 'forwardDelete': function () {
- DeleteCommands.forwardDeleteCommand(editor);
- },
- 'mceNewDocument': function () {
- editor.setContent('');
- },
- 'InsertLineBreak': function (command, ui, value) {
- InsertBr.insert(editor, value);
- return true;
- }
- });
- var alignStates = function (name) {
- return function () {
- var nodes = selection.isCollapsed() ? [dom.getParent(selection.getNode(), dom.isBlock)] : selection.getSelectedBlocks();
- var matches = map$3(nodes, function (node) {
- return !!formatter.matchNode(node, name);
- });
- return inArray$2(matches, true) !== -1;
- };
- };
- addCommands({
- 'JustifyLeft': alignStates('alignleft'),
- 'JustifyCenter': alignStates('aligncenter'),
- 'JustifyRight': alignStates('alignright'),
- 'JustifyFull': alignStates('alignjustify'),
- 'Bold,Italic,Underline,Strikethrough,Superscript,Subscript': function (command) {
- return isFormatMatch(command);
- },
- 'mceBlockQuote': function () {
- return isFormatMatch('blockquote');
- },
- 'Outdent': function () {
- var node;
- if (settings.inline_styles) {
- if ((node = dom.getParent(selection.getStart(), dom.isBlock)) && parseInt(node.style.paddingLeft, 10) > 0) {
- return true;
- }
- if ((node = dom.getParent(selection.getEnd(), dom.isBlock)) && parseInt(node.style.paddingLeft, 10) > 0) {
- return true;
- }
- }
- return queryCommandState('InsertUnorderedList') || queryCommandState('InsertOrderedList') || !settings.inline_styles && !!dom.getParent(selection.getNode(), 'BLOCKQUOTE');
- },
- 'InsertUnorderedList,InsertOrderedList': function (command) {
- var list = dom.getParent(selection.getNode(), 'ul,ol');
- return list && (command === 'insertunorderedlist' && list.tagName === 'UL' || command === 'insertorderedlist' && list.tagName === 'OL');
- }
- }, 'state');
- addCommands({
- Undo: function () {
- editor.undoManager.undo();
- },
- Redo: function () {
- editor.undoManager.redo();
- }
- });
- addQueryValueHandler('FontName', function () {
- return fontNameQuery(editor);
- }, this);
- addQueryValueHandler('FontSize', function () {
- return fontSizeQuery(editor);
- }, this);
- }
-
- var nativeEvents = Tools.makeMap('focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange ' + 'mouseout mouseenter mouseleave wheel keydown keypress keyup input contextmenu dragstart dragend dragover ' + 'draggesture dragdrop drop drag submit ' + 'compositionstart compositionend compositionupdate touchstart touchmove touchend', ' ');
- var Dispatcher = function (settings) {
- var self = this;
- var scope, bindings = {}, toggleEvent;
- var returnFalse = function () {
- return false;
- };
- var returnTrue = function () {
- return true;
- };
- settings = settings || {};
- scope = settings.scope || self;
- toggleEvent = settings.toggleEvent || returnFalse;
- var fire = function (name, args) {
- var handlers, i, l, callback;
- name = name.toLowerCase();
- args = args || {};
- args.type = name;
- if (!args.target) {
- args.target = scope;
- }
- if (!args.preventDefault) {
- args.preventDefault = function () {
- args.isDefaultPrevented = returnTrue;
- };
- args.stopPropagation = function () {
- args.isPropagationStopped = returnTrue;
- };
- args.stopImmediatePropagation = function () {
- args.isImmediatePropagationStopped = returnTrue;
- };
- args.isDefaultPrevented = returnFalse;
- args.isPropagationStopped = returnFalse;
- args.isImmediatePropagationStopped = returnFalse;
- }
- if (settings.beforeFire) {
- settings.beforeFire(args);
- }
- handlers = bindings[name];
- if (handlers) {
- for (i = 0, l = handlers.length; i < l; i++) {
- callback = handlers[i];
- if (callback.once) {
- off(name, callback.func);
- }
- if (args.isImmediatePropagationStopped()) {
- args.stopPropagation();
- return args;
- }
- if (callback.func.call(scope, args) === false) {
- args.preventDefault();
- return args;
- }
- }
- }
- return args;
- };
- var on = function (name, callback, prepend, extra) {
- var handlers, names, i;
- if (callback === false) {
- callback = returnFalse;
- }
- if (callback) {
- callback = { func: callback };
- if (extra) {
- Tools.extend(callback, extra);
- }
- names = name.toLowerCase().split(' ');
- i = names.length;
- while (i--) {
- name = names[i];
- handlers = bindings[name];
- if (!handlers) {
- handlers = bindings[name] = [];
- toggleEvent(name, true);
- }
- if (prepend) {
- handlers.unshift(callback);
- } else {
- handlers.push(callback);
- }
- }
- }
- return self;
- };
- var off = function (name, callback) {
- var i, handlers, bindingName, names, hi;
- if (name) {
- names = name.toLowerCase().split(' ');
- i = names.length;
- while (i--) {
- name = names[i];
- handlers = bindings[name];
- if (!name) {
- for (bindingName in bindings) {
- toggleEvent(bindingName, false);
- delete bindings[bindingName];
- }
- return self;
- }
- if (handlers) {
- if (!callback) {
- handlers.length = 0;
- } else {
- hi = handlers.length;
- while (hi--) {
- if (handlers[hi].func === callback) {
- handlers = handlers.slice(0, hi).concat(handlers.slice(hi + 1));
- bindings[name] = handlers;
- }
- }
- }
- if (!handlers.length) {
- toggleEvent(name, false);
- delete bindings[name];
- }
- }
- }
- } else {
- for (name in bindings) {
- toggleEvent(name, false);
- }
- bindings = {};
- }
- return self;
- };
- var once = function (name, callback, prepend) {
- return on(name, callback, prepend, { once: true });
- };
- var has = function (name) {
- name = name.toLowerCase();
- return !(!bindings[name] || bindings[name].length === 0);
- };
- self.fire = fire;
- self.on = on;
- self.off = off;
- self.once = once;
- self.has = has;
- };
- Dispatcher.isNative = function (name) {
- return !!nativeEvents[name.toLowerCase()];
- };
-
- var getEventDispatcher = function (obj) {
- if (!obj._eventDispatcher) {
- obj._eventDispatcher = new Dispatcher({
- scope: obj,
- toggleEvent: function (name, state) {
- if (Dispatcher.isNative(name) && obj.toggleNativeEvent) {
- obj.toggleNativeEvent(name, state);
- }
- }
- });
- }
- return obj._eventDispatcher;
- };
- var Observable = {
- fire: function (name, args, bubble) {
- var self = this;
- if (self.removed && name !== 'remove' && name !== 'detach') {
- return args;
- }
- args = getEventDispatcher(self).fire(name, args, bubble);
- if (bubble !== false && self.parent) {
- var parent = self.parent();
- while (parent && !args.isPropagationStopped()) {
- parent.fire(name, args, false);
- parent = parent.parent();
- }
- }
- return args;
- },
- on: function (name, callback, prepend) {
- return getEventDispatcher(this).on(name, callback, prepend);
- },
- off: function (name, callback) {
- return getEventDispatcher(this).off(name, callback);
- },
- once: function (name, callback) {
- return getEventDispatcher(this).once(name, callback);
- },
- hasEventListeners: function (name) {
- return getEventDispatcher(this).has(name);
- }
- };
-
- var firePreProcess = function (editor, args) {
- return editor.fire('PreProcess', args);
- };
- var firePostProcess = function (editor, args) {
- return editor.fire('PostProcess', args);
- };
- var fireRemove = function (editor) {
- return editor.fire('remove');
- };
- var fireDetach = function (editor) {
- return editor.fire('detach');
- };
- var fireSwitchMode = function (editor, mode) {
- return editor.fire('SwitchMode', { mode: mode });
- };
- var fireObjectResizeStart = function (editor, target, width, height) {
- editor.fire('ObjectResizeStart', {
- target: target,
- width: width,
- height: height
- });
- };
- var fireObjectResized = function (editor, target, width, height) {
- editor.fire('ObjectResized', {
- target: target,
- width: width,
- height: height
- });
- };
- var Events = {
- firePreProcess: firePreProcess,
- firePostProcess: firePostProcess,
- fireRemove: fireRemove,
- fireDetach: fireDetach,
- fireSwitchMode: fireSwitchMode,
- fireObjectResizeStart: fireObjectResizeStart,
- fireObjectResized: fireObjectResized
- };
-
- var setEditorCommandState = function (editor, cmd, state) {
- try {
- editor.getDoc().execCommand(cmd, false, state);
- } catch (ex) {
- }
- };
- var toggleClass = function (elm, cls, state) {
- if (has$2(elm, cls) && state === false) {
- remove$4(elm, cls);
- } else if (state) {
- add$2(elm, cls);
- }
- };
- var toggleReadOnly = function (editor, state) {
- toggleClass(Element.fromDom(editor.getBody()), 'mce-content-readonly', state);
- if (state) {
- editor.selection.controlSelection.hideResizeRect();
- editor.readonly = true;
- editor.getBody().contentEditable = 'false';
- } else {
- editor.readonly = false;
- editor.getBody().contentEditable = 'true';
- setEditorCommandState(editor, 'StyleWithCSS', false);
- setEditorCommandState(editor, 'enableInlineTableEditing', false);
- setEditorCommandState(editor, 'enableObjectResizing', false);
- editor.focus();
- editor.nodeChanged();
- }
- };
- var setMode = function (editor, mode) {
- if (mode === getMode(editor)) {
- return;
- }
- if (editor.initialized) {
- toggleReadOnly(editor, mode === 'readonly');
- } else {
- editor.on('init', function () {
- toggleReadOnly(editor, mode === 'readonly');
- });
- }
- Events.fireSwitchMode(editor, mode);
- };
- var getMode = function (editor) {
- return editor.readonly ? 'readonly' : 'design';
- };
- var isReadOnly = function (editor) {
- return editor.readonly === true;
- };
-
- var DOM$1 = DOMUtils$1.DOM;
- var customEventRootDelegates;
- var getEventTarget = function (editor, eventName) {
- if (eventName === 'selectionchange') {
- return editor.getDoc();
- }
- if (!editor.inline && /^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(eventName)) {
- return editor.getDoc().documentElement;
- }
- if (editor.settings.event_root) {
- if (!editor.eventRoot) {
- editor.eventRoot = DOM$1.select(editor.settings.event_root)[0];
- }
- return editor.eventRoot;
- }
- return editor.getBody();
- };
- var isListening = function (editor) {
- return !editor.hidden && !editor.readonly;
- };
- var fireEvent = function (editor, eventName, e) {
- if (isListening(editor)) {
- editor.fire(eventName, e);
- } else if (isReadOnly(editor)) {
- e.preventDefault();
- }
- };
- var bindEventDelegate = function (editor, eventName) {
- var eventRootElm, delegate;
- if (!editor.delegates) {
- editor.delegates = {};
- }
- if (editor.delegates[eventName] || editor.removed) {
- return;
- }
- eventRootElm = getEventTarget(editor, eventName);
- if (editor.settings.event_root) {
- if (!customEventRootDelegates) {
- customEventRootDelegates = {};
- editor.editorManager.on('removeEditor', function () {
- var name;
- if (!editor.editorManager.activeEditor) {
- if (customEventRootDelegates) {
- for (name in customEventRootDelegates) {
- editor.dom.unbind(getEventTarget(editor, name));
- }
- customEventRootDelegates = null;
- }
- }
- });
- }
- if (customEventRootDelegates[eventName]) {
- return;
- }
- delegate = function (e) {
- var target = e.target;
- var editors = editor.editorManager.get();
- var i = editors.length;
- while (i--) {
- var body = editors[i].getBody();
- if (body === target || DOM$1.isChildOf(target, body)) {
- fireEvent(editors[i], eventName, e);
- }
- }
- };
- customEventRootDelegates[eventName] = delegate;
- DOM$1.bind(eventRootElm, eventName, delegate);
- } else {
- delegate = function (e) {
- fireEvent(editor, eventName, e);
- };
- DOM$1.bind(eventRootElm, eventName, delegate);
- editor.delegates[eventName] = delegate;
- }
- };
- var EditorObservable = {
- bindPendingEventDelegates: function () {
- var self = this;
- Tools.each(self._pendingNativeEvents, function (name) {
- bindEventDelegate(self, name);
- });
- },
- toggleNativeEvent: function (name, state) {
- var self = this;
- if (name === 'focus' || name === 'blur') {
- return;
- }
- if (state) {
- if (self.initialized) {
- bindEventDelegate(self, name);
- } else {
- if (!self._pendingNativeEvents) {
- self._pendingNativeEvents = [name];
- } else {
- self._pendingNativeEvents.push(name);
- }
- }
- } else if (self.initialized) {
- self.dom.unbind(getEventTarget(self, name), name, self.delegates[name]);
- delete self.delegates[name];
- }
- },
- unbindAllNativeEvents: function () {
- var self = this;
- var body = self.getBody();
- var dom = self.dom;
- var name;
- if (self.delegates) {
- for (name in self.delegates) {
- self.dom.unbind(getEventTarget(self, name), name, self.delegates[name]);
- }
- delete self.delegates;
- }
- if (!self.inline && body && dom) {
- body.onload = null;
- dom.unbind(self.getWin());
- dom.unbind(self.getDoc());
- }
- if (dom) {
- dom.unbind(body);
- dom.unbind(self.getContainer());
- }
- }
- };
- EditorObservable = Tools.extend({}, Observable, EditorObservable);
- var EditorObservable$1 = EditorObservable;
-
- var sectionResult = Immutable('sections', 'settings');
- var detection = PlatformDetection$1.detect();
- var isTouch = detection.deviceType.isTouch();
- var mobilePlugins = [
- 'lists',
- 'autolink',
- 'autosave'
- ];
- var defaultMobileSettings = { theme: 'mobile' };
- var normalizePlugins = function (plugins) {
- var pluginNames = isArray(plugins) ? plugins.join(' ') : plugins;
- var trimmedPlugins = map(isString(pluginNames) ? pluginNames.split(' ') : [], trim$2);
- return filter(trimmedPlugins, function (item) {
- return item.length > 0;
- });
- };
- var filterMobilePlugins = function (plugins) {
- return filter(plugins, curry(contains, mobilePlugins));
- };
- var extractSections = function (keys, settings) {
- var result = bifilter(settings, function (value, key) {
- return contains(keys, key);
- });
- return sectionResult(result.t, result.f);
- };
- var getSection = function (sectionResult, name, defaults) {
- var sections = sectionResult.sections();
- var sectionSettings = sections.hasOwnProperty(name) ? sections[name] : {};
- return Tools.extend({}, defaults, sectionSettings);
- };
- var hasSection = function (sectionResult, name) {
- return sectionResult.sections().hasOwnProperty(name);
- };
- var getDefaultSettings = function (id, documentBaseUrl, editor) {
- return {
- id: id,
- theme: 'modern',
- delta_width: 0,
- delta_height: 0,
- popup_css: '',
- plugins: '',
- document_base_url: documentBaseUrl,
- add_form_submit_trigger: true,
- submit_patch: true,
- add_unload_trigger: true,
- convert_urls: true,
- relative_urls: true,
- remove_script_host: true,
- object_resizing: true,
- doctype: '',
- visual: true,
- font_size_style_values: 'xx-small,x-small,small,medium,large,x-large,xx-large',
- font_size_legacy_values: 'xx-small,small,medium,large,x-large,xx-large,300%',
- forced_root_block: 'p',
- hidden_input: true,
- render_ui: true,
- indentation: '40px',
- inline_styles: true,
- convert_fonts_to_spans: true,
- indent: 'simple',
- indent_before: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' + 'tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist',
- indent_after: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' + 'tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist',
- entity_encoding: 'named',
- url_converter: editor.convertURL,
- url_converter_scope: editor,
- ie7_compat: true
- };
- };
- var getExternalPlugins = function (overrideSettings, settings) {
- var userDefinedExternalPlugins = settings.external_plugins ? settings.external_plugins : {};
- if (overrideSettings && overrideSettings.external_plugins) {
- return Tools.extend({}, overrideSettings.external_plugins, userDefinedExternalPlugins);
- } else {
- return userDefinedExternalPlugins;
- }
- };
- var combinePlugins = function (forcedPlugins, plugins) {
- return [].concat(normalizePlugins(forcedPlugins)).concat(normalizePlugins(plugins));
- };
- var processPlugins = function (isTouchDevice, sectionResult, defaultOverrideSettings, settings) {
- var forcedPlugins = normalizePlugins(defaultOverrideSettings.forced_plugins);
- var plugins = normalizePlugins(settings.plugins);
- var platformPlugins = isTouchDevice && hasSection(sectionResult, 'mobile') ? filterMobilePlugins(plugins) : plugins;
- var combinedPlugins = combinePlugins(forcedPlugins, platformPlugins);
- return Tools.extend(settings, { plugins: combinedPlugins.join(' ') });
- };
- var isOnMobile = function (isTouchDevice, sectionResult) {
- var isInline = sectionResult.settings().inline;
- return isTouchDevice && hasSection(sectionResult, 'mobile') && !isInline;
- };
- var combineSettings = function (isTouchDevice, defaultSettings, defaultOverrideSettings, settings) {
- var sectionResult = extractSections(['mobile'], settings);
- var extendedSettings = Tools.extend(defaultSettings, defaultOverrideSettings, sectionResult.settings(), isOnMobile(isTouchDevice, sectionResult) ? getSection(sectionResult, 'mobile', defaultMobileSettings) : {}, {
- validate: true,
- content_editable: sectionResult.settings().inline,
- external_plugins: getExternalPlugins(defaultOverrideSettings, sectionResult.settings())
- });
- return processPlugins(isTouchDevice, sectionResult, defaultOverrideSettings, extendedSettings);
- };
- var getEditorSettings = function (editor, id, documentBaseUrl, defaultOverrideSettings, settings) {
- var defaultSettings = getDefaultSettings(id, documentBaseUrl, editor);
- return combineSettings(isTouch, defaultSettings, defaultOverrideSettings, settings);
- };
- var getFiltered = function (predicate, editor, name) {
- return Option.from(editor.settings[name]).filter(predicate);
- };
- var getParamObject = function (value) {
- var output = {};
- if (typeof value === 'string') {
- each(value.indexOf('=') > 0 ? value.split(/[;,](?![^=;,]*(?:[;,]|$))/) : value.split(','), function (val) {
- var arr = val.split('=');
- if (arr.length > 1) {
- output[Tools.trim(arr[0])] = Tools.trim(arr[1]);
- } else {
- output[Tools.trim(arr[0])] = Tools.trim(arr);
- }
- });
- } else {
- output = value;
- }
- return output;
- };
- var isArrayOf = function (p) {
- return function (a) {
- return isArray(a) && forall(a, p);
- };
- };
- var getParam = function (editor, name, defaultVal, type) {
- var value = name in editor.settings ? editor.settings[name] : defaultVal;
- if (type === 'hash') {
- return getParamObject(value);
- } else if (type === 'string') {
- return getFiltered(isString, editor, name).getOr(defaultVal);
- } else if (type === 'number') {
- return getFiltered(isNumber, editor, name).getOr(defaultVal);
- } else if (type === 'boolean') {
- return getFiltered(isBoolean, editor, name).getOr(defaultVal);
- } else if (type === 'object') {
- return getFiltered(isObject, editor, name).getOr(defaultVal);
- } else if (type === 'array') {
- return getFiltered(isArray, editor, name).getOr(defaultVal);
- } else if (type === 'string[]') {
- return getFiltered(isArrayOf(isString), editor, name).getOr(defaultVal);
- } else if (type === 'function') {
- return getFiltered(isFunction, editor, name).getOr(defaultVal);
- } else {
- return value;
- }
- };
-
- var each$b = Tools.each, explode$2 = Tools.explode;
- var keyCodeLookup = {
- f1: 112,
- f2: 113,
- f3: 114,
- f4: 115,
- f5: 116,
- f6: 117,
- f7: 118,
- f8: 119,
- f9: 120,
- f10: 121,
- f11: 122,
- f12: 123
- };
- var modifierNames = Tools.makeMap('alt,ctrl,shift,meta,access');
- function Shortcuts (editor) {
- var self = this;
- var shortcuts = {};
- var pendingPatterns = [];
- var parseShortcut = function (pattern) {
- var id, key;
- var shortcut = {};
- each$b(explode$2(pattern, '+'), function (value) {
- if (value in modifierNames) {
- shortcut[value] = true;
- } else {
- if (/^[0-9]{2,}$/.test(value)) {
- shortcut.keyCode = parseInt(value, 10);
- } else {
- shortcut.charCode = value.charCodeAt(0);
- shortcut.keyCode = keyCodeLookup[value] || value.toUpperCase().charCodeAt(0);
- }
- }
- });
- id = [shortcut.keyCode];
- for (key in modifierNames) {
- if (shortcut[key]) {
- id.push(key);
- } else {
- shortcut[key] = false;
- }
- }
- shortcut.id = id.join(',');
- if (shortcut.access) {
- shortcut.alt = true;
- if (Env.mac) {
- shortcut.ctrl = true;
- } else {
- shortcut.shift = true;
- }
- }
- if (shortcut.meta) {
- if (Env.mac) {
- shortcut.meta = true;
- } else {
- shortcut.ctrl = true;
- shortcut.meta = false;
- }
- }
- return shortcut;
- };
- var createShortcut = function (pattern, desc, cmdFunc, scope) {
- var shortcuts;
- shortcuts = Tools.map(explode$2(pattern, '>'), parseShortcut);
- shortcuts[shortcuts.length - 1] = Tools.extend(shortcuts[shortcuts.length - 1], {
- func: cmdFunc,
- scope: scope || editor
- });
- return Tools.extend(shortcuts[0], {
- desc: editor.translate(desc),
- subpatterns: shortcuts.slice(1)
- });
- };
- var hasModifier = function (e) {
- return e.altKey || e.ctrlKey || e.metaKey;
- };
- var isFunctionKey = function (e) {
- return e.type === 'keydown' && e.keyCode >= 112 && e.keyCode <= 123;
- };
- var matchShortcut = function (e, shortcut) {
- if (!shortcut) {
- return false;
- }
- if (shortcut.ctrl !== e.ctrlKey || shortcut.meta !== e.metaKey) {
- return false;
- }
- if (shortcut.alt !== e.altKey || shortcut.shift !== e.shiftKey) {
- return false;
- }
- if (e.keyCode === shortcut.keyCode || e.charCode && e.charCode === shortcut.charCode) {
- e.preventDefault();
- return true;
- }
- return false;
- };
- var executeShortcutAction = function (shortcut) {
- return shortcut.func ? shortcut.func.call(shortcut.scope) : null;
- };
- editor.on('keyup keypress keydown', function (e) {
- if ((hasModifier(e) || isFunctionKey(e)) && !e.isDefaultPrevented()) {
- each$b(shortcuts, function (shortcut) {
- if (matchShortcut(e, shortcut)) {
- pendingPatterns = shortcut.subpatterns.slice(0);
- if (e.type === 'keydown') {
- executeShortcutAction(shortcut);
- }
- return true;
- }
- });
- if (matchShortcut(e, pendingPatterns[0])) {
- if (pendingPatterns.length === 1) {
- if (e.type === 'keydown') {
- executeShortcutAction(pendingPatterns[0]);
- }
- }
- pendingPatterns.shift();
- }
- }
- });
- self.add = function (pattern, desc, cmdFunc, scope) {
- var cmd;
- cmd = cmdFunc;
- if (typeof cmdFunc === 'string') {
- cmdFunc = function () {
- editor.execCommand(cmd, false, null);
- };
- } else if (Tools.isArray(cmd)) {
- cmdFunc = function () {
- editor.execCommand(cmd[0], cmd[1], cmd[2]);
- };
- }
- each$b(explode$2(Tools.trim(pattern.toLowerCase())), function (pattern) {
- var shortcut = createShortcut(pattern, desc, cmdFunc, scope);
- shortcuts[shortcut.id] = shortcut;
- });
- return true;
- };
- self.remove = function (pattern) {
- var shortcut = createShortcut(pattern);
- if (shortcuts[shortcut.id]) {
- delete shortcuts[shortcut.id];
- return true;
- }
- return false;
- };
- }
-
- var hasFocus = function (element) {
- var doc = owner(element).dom();
- return element.dom() === doc.activeElement;
- };
- var active = function (_doc) {
- var doc = _doc !== undefined ? _doc.dom() : domGlobals.document;
- return Option.from(doc.activeElement).map(Element.fromDom);
- };
- var search = function (element) {
- return active(owner(element)).filter(function (e) {
- return element.dom().contains(e.dom());
- });
- };
-
- var getContentEditableHost = function (editor, node) {
- return editor.dom.getParent(node, function (node) {
- return editor.dom.getContentEditable(node) === 'true';
- });
- };
- var getCollapsedNode = function (rng) {
- return rng.collapsed ? Option.from(getNode(rng.startContainer, rng.startOffset)).map(Element.fromDom) : Option.none();
- };
- var getFocusInElement = function (root, rng) {
- return getCollapsedNode(rng).bind(function (node) {
- if (isTableSection(node)) {
- return Option.some(node);
- } else if (contains$3(root, node) === false) {
- return Option.some(root);
- } else {
- return Option.none();
- }
- });
- };
- var normalizeSelection = function (editor, rng) {
- getFocusInElement(Element.fromDom(editor.getBody()), rng).bind(function (elm) {
- return CaretFinder.firstPositionIn(elm.dom());
- }).fold(function () {
- editor.selection.normalize();
- return;
- }, function (caretPos) {
- return editor.selection.setRng(caretPos.toRange());
- });
- };
- var focusBody = function (body) {
- if (body.setActive) {
- try {
- body.setActive();
- } catch (ex) {
- body.focus();
- }
- } else {
- body.focus();
- }
- };
- var hasElementFocus = function (elm) {
- return hasFocus(elm) || search(elm).isSome();
- };
- var hasIframeFocus = function (editor) {
- return editor.iframeElement && hasFocus(Element.fromDom(editor.iframeElement));
- };
- var hasInlineFocus = function (editor) {
- var rawBody = editor.getBody();
- return rawBody && hasElementFocus(Element.fromDom(rawBody));
- };
- var hasFocus$1 = function (editor) {
- return editor.inline ? hasInlineFocus(editor) : hasIframeFocus(editor);
- };
- var focusEditor = function (editor) {
- var selection = editor.selection, contentEditable = editor.settings.content_editable;
- var body = editor.getBody();
- var rng = selection.getRng();
- editor.quirks.refreshContentEditable();
- var contentEditableHost = getContentEditableHost(editor, selection.getNode());
- if (editor.$.contains(body, contentEditableHost)) {
- focusBody(contentEditableHost);
- normalizeSelection(editor, rng);
- activateEditor(editor);
- return;
- }
- if (editor.bookmark !== undefined && hasFocus$1(editor) === false) {
- SelectionBookmark.getRng(editor).each(function (bookmarkRng) {
- editor.selection.setRng(bookmarkRng);
- rng = bookmarkRng;
- });
- }
- if (!contentEditable) {
- if (!Env.opera) {
- focusBody(body);
- }
- editor.getWin().focus();
- }
- if (Env.gecko || contentEditable) {
- focusBody(body);
- normalizeSelection(editor, rng);
- }
- activateEditor(editor);
- };
- var activateEditor = function (editor) {
- return editor.editorManager.setActive(editor);
- };
- var focus = function (editor, skipFocus) {
- if (editor.removed) {
- return;
- }
- skipFocus ? activateEditor(editor) : focusEditor(editor);
- };
- var EditorFocus = {
- focus: focus,
- hasFocus: hasFocus$1
- };
-
- var getProp = function (propName, elm) {
- var rawElm = elm.dom();
- return rawElm[propName];
- };
- var getComputedSizeProp = function (propName, elm) {
- return parseInt(get$1(elm, propName), 10);
- };
- var getClientWidth = curry(getProp, 'clientWidth');
- var getClientHeight = curry(getProp, 'clientHeight');
- var getMarginTop = curry(getComputedSizeProp, 'margin-top');
- var getMarginLeft = curry(getComputedSizeProp, 'margin-left');
- var getBoundingClientRect$1 = function (elm) {
- return elm.dom().getBoundingClientRect();
- };
- var isInsideElementContentArea = function (bodyElm, clientX, clientY) {
- var clientWidth = getClientWidth(bodyElm);
- var clientHeight = getClientHeight(bodyElm);
- return clientX >= 0 && clientY >= 0 && clientX <= clientWidth && clientY <= clientHeight;
- };
- var transpose = function (inline, elm, clientX, clientY) {
- var clientRect = getBoundingClientRect$1(elm);
- var deltaX = inline ? clientRect.left + elm.dom().clientLeft + getMarginLeft(elm) : 0;
- var deltaY = inline ? clientRect.top + elm.dom().clientTop + getMarginTop(elm) : 0;
- var x = clientX - deltaX;
- var y = clientY - deltaY;
- return {
- x: x,
- y: y
- };
- };
- var isXYInContentArea = function (editor, clientX, clientY) {
- var bodyElm = Element.fromDom(editor.getBody());
- var targetElm = editor.inline ? bodyElm : documentElement(bodyElm);
- var transposedPoint = transpose(editor.inline, targetElm, clientX, clientY);
- return isInsideElementContentArea(targetElm, transposedPoint.x, transposedPoint.y);
- };
- var fromDomSafe = function (node) {
- return Option.from(node).map(Element.fromDom);
- };
- var isEditorAttachedToDom = function (editor) {
- var rawContainer = editor.inline ? editor.getBody() : editor.getContentAreaContainer();
- return fromDomSafe(rawContainer).map(function (container) {
- return contains$3(owner(container), container);
- }).getOr(false);
- };
- var EditorView = {
- isXYInContentArea: isXYInContentArea,
- isEditorAttachedToDom: isEditorAttachedToDom
- };
-
- function NotificationManagerImpl () {
- var unimplemented = function () {
- throw new Error('Theme did not provide a NotificationManager implementation.');
- };
- return {
- open: unimplemented,
- close: unimplemented,
- reposition: unimplemented,
- getArgs: unimplemented
- };
- }
-
- function NotificationManager (editor) {
- var notifications = [];
- var getImplementation = function () {
- var theme = editor.theme;
- return theme && theme.getNotificationManagerImpl ? theme.getNotificationManagerImpl() : NotificationManagerImpl();
- };
- var getTopNotification = function () {
- return Option.from(notifications[0]);
- };
- var isEqual = function (a, b) {
- return a.type === b.type && a.text === b.text && !a.progressBar && !a.timeout && !b.progressBar && !b.timeout;
- };
- var reposition = function () {
- if (notifications.length > 0) {
- getImplementation().reposition(notifications);
- }
- };
- var addNotification = function (notification) {
- notifications.push(notification);
- };
- var closeNotification = function (notification) {
- findIndex(notifications, function (otherNotification) {
- return otherNotification === notification;
- }).each(function (index) {
- notifications.splice(index, 1);
- });
- };
- var open = function (args) {
- if (editor.removed || !EditorView.isEditorAttachedToDom(editor)) {
- return;
- }
- return find(notifications, function (notification) {
- return isEqual(getImplementation().getArgs(notification), args);
- }).getOrThunk(function () {
- editor.editorManager.setActive(editor);
- var notification = getImplementation().open(args, function () {
- closeNotification(notification);
- reposition();
- });
- addNotification(notification);
- reposition();
- return notification;
- });
- };
- var close = function () {
- getTopNotification().each(function (notification) {
- getImplementation().close(notification);
- closeNotification(notification);
- reposition();
- });
- };
- var getNotifications = function () {
- return notifications;
- };
- var registerEvents = function (editor) {
- editor.on('SkinLoaded', function () {
- var serviceMessage = editor.settings.service_message;
- if (serviceMessage) {
- open({
- text: serviceMessage,
- type: 'warning',
- timeout: 0,
- icon: ''
- });
- }
- });
- editor.on('ResizeEditor ResizeWindow', function () {
- Delay.requestAnimationFrame(reposition);
- });
- editor.on('remove', function () {
- each(notifications.slice(), function (notification) {
- getImplementation().close(notification);
- });
- });
- };
- registerEvents(editor);
- return {
- open: open,
- close: close,
- getNotifications: getNotifications
- };
- }
-
- function WindowManagerImpl () {
- var unimplemented = function () {
- throw new Error('Theme did not provide a WindowManager implementation.');
- };
- return {
- open: unimplemented,
- alert: unimplemented,
- confirm: unimplemented,
- close: unimplemented,
- getParams: unimplemented,
- setParams: unimplemented
- };
- }
-
- function WindowManager (editor) {
- var windows = [];
- var getImplementation = function () {
- var theme = editor.theme;
- return theme && theme.getWindowManagerImpl ? theme.getWindowManagerImpl() : WindowManagerImpl();
- };
- var funcBind = function (scope, f) {
- return function () {
- return f ? f.apply(scope, arguments) : undefined;
- };
- };
- var fireOpenEvent = function (win) {
- editor.fire('OpenWindow', { win: win });
- };
- var fireCloseEvent = function (win) {
- editor.fire('CloseWindow', { win: win });
- };
- var addWindow = function (win) {
- windows.push(win);
- fireOpenEvent(win);
- };
- var closeWindow = function (win) {
- findIndex(windows, function (otherWindow) {
- return otherWindow === win;
- }).each(function (index) {
- windows.splice(index, 1);
- fireCloseEvent(win);
- if (windows.length === 0) {
- editor.focus();
- }
- });
- };
- var getTopWindow = function () {
- return Option.from(windows[windows.length - 1]);
- };
- var open = function (args, params) {
- editor.editorManager.setActive(editor);
- SelectionBookmark.store(editor);
- var win = getImplementation().open(args, params, closeWindow);
- addWindow(win);
- return win;
- };
- var alert = function (message, callback, scope) {
- var win = getImplementation().alert(message, funcBind(scope ? scope : this, callback), closeWindow);
- addWindow(win);
- };
- var confirm = function (message, callback, scope) {
- var win = getImplementation().confirm(message, funcBind(scope ? scope : this, callback), closeWindow);
- addWindow(win);
- };
- var close = function () {
- getTopWindow().each(function (win) {
- getImplementation().close(win);
- closeWindow(win);
- });
- };
- var getParams = function () {
- return getTopWindow().map(getImplementation().getParams).getOr(null);
- };
- var setParams = function (params) {
- getTopWindow().each(function (win) {
- getImplementation().setParams(win, params);
- });
- };
- var getWindows = function () {
- return windows;
- };
- editor.on('remove', function () {
- each(windows.slice(0), function (win) {
- getImplementation().close(win);
- });
- });
- return {
- windows: windows,
- open: open,
- alert: alert,
- confirm: confirm,
- close: close,
- getParams: getParams,
- setParams: setParams,
- getWindows: getWindows
- };
- }
-
- var data = {};
- var code = 'en';
- var I18n = {
- setCode: function (newCode) {
- if (newCode) {
- code = newCode;
- this.rtl = this.data[newCode] ? this.data[newCode]._dir === 'rtl' : false;
- }
- },
- getCode: function () {
- return code;
- },
- rtl: false,
- add: function (code, items) {
- var langData = data[code];
- if (!langData) {
- data[code] = langData = {};
- }
- for (var name in items) {
- langData[name] = items[name];
- }
- this.setCode(code);
- },
- translate: function (text) {
- var langData = data[code] || {};
- var toString = function (obj) {
- if (Tools.is(obj, 'function')) {
- return Object.prototype.toString.call(obj);
- }
- return !isEmpty(obj) ? '' + obj : '';
- };
- var isEmpty = function (text) {
- return text === '' || text === null || Tools.is(text, 'undefined');
- };
- var getLangData = function (text) {
- text = toString(text);
- return Tools.hasOwn(langData, text) ? toString(langData[text]) : text;
- };
- if (isEmpty(text)) {
- return '';
- }
- if (Tools.is(text, 'object') && Tools.hasOwn(text, 'raw')) {
- return toString(text.raw);
- }
- if (Tools.is(text, 'array')) {
- var values_1 = text.slice(1);
- text = getLangData(text[0]).replace(/\{([0-9]+)\}/g, function ($1, $2) {
- return Tools.hasOwn(values_1, $2) ? toString(values_1[$2]) : $1;
- });
- }
- return getLangData(text).replace(/{context:\w+}$/, '');
- },
- data: data
- };
-
- var PluginManager = AddOnManager.PluginManager;
- var resolvePluginName = function (targetUrl, suffix) {
- for (var name in PluginManager.urls) {
- var matchUrl = PluginManager.urls[name] + '/plugin' + suffix + '.js';
- if (matchUrl === targetUrl) {
- return name;
- }
- }
- return null;
- };
- var pluginUrlToMessage = function (editor, url) {
- var plugin = resolvePluginName(url, editor.suffix);
- return plugin ? I18n.translate([
- 'Failed to load plugin: {0} from url {1}',
- plugin,
- url
- ]) : I18n.translate([
- 'Failed to load plugin url: {0}',
- url
- ]);
- };
- var displayNotification = function (editor, message) {
- editor.notificationManager.open({
- type: 'error',
- text: message
- });
- };
- var displayError = function (editor, message) {
- if (editor._skinLoaded) {
- displayNotification(editor, message);
- } else {
- editor.on('SkinLoaded', function () {
- displayNotification(editor, message);
- });
- }
- };
- var uploadError = function (editor, message) {
- displayError(editor, I18n.translate([
- 'Failed to upload image: {0}',
- message
- ]));
- };
- var pluginLoadError = function (editor, url) {
- displayError(editor, pluginUrlToMessage(editor, url));
- };
- var pluginInitError = function (editor, name, err) {
- var message = I18n.translate([
- 'Failed to initialize plugin: {0}',
- name
- ]);
- initError(message, err);
- displayError(editor, message);
- };
- var initError = function (message) {
- var x = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- x[_i - 1] = arguments[_i];
- }
- var console = domGlobals.window.console;
- if (console) {
- if (console.error) {
- console.error.apply(console, arguments);
- } else {
- console.log.apply(console, arguments);
- }
- }
- };
- var ErrorReporter = {
- pluginLoadError: pluginLoadError,
- pluginInitError: pluginInitError,
- uploadError: uploadError,
- displayError: displayError,
- initError: initError
- };
-
- var PluginManager$1 = AddOnManager.PluginManager;
-
- var ThemeManager = AddOnManager.ThemeManager;
-
- function XMLHttpRequest () {
- var f = Global$1.getOrDie('XMLHttpRequest');
- return new f();
- }
-
- function Uploader (uploadStatus, settings) {
- var pendingPromises = {};
- var pathJoin = function (path1, path2) {
- if (path1) {
- return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, '');
- }
- return path2;
- };
- var defaultHandler = function (blobInfo, success, failure, progress) {
- var xhr, formData;
- xhr = XMLHttpRequest();
- xhr.open('POST', settings.url);
- xhr.withCredentials = settings.credentials;
- xhr.upload.onprogress = function (e) {
- progress(e.loaded / e.total * 100);
- };
- xhr.onerror = function () {
- failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status);
- };
- xhr.onload = function () {
- var json;
- if (xhr.status < 200 || xhr.status >= 300) {
- failure('HTTP Error: ' + xhr.status);
- return;
- }
- json = JSON.parse(xhr.responseText);
- if (!json || typeof json.location !== 'string') {
- failure('Invalid JSON: ' + xhr.responseText);
- return;
- }
- success(pathJoin(settings.basePath, json.location));
- };
- formData = new domGlobals.FormData();
- formData.append('file', blobInfo.blob(), blobInfo.filename());
- xhr.send(formData);
- };
- var noUpload = function () {
- return new promiseObj(function (resolve) {
- resolve([]);
- });
- };
- var handlerSuccess = function (blobInfo, url) {
- return {
- url: url,
- blobInfo: blobInfo,
- status: true
- };
- };
- var handlerFailure = function (blobInfo, error) {
- return {
- url: '',
- blobInfo: blobInfo,
- status: false,
- error: error
- };
- };
- var resolvePending = function (blobUri, result) {
- Tools.each(pendingPromises[blobUri], function (resolve) {
- resolve(result);
- });
- delete pendingPromises[blobUri];
- };
- var uploadBlobInfo = function (blobInfo, handler, openNotification) {
- uploadStatus.markPending(blobInfo.blobUri());
- return new promiseObj(function (resolve) {
- var notification, progress;
- var noop = function () {
- };
- try {
- var closeNotification_1 = function () {
- if (notification) {
- notification.close();
- progress = noop;
- }
- };
- var success = function (url) {
- closeNotification_1();
- uploadStatus.markUploaded(blobInfo.blobUri(), url);
- resolvePending(blobInfo.blobUri(), handlerSuccess(blobInfo, url));
- resolve(handlerSuccess(blobInfo, url));
- };
- var failure = function (error) {
- closeNotification_1();
- uploadStatus.removeFailed(blobInfo.blobUri());
- resolvePending(blobInfo.blobUri(), handlerFailure(blobInfo, error));
- resolve(handlerFailure(blobInfo, error));
- };
- progress = function (percent) {
- if (percent < 0 || percent > 100) {
- return;
- }
- if (!notification) {
- notification = openNotification();
- }
- notification.progressBar.value(percent);
- };
- handler(blobInfo, success, failure, progress);
- } catch (ex) {
- resolve(handlerFailure(blobInfo, ex.message));
- }
- });
- };
- var isDefaultHandler = function (handler) {
- return handler === defaultHandler;
- };
- var pendingUploadBlobInfo = function (blobInfo) {
- var blobUri = blobInfo.blobUri();
- return new promiseObj(function (resolve) {
- pendingPromises[blobUri] = pendingPromises[blobUri] || [];
- pendingPromises[blobUri].push(resolve);
- });
- };
- var uploadBlobs = function (blobInfos, openNotification) {
- blobInfos = Tools.grep(blobInfos, function (blobInfo) {
- return !uploadStatus.isUploaded(blobInfo.blobUri());
- });
- return promiseObj.all(Tools.map(blobInfos, function (blobInfo) {
- return uploadStatus.isPending(blobInfo.blobUri()) ? pendingUploadBlobInfo(blobInfo) : uploadBlobInfo(blobInfo, settings.handler, openNotification);
- }));
- };
- var upload = function (blobInfos, openNotification) {
- return !settings.url && isDefaultHandler(settings.handler) ? noUpload() : uploadBlobs(blobInfos, openNotification);
- };
- if (isFunction(settings.handler) === false) {
- settings.handler = defaultHandler;
- }
- return { upload: upload };
- }
-
- function FileReader () {
- var f = Global$1.getOrDie('FileReader');
- return new f();
- }
-
- function Uint8Array (arr) {
- var f = Global$1.getOrDie('Uint8Array');
- return new f(arr);
- }
-
- var requestAnimationFrame$1 = function (callback) {
- var f = Global$1.getOrDie('requestAnimationFrame');
- f(callback);
- };
- var atob = function (base64) {
- var f = Global$1.getOrDie('atob');
- return f(base64);
- };
- var Window = {
- atob: atob,
- requestAnimationFrame: requestAnimationFrame$1
- };
-
- var blobUriToBlob = function (url) {
- return new promiseObj(function (resolve, reject) {
- var rejectWithError = function () {
- reject('Cannot convert ' + url + ' to Blob. Resource might not exist or is inaccessible.');
- };
- try {
- var xhr = XMLHttpRequest();
- xhr.open('GET', url, true);
- xhr.responseType = 'blob';
- xhr.onload = function () {
- if (this.status === 200) {
- resolve(this.response);
- } else {
- rejectWithError();
- }
- };
- xhr.onerror = rejectWithError;
- xhr.send();
- } catch (ex) {
- rejectWithError();
- }
- });
- };
- var parseDataUri = function (uri) {
- var type, matches;
- var uriParts = decodeURIComponent(uri).split(',');
- matches = /data:([^;]+)/.exec(uriParts[0]);
- if (matches) {
- type = matches[1];
- }
- return {
- type: type,
- data: uriParts[1]
- };
- };
- var dataUriToBlob = function (uri) {
- return new promiseObj(function (resolve) {
- var str, arr, i;
- var uriParts = parseDataUri(uri);
- try {
- str = Window.atob(uriParts.data);
- } catch (e) {
- resolve(new domGlobals.Blob([]));
- return;
- }
- arr = Uint8Array(str.length);
- for (i = 0; i < arr.length; i++) {
- arr[i] = str.charCodeAt(i);
- }
- resolve(new domGlobals.Blob([arr], { type: uriParts.type }));
- });
- };
- var uriToBlob = function (url) {
- if (url.indexOf('blob:') === 0) {
- return blobUriToBlob(url);
- }
- if (url.indexOf('data:') === 0) {
- return dataUriToBlob(url);
- }
- return null;
- };
- var blobToDataUri = function (blob) {
- return new promiseObj(function (resolve) {
- var reader = FileReader();
- reader.onloadend = function () {
- resolve(reader.result);
- };
- reader.readAsDataURL(blob);
- });
- };
- var Conversions = {
- uriToBlob: uriToBlob,
- blobToDataUri: blobToDataUri,
- parseDataUri: parseDataUri
- };
-
- var count = 0;
- var uniqueId = function (prefix) {
- return (prefix || 'blobid') + count++;
- };
- var imageToBlobInfo = function (blobCache, img, resolve, reject) {
- var base64, blobInfo;
- if (img.src.indexOf('blob:') === 0) {
- blobInfo = blobCache.getByUri(img.src);
- if (blobInfo) {
- resolve({
- image: img,
- blobInfo: blobInfo
- });
- } else {
- Conversions.uriToBlob(img.src).then(function (blob) {
- Conversions.blobToDataUri(blob).then(function (dataUri) {
- base64 = Conversions.parseDataUri(dataUri).data;
- blobInfo = blobCache.create(uniqueId(), blob, base64);
- blobCache.add(blobInfo);
- resolve({
- image: img,
- blobInfo: blobInfo
- });
- });
- }, function (err) {
- reject(err);
- });
- }
- return;
- }
- base64 = Conversions.parseDataUri(img.src).data;
- blobInfo = blobCache.findFirst(function (cachedBlobInfo) {
- return cachedBlobInfo.base64() === base64;
- });
- if (blobInfo) {
- resolve({
- image: img,
- blobInfo: blobInfo
- });
- } else {
- Conversions.uriToBlob(img.src).then(function (blob) {
- blobInfo = blobCache.create(uniqueId(), blob, base64);
- blobCache.add(blobInfo);
- resolve({
- image: img,
- blobInfo: blobInfo
- });
- }, function (err) {
- reject(err);
- });
- }
- };
- var getAllImages = function (elm) {
- return elm ? from$1(elm.getElementsByTagName('img')) : [];
- };
- function ImageScanner (uploadStatus, blobCache) {
- var cachedPromises = {};
- var findAll = function (elm, predicate) {
- var images;
- if (!predicate) {
- predicate = constant(true);
- }
- images = filter(getAllImages(elm), function (img) {
- var src = img.src;
- if (!Env.fileApi) {
- return false;
- }
- if (img.hasAttribute('data-mce-bogus')) {
- return false;
- }
- if (img.hasAttribute('data-mce-placeholder')) {
- return false;
- }
- if (!src || src === Env.transparentSrc) {
- return false;
- }
- if (src.indexOf('blob:') === 0) {
- return !uploadStatus.isUploaded(src) && predicate(img);
- }
- if (src.indexOf('data:') === 0) {
- return predicate(img);
- }
- return false;
- });
- var promises = map(images, function (img) {
- if (cachedPromises[img.src]) {
- return new promiseObj(function (resolve) {
- cachedPromises[img.src].then(function (imageInfo) {
- if (typeof imageInfo === 'string') {
- return imageInfo;
- }
- resolve({
- image: img,
- blobInfo: imageInfo.blobInfo
- });
- });
- });
- }
- var newPromise = new promiseObj(function (resolve, reject) {
- imageToBlobInfo(blobCache, img, resolve, reject);
- }).then(function (result) {
- delete cachedPromises[result.image.src];
- return result;
- }).catch(function (error) {
- delete cachedPromises[img.src];
- return error;
- });
- cachedPromises[img.src] = newPromise;
- return newPromise;
- });
- return promiseObj.all(promises);
- };
- return { findAll: findAll };
- }
-
- var count$1 = 0;
- var seed = function () {
- var rnd = function () {
- return Math.round(Math.random() * 4294967295).toString(36);
- };
- var now = new Date().getTime();
- return 's' + now.toString(36) + rnd() + rnd() + rnd();
- };
- var uuid = function (prefix) {
- return prefix + count$1++ + seed();
- };
- var Uuid = { uuid: uuid };
-
- function BlobCache () {
- var cache = [];
- var mimeToExt = function (mime) {
- var mimes = {
- 'image/jpeg': 'jpg',
- 'image/jpg': 'jpg',
- 'image/gif': 'gif',
- 'image/png': 'png'
- };
- return mimes[mime.toLowerCase()] || 'dat';
- };
- var create = function (o, blob, base64, filename) {
- if (isString(o)) {
- var id = o;
- return toBlobInfo({
- id: id,
- name: filename,
- blob: blob,
- base64: base64
- });
- } else if (isObject(o)) {
- return toBlobInfo(o);
- } else {
- throw new Error('Unknown input type');
- }
- };
- var toBlobInfo = function (o) {
- var id, name;
- if (!o.blob || !o.base64) {
- throw new Error('blob and base64 representations of the image are required for BlobInfo to be created');
- }
- id = o.id || Uuid.uuid('blobid');
- name = o.name || id;
- return {
- id: constant(id),
- name: constant(name),
- filename: constant(name + '.' + mimeToExt(o.blob.type)),
- blob: constant(o.blob),
- base64: constant(o.base64),
- blobUri: constant(o.blobUri || URL.createObjectURL(o.blob)),
- uri: constant(o.uri)
- };
- };
- var add = function (blobInfo) {
- if (!get(blobInfo.id())) {
- cache.push(blobInfo);
- }
- };
- var get = function (id) {
- return findFirst(function (cachedBlobInfo) {
- return cachedBlobInfo.id() === id;
- });
- };
- var findFirst = function (predicate) {
- return filter(cache, predicate)[0];
- };
- var getByUri = function (blobUri) {
- return findFirst(function (blobInfo) {
- return blobInfo.blobUri() === blobUri;
- });
- };
- var removeByUri = function (blobUri) {
- cache = filter(cache, function (blobInfo) {
- if (blobInfo.blobUri() === blobUri) {
- URL.revokeObjectURL(blobInfo.blobUri());
- return false;
- }
- return true;
- });
- };
- var destroy = function () {
- each(cache, function (cachedBlobInfo) {
- URL.revokeObjectURL(cachedBlobInfo.blobUri());
- });
- cache = [];
- };
- return {
- create: create,
- add: add,
- get: get,
- getByUri: getByUri,
- findFirst: findFirst,
- removeByUri: removeByUri,
- destroy: destroy
- };
- }
-
- function UploadStatus () {
- var PENDING = 1, UPLOADED = 2;
- var blobUriStatuses = {};
- var createStatus = function (status, resultUri) {
- return {
- status: status,
- resultUri: resultUri
- };
- };
- var hasBlobUri = function (blobUri) {
- return blobUri in blobUriStatuses;
- };
- var getResultUri = function (blobUri) {
- var result = blobUriStatuses[blobUri];
- return result ? result.resultUri : null;
- };
- var isPending = function (blobUri) {
- return hasBlobUri(blobUri) ? blobUriStatuses[blobUri].status === PENDING : false;
- };
- var isUploaded = function (blobUri) {
- return hasBlobUri(blobUri) ? blobUriStatuses[blobUri].status === UPLOADED : false;
- };
- var markPending = function (blobUri) {
- blobUriStatuses[blobUri] = createStatus(PENDING, null);
- };
- var markUploaded = function (blobUri, resultUri) {
- blobUriStatuses[blobUri] = createStatus(UPLOADED, resultUri);
- };
- var removeFailed = function (blobUri) {
- delete blobUriStatuses[blobUri];
- };
- var destroy = function () {
- blobUriStatuses = {};
- };
- return {
- hasBlobUri: hasBlobUri,
- getResultUri: getResultUri,
- isPending: isPending,
- isUploaded: isUploaded,
- markPending: markPending,
- markUploaded: markUploaded,
- removeFailed: removeFailed,
- destroy: destroy
- };
- }
-
- function EditorUpload (editor) {
- var blobCache = BlobCache();
- var uploader, imageScanner;
- var uploadStatus = UploadStatus();
- var urlFilters = [];
- var aliveGuard = function (callback) {
- return function (result) {
- if (editor.selection) {
- return callback(result);
- }
- return [];
- };
- };
- var cacheInvalidator = function () {
- return '?' + new Date().getTime();
- };
- var replaceString = function (content, search, replace) {
- var index = 0;
- do {
- index = content.indexOf(search, index);
- if (index !== -1) {
- content = content.substring(0, index) + replace + content.substr(index + search.length);
- index += replace.length - search.length + 1;
- }
- } while (index !== -1);
- return content;
- };
- var replaceImageUrl = function (content, targetUrl, replacementUrl) {
- content = replaceString(content, 'src="' + targetUrl + '"', 'src="' + replacementUrl + '"');
- content = replaceString(content, 'data-mce-src="' + targetUrl + '"', 'data-mce-src="' + replacementUrl + '"');
- return content;
- };
- var replaceUrlInUndoStack = function (targetUrl, replacementUrl) {
- each(editor.undoManager.data, function (level) {
- if (level.type === 'fragmented') {
- level.fragments = map(level.fragments, function (fragment) {
- return replaceImageUrl(fragment, targetUrl, replacementUrl);
- });
- } else {
- level.content = replaceImageUrl(level.content, targetUrl, replacementUrl);
- }
- });
- };
- var openNotification = function () {
- return editor.notificationManager.open({
- text: editor.translate('Image uploading...'),
- type: 'info',
- timeout: -1,
- progressBar: true
- });
- };
- var replaceImageUri = function (image, resultUri) {
- blobCache.removeByUri(image.src);
- replaceUrlInUndoStack(image.src, resultUri);
- editor.$(image).attr({
- 'src': Settings.shouldReuseFileName(editor) ? resultUri + cacheInvalidator() : resultUri,
- 'data-mce-src': editor.convertURL(resultUri, 'src')
- });
- };
- var uploadImages = function (callback) {
- if (!uploader) {
- uploader = Uploader(uploadStatus, {
- url: Settings.getImageUploadUrl(editor),
- basePath: Settings.getImageUploadBasePath(editor),
- credentials: Settings.getImagesUploadCredentials(editor),
- handler: Settings.getImagesUploadHandler(editor)
- });
- }
- return scanForImages().then(aliveGuard(function (imageInfos) {
- var blobInfos;
- blobInfos = map(imageInfos, function (imageInfo) {
- return imageInfo.blobInfo;
- });
- return uploader.upload(blobInfos, openNotification).then(aliveGuard(function (result) {
- var filteredResult = map(result, function (uploadInfo, index) {
- var image = imageInfos[index].image;
- if (uploadInfo.status && Settings.shouldReplaceBlobUris(editor)) {
- replaceImageUri(image, uploadInfo.url);
- } else if (uploadInfo.error) {
- ErrorReporter.uploadError(editor, uploadInfo.error);
- }
- return {
- element: image,
- status: uploadInfo.status
- };
- });
- if (callback) {
- callback(filteredResult);
- }
- return filteredResult;
- }));
- }));
- };
- var uploadImagesAuto = function (callback) {
- if (Settings.isAutomaticUploadsEnabled(editor)) {
- return uploadImages(callback);
- }
- };
- var isValidDataUriImage = function (imgElm) {
- if (forall(urlFilters, function (filter) {
- return filter(imgElm);
- }) === false) {
- return false;
- }
- if (imgElm.getAttribute('src').indexOf('data:') === 0) {
- var dataImgFilter = Settings.getImagesDataImgFilter(editor);
- return dataImgFilter(imgElm);
- }
- return true;
- };
- var addFilter = function (filter) {
- urlFilters.push(filter);
- };
- var scanForImages = function () {
- if (!imageScanner) {
- imageScanner = ImageScanner(uploadStatus, blobCache);
- }
- return imageScanner.findAll(editor.getBody(), isValidDataUriImage).then(aliveGuard(function (result) {
- result = filter(result, function (resultItem) {
- if (typeof resultItem === 'string') {
- ErrorReporter.displayError(editor, resultItem);
- return false;
- }
- return true;
- });
- each(result, function (resultItem) {
- replaceUrlInUndoStack(resultItem.image.src, resultItem.blobInfo.blobUri());
- resultItem.image.src = resultItem.blobInfo.blobUri();
- resultItem.image.removeAttribute('data-mce-src');
- });
- return result;
- }));
- };
- var destroy = function () {
- blobCache.destroy();
- uploadStatus.destroy();
- imageScanner = uploader = null;
- };
- var replaceBlobUris = function (content) {
- return content.replace(/src="(blob:[^"]+)"/g, function (match, blobUri) {
- var resultUri = uploadStatus.getResultUri(blobUri);
- if (resultUri) {
- return 'src="' + resultUri + '"';
- }
- var blobInfo = blobCache.getByUri(blobUri);
- if (!blobInfo) {
- blobInfo = foldl(editor.editorManager.get(), function (result, editor) {
- return result || editor.editorUpload && editor.editorUpload.blobCache.getByUri(blobUri);
- }, null);
- }
- if (blobInfo) {
- var blob = blobInfo.blob();
- return 'src="data:' + blob.type + ';base64,' + blobInfo.base64() + '"';
- }
- return match;
- });
- };
- editor.on('setContent', function () {
- if (Settings.isAutomaticUploadsEnabled(editor)) {
- uploadImagesAuto();
- } else {
- scanForImages();
- }
- });
- editor.on('RawSaveContent', function (e) {
- e.content = replaceBlobUris(e.content);
- });
- editor.on('getContent', function (e) {
- if (e.source_view || e.format === 'raw') {
- return;
- }
- e.content = replaceBlobUris(e.content);
- });
- editor.on('PostRender', function () {
- editor.parser.addNodeFilter('img', function (images) {
- each(images, function (img) {
- var src = img.attr('src');
- if (blobCache.getByUri(src)) {
- return;
- }
- var resultUri = uploadStatus.getResultUri(src);
- if (resultUri) {
- img.attr('src', resultUri);
- }
- });
- });
- });
- return {
- blobCache: blobCache,
- addFilter: addFilter,
- uploadImages: uploadImages,
- uploadImagesAuto: uploadImagesAuto,
- scanForImages: scanForImages,
- destroy: destroy
- };
- }
-
- var isBlockElement = function (blockElements, node) {
- return blockElements.hasOwnProperty(node.nodeName);
- };
- var isValidTarget = function (blockElements, node) {
- if (NodeType.isText(node)) {
- return true;
- } else if (NodeType.isElement(node)) {
- return !isBlockElement(blockElements, node) && !Bookmarks.isBookmarkNode(node);
- } else {
- return false;
- }
- };
- var hasBlockParent = function (blockElements, root, node) {
- return exists(Parents.parents(Element.fromDom(node), Element.fromDom(root)), function (elm) {
- return isBlockElement(blockElements, elm.dom());
- });
- };
- var shouldRemoveTextNode = function (blockElements, node) {
- if (NodeType.isText(node)) {
- if (node.nodeValue.length === 0) {
- return true;
- } else if (/^\s+$/.test(node.nodeValue) && (!node.nextSibling || isBlockElement(blockElements, node.nextSibling))) {
- return true;
- }
- }
- return false;
- };
- var addRootBlocks = function (editor) {
- var settings = editor.settings, dom = editor.dom, selection = editor.selection;
- var schema = editor.schema, blockElements = schema.getBlockElements();
- var node = selection.getStart();
- var rootNode = editor.getBody();
- var rng;
- var startContainer, startOffset, endContainer, endOffset, rootBlockNode;
- var tempNode, wrapped, restoreSelection;
- var rootNodeName, forcedRootBlock;
- forcedRootBlock = settings.forced_root_block;
- if (!node || !NodeType.isElement(node) || !forcedRootBlock) {
- return;
- }
- rootNodeName = rootNode.nodeName.toLowerCase();
- if (!schema.isValidChild(rootNodeName, forcedRootBlock.toLowerCase()) || hasBlockParent(blockElements, rootNode, node)) {
- return;
- }
- rng = selection.getRng();
- startContainer = rng.startContainer;
- startOffset = rng.startOffset;
- endContainer = rng.endContainer;
- endOffset = rng.endOffset;
- restoreSelection = EditorFocus.hasFocus(editor);
- node = rootNode.firstChild;
- while (node) {
- if (isValidTarget(blockElements, node)) {
- if (shouldRemoveTextNode(blockElements, node)) {
- tempNode = node;
- node = node.nextSibling;
- dom.remove(tempNode);
- continue;
- }
- if (!rootBlockNode) {
- rootBlockNode = dom.create(forcedRootBlock, editor.settings.forced_root_block_attrs);
- node.parentNode.insertBefore(rootBlockNode, node);
- wrapped = true;
- }
- tempNode = node;
- node = node.nextSibling;
- rootBlockNode.appendChild(tempNode);
- } else {
- rootBlockNode = null;
- node = node.nextSibling;
- }
- }
- if (wrapped && restoreSelection) {
- rng.setStart(startContainer, startOffset);
- rng.setEnd(endContainer, endOffset);
- selection.setRng(rng);
- editor.nodeChanged();
- }
- };
- var setup$3 = function (editor) {
- if (editor.settings.forced_root_block) {
- editor.on('NodeChange', curry(addRootBlocks, editor));
- }
- };
- var ForceBlocks = { setup: setup$3 };
-
- var getStartNode = function (rng) {
- var sc = rng.startContainer, so = rng.startOffset;
- if (NodeType.isText(sc)) {
- return so === 0 ? Option.some(Element.fromDom(sc)) : Option.none();
- } else {
- return Option.from(sc.childNodes[so]).map(Element.fromDom);
- }
- };
- var getEndNode = function (rng) {
- var ec = rng.endContainer, eo = rng.endOffset;
- if (NodeType.isText(ec)) {
- return eo === ec.data.length ? Option.some(Element.fromDom(ec)) : Option.none();
- } else {
- return Option.from(ec.childNodes[eo - 1]).map(Element.fromDom);
- }
- };
- var getFirstChildren = function (node) {
- return firstChild(node).fold(constant([node]), function (child) {
- return [node].concat(getFirstChildren(child));
- });
- };
- var getLastChildren$1 = function (node) {
- return lastChild(node).fold(constant([node]), function (child) {
- if (name(child) === 'br') {
- return prevSibling(child).map(function (sibling) {
- return [node].concat(getLastChildren$1(sibling));
- }).getOr([]);
- } else {
- return [node].concat(getLastChildren$1(child));
- }
- });
- };
- var hasAllContentsSelected = function (elm, rng) {
- return lift2(getStartNode(rng), getEndNode(rng), function (startNode, endNode) {
- var start = find(getFirstChildren(elm), curry(eq, startNode));
- var end = find(getLastChildren$1(elm), curry(eq, endNode));
- return start.isSome() && end.isSome();
- }).getOr(false);
- };
- var moveEndPoint$1 = function (dom, rng, node, start) {
- var root = node, walker = new TreeWalker(node, root);
- var nonEmptyElementsMap = dom.schema.getNonEmptyElements();
- do {
- if (node.nodeType === 3 && Tools.trim(node.nodeValue).length !== 0) {
- if (start) {
- rng.setStart(node, 0);
- } else {
- rng.setEnd(node, node.nodeValue.length);
- }
- return;
- }
- if (nonEmptyElementsMap[node.nodeName] && !/^(TD|TH)$/.test(node.nodeName)) {
- if (start) {
- rng.setStartBefore(node);
- } else {
- if (node.nodeName === 'BR') {
- rng.setEndBefore(node);
- } else {
- rng.setEndAfter(node);
- }
- }
- return;
- }
- if (Env.ie && Env.ie < 11 && dom.isBlock(node) && dom.isEmpty(node)) {
- if (start) {
- rng.setStart(node, 0);
- } else {
- rng.setEnd(node, 0);
- }
- return;
- }
- } while (node = start ? walker.next() : walker.prev());
- if (root.nodeName === 'BODY') {
- if (start) {
- rng.setStart(root, 0);
- } else {
- rng.setEnd(root, root.childNodes.length);
- }
- }
- };
- var hasAnyRanges = function (editor) {
- var sel = editor.selection.getSel();
- return sel && sel.rangeCount > 0;
- };
-
- function NodeChange (editor) {
- var lastRng, lastPath = [];
- var isSameElementPath = function (startElm) {
- var i, currentPath;
- currentPath = editor.$(startElm).parentsUntil(editor.getBody()).add(startElm);
- if (currentPath.length === lastPath.length) {
- for (i = currentPath.length; i >= 0; i--) {
- if (currentPath[i] !== lastPath[i]) {
- break;
- }
- }
- if (i === -1) {
- lastPath = currentPath;
- return true;
- }
- }
- lastPath = currentPath;
- return false;
- };
- if (!('onselectionchange' in editor.getDoc())) {
- editor.on('NodeChange Click MouseUp KeyUp Focus', function (e) {
- var nativeRng, fakeRng;
- nativeRng = editor.selection.getRng();
- fakeRng = {
- startContainer: nativeRng.startContainer,
- startOffset: nativeRng.startOffset,
- endContainer: nativeRng.endContainer,
- endOffset: nativeRng.endOffset
- };
- if (e.type === 'nodechange' || !RangeCompare.isEq(fakeRng, lastRng)) {
- editor.fire('SelectionChange');
- }
- lastRng = fakeRng;
- });
- }
- editor.on('contextmenu', function () {
- editor.fire('SelectionChange');
- });
- editor.on('SelectionChange', function () {
- var startElm = editor.selection.getStart(true);
- if (!startElm || !Env.range && editor.selection.isCollapsed()) {
- return;
- }
- if (hasAnyRanges(editor) && !isSameElementPath(startElm) && editor.dom.isChildOf(startElm, editor.getBody())) {
- editor.nodeChanged({ selectionChange: true });
- }
- });
- editor.on('MouseUp', function (e) {
- if (!e.isDefaultPrevented() && hasAnyRanges(editor)) {
- if (editor.selection.getNode().nodeName === 'IMG') {
- Delay.setEditorTimeout(editor, function () {
- editor.nodeChanged();
- });
- } else {
- editor.nodeChanged();
- }
- }
- });
- this.nodeChanged = function (args) {
- var selection = editor.selection;
- var node, parents, root;
- if (editor.initialized && selection && !editor.settings.disable_nodechange && !editor.readonly) {
- root = editor.getBody();
- node = selection.getStart(true) || root;
- if (node.ownerDocument !== editor.getDoc() || !editor.dom.isChildOf(node, root)) {
- node = root;
- }
- parents = [];
- editor.dom.getParent(node, function (node) {
- if (node === root) {
- return true;
- }
- parents.push(node);
- });
- args = args || {};
- args.element = node;
- args.parents = parents;
- editor.fire('NodeChange', args);
- }
- };
- }
-
- var VK = {
- BACKSPACE: 8,
- DELETE: 46,
- DOWN: 40,
- ENTER: 13,
- LEFT: 37,
- RIGHT: 39,
- SPACEBAR: 32,
- TAB: 9,
- UP: 38,
- END: 35,
- HOME: 36,
- modifierPressed: function (e) {
- return e.shiftKey || e.ctrlKey || e.altKey || this.metaKeyPressed(e);
- },
- metaKeyPressed: function (e) {
- return Env.mac ? e.metaKey : e.ctrlKey && !e.altKey;
- }
- };
-
- var getNodeClientRects = function (node) {
- var toArrayWithNode = function (clientRects) {
- return map(clientRects, function (clientRect) {
- clientRect = clone$1(clientRect);
- clientRect.node = node;
- return clientRect;
- });
- };
- if (NodeType.isElement(node)) {
- return toArrayWithNode(node.getClientRects());
- }
- if (NodeType.isText(node)) {
- var rng = node.ownerDocument.createRange();
- rng.setStart(node, 0);
- rng.setEnd(node, node.data.length);
- return toArrayWithNode(rng.getClientRects());
- }
- };
- var getClientRects = function (node) {
- return foldl(node, function (result, node) {
- return result.concat(getNodeClientRects(node));
- }, []);
- };
-
- var VDirection;
- (function (VDirection) {
- VDirection[VDirection['Up'] = -1] = 'Up';
- VDirection[VDirection['Down'] = 1] = 'Down';
- }(VDirection || (VDirection = {})));
- var findUntil = function (direction, root, predicateFn, node) {
- while (node = findNode(node, direction, isEditableCaretCandidate, root)) {
- if (predicateFn(node)) {
- return;
- }
- }
- };
- var walkUntil = function (direction, isAboveFn, isBeflowFn, root, predicateFn, caretPosition) {
- var line = 0, node;
- var result = [];
- var targetClientRect;
- var add = function (node) {
- var i, clientRect, clientRects;
- clientRects = getClientRects([node]);
- if (direction === -1) {
- clientRects = clientRects.reverse();
- }
- for (i = 0; i < clientRects.length; i++) {
- clientRect = clientRects[i];
- if (isBeflowFn(clientRect, targetClientRect)) {
- continue;
- }
- if (result.length > 0 && isAboveFn(clientRect, ArrUtils.last(result))) {
- line++;
- }
- clientRect.line = line;
- if (predicateFn(clientRect)) {
- return true;
- }
- result.push(clientRect);
- }
- };
- targetClientRect = ArrUtils.last(caretPosition.getClientRects());
- if (!targetClientRect) {
- return result;
- }
- node = caretPosition.getNode();
- add(node);
- findUntil(direction, root, add, node);
- return result;
- };
- var aboveLineNumber = function (lineNumber, clientRect) {
- return clientRect.line > lineNumber;
- };
- var isLineNumber = function (lineNumber, clientRect) {
- return clientRect.line === lineNumber;
- };
- var upUntil = curry(walkUntil, VDirection.Up, isAbove, isBelow);
- var downUntil = curry(walkUntil, VDirection.Down, isBelow, isAbove);
- var positionsUntil = function (direction, root, predicateFn, node) {
- var caretWalker = CaretWalker(root);
- var walkFn, isBelowFn, isAboveFn, caretPosition;
- var result = [];
- var line = 0, clientRect, targetClientRect;
- var getClientRect = function (caretPosition) {
- if (direction === 1) {
- return ArrUtils.last(caretPosition.getClientRects());
- }
- return ArrUtils.last(caretPosition.getClientRects());
- };
- if (direction === 1) {
- walkFn = caretWalker.next;
- isBelowFn = isBelow;
- isAboveFn = isAbove;
- caretPosition = CaretPosition$1.after(node);
- } else {
- walkFn = caretWalker.prev;
- isBelowFn = isAbove;
- isAboveFn = isBelow;
- caretPosition = CaretPosition$1.before(node);
- }
- targetClientRect = getClientRect(caretPosition);
- do {
- if (!caretPosition.isVisible()) {
- continue;
- }
- clientRect = getClientRect(caretPosition);
- if (isAboveFn(clientRect, targetClientRect)) {
- continue;
- }
- if (result.length > 0 && isBelowFn(clientRect, ArrUtils.last(result))) {
- line++;
- }
- clientRect = clone$1(clientRect);
- clientRect.position = caretPosition;
- clientRect.line = line;
- if (predicateFn(clientRect)) {
- return result;
- }
- result.push(clientRect);
- } while (caretPosition = walkFn(caretPosition));
- return result;
- };
- var isAboveLine = function (lineNumber) {
- return function (clientRect) {
- return aboveLineNumber(lineNumber, clientRect);
- };
- };
- var isLine = function (lineNumber) {
- return function (clientRect) {
- return isLineNumber(lineNumber, clientRect);
- };
- };
-
- var isContentEditableFalse$7 = NodeType.isContentEditableFalse;
- var findNode$1 = findNode;
- var distanceToRectLeft = function (clientRect, clientX) {
- return Math.abs(clientRect.left - clientX);
- };
- var distanceToRectRight = function (clientRect, clientX) {
- return Math.abs(clientRect.right - clientX);
- };
- var isInside = function (clientX, clientRect) {
- return clientX >= clientRect.left && clientX <= clientRect.right;
- };
- var findClosestClientRect = function (clientRects, clientX) {
- return ArrUtils.reduce(clientRects, function (oldClientRect, clientRect) {
- var oldDistance, newDistance;
- oldDistance = Math.min(distanceToRectLeft(oldClientRect, clientX), distanceToRectRight(oldClientRect, clientX));
- newDistance = Math.min(distanceToRectLeft(clientRect, clientX), distanceToRectRight(clientRect, clientX));
- if (isInside(clientX, clientRect)) {
- return clientRect;
- }
- if (isInside(clientX, oldClientRect)) {
- return oldClientRect;
- }
- if (newDistance === oldDistance && isContentEditableFalse$7(clientRect.node)) {
- return clientRect;
- }
- if (newDistance < oldDistance) {
- return clientRect;
- }
- return oldClientRect;
- });
- };
- var walkUntil$1 = function (direction, root, predicateFn, node) {
- while (node = findNode$1(node, direction, isEditableCaretCandidate, root)) {
- if (predicateFn(node)) {
- return;
- }
- }
- };
- var findLineNodeRects = function (root, targetNodeRect) {
- var clientRects = [];
- var collect = function (checkPosFn, node) {
- var lineRects;
- lineRects = filter(getClientRects([node]), function (clientRect) {
- return !checkPosFn(clientRect, targetNodeRect);
- });
- clientRects = clientRects.concat(lineRects);
- return lineRects.length === 0;
- };
- clientRects.push(targetNodeRect);
- walkUntil$1(VDirection.Up, root, curry(collect, isAbove), targetNodeRect.node);
- walkUntil$1(VDirection.Down, root, curry(collect, isBelow), targetNodeRect.node);
- return clientRects;
- };
- var getFakeCaretTargets = function (root) {
- return filter(from$1(root.getElementsByTagName('*')), isFakeCaretTarget);
- };
- var caretInfo = function (clientRect, clientX) {
- return {
- node: clientRect.node,
- before: distanceToRectLeft(clientRect, clientX) < distanceToRectRight(clientRect, clientX)
- };
- };
- var closestCaret = function (root, clientX, clientY) {
- var closestNodeRect;
- var contentEditableFalseNodeRects = getClientRects(getFakeCaretTargets(root));
- var targetNodeRects = filter(contentEditableFalseNodeRects, function (rect) {
- return clientY >= rect.top && clientY <= rect.bottom;
- });
- closestNodeRect = findClosestClientRect(targetNodeRects, clientX);
- if (closestNodeRect) {
- closestNodeRect = findClosestClientRect(findLineNodeRects(root, closestNodeRect), clientX);
- if (closestNodeRect && isFakeCaretTarget(closestNodeRect.node)) {
- return caretInfo(closestNodeRect, clientX);
- }
- }
- return null;
- };
-
- var isXYWithinRange = function (clientX, clientY, range) {
- if (range.collapsed) {
- return false;
- }
- if (Env.ie && Env.ie <= 11 && range.startOffset === range.endOffset - 1 && range.startContainer === range.endContainer) {
- var elm = range.startContainer.childNodes[range.startOffset];
- if (NodeType.isElement(elm)) {
- return exists(elm.getClientRects(), function (rect) {
- return containsXY(rect, clientX, clientY);
- });
- }
- }
- return exists(range.getClientRects(), function (rect) {
- return containsXY(rect, clientX, clientY);
- });
- };
- var RangePoint = { isXYWithinRange: isXYWithinRange };
-
- var getAbsolutePosition = function (elm) {
- var doc, docElem, win, clientRect;
- clientRect = elm.getBoundingClientRect();
- doc = elm.ownerDocument;
- docElem = doc.documentElement;
- win = doc.defaultView;
- return {
- top: clientRect.top + win.pageYOffset - docElem.clientTop,
- left: clientRect.left + win.pageXOffset - docElem.clientLeft
- };
- };
- var getBodyPosition = function (editor) {
- return editor.inline ? getAbsolutePosition(editor.getBody()) : {
- left: 0,
- top: 0
- };
- };
- var getScrollPosition = function (editor) {
- var body = editor.getBody();
- return editor.inline ? {
- left: body.scrollLeft,
- top: body.scrollTop
- } : {
- left: 0,
- top: 0
- };
- };
- var getBodyScroll = function (editor) {
- var body = editor.getBody(), docElm = editor.getDoc().documentElement;
- var inlineScroll = {
- left: body.scrollLeft,
- top: body.scrollTop
- };
- var iframeScroll = {
- left: body.scrollLeft || docElm.scrollLeft,
- top: body.scrollTop || docElm.scrollTop
- };
- return editor.inline ? inlineScroll : iframeScroll;
- };
- var getMousePosition = function (editor, event) {
- if (event.target.ownerDocument !== editor.getDoc()) {
- var iframePosition = getAbsolutePosition(editor.getContentAreaContainer());
- var scrollPosition = getBodyScroll(editor);
- return {
- left: event.pageX - iframePosition.left + scrollPosition.left,
- top: event.pageY - iframePosition.top + scrollPosition.top
- };
- }
- return {
- left: event.pageX,
- top: event.pageY
- };
- };
- var calculatePosition = function (bodyPosition, scrollPosition, mousePosition) {
- return {
- pageX: mousePosition.left - bodyPosition.left + scrollPosition.left,
- pageY: mousePosition.top - bodyPosition.top + scrollPosition.top
- };
- };
- var calc = function (editor, event) {
- return calculatePosition(getBodyPosition(editor), getScrollPosition(editor), getMousePosition(editor, event));
- };
- var MousePosition = { calc: calc };
-
- var isContentEditableFalse$8 = NodeType.isContentEditableFalse, isContentEditableTrue$3 = NodeType.isContentEditableTrue;
- var isDraggable = function (rootElm, elm) {
- return isContentEditableFalse$8(elm) && elm !== rootElm;
- };
- var isValidDropTarget = function (editor, targetElement, dragElement) {
- if (targetElement === dragElement || editor.dom.isChildOf(targetElement, dragElement)) {
- return false;
- }
- if (isContentEditableFalse$8(targetElement)) {
- return false;
- }
- return true;
- };
- var cloneElement = function (elm) {
- var cloneElm = elm.cloneNode(true);
- cloneElm.removeAttribute('data-mce-selected');
- return cloneElm;
- };
- var createGhost = function (editor, elm, width, height) {
- var clonedElm = elm.cloneNode(true);
- editor.dom.setStyles(clonedElm, {
- width: width,
- height: height
- });
- editor.dom.setAttrib(clonedElm, 'data-mce-selected', null);
- var ghostElm = editor.dom.create('div', {
- 'class': 'mce-drag-container',
- 'data-mce-bogus': 'all',
- 'unselectable': 'on',
- 'contenteditable': 'false'
- });
- editor.dom.setStyles(ghostElm, {
- position: 'absolute',
- opacity: 0.5,
- overflow: 'hidden',
- border: 0,
- padding: 0,
- margin: 0,
- width: width,
- height: height
- });
- editor.dom.setStyles(clonedElm, {
- margin: 0,
- boxSizing: 'border-box'
- });
- ghostElm.appendChild(clonedElm);
- return ghostElm;
- };
- var appendGhostToBody = function (ghostElm, bodyElm) {
- if (ghostElm.parentNode !== bodyElm) {
- bodyElm.appendChild(ghostElm);
- }
- };
- var moveGhost = function (ghostElm, position, width, height, maxX, maxY) {
- var overflowX = 0, overflowY = 0;
- ghostElm.style.left = position.pageX + 'px';
- ghostElm.style.top = position.pageY + 'px';
- if (position.pageX + width > maxX) {
- overflowX = position.pageX + width - maxX;
- }
- if (position.pageY + height > maxY) {
- overflowY = position.pageY + height - maxY;
- }
- ghostElm.style.width = width - overflowX + 'px';
- ghostElm.style.height = height - overflowY + 'px';
- };
- var removeElement = function (elm) {
- if (elm && elm.parentNode) {
- elm.parentNode.removeChild(elm);
- }
- };
- var isLeftMouseButtonPressed = function (e) {
- return e.button === 0;
- };
- var hasDraggableElement = function (state) {
- return state.element;
- };
- var applyRelPos = function (state, position) {
- return {
- pageX: position.pageX - state.relX,
- pageY: position.pageY + 5
- };
- };
- var start$1 = function (state, editor) {
- return function (e) {
- if (isLeftMouseButtonPressed(e)) {
- var ceElm = find(editor.dom.getParents(e.target), Predicate.or(isContentEditableFalse$8, isContentEditableTrue$3)).getOr(null);
- if (isDraggable(editor.getBody(), ceElm)) {
- var elmPos = editor.dom.getPos(ceElm);
- var bodyElm = editor.getBody();
- var docElm = editor.getDoc().documentElement;
- state.element = ceElm;
- state.screenX = e.screenX;
- state.screenY = e.screenY;
- state.maxX = (editor.inline ? bodyElm.scrollWidth : docElm.offsetWidth) - 2;
- state.maxY = (editor.inline ? bodyElm.scrollHeight : docElm.offsetHeight) - 2;
- state.relX = e.pageX - elmPos.x;
- state.relY = e.pageY - elmPos.y;
- state.width = ceElm.offsetWidth;
- state.height = ceElm.offsetHeight;
- state.ghost = createGhost(editor, ceElm, state.width, state.height);
- }
- }
- };
- };
- var move$1 = function (state, editor) {
- var throttledPlaceCaretAt = Delay.throttle(function (clientX, clientY) {
- editor._selectionOverrides.hideFakeCaret();
- editor.selection.placeCaretAt(clientX, clientY);
- }, 0);
- return function (e) {
- var movement = Math.max(Math.abs(e.screenX - state.screenX), Math.abs(e.screenY - state.screenY));
- if (hasDraggableElement(state) && !state.dragging && movement > 10) {
- var args = editor.fire('dragstart', { target: state.element });
- if (args.isDefaultPrevented()) {
- return;
- }
- state.dragging = true;
- editor.focus();
- }
- if (state.dragging) {
- var targetPos = applyRelPos(state, MousePosition.calc(editor, e));
- appendGhostToBody(state.ghost, editor.getBody());
- moveGhost(state.ghost, targetPos, state.width, state.height, state.maxX, state.maxY);
- throttledPlaceCaretAt(e.clientX, e.clientY);
- }
- };
- };
- var getRawTarget = function (selection) {
- var rng = selection.getSel().getRangeAt(0);
- var startContainer = rng.startContainer;
- return startContainer.nodeType === 3 ? startContainer.parentNode : startContainer;
- };
- var drop = function (state, editor) {
- return function (e) {
- if (state.dragging) {
- if (isValidDropTarget(editor, getRawTarget(editor.selection), state.element)) {
- var targetClone_1 = cloneElement(state.element);
- var args = editor.fire('drop', {
- targetClone: targetClone_1,
- clientX: e.clientX,
- clientY: e.clientY
- });
- if (!args.isDefaultPrevented()) {
- targetClone_1 = args.targetClone;
- editor.undoManager.transact(function () {
- removeElement(state.element);
- editor.insertContent(editor.dom.getOuterHTML(targetClone_1));
- editor._selectionOverrides.hideFakeCaret();
- });
- }
- }
- }
- removeDragState(state);
- };
- };
- var stop = function (state, editor) {
- return function () {
- if (state.dragging) {
- editor.fire('dragend');
- }
- removeDragState(state);
- };
- };
- var removeDragState = function (state) {
- state.dragging = false;
- state.element = null;
- removeElement(state.ghost);
- };
- var bindFakeDragEvents = function (editor) {
- var state = {};
- var pageDom, dragStartHandler, dragHandler, dropHandler, dragEndHandler, rootDocument;
- pageDom = DOMUtils$1.DOM;
- rootDocument = domGlobals.document;
- dragStartHandler = start$1(state, editor);
- dragHandler = move$1(state, editor);
- dropHandler = drop(state, editor);
- dragEndHandler = stop(state, editor);
- editor.on('mousedown', dragStartHandler);
- editor.on('mousemove', dragHandler);
- editor.on('mouseup', dropHandler);
- pageDom.bind(rootDocument, 'mousemove', dragHandler);
- pageDom.bind(rootDocument, 'mouseup', dragEndHandler);
- editor.on('remove', function () {
- pageDom.unbind(rootDocument, 'mousemove', dragHandler);
- pageDom.unbind(rootDocument, 'mouseup', dragEndHandler);
- });
- };
- var blockIeDrop = function (editor) {
- editor.on('drop', function (e) {
- var realTarget = typeof e.clientX !== 'undefined' ? editor.getDoc().elementFromPoint(e.clientX, e.clientY) : null;
- if (isContentEditableFalse$8(realTarget) || isContentEditableFalse$8(editor.dom.getContentEditableParent(realTarget))) {
- e.preventDefault();
- }
- });
- };
- var init = function (editor) {
- bindFakeDragEvents(editor);
- blockIeDrop(editor);
- };
- var DragDropOverrides = { init: init };
-
- var setup$4 = function (editor) {
- var renderFocusCaret = first(function () {
- if (!editor.removed) {
- var rng = editor.selection.getRng();
- if (rng.collapsed) {
- var caretRange = renderRangeCaret(editor, editor.selection.getRng(), false);
- editor.selection.setRng(caretRange);
- }
- }
- }, 0);
- editor.on('focus', function () {
- renderFocusCaret.throttle();
- });
- editor.on('blur', function () {
- renderFocusCaret.cancel();
- });
- };
- var CefFocus = { setup: setup$4 };
-
- var isContentEditableTrue$4 = NodeType.isContentEditableTrue;
- var isContentEditableFalse$9 = NodeType.isContentEditableFalse;
- var getContentEditableRoot$1 = function (editor, node) {
- var root = editor.getBody();
- while (node && node !== root) {
- if (isContentEditableTrue$4(node) || isContentEditableFalse$9(node)) {
- return node;
- }
- node = node.parentNode;
- }
- return null;
- };
- var SelectionOverrides = function (editor) {
- var isBlock = function (node) {
- return editor.dom.isBlock(node);
- };
- var rootNode = editor.getBody();
- var fakeCaret = FakeCaret(editor.getBody(), isBlock, function () {
- return EditorFocus.hasFocus(editor);
- });
- var realSelectionId = 'sel-' + editor.dom.uniqueId();
- var selectedContentEditableNode;
- var isFakeSelectionElement = function (elm) {
- return editor.dom.hasClass(elm, 'mce-offscreen-selection');
- };
- var getRealSelectionElement = function () {
- var container = editor.dom.get(realSelectionId);
- return container ? container.getElementsByTagName('*')[0] : container;
- };
- var setRange = function (range) {
- if (range) {
- editor.selection.setRng(range);
- }
- };
- var getRange = function () {
- return editor.selection.getRng();
- };
- var showCaret = function (direction, node, before, scrollIntoView) {
- if (scrollIntoView === void 0) {
- scrollIntoView = true;
- }
- var e;
- e = editor.fire('ShowCaret', {
- target: node,
- direction: direction,
- before: before
- });
- if (e.isDefaultPrevented()) {
- return null;
- }
- if (scrollIntoView) {
- editor.selection.scrollIntoView(node, direction === -1);
- }
- return fakeCaret.show(before, node);
- };
- var getNormalizedRangeEndPoint = function (direction, range) {
- range = normalizeRange(direction, rootNode, range);
- if (direction === -1) {
- return CaretPosition$1.fromRangeStart(range);
- }
- return CaretPosition$1.fromRangeEnd(range);
- };
- var showBlockCaretContainer = function (blockCaretContainer) {
- if (blockCaretContainer.hasAttribute('data-mce-caret')) {
- showCaretContainerBlock(blockCaretContainer);
- setRange(getRange());
- editor.selection.scrollIntoView(blockCaretContainer[0]);
- }
- };
- var registerEvents = function () {
- editor.on('mouseup', function (e) {
- var range = getRange();
- if (range.collapsed && EditorView.isXYInContentArea(editor, e.clientX, e.clientY)) {
- setRange(renderCaretAtRange(editor, range, false));
- }
- });
- editor.on('click', function (e) {
- var contentEditableRoot;
- contentEditableRoot = getContentEditableRoot$1(editor, e.target);
- if (contentEditableRoot) {
- if (isContentEditableFalse$9(contentEditableRoot)) {
- e.preventDefault();
- editor.focus();
- }
- if (isContentEditableTrue$4(contentEditableRoot)) {
- if (editor.dom.isChildOf(contentEditableRoot, editor.selection.getNode())) {
- removeContentEditableSelection();
- }
- }
- }
- });
- editor.on('blur NewBlock', function () {
- removeContentEditableSelection();
- });
- editor.on('ResizeWindow FullscreenStateChanged', function () {
- return fakeCaret.reposition();
- });
- var handleTouchSelect = function (editor) {
- var moved = false;
- editor.on('touchstart', function () {
- moved = false;
- });
- editor.on('touchmove', function () {
- moved = true;
- });
- editor.on('touchend', function (e) {
- var contentEditableRoot = getContentEditableRoot$1(editor, e.target);
- if (isContentEditableFalse$9(contentEditableRoot)) {
- if (!moved) {
- e.preventDefault();
- setContentEditableSelection(selectNode(editor, contentEditableRoot));
- }
- }
- });
- };
- var hasNormalCaretPosition = function (elm) {
- var caretWalker = CaretWalker(elm);
- if (!elm.firstChild) {
- return false;
- }
- var startPos = CaretPosition$1.before(elm.firstChild);
- var newPos = caretWalker.next(startPos);
- return newPos && !isBeforeContentEditableFalse(newPos) && !isAfterContentEditableFalse(newPos);
- };
- var isInSameBlock = function (node1, node2) {
- var block1 = editor.dom.getParent(node1, editor.dom.isBlock);
- var block2 = editor.dom.getParent(node2, editor.dom.isBlock);
- return block1 === block2;
- };
- var hasBetterMouseTarget = function (targetNode, caretNode) {
- var targetBlock = editor.dom.getParent(targetNode, editor.dom.isBlock);
- var caretBlock = editor.dom.getParent(caretNode, editor.dom.isBlock);
- if (targetBlock && editor.dom.isChildOf(targetBlock, caretBlock) && isContentEditableFalse$9(getContentEditableRoot$1(editor, targetBlock)) === false) {
- return true;
- }
- return targetBlock && !isInSameBlock(targetBlock, caretBlock) && hasNormalCaretPosition(targetBlock);
- };
- handleTouchSelect(editor);
- editor.on('mousedown', function (e) {
- var contentEditableRoot;
- var targetElm = e.target;
- if (targetElm !== rootNode && targetElm.nodeName !== 'HTML' && !editor.dom.isChildOf(targetElm, rootNode)) {
- return;
- }
- if (EditorView.isXYInContentArea(editor, e.clientX, e.clientY) === false) {
- return;
- }
- contentEditableRoot = getContentEditableRoot$1(editor, targetElm);
- if (contentEditableRoot) {
- if (isContentEditableFalse$9(contentEditableRoot)) {
- e.preventDefault();
- setContentEditableSelection(selectNode(editor, contentEditableRoot));
- } else {
- removeContentEditableSelection();
- if (!(isContentEditableTrue$4(contentEditableRoot) && e.shiftKey) && !RangePoint.isXYWithinRange(e.clientX, e.clientY, editor.selection.getRng())) {
- hideFakeCaret();
- editor.selection.placeCaretAt(e.clientX, e.clientY);
- }
- }
- } else if (isFakeCaretTarget(targetElm) === false) {
- removeContentEditableSelection();
- hideFakeCaret();
- var caretInfo = closestCaret(rootNode, e.clientX, e.clientY);
- if (caretInfo) {
- if (!hasBetterMouseTarget(e.target, caretInfo.node)) {
- e.preventDefault();
- var range = showCaret(1, caretInfo.node, caretInfo.before, false);
- editor.getBody().focus();
- setRange(range);
- }
- }
- }
- });
- editor.on('keypress', function (e) {
- if (VK.modifierPressed(e)) {
- return;
- }
- switch (e.keyCode) {
- default:
- if (isContentEditableFalse$9(editor.selection.getNode())) {
- e.preventDefault();
- }
- break;
- }
- });
- editor.on('getSelectionRange', function (e) {
- var rng = e.range;
- if (selectedContentEditableNode) {
- if (!selectedContentEditableNode.parentNode) {
- selectedContentEditableNode = null;
- return;
- }
- rng = rng.cloneRange();
- rng.selectNode(selectedContentEditableNode);
- e.range = rng;
- }
- });
- editor.on('setSelectionRange', function (e) {
- e.range = normalizeShortEndedElementSelection(e.range);
- var rng = setContentEditableSelection(e.range, e.forward);
- if (rng) {
- e.range = rng;
- }
- });
- var isPasteBin = function (node) {
- return node.id === 'mcepastebin';
- };
- editor.on('AfterSetSelectionRange', function (e) {
- var rng = e.range;
- if (!isRangeInCaretContainer(rng) && !isPasteBin(rng.startContainer.parentNode)) {
- hideFakeCaret();
- }
- if (!isFakeSelectionElement(rng.startContainer.parentNode)) {
- removeContentEditableSelection();
- }
- });
- editor.on('copy', function (e) {
- var clipboardData = e.clipboardData;
- if (!e.isDefaultPrevented() && e.clipboardData && !Env.ie) {
- var realSelectionElement = getRealSelectionElement();
- if (realSelectionElement) {
- e.preventDefault();
- clipboardData.clearData();
- clipboardData.setData('text/html', realSelectionElement.outerHTML);
- clipboardData.setData('text/plain', realSelectionElement.outerText);
- }
- }
- });
- DragDropOverrides.init(editor);
- CefFocus.setup(editor);
- };
- var addCss = function () {
- var styles = editor.contentStyles, rootClass = '.mce-content-body';
- styles.push(fakeCaret.getCss());
- styles.push(rootClass + ' .mce-offscreen-selection {' + 'position: absolute;' + 'left: -9999999999px;' + 'max-width: 1000000px;' + '}' + rootClass + ' *[contentEditable=false] {' + 'cursor: default;' + '}' + rootClass + ' *[contentEditable=true] {' + 'cursor: text;' + '}');
- };
- var isWithinCaretContainer = function (node) {
- return isCaretContainer(node) || startsWithCaretContainer(node) || endsWithCaretContainer(node);
- };
- var isRangeInCaretContainer = function (rng) {
- return isWithinCaretContainer(rng.startContainer) || isWithinCaretContainer(rng.endContainer);
- };
- var normalizeShortEndedElementSelection = function (rng) {
- var shortEndedElements = editor.schema.getShortEndedElements();
- var newRng = editor.dom.createRng();
- var startContainer = rng.startContainer;
- var startOffset = rng.startOffset;
- var endContainer = rng.endContainer;
- var endOffset = rng.endOffset;
- if (has(shortEndedElements, startContainer.nodeName.toLowerCase())) {
- if (startOffset === 0) {
- newRng.setStartBefore(startContainer);
- } else {
- newRng.setStartAfter(startContainer);
- }
- } else {
- newRng.setStart(startContainer, startOffset);
- }
- if (has(shortEndedElements, endContainer.nodeName.toLowerCase())) {
- if (endOffset === 0) {
- newRng.setEndBefore(endContainer);
- } else {
- newRng.setEndAfter(endContainer);
- }
- } else {
- newRng.setEnd(endContainer, endOffset);
- }
- return newRng;
- };
- var setContentEditableSelection = function (range, forward) {
- var node;
- var $ = editor.$;
- var dom = editor.dom;
- var $realSelectionContainer, sel, startContainer, startOffset, endOffset, e, caretPosition, targetClone, origTargetClone;
- if (!range) {
- return null;
- }
- if (range.collapsed) {
- if (!isRangeInCaretContainer(range)) {
- if (forward === false) {
- caretPosition = getNormalizedRangeEndPoint(-1, range);
- if (isFakeCaretTarget(caretPosition.getNode(true))) {
- return showCaret(-1, caretPosition.getNode(true), false, false);
- }
- if (isFakeCaretTarget(caretPosition.getNode())) {
- return showCaret(-1, caretPosition.getNode(), !caretPosition.isAtEnd(), false);
- }
- } else {
- caretPosition = getNormalizedRangeEndPoint(1, range);
- if (isFakeCaretTarget(caretPosition.getNode())) {
- return showCaret(1, caretPosition.getNode(), !caretPosition.isAtEnd(), false);
- }
- if (isFakeCaretTarget(caretPosition.getNode(true))) {
- return showCaret(1, caretPosition.getNode(true), false, false);
- }
- }
- }
- return null;
- }
- startContainer = range.startContainer;
- startOffset = range.startOffset;
- endOffset = range.endOffset;
- if (startContainer.nodeType === 3 && startOffset === 0 && isContentEditableFalse$9(startContainer.parentNode)) {
- startContainer = startContainer.parentNode;
- startOffset = dom.nodeIndex(startContainer);
- startContainer = startContainer.parentNode;
- }
- if (startContainer.nodeType !== 1) {
- return null;
- }
- if (endOffset === startOffset + 1 && startContainer === range.endContainer) {
- node = startContainer.childNodes[startOffset];
- }
- if (!isContentEditableFalse$9(node)) {
- return null;
- }
- targetClone = origTargetClone = node.cloneNode(true);
- e = editor.fire('ObjectSelected', {
- target: node,
- targetClone: targetClone
- });
- if (e.isDefaultPrevented()) {
- return null;
- }
- $realSelectionContainer = descendant(Element.fromDom(editor.getBody()), '#' + realSelectionId).fold(function () {
- return $([]);
- }, function (elm) {
- return $([elm.dom()]);
- });
- targetClone = e.targetClone;
- if ($realSelectionContainer.length === 0) {
- $realSelectionContainer = $('
').attr('id', realSelectionId);
- $realSelectionContainer.appendTo(editor.getBody());
- }
- range = editor.dom.createRng();
- if (targetClone === origTargetClone && Env.ie) {
- $realSelectionContainer.empty().append('\xA0
').append(targetClone);
- range.setStartAfter($realSelectionContainer[0].firstChild.firstChild);
- range.setEndAfter(targetClone);
- } else {
- $realSelectionContainer.empty().append('\xA0').append(targetClone).append('\xA0');
- range.setStart($realSelectionContainer[0].firstChild, 1);
- range.setEnd($realSelectionContainer[0].lastChild, 0);
- }
- $realSelectionContainer.css({ top: dom.getPos(node, editor.getBody()).y });
- $realSelectionContainer[0].focus();
- sel = editor.selection.getSel();
- sel.removeAllRanges();
- sel.addRange(range);
- each(descendants$1(Element.fromDom(editor.getBody()), '*[data-mce-selected]'), function (elm) {
- remove(elm, 'data-mce-selected');
- });
- node.setAttribute('data-mce-selected', '1');
- selectedContentEditableNode = node;
- hideFakeCaret();
- return range;
- };
- var removeContentEditableSelection = function () {
- if (selectedContentEditableNode) {
- selectedContentEditableNode.removeAttribute('data-mce-selected');
- descendant(Element.fromDom(editor.getBody()), '#' + realSelectionId).each(remove$1);
- selectedContentEditableNode = null;
- }
- descendant(Element.fromDom(editor.getBody()), '#' + realSelectionId).each(remove$1);
- selectedContentEditableNode = null;
- };
- var destroy = function () {
- fakeCaret.destroy();
- selectedContentEditableNode = null;
- };
- var hideFakeCaret = function () {
- fakeCaret.hide();
- };
- if (Env.ceFalse) {
- registerEvents();
- addCss();
- }
- return {
- showCaret: showCaret,
- showBlockCaretContainer: showBlockCaretContainer,
- hideFakeCaret: hideFakeCaret,
- destroy: destroy
- };
- };
-
- var isValidPrefixAttrName = function (name) {
- return name.indexOf('data-') === 0 || name.indexOf('aria-') === 0;
- };
- var trimComments = function (text) {
- var sanitizedText = text;
- while (/';
- }
- return '';
- };
- var createFragment$1 = function (html) {
- var frag, node, container;
- container = domGlobals.document.createElement('div');
- frag = domGlobals.document.createDocumentFragment();
- if (html) {
- container.innerHTML = html;
- }
- while (node = container.firstChild) {
- frag.appendChild(node);
- }
- return frag;
- };
- var insertAt = function (elm, html, index) {
- var fragment = createFragment$1(html);
- if (elm.hasChildNodes() && index < elm.childNodes.length) {
- var target = elm.childNodes[index];
- target.parentNode.insertBefore(fragment, target);
- } else {
- elm.appendChild(fragment);
- }
- };
- var removeAt = function (elm, index) {
- if (elm.hasChildNodes() && index < elm.childNodes.length) {
- var target = elm.childNodes[index];
- target.parentNode.removeChild(target);
- }
- };
- var applyDiff = function (diff, elm) {
- var index = 0;
- each(diff, function (action) {
- if (action[0] === Diff.KEEP) {
- index++;
- } else if (action[0] === Diff.INSERT) {
- insertAt(elm, action[1], index);
- index++;
- } else if (action[0] === Diff.DELETE) {
- removeAt(elm, index);
- }
- });
- };
- var read$3 = function (elm) {
- return filter(map(from$1(elm.childNodes), getOuterHtml), function (item) {
- return item.length > 0;
- });
- };
- var write = function (fragments, elm) {
- var currentFragments = map(from$1(elm.childNodes), getOuterHtml);
- applyDiff(Diff.diff(currentFragments, fragments), elm);
- return elm;
- };
- var Fragments = {
- read: read$3,
- write: write
- };
-
- var undoLevelDocument = Cell(Option.none());
- var lazyTempDocument = function () {
- return undoLevelDocument.get().getOrThunk(function () {
- var doc = domGlobals.document.implementation.createHTMLDocument('undo');
- undoLevelDocument.set(Option.some(doc));
- return doc;
- });
- };
- var hasIframes = function (html) {
- return html.indexOf('') !== -1;
- };
- var createFragmentedLevel = function (fragments) {
- return {
- type: 'fragmented',
- fragments: fragments,
- content: '',
- bookmark: null,
- beforeBookmark: null
- };
- };
- var createCompleteLevel = function (content) {
- return {
- type: 'complete',
- fragments: null,
- content: content,
- bookmark: null,
- beforeBookmark: null
- };
- };
- var createFromEditor = function (editor) {
- var fragments, content, trimmedFragments;
- fragments = Fragments.read(editor.getBody());
- trimmedFragments = bind(fragments, function (html) {
- var trimmed = TrimHtml.trimInternal(editor.serializer, html);
- return trimmed.length > 0 ? [trimmed] : [];
- });
- content = trimmedFragments.join('');
- return hasIframes(content) ? createFragmentedLevel(trimmedFragments) : createCompleteLevel(content);
- };
- var applyToEditor = function (editor, level, before) {
- if (level.type === 'fragmented') {
- Fragments.write(level.fragments, editor.getBody());
- } else {
- editor.setContent(level.content, { format: 'raw' });
- }
- editor.selection.moveToBookmark(before ? level.beforeBookmark : level.bookmark);
- };
- var getLevelContent = function (level) {
- return level.type === 'fragmented' ? level.fragments.join('') : level.content;
- };
- var getCleanLevelContent = function (level) {
- var elm = Element.fromTag('body', lazyTempDocument());
- set$1(elm, getLevelContent(level));
- each(descendants$1(elm, '*[data-mce-bogus]'), unwrap);
- return get$3(elm);
- };
- var hasEqualContent = function (level1, level2) {
- return getLevelContent(level1) === getLevelContent(level2);
- };
- var hasEqualCleanedContent = function (level1, level2) {
- return getCleanLevelContent(level1) === getCleanLevelContent(level2);
- };
- var isEq$4 = function (level1, level2) {
- if (!level1 || !level2) {
- return false;
- } else if (hasEqualContent(level1, level2)) {
- return true;
- } else {
- return hasEqualCleanedContent(level1, level2);
- }
- };
- var Levels = {
- createFragmentedLevel: createFragmentedLevel,
- createCompleteLevel: createCompleteLevel,
- createFromEditor: createFromEditor,
- applyToEditor: applyToEditor,
- isEq: isEq$4
- };
-
- function UndoManager (editor) {
- var self = this, index = 0, data = [], beforeBookmark, isFirstTypedCharacter, locks = 0;
- var isUnlocked = function () {
- return locks === 0;
- };
- var setTyping = function (typing) {
- if (isUnlocked()) {
- self.typing = typing;
- }
- };
- var setDirty = function (state) {
- editor.setDirty(state);
- };
- var addNonTypingUndoLevel = function (e) {
- setTyping(false);
- self.add({}, e);
- };
- var endTyping = function () {
- if (self.typing) {
- setTyping(false);
- self.add();
- }
- };
- editor.on('init', function () {
- self.add();
- });
- editor.on('BeforeExecCommand', function (e) {
- var cmd = e.command;
- if (cmd !== 'Undo' && cmd !== 'Redo' && cmd !== 'mceRepaint') {
- endTyping();
- self.beforeChange();
- }
- });
- editor.on('ExecCommand', function (e) {
- var cmd = e.command;
- if (cmd !== 'Undo' && cmd !== 'Redo' && cmd !== 'mceRepaint') {
- addNonTypingUndoLevel(e);
- }
- });
- editor.on('ObjectResizeStart Cut', function () {
- self.beforeChange();
- });
- editor.on('SaveContent ObjectResized blur', addNonTypingUndoLevel);
- editor.on('DragEnd', addNonTypingUndoLevel);
- editor.on('KeyUp', function (e) {
- var keyCode = e.keyCode;
- if (e.isDefaultPrevented()) {
- return;
- }
- if (keyCode >= 33 && keyCode <= 36 || keyCode >= 37 && keyCode <= 40 || keyCode === 45 || e.ctrlKey) {
- addNonTypingUndoLevel();
- editor.nodeChanged();
- }
- if (keyCode === 46 || keyCode === 8) {
- editor.nodeChanged();
- }
- if (isFirstTypedCharacter && self.typing && Levels.isEq(Levels.createFromEditor(editor), data[0]) === false) {
- if (editor.isDirty() === false) {
- setDirty(true);
- editor.fire('change', {
- level: data[0],
- lastLevel: null
- });
- }
- editor.fire('TypingUndo');
- isFirstTypedCharacter = false;
- editor.nodeChanged();
- }
- });
- editor.on('KeyDown', function (e) {
- var keyCode = e.keyCode;
- if (e.isDefaultPrevented()) {
- return;
- }
- if (keyCode >= 33 && keyCode <= 36 || keyCode >= 37 && keyCode <= 40 || keyCode === 45) {
- if (self.typing) {
- addNonTypingUndoLevel(e);
- }
- return;
- }
- var modKey = e.ctrlKey && !e.altKey || e.metaKey;
- if ((keyCode < 16 || keyCode > 20) && keyCode !== 224 && keyCode !== 91 && !self.typing && !modKey) {
- self.beforeChange();
- setTyping(true);
- self.add({}, e);
- isFirstTypedCharacter = true;
- }
- });
- editor.on('MouseDown', function (e) {
- if (self.typing) {
- addNonTypingUndoLevel(e);
- }
- });
- var isInsertReplacementText = function (event) {
- return event.inputType === 'insertReplacementText';
- };
- var isInsertTextDataNull = function (event) {
- return event.inputType === 'insertText' && event.data === null;
- };
- editor.on('input', function (e) {
- if (e.inputType && (isInsertReplacementText(e) || isInsertTextDataNull(e))) {
- addNonTypingUndoLevel(e);
- }
- });
- editor.addShortcut('meta+z', '', 'Undo');
- editor.addShortcut('meta+y,meta+shift+z', '', 'Redo');
- editor.on('AddUndo Undo Redo ClearUndos', function (e) {
- if (!e.isDefaultPrevented()) {
- editor.nodeChanged();
- }
- });
- self = {
- data: data,
- typing: false,
- beforeChange: function () {
- if (isUnlocked()) {
- beforeBookmark = GetBookmark.getUndoBookmark(editor.selection);
- }
- },
- add: function (level, event) {
- var i;
- var settings = editor.settings;
- var lastLevel, currentLevel;
- currentLevel = Levels.createFromEditor(editor);
- level = level || {};
- level = Tools.extend(level, currentLevel);
- if (isUnlocked() === false || editor.removed) {
- return null;
- }
- lastLevel = data[index];
- if (editor.fire('BeforeAddUndo', {
- level: level,
- lastLevel: lastLevel,
- originalEvent: event
- }).isDefaultPrevented()) {
- return null;
- }
- if (lastLevel && Levels.isEq(lastLevel, level)) {
- return null;
- }
- if (data[index]) {
- data[index].beforeBookmark = beforeBookmark;
- }
- if (settings.custom_undo_redo_levels) {
- if (data.length > settings.custom_undo_redo_levels) {
- for (i = 0; i < data.length - 1; i++) {
- data[i] = data[i + 1];
- }
- data.length--;
- index = data.length;
- }
- }
- level.bookmark = GetBookmark.getUndoBookmark(editor.selection);
- if (index < data.length - 1) {
- data.length = index + 1;
- }
- data.push(level);
- index = data.length - 1;
- var args = {
- level: level,
- lastLevel: lastLevel,
- originalEvent: event
- };
- editor.fire('AddUndo', args);
- if (index > 0) {
- setDirty(true);
- editor.fire('change', args);
- }
- return level;
- },
- undo: function () {
- var level;
- if (self.typing) {
- self.add();
- self.typing = false;
- setTyping(false);
- }
- if (index > 0) {
- level = data[--index];
- Levels.applyToEditor(editor, level, true);
- setDirty(true);
- editor.fire('undo', { level: level });
- }
- return level;
- },
- redo: function () {
- var level;
- if (index < data.length - 1) {
- level = data[++index];
- Levels.applyToEditor(editor, level, false);
- setDirty(true);
- editor.fire('redo', { level: level });
- }
- return level;
- },
- clear: function () {
- data = [];
- index = 0;
- self.typing = false;
- self.data = data;
- editor.fire('ClearUndos');
- },
- hasUndo: function () {
- return index > 0 || self.typing && data[0] && !Levels.isEq(Levels.createFromEditor(editor), data[0]);
- },
- hasRedo: function () {
- return index < data.length - 1 && !self.typing;
- },
- transact: function (callback) {
- endTyping();
- self.beforeChange();
- self.ignore(callback);
- return self.add();
- },
- ignore: function (callback) {
- try {
- locks++;
- callback();
- } finally {
- locks--;
- }
- },
- extra: function (callback1, callback2) {
- var lastLevel, bookmark;
- if (self.transact(callback1)) {
- bookmark = data[index].bookmark;
- lastLevel = data[index - 1];
- Levels.applyToEditor(editor, lastLevel, true);
- if (self.transact(callback2)) {
- data[index - 1].beforeBookmark = bookmark;
- }
- }
- }
- };
- return self;
- }
-
- var postProcessHooks = {}, filter$2 = ArrUtils.filter, each$c = ArrUtils.each;
- var addPostProcessHook = function (name, hook) {
- var hooks = postProcessHooks[name];
- if (!hooks) {
- postProcessHooks[name] = hooks = [];
- }
- postProcessHooks[name].push(hook);
- };
- var postProcess = function (name, editor) {
- each$c(postProcessHooks[name], function (hook) {
- hook(editor);
- });
- };
- addPostProcessHook('pre', function (editor) {
- var rng = editor.selection.getRng();
- var isPre, blocks;
- var hasPreSibling = function (pre) {
- return isPre(pre.previousSibling) && ArrUtils.indexOf(blocks, pre.previousSibling) !== -1;
- };
- var joinPre = function (pre1, pre2) {
- DomQuery(pre2).remove();
- DomQuery(pre1).append(' ').append(pre2.childNodes);
- };
- isPre = NodeType.matchNodeNames('pre');
- if (!rng.collapsed) {
- blocks = editor.selection.getSelectedBlocks();
- each$c(filter$2(filter$2(blocks, isPre), hasPreSibling), function (pre) {
- joinPre(pre.previousSibling, pre);
- });
- }
- });
- var Hooks = { postProcess: postProcess };
-
- var MCE_ATTR_RE = /^(src|href|style)$/;
- var each$d = Tools.each;
- var isEq$5 = FormatUtils.isEq;
- var isTableCell$4 = function (node) {
- return /^(TH|TD)$/.test(node.nodeName);
- };
- var isChildOfInlineParent = function (dom, node, parent) {
- return dom.isChildOf(node, parent) && node !== parent && !dom.isBlock(parent);
- };
- var getContainer = function (ed, rng, start) {
- var container, offset, lastIdx;
- container = rng[start ? 'startContainer' : 'endContainer'];
- offset = rng[start ? 'startOffset' : 'endOffset'];
- if (NodeType.isElement(container)) {
- lastIdx = container.childNodes.length - 1;
- if (!start && offset) {
- offset--;
- }
- container = container.childNodes[offset > lastIdx ? lastIdx : offset];
- }
- if (NodeType.isText(container) && start && offset >= container.nodeValue.length) {
- container = new TreeWalker(container, ed.getBody()).next() || container;
- }
- if (NodeType.isText(container) && !start && offset === 0) {
- container = new TreeWalker(container, ed.getBody()).prev() || container;
- }
- return container;
- };
- var wrap$2 = function (dom, node, name, attrs) {
- var wrapper = dom.create(name, attrs);
- node.parentNode.insertBefore(wrapper, node);
- wrapper.appendChild(node);
- return wrapper;
- };
- var wrapWithSiblings = function (dom, node, next, name, attrs) {
- var start = Element.fromDom(node);
- var wrapper = Element.fromDom(dom.create(name, attrs));
- var siblings = next ? nextSiblings(start) : prevSiblings(start);
- append$1(wrapper, siblings);
- if (next) {
- before(start, wrapper);
- prepend(wrapper, start);
- } else {
- after(start, wrapper);
- append(wrapper, start);
- }
- return wrapper.dom();
- };
- var matchName$1 = function (dom, node, format) {
- if (isEq$5(node, format.inline)) {
- return true;
- }
- if (isEq$5(node, format.block)) {
- return true;
- }
- if (format.selector) {
- return NodeType.isElement(node) && dom.is(node, format.selector);
- }
- };
- var isColorFormatAndAnchor = function (node, format) {
- return format.links && node.tagName === 'A';
- };
- var find$3 = function (dom, node, next, inc) {
- node = FormatUtils.getNonWhiteSpaceSibling(node, next, inc);
- return !node || (node.nodeName === 'BR' || dom.isBlock(node));
- };
- var removeNode$1 = function (ed, node, format) {
- var parentNode = node.parentNode;
- var rootBlockElm;
- var dom = ed.dom, forcedRootBlock = ed.settings.forced_root_block;
- if (format.block) {
- if (!forcedRootBlock) {
- if (dom.isBlock(node) && !dom.isBlock(parentNode)) {
- if (!find$3(dom, node, false) && !find$3(dom, node.firstChild, true, 1)) {
- node.insertBefore(dom.create('br'), node.firstChild);
- }
- if (!find$3(dom, node, true) && !find$3(dom, node.lastChild, false, 1)) {
- node.appendChild(dom.create('br'));
- }
- }
- } else {
- if (parentNode === dom.getRoot()) {
- if (!format.list_block || !isEq$5(node, format.list_block)) {
- each$d(Tools.grep(node.childNodes), function (node) {
- if (FormatUtils.isValid(ed, forcedRootBlock, node.nodeName.toLowerCase())) {
- if (!rootBlockElm) {
- rootBlockElm = wrap$2(dom, node, forcedRootBlock);
- dom.setAttribs(rootBlockElm, ed.settings.forced_root_block_attrs);
- } else {
- rootBlockElm.appendChild(node);
- }
- } else {
- rootBlockElm = 0;
- }
- });
- }
- }
- }
- }
- if (format.selector && format.inline && !isEq$5(format.inline, node)) {
- return;
- }
- dom.remove(node, 1);
- };
- var removeFormat = function (ed, format, vars, node, compareNode) {
- var i, attrs, stylesModified;
- var dom = ed.dom;
- if (!matchName$1(dom, node, format) && !isColorFormatAndAnchor(node, format)) {
- return false;
- }
- if (format.remove !== 'all') {
- each$d(format.styles, function (value, name) {
- value = FormatUtils.normalizeStyleValue(dom, FormatUtils.replaceVars(value, vars), name);
- if (typeof name === 'number') {
- name = value;
- compareNode = 0;
- }
- if (format.remove_similar || (!compareNode || isEq$5(FormatUtils.getStyle(dom, compareNode, name), value))) {
- dom.setStyle(node, name, '');
- }
- stylesModified = 1;
- });
- if (stylesModified && dom.getAttrib(node, 'style') === '') {
- node.removeAttribute('style');
- node.removeAttribute('data-mce-style');
- }
- each$d(format.attributes, function (value, name) {
- var valueOut;
- value = FormatUtils.replaceVars(value, vars);
- if (typeof name === 'number') {
- name = value;
- compareNode = 0;
- }
- if (!compareNode || isEq$5(dom.getAttrib(compareNode, name), value)) {
- if (name === 'class') {
- value = dom.getAttrib(node, name);
- if (value) {
- valueOut = '';
- each$d(value.split(/\s+/), function (cls) {
- if (/mce\-\w+/.test(cls)) {
- valueOut += (valueOut ? ' ' : '') + cls;
- }
- });
- if (valueOut) {
- dom.setAttrib(node, name, valueOut);
- return;
- }
- }
- }
- if (name === 'class') {
- node.removeAttribute('className');
- }
- if (MCE_ATTR_RE.test(name)) {
- node.removeAttribute('data-mce-' + name);
- }
- node.removeAttribute(name);
- }
- });
- each$d(format.classes, function (value) {
- value = FormatUtils.replaceVars(value, vars);
- if (!compareNode || dom.hasClass(compareNode, value)) {
- dom.removeClass(node, value);
- }
- });
- attrs = dom.getAttribs(node);
- for (i = 0; i < attrs.length; i++) {
- var attrName = attrs[i].nodeName;
- if (attrName.indexOf('_') !== 0 && attrName.indexOf('data-') !== 0) {
- return false;
- }
- }
- }
- if (format.remove !== 'none') {
- removeNode$1(ed, node, format);
- return true;
- }
- };
- var findFormatRoot = function (editor, container, name, vars, similar) {
- var formatRoot;
- each$d(FormatUtils.getParents(editor.dom, container.parentNode).reverse(), function (parent) {
- var format;
- if (!formatRoot && parent.id !== '_start' && parent.id !== '_end') {
- format = MatchFormat.matchNode(editor, parent, name, vars, similar);
- if (format && format.split !== false) {
- formatRoot = parent;
- }
- }
- });
- return formatRoot;
- };
- var wrapAndSplit = function (editor, formatList, formatRoot, container, target, split, format, vars) {
- var parent, clone, lastClone, firstClone, i, formatRootParent;
- var dom = editor.dom;
- if (formatRoot) {
- formatRootParent = formatRoot.parentNode;
- for (parent = container.parentNode; parent && parent !== formatRootParent; parent = parent.parentNode) {
- clone = dom.clone(parent, false);
- for (i = 0; i < formatList.length; i++) {
- if (removeFormat(editor, formatList[i], vars, clone, clone)) {
- clone = 0;
- break;
- }
- }
- if (clone) {
- if (lastClone) {
- clone.appendChild(lastClone);
- }
- if (!firstClone) {
- firstClone = clone;
- }
- lastClone = clone;
- }
- }
- if (split && (!format.mixed || !dom.isBlock(formatRoot))) {
- container = dom.split(formatRoot, container);
- }
- if (lastClone) {
- target.parentNode.insertBefore(lastClone, target);
- firstClone.appendChild(target);
- }
- }
- return container;
- };
- var remove$6 = function (ed, name, vars, node, similar) {
- var formatList = ed.formatter.get(name), format = formatList[0];
- var bookmark, rng, contentEditable = true;
- var dom = ed.dom;
- var selection = ed.selection;
- var splitToFormatRoot = function (container) {
- var formatRoot = findFormatRoot(ed, container, name, vars, similar);
- return wrapAndSplit(ed, formatList, formatRoot, container, container, true, format, vars);
- };
- var isRemoveBookmarkNode = function (node) {
- return Bookmarks.isBookmarkNode(node) && NodeType.isElement(node) && (node.id === '_start' || node.id === '_end');
- };
- var process = function (node) {
- var children, i, l, lastContentEditable, hasContentEditableState;
- if (NodeType.isElement(node) && dom.getContentEditable(node)) {
- lastContentEditable = contentEditable;
- contentEditable = dom.getContentEditable(node) === 'true';
- hasContentEditableState = true;
- }
- children = Tools.grep(node.childNodes);
- if (contentEditable && !hasContentEditableState) {
- for (i = 0, l = formatList.length; i < l; i++) {
- if (removeFormat(ed, formatList[i], vars, node, node)) {
- break;
- }
- }
- }
- if (format.deep) {
- if (children.length) {
- for (i = 0, l = children.length; i < l; i++) {
- process(children[i]);
- }
- if (hasContentEditableState) {
- contentEditable = lastContentEditable;
- }
- }
- }
- };
- var unwrap = function (start) {
- var node = dom.get(start ? '_start' : '_end');
- var out = node[start ? 'firstChild' : 'lastChild'];
- if (isRemoveBookmarkNode(out)) {
- out = out[start ? 'firstChild' : 'lastChild'];
- }
- if (NodeType.isText(out) && out.data.length === 0) {
- out = start ? node.previousSibling || node.nextSibling : node.nextSibling || node.previousSibling;
- }
- dom.remove(node, true);
- return out;
- };
- var removeRngStyle = function (rng) {
- var startContainer, endContainer;
- var commonAncestorContainer = rng.commonAncestorContainer;
- rng = ExpandRange.expandRng(ed, rng, formatList, true);
- if (format.split) {
- rng = SplitRange.split(rng);
- startContainer = getContainer(ed, rng, true);
- endContainer = getContainer(ed, rng);
- if (startContainer !== endContainer) {
- if (/^(TR|TH|TD)$/.test(startContainer.nodeName) && startContainer.firstChild) {
- if (startContainer.nodeName === 'TR') {
- startContainer = startContainer.firstChild.firstChild || startContainer;
- } else {
- startContainer = startContainer.firstChild || startContainer;
- }
- }
- if (commonAncestorContainer && /^T(HEAD|BODY|FOOT|R)$/.test(commonAncestorContainer.nodeName) && isTableCell$4(endContainer) && endContainer.firstChild) {
- endContainer = endContainer.firstChild || endContainer;
- }
- if (isChildOfInlineParent(dom, startContainer, endContainer)) {
- var marker = Option.from(startContainer.firstChild).getOr(startContainer);
- splitToFormatRoot(wrapWithSiblings(dom, marker, true, 'span', {
- 'id': '_start',
- 'data-mce-type': 'bookmark'
- }));
- unwrap(true);
- return;
- }
- if (isChildOfInlineParent(dom, endContainer, startContainer)) {
- var marker = Option.from(endContainer.lastChild).getOr(endContainer);
- splitToFormatRoot(wrapWithSiblings(dom, marker, false, 'span', {
- 'id': '_end',
- 'data-mce-type': 'bookmark'
- }));
- unwrap(false);
- return;
- }
- startContainer = wrap$2(dom, startContainer, 'span', {
- 'id': '_start',
- 'data-mce-type': 'bookmark'
- });
- endContainer = wrap$2(dom, endContainer, 'span', {
- 'id': '_end',
- 'data-mce-type': 'bookmark'
- });
- splitToFormatRoot(startContainer);
- splitToFormatRoot(endContainer);
- startContainer = unwrap(true);
- endContainer = unwrap();
- } else {
- startContainer = endContainer = splitToFormatRoot(startContainer);
- }
- rng.startContainer = startContainer.parentNode ? startContainer.parentNode : startContainer;
- rng.startOffset = dom.nodeIndex(startContainer);
- rng.endContainer = endContainer.parentNode ? endContainer.parentNode : endContainer;
- rng.endOffset = dom.nodeIndex(endContainer) + 1;
- }
- RangeWalk.walk(dom, rng, function (nodes) {
- each$d(nodes, function (node) {
- process(node);
- if (NodeType.isElement(node) && ed.dom.getStyle(node, 'text-decoration') === 'underline' && node.parentNode && FormatUtils.getTextDecoration(dom, node.parentNode) === 'underline') {
- removeFormat(ed, {
- deep: false,
- exact: true,
- inline: 'span',
- styles: { textDecoration: 'underline' }
- }, null, node);
- }
- });
- });
- };
- if (node) {
- if (node.nodeType) {
- rng = dom.createRng();
- rng.setStartBefore(node);
- rng.setEndAfter(node);
- removeRngStyle(rng);
- } else {
- removeRngStyle(node);
- }
- return;
- }
- if (dom.getContentEditable(selection.getNode()) === 'false') {
- node = selection.getNode();
- for (var i = 0, l = formatList.length; i < l; i++) {
- if (formatList[i].ceFalseOverride) {
- if (removeFormat(ed, formatList[i], vars, node, node)) {
- break;
- }
- }
- }
- return;
- }
- if (!selection.isCollapsed() || !format.inline || dom.select('td[data-mce-selected],th[data-mce-selected]').length) {
- bookmark = GetBookmark.getPersistentBookmark(ed.selection, true);
- removeRngStyle(selection.getRng());
- selection.moveToBookmark(bookmark);
- if (format.inline && MatchFormat.match(ed, name, vars, selection.getStart())) {
- FormatUtils.moveStart(dom, selection, selection.getRng());
- }
- ed.nodeChanged();
- } else {
- removeCaretFormat(ed, name, vars, similar);
- }
- };
- var RemoveFormat = {
- removeFormat: removeFormat,
- remove: remove$6
- };
-
- var each$e = Tools.each;
- var isElementNode = function (node) {
- return node && node.nodeType === 1 && !Bookmarks.isBookmarkNode(node) && !isCaretNode(node) && !NodeType.isBogus(node);
- };
- var findElementSibling = function (node, siblingName) {
- var sibling;
- for (sibling = node; sibling; sibling = sibling[siblingName]) {
- if (sibling.nodeType === 3 && sibling.nodeValue.length !== 0) {
- return node;
- }
- if (sibling.nodeType === 1 && !Bookmarks.isBookmarkNode(sibling)) {
- return sibling;
- }
- }
- return node;
- };
- var mergeSiblingsNodes = function (dom, prev, next) {
- var sibling, tmpSibling;
- var elementUtils = new ElementUtils(dom);
- if (prev && next) {
- prev = findElementSibling(prev, 'previousSibling');
- next = findElementSibling(next, 'nextSibling');
- if (elementUtils.compare(prev, next)) {
- for (sibling = prev.nextSibling; sibling && sibling !== next;) {
- tmpSibling = sibling;
- sibling = sibling.nextSibling;
- prev.appendChild(tmpSibling);
- }
- dom.remove(next);
- Tools.each(Tools.grep(next.childNodes), function (node) {
- prev.appendChild(node);
- });
- return prev;
- }
- }
- return next;
- };
- var processChildElements = function (node, filter, process) {
- each$e(node.childNodes, function (node) {
- if (isElementNode(node)) {
- if (filter(node)) {
- process(node);
- }
- if (node.hasChildNodes()) {
- processChildElements(node, filter, process);
- }
- }
- });
- };
- var hasStyle = function (dom, name) {
- return curry(function (name, node) {
- return !!(node && FormatUtils.getStyle(dom, node, name));
- }, name);
- };
- var applyStyle = function (dom, name, value) {
- return curry(function (name, value, node) {
- dom.setStyle(node, name, value);
- if (node.getAttribute('style') === '') {
- node.removeAttribute('style');
- }
- unwrapEmptySpan(dom, node);
- }, name, value);
- };
- var unwrapEmptySpan = function (dom, node) {
- if (node.nodeName === 'SPAN' && dom.getAttribs(node).length === 0) {
- dom.remove(node, true);
- }
- };
- var processUnderlineAndColor = function (dom, node) {
- var textDecoration;
- if (node.nodeType === 1 && node.parentNode && node.parentNode.nodeType === 1) {
- textDecoration = FormatUtils.getTextDecoration(dom, node.parentNode);
- if (dom.getStyle(node, 'color') && textDecoration) {
- dom.setStyle(node, 'text-decoration', textDecoration);
- } else if (dom.getStyle(node, 'text-decoration') === textDecoration) {
- dom.setStyle(node, 'text-decoration', null);
- }
- }
- };
- var mergeUnderlineAndColor = function (dom, format, vars, node) {
- if (format.styles.color || format.styles.textDecoration) {
- Tools.walk(node, curry(processUnderlineAndColor, dom), 'childNodes');
- processUnderlineAndColor(dom, node);
- }
- };
- var mergeBackgroundColorAndFontSize = function (dom, format, vars, node) {
- if (format.styles && format.styles.backgroundColor) {
- processChildElements(node, hasStyle(dom, 'fontSize'), applyStyle(dom, 'backgroundColor', FormatUtils.replaceVars(format.styles.backgroundColor, vars)));
- }
- };
- var mergeSubSup = function (dom, format, vars, node) {
- if (format.inline === 'sub' || format.inline === 'sup') {
- processChildElements(node, hasStyle(dom, 'fontSize'), applyStyle(dom, 'fontSize', ''));
- dom.remove(dom.select(format.inline === 'sup' ? 'sub' : 'sup', node), true);
- }
- };
- var mergeSiblings = function (dom, format, vars, node) {
- if (node && format.merge_siblings !== false) {
- node = mergeSiblingsNodes(dom, FormatUtils.getNonWhiteSpaceSibling(node), node);
- node = mergeSiblingsNodes(dom, node, FormatUtils.getNonWhiteSpaceSibling(node, true));
- }
- };
- var clearChildStyles = function (dom, format, node) {
- if (format.clear_child_styles) {
- var selector = format.links ? '*:not(a)' : '*';
- each$e(dom.select(selector, node), function (node) {
- if (isElementNode(node)) {
- each$e(format.styles, function (value, name) {
- dom.setStyle(node, name, '');
- });
- }
- });
- }
- };
- var mergeWithChildren = function (editor, formatList, vars, node) {
- each$e(formatList, function (format) {
- each$e(editor.dom.select(format.inline, node), function (child) {
- if (!isElementNode(child)) {
- return;
- }
- RemoveFormat.removeFormat(editor, format, vars, child, format.exact ? child : null);
- });
- clearChildStyles(editor.dom, format, node);
- });
- };
- var mergeWithParents = function (editor, format, name, vars, node) {
- if (MatchFormat.matchNode(editor, node.parentNode, name, vars)) {
- if (RemoveFormat.removeFormat(editor, format, vars, node)) {
- return;
- }
- }
- if (format.merge_with_parents) {
- editor.dom.getParent(node.parentNode, function (parent) {
- if (MatchFormat.matchNode(editor, parent, name, vars)) {
- RemoveFormat.removeFormat(editor, format, vars, node);
- return true;
- }
- });
- }
- };
- var MergeFormats = {
- mergeWithChildren: mergeWithChildren,
- mergeUnderlineAndColor: mergeUnderlineAndColor,
- mergeBackgroundColorAndFontSize: mergeBackgroundColorAndFontSize,
- mergeSubSup: mergeSubSup,
- mergeSiblings: mergeSiblings,
- mergeWithParents: mergeWithParents
- };
-
- var each$f = Tools.each;
- var isElementNode$1 = function (node) {
- return node && node.nodeType === 1 && !Bookmarks.isBookmarkNode(node) && !isCaretNode(node) && !NodeType.isBogus(node);
- };
- var applyFormat = function (ed, name, vars, node) {
- var formatList = ed.formatter.get(name);
- var format = formatList[0];
- var bookmark, rng;
- var isCollapsed = !node && ed.selection.isCollapsed();
- var dom = ed.dom, selection = ed.selection;
- var setElementFormat = function (elm, fmt) {
- fmt = fmt || format;
- if (elm) {
- if (fmt.onformat) {
- fmt.onformat(elm, fmt, vars, node);
- }
- each$f(fmt.styles, function (value, name) {
- dom.setStyle(elm, name, FormatUtils.replaceVars(value, vars));
- });
- if (fmt.styles) {
- var styleVal = dom.getAttrib(elm, 'style');
- if (styleVal) {
- elm.setAttribute('data-mce-style', styleVal);
- }
- }
- each$f(fmt.attributes, function (value, name) {
- dom.setAttrib(elm, name, FormatUtils.replaceVars(value, vars));
- });
- each$f(fmt.classes, function (value) {
- value = FormatUtils.replaceVars(value, vars);
- if (!dom.hasClass(elm, value)) {
- dom.addClass(elm, value);
- }
- });
- }
- };
- var applyNodeStyle = function (formatList, node) {
- var found = false;
- if (!format.selector) {
- return false;
- }
- each$f(formatList, function (format) {
- if ('collapsed' in format && format.collapsed !== isCollapsed) {
- return;
- }
- if (dom.is(node, format.selector) && !isCaretNode(node)) {
- setElementFormat(node, format);
- found = true;
- return false;
- }
- });
- return found;
- };
- var applyRngStyle = function (dom, rng, bookmark, nodeSpecific) {
- var newWrappers = [];
- var wrapName, wrapElm, contentEditable = true;
- wrapName = format.inline || format.block;
- wrapElm = dom.create(wrapName);
- setElementFormat(wrapElm);
- RangeWalk.walk(dom, rng, function (nodes) {
- var currentWrapElm;
- var process = function (node) {
- var nodeName, parentName, hasContentEditableState, lastContentEditable;
- lastContentEditable = contentEditable;
- nodeName = node.nodeName.toLowerCase();
- parentName = node.parentNode.nodeName.toLowerCase();
- if (node.nodeType === 1 && dom.getContentEditable(node)) {
- lastContentEditable = contentEditable;
- contentEditable = dom.getContentEditable(node) === 'true';
- hasContentEditableState = true;
- }
- if (FormatUtils.isEq(nodeName, 'br')) {
- currentWrapElm = 0;
- if (format.block) {
- dom.remove(node);
- }
- return;
- }
- if (format.wrapper && MatchFormat.matchNode(ed, node, name, vars)) {
- currentWrapElm = 0;
- return;
- }
- if (contentEditable && !hasContentEditableState && format.block && !format.wrapper && FormatUtils.isTextBlock(ed, nodeName) && FormatUtils.isValid(ed, parentName, wrapName)) {
- node = dom.rename(node, wrapName);
- setElementFormat(node);
- newWrappers.push(node);
- currentWrapElm = 0;
- return;
- }
- if (format.selector) {
- var found = applyNodeStyle(formatList, node);
- if (!format.inline || found) {
- currentWrapElm = 0;
- return;
- }
- }
- if (contentEditable && !hasContentEditableState && FormatUtils.isValid(ed, wrapName, nodeName) && FormatUtils.isValid(ed, parentName, wrapName) && !(!nodeSpecific && node.nodeType === 3 && node.nodeValue.length === 1 && node.nodeValue.charCodeAt(0) === 65279) && !isCaretNode(node) && (!format.inline || !dom.isBlock(node))) {
- if (!currentWrapElm) {
- currentWrapElm = dom.clone(wrapElm, false);
- node.parentNode.insertBefore(currentWrapElm, node);
- newWrappers.push(currentWrapElm);
- }
- currentWrapElm.appendChild(node);
- } else {
- currentWrapElm = 0;
- each$f(Tools.grep(node.childNodes), process);
- if (hasContentEditableState) {
- contentEditable = lastContentEditable;
- }
- currentWrapElm = 0;
- }
- };
- each$f(nodes, process);
- });
- if (format.links === true) {
- each$f(newWrappers, function (node) {
- var process = function (node) {
- if (node.nodeName === 'A') {
- setElementFormat(node, format);
- }
- each$f(Tools.grep(node.childNodes), process);
- };
- process(node);
- });
- }
- each$f(newWrappers, function (node) {
- var childCount;
- var getChildCount = function (node) {
- var count = 0;
- each$f(node.childNodes, function (node) {
- if (!FormatUtils.isWhiteSpaceNode(node) && !Bookmarks.isBookmarkNode(node)) {
- count++;
- }
- });
- return count;
- };
- var getChildElementNode = function (root) {
- var child = false;
- each$f(root.childNodes, function (node) {
- if (isElementNode$1(node)) {
- child = node;
- return false;
- }
- });
- return child;
- };
- var mergeStyles = function (node) {
- var child, clone;
- child = getChildElementNode(node);
- if (child && !Bookmarks.isBookmarkNode(child) && MatchFormat.matchName(dom, child, format)) {
- clone = dom.clone(child, false);
- setElementFormat(clone);
- dom.replace(clone, node, true);
- dom.remove(child, 1);
- }
- return clone || node;
- };
- childCount = getChildCount(node);
- if ((newWrappers.length > 1 || !dom.isBlock(node)) && childCount === 0) {
- dom.remove(node, 1);
- return;
- }
- if (format.inline || format.wrapper) {
- if (!format.exact && childCount === 1) {
- node = mergeStyles(node);
- }
- MergeFormats.mergeWithChildren(ed, formatList, vars, node);
- MergeFormats.mergeWithParents(ed, format, name, vars, node);
- MergeFormats.mergeBackgroundColorAndFontSize(dom, format, vars, node);
- MergeFormats.mergeSubSup(dom, format, vars, node);
- MergeFormats.mergeSiblings(dom, format, vars, node);
- }
- });
- };
- if (dom.getContentEditable(selection.getNode()) === 'false') {
- node = selection.getNode();
- for (var i = 0, l = formatList.length; i < l; i++) {
- if (formatList[i].ceFalseOverride && dom.is(node, formatList[i].selector)) {
- setElementFormat(node, formatList[i]);
- return;
- }
- }
- return;
- }
- if (format) {
- if (node) {
- if (node.nodeType) {
- if (!applyNodeStyle(formatList, node)) {
- rng = dom.createRng();
- rng.setStartBefore(node);
- rng.setEndAfter(node);
- applyRngStyle(dom, ExpandRange.expandRng(ed, rng, formatList), null, true);
- }
- } else {
- applyRngStyle(dom, node, null, true);
- }
- } else {
- if (!isCollapsed || !format.inline || dom.select('td[data-mce-selected],th[data-mce-selected]').length) {
- var curSelNode = ed.selection.getNode();
- if (!ed.settings.forced_root_block && formatList[0].defaultBlock && !dom.getParent(curSelNode, dom.isBlock)) {
- applyFormat(ed, formatList[0].defaultBlock);
- }
- ed.selection.setRng(RangeNormalizer.normalize(ed.selection.getRng()));
- bookmark = GetBookmark.getPersistentBookmark(ed.selection, true);
- applyRngStyle(dom, ExpandRange.expandRng(ed, selection.getRng(), formatList));
- if (format.styles) {
- MergeFormats.mergeUnderlineAndColor(dom, format, vars, curSelNode);
- }
- selection.moveToBookmark(bookmark);
- FormatUtils.moveStart(dom, selection, selection.getRng());
- ed.nodeChanged();
- } else {
- applyCaretFormat(ed, name, vars);
- }
- }
- Hooks.postProcess(name, ed);
- }
- };
- var ApplyFormat = { applyFormat: applyFormat };
-
- var each$g = Tools.each;
- var setup$5 = function (formatChangeData, editor) {
- var currentFormats = {};
- formatChangeData.set({});
- editor.on('NodeChange', function (e) {
- var parents = FormatUtils.getParents(editor.dom, e.element);
- var matchedFormats = {};
- parents = Tools.grep(parents, function (node) {
- return node.nodeType === 1 && !node.getAttribute('data-mce-bogus');
- });
- each$g(formatChangeData.get(), function (callbacks, format) {
- each$g(parents, function (node) {
- if (editor.formatter.matchNode(node, format, {}, callbacks.similar)) {
- if (!currentFormats[format]) {
- each$g(callbacks, function (callback) {
- callback(true, {
- node: node,
- format: format,
- parents: parents
- });
- });
- currentFormats[format] = callbacks;
- }
- matchedFormats[format] = callbacks;
- return false;
- }
- if (MatchFormat.matchesUnInheritedFormatSelector(editor, node, format)) {
- return false;
- }
- });
- });
- each$g(currentFormats, function (callbacks, format) {
- if (!matchedFormats[format]) {
- delete currentFormats[format];
- each$g(callbacks, function (callback) {
- callback(false, {
- node: e.element,
- format: format,
- parents: parents
- });
- });
- }
- });
- });
- };
- var addListeners = function (formatChangeData, formats, callback, similar) {
- var formatChangeItems = formatChangeData.get();
- each$g(formats.split(','), function (format) {
- if (!formatChangeItems[format]) {
- formatChangeItems[format] = [];
- formatChangeItems[format].similar = similar;
- }
- formatChangeItems[format].push(callback);
- });
- formatChangeData.set(formatChangeItems);
- };
- var formatChanged = function (editor, formatChangeState, formats, callback, similar) {
- if (formatChangeState.get() === null) {
- setup$5(formatChangeState, editor);
- }
- addListeners(formatChangeState, formats, callback, similar);
- };
- var FormatChanged = { formatChanged: formatChanged };
-
- var get$5 = function (dom) {
- var formats = {
- valigntop: [{
- selector: 'td,th',
- styles: { verticalAlign: 'top' }
- }],
- valignmiddle: [{
- selector: 'td,th',
- styles: { verticalAlign: 'middle' }
- }],
- valignbottom: [{
- selector: 'td,th',
- styles: { verticalAlign: 'bottom' }
- }],
- alignleft: [
- {
- selector: 'figure.image',
- collapsed: false,
- classes: 'align-left',
- ceFalseOverride: true,
- preview: 'font-family font-size'
- },
- {
- selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li',
- styles: { textAlign: 'left' },
- inherit: false,
- preview: false,
- defaultBlock: 'div'
- },
- {
- selector: 'img,table',
- collapsed: false,
- styles: { float: 'left' },
- preview: 'font-family font-size'
- }
- ],
- aligncenter: [
- {
- selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li',
- styles: { textAlign: 'center' },
- inherit: false,
- preview: 'font-family font-size',
- defaultBlock: 'div'
- },
- {
- selector: 'figure.image',
- collapsed: false,
- classes: 'align-center',
- ceFalseOverride: true,
- preview: 'font-family font-size'
- },
- {
- selector: 'img',
- collapsed: false,
- styles: {
- display: 'block',
- marginLeft: 'auto',
- marginRight: 'auto'
- },
- preview: false
- },
- {
- selector: 'table',
- collapsed: false,
- styles: {
- marginLeft: 'auto',
- marginRight: 'auto'
- },
- preview: 'font-family font-size'
- }
- ],
- alignright: [
- {
- selector: 'figure.image',
- collapsed: false,
- classes: 'align-right',
- ceFalseOverride: true,
- preview: 'font-family font-size'
- },
- {
- selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li',
- styles: { textAlign: 'right' },
- inherit: false,
- preview: 'font-family font-size',
- defaultBlock: 'div'
- },
- {
- selector: 'img,table',
- collapsed: false,
- styles: { float: 'right' },
- preview: 'font-family font-size'
- }
- ],
- alignjustify: [{
- selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li',
- styles: { textAlign: 'justify' },
- inherit: false,
- defaultBlock: 'div',
- preview: 'font-family font-size'
- }],
- bold: [
- {
- inline: 'strong',
- remove: 'all'
- },
- {
- inline: 'span',
- styles: { fontWeight: 'bold' }
- },
- {
- inline: 'b',
- remove: 'all'
- }
- ],
- italic: [
- {
- inline: 'em',
- remove: 'all'
- },
- {
- inline: 'span',
- styles: { fontStyle: 'italic' }
- },
- {
- inline: 'i',
- remove: 'all'
- }
- ],
- underline: [
- {
- inline: 'span',
- styles: { textDecoration: 'underline' },
- exact: true
- },
- {
- inline: 'u',
- remove: 'all'
- }
- ],
- strikethrough: [
- {
- inline: 'span',
- styles: { textDecoration: 'line-through' },
- exact: true
- },
- {
- inline: 'strike',
- remove: 'all'
- }
- ],
- forecolor: {
- inline: 'span',
- styles: { color: '%value' },
- links: true,
- remove_similar: true,
- clear_child_styles: true
- },
- hilitecolor: {
- inline: 'span',
- styles: { backgroundColor: '%value' },
- links: true,
- remove_similar: true,
- clear_child_styles: true
- },
- fontname: {
- inline: 'span',
- toggle: false,
- styles: { fontFamily: '%value' },
- clear_child_styles: true
- },
- fontsize: {
- inline: 'span',
- toggle: false,
- styles: { fontSize: '%value' },
- clear_child_styles: true
- },
- fontsize_class: {
- inline: 'span',
- attributes: { class: '%value' }
- },
- blockquote: {
- block: 'blockquote',
- wrapper: 1,
- remove: 'all'
- },
- subscript: { inline: 'sub' },
- superscript: { inline: 'sup' },
- code: { inline: 'code' },
- link: {
- inline: 'a',
- selector: 'a',
- remove: 'all',
- split: true,
- deep: true,
- onmatch: function () {
- return true;
- },
- onformat: function (elm, fmt, vars) {
- Tools.each(vars, function (value, key) {
- dom.setAttrib(elm, key, value);
- });
- }
- },
- removeformat: [
- {
- selector: 'b,strong,em,i,font,u,strike,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins',
- remove: 'all',
- split: true,
- expand: false,
- block_expand: true,
- deep: true
- },
- {
- selector: 'span',
- attributes: [
- 'style',
- 'class'
- ],
- remove: 'empty',
- split: true,
- expand: false,
- deep: true
- },
- {
- selector: '*',
- attributes: [
- 'style',
- 'class'
- ],
- split: false,
- expand: false,
- deep: true
- }
- ]
- };
- Tools.each('p h1 h2 h3 h4 h5 h6 div address pre div dt dd samp'.split(/\s/), function (name) {
- formats[name] = {
- block: name,
- remove: 'all'
- };
- });
- return formats;
- };
- var DefaultFormats = { get: get$5 };
-
- function FormatRegistry (editor) {
- var formats = {};
- var get = function (name) {
- return name ? formats[name] : formats;
- };
- var register = function (name, format) {
- if (name) {
- if (typeof name !== 'string') {
- Tools.each(name, function (format, name) {
- register(name, format);
- });
- } else {
- format = format.length ? format : [format];
- Tools.each(format, function (format) {
- if (typeof format.deep === 'undefined') {
- format.deep = !format.selector;
- }
- if (typeof format.split === 'undefined') {
- format.split = !format.selector || format.inline;
- }
- if (typeof format.remove === 'undefined' && format.selector && !format.inline) {
- format.remove = 'none';
- }
- if (format.selector && format.inline) {
- format.mixed = true;
- format.block_expand = true;
- }
- if (typeof format.classes === 'string') {
- format.classes = format.classes.split(/\s+/);
- }
- });
- formats[name] = format;
- }
- }
- };
- var unregister = function (name) {
- if (name && formats[name]) {
- delete formats[name];
- }
- return formats;
- };
- register(DefaultFormats.get(editor.dom));
- register(editor.settings.formats);
- return {
- get: get,
- register: register,
- unregister: unregister
- };
- }
-
- var each$h = Tools.each;
- var dom = DOMUtils$1.DOM;
- var parsedSelectorToHtml = function (ancestry, editor) {
- var elm, item, fragment;
- var schema = editor && editor.schema || Schema({});
- var decorate = function (elm, item) {
- if (item.classes.length) {
- dom.addClass(elm, item.classes.join(' '));
- }
- dom.setAttribs(elm, item.attrs);
- };
- var createElement = function (sItem) {
- var elm;
- item = typeof sItem === 'string' ? {
- name: sItem,
- classes: [],
- attrs: {}
- } : sItem;
- elm = dom.create(item.name);
- decorate(elm, item);
- return elm;
- };
- var getRequiredParent = function (elm, candidate) {
- var name = typeof elm !== 'string' ? elm.nodeName.toLowerCase() : elm;
- var elmRule = schema.getElementRule(name);
- var parentsRequired = elmRule && elmRule.parentsRequired;
- if (parentsRequired && parentsRequired.length) {
- return candidate && Tools.inArray(parentsRequired, candidate) !== -1 ? candidate : parentsRequired[0];
- } else {
- return false;
- }
- };
- var wrapInHtml = function (elm, ancestry, siblings) {
- var parent, parentCandidate, parentRequired;
- var ancestor = ancestry.length > 0 && ancestry[0];
- var ancestorName = ancestor && ancestor.name;
- parentRequired = getRequiredParent(elm, ancestorName);
- if (parentRequired) {
- if (ancestorName === parentRequired) {
- parentCandidate = ancestry[0];
- ancestry = ancestry.slice(1);
- } else {
- parentCandidate = parentRequired;
- }
- } else if (ancestor) {
- parentCandidate = ancestry[0];
- ancestry = ancestry.slice(1);
- } else if (!siblings) {
- return elm;
- }
- if (parentCandidate) {
- parent = createElement(parentCandidate);
- parent.appendChild(elm);
- }
- if (siblings) {
- if (!parent) {
- parent = dom.create('div');
- parent.appendChild(elm);
- }
- Tools.each(siblings, function (sibling) {
- var siblingElm = createElement(sibling);
- parent.insertBefore(siblingElm, elm);
- });
- }
- return wrapInHtml(parent, ancestry, parentCandidate && parentCandidate.siblings);
- };
- if (ancestry && ancestry.length) {
- item = ancestry[0];
- elm = createElement(item);
- fragment = dom.create('div');
- fragment.appendChild(wrapInHtml(elm, ancestry.slice(1), item.siblings));
- return fragment;
- } else {
- return '';
- }
- };
- var selectorToHtml = function (selector, editor) {
- return parsedSelectorToHtml(parseSelector(selector), editor);
- };
- var parseSelectorItem = function (item) {
- var tagName;
- var obj = {
- classes: [],
- attrs: {}
- };
- item = obj.selector = Tools.trim(item);
- if (item !== '*') {
- tagName = item.replace(/(?:([#\.]|::?)([\w\-]+)|(\[)([^\]]+)\]?)/g, function ($0, $1, $2, $3, $4) {
- switch ($1) {
- case '#':
- obj.attrs.id = $2;
- break;
- case '.':
- obj.classes.push($2);
- break;
- case ':':
- if (Tools.inArray('checked disabled enabled read-only required'.split(' '), $2) !== -1) {
- obj.attrs[$2] = $2;
- }
- break;
- }
- if ($3 === '[') {
- var m = $4.match(/([\w\-]+)(?:\=\"([^\"]+))?/);
- if (m) {
- obj.attrs[m[1]] = m[2];
- }
- }
- return '';
- });
- }
- obj.name = tagName || 'div';
- return obj;
- };
- var parseSelector = function (selector) {
- if (!selector || typeof selector !== 'string') {
- return [];
- }
- selector = selector.split(/\s*,\s*/)[0];
- selector = selector.replace(/\s*(~\+|~|\+|>)\s*/g, '$1');
- return Tools.map(selector.split(/(?:>|\s+(?![^\[\]]+\]))/), function (item) {
- var siblings = Tools.map(item.split(/(?:~\+|~|\+)/), parseSelectorItem);
- var obj = siblings.pop();
- if (siblings.length) {
- obj.siblings = siblings;
- }
- return obj;
- }).reverse();
- };
- var getCssText = function (editor, format) {
- var name, previewFrag, previewElm, items;
- var previewCss = '', parentFontSize, previewStyles;
- previewStyles = editor.settings.preview_styles;
- if (previewStyles === false) {
- return '';
- }
- if (typeof previewStyles !== 'string') {
- previewStyles = 'font-family font-size font-weight font-style text-decoration ' + 'text-transform color background-color border border-radius outline text-shadow';
- }
- var removeVars = function (val) {
- return val.replace(/%(\w+)/g, '');
- };
- if (typeof format === 'string') {
- format = editor.formatter.get(format);
- if (!format) {
- return;
- }
- format = format[0];
- }
- if ('preview' in format) {
- previewStyles = format.preview;
- if (previewStyles === false) {
- return '';
- }
- }
- name = format.block || format.inline || 'span';
- items = parseSelector(format.selector);
- if (items.length) {
- if (!items[0].name) {
- items[0].name = name;
- }
- name = format.selector;
- previewFrag = parsedSelectorToHtml(items, editor);
- } else {
- previewFrag = parsedSelectorToHtml([name], editor);
- }
- previewElm = dom.select(name, previewFrag)[0] || previewFrag.firstChild;
- each$h(format.styles, function (value, name) {
- value = removeVars(value);
- if (value) {
- dom.setStyle(previewElm, name, value);
- }
- });
- each$h(format.attributes, function (value, name) {
- value = removeVars(value);
- if (value) {
- dom.setAttrib(previewElm, name, value);
- }
- });
- each$h(format.classes, function (value) {
- value = removeVars(value);
- if (!dom.hasClass(previewElm, value)) {
- dom.addClass(previewElm, value);
- }
- });
- editor.fire('PreviewFormats');
- dom.setStyles(previewFrag, {
- position: 'absolute',
- left: -65535
- });
- editor.getBody().appendChild(previewFrag);
- parentFontSize = dom.getStyle(editor.getBody(), 'fontSize', true);
- parentFontSize = /px$/.test(parentFontSize) ? parseInt(parentFontSize, 10) : 0;
- each$h(previewStyles.split(' '), function (name) {
- var value = dom.getStyle(previewElm, name, true);
- if (name === 'background-color' && /transparent|rgba\s*\([^)]+,\s*0\)/.test(value)) {
- value = dom.getStyle(editor.getBody(), name, true);
- if (dom.toHex(value).toLowerCase() === '#ffffff') {
- return;
- }
- }
- if (name === 'color') {
- if (dom.toHex(value).toLowerCase() === '#000000') {
- return;
- }
- }
- if (name === 'font-size') {
- if (/em|%$/.test(value)) {
- if (parentFontSize === 0) {
- return;
- }
- var numValue = parseFloat(value) / (/%$/.test(value) ? 100 : 1);
- value = numValue * parentFontSize + 'px';
- }
- }
- if (name === 'border' && value) {
- previewCss += 'padding:0 2px;';
- }
- previewCss += name + ':' + value + ';';
- });
- editor.fire('AfterPreviewFormats');
- dom.remove(previewFrag);
- return previewCss;
- };
- var Preview = {
- getCssText: getCssText,
- parseSelector: parseSelector,
- selectorToHtml: selectorToHtml
- };
-
- var toggle = function (editor, formats, name, vars, node) {
- var fmt = formats.get(name);
- if (MatchFormat.match(editor, name, vars, node) && (!('toggle' in fmt[0]) || fmt[0].toggle)) {
- RemoveFormat.remove(editor, name, vars, node);
- } else {
- ApplyFormat.applyFormat(editor, name, vars, node);
- }
- };
- var ToggleFormat = { toggle: toggle };
-
- var setup$6 = function (editor) {
- editor.addShortcut('meta+b', '', 'Bold');
- editor.addShortcut('meta+i', '', 'Italic');
- editor.addShortcut('meta+u', '', 'Underline');
- for (var i = 1; i <= 6; i++) {
- editor.addShortcut('access+' + i, '', [
- 'FormatBlock',
- false,
- 'h' + i
- ]);
- }
- editor.addShortcut('access+7', '', [
- 'FormatBlock',
- false,
- 'p'
- ]);
- editor.addShortcut('access+8', '', [
- 'FormatBlock',
- false,
- 'div'
- ]);
- editor.addShortcut('access+9', '', [
- 'FormatBlock',
- false,
- 'address'
- ]);
- };
- var FormatShortcuts = { setup: setup$6 };
-
- function Formatter (editor) {
- var formats = FormatRegistry(editor);
- var formatChangeState = Cell(null);
- FormatShortcuts.setup(editor);
- setup$2(editor);
- return {
- get: formats.get,
- register: formats.register,
- unregister: formats.unregister,
- apply: curry(ApplyFormat.applyFormat, editor),
- remove: curry(RemoveFormat.remove, editor),
- toggle: curry(ToggleFormat.toggle, editor, formats),
- match: curry(MatchFormat.match, editor),
- matchAll: curry(MatchFormat.matchAll, editor),
- matchNode: curry(MatchFormat.matchNode, editor),
- canApply: curry(MatchFormat.canApply, editor),
- formatChanged: curry(FormatChanged.formatChanged, editor, formatChangeState),
- getCssText: curry(Preview.getCssText, editor)
- };
- }
-
- var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
- var shallow$1 = function (old, nu) {
- return nu;
- };
- var baseMerge = function (merger) {
- return function () {
- var objects = new Array(arguments.length);
- for (var i = 0; i < objects.length; i++) {
- objects[i] = arguments[i];
- }
- if (objects.length === 0) {
- throw new Error('Can\'t merge zero objects');
- }
- var ret = {};
- for (var j = 0; j < objects.length; j++) {
- var curObject = objects[j];
- for (var key in curObject) {
- if (hasOwnProperty$2.call(curObject, key)) {
- ret[key] = merger(ret[key], curObject[key]);
- }
- }
- }
- return ret;
- };
- };
- var merge = baseMerge(shallow$1);
-
- var register = function (htmlParser, settings, dom) {
- htmlParser.addAttributeFilter('data-mce-tabindex', function (nodes, name) {
- var i = nodes.length, node;
- while (i--) {
- node = nodes[i];
- node.attr('tabindex', node.attributes.map['data-mce-tabindex']);
- node.attr(name, null);
- }
- });
- htmlParser.addAttributeFilter('src,href,style', function (nodes, name) {
- var i = nodes.length, node, value;
- var internalName = 'data-mce-' + name;
- var urlConverter = settings.url_converter;
- var urlConverterScope = settings.url_converter_scope;
- while (i--) {
- node = nodes[i];
- value = node.attributes.map[internalName];
- if (value !== undefined) {
- node.attr(name, value.length > 0 ? value : null);
- node.attr(internalName, null);
- } else {
- value = node.attributes.map[name];
- if (name === 'style') {
- value = dom.serializeStyle(dom.parseStyle(value), node.name);
- } else if (urlConverter) {
- value = urlConverter.call(urlConverterScope, value, name, node.name);
- }
- node.attr(name, value.length > 0 ? value : null);
- }
- }
- });
- htmlParser.addAttributeFilter('class', function (nodes) {
- var i = nodes.length, node, value;
- while (i--) {
- node = nodes[i];
- value = node.attr('class');
- if (value) {
- value = node.attr('class').replace(/(?:^|\s)mce-item-\w+(?!\S)/g, '');
- node.attr('class', value.length > 0 ? value : null);
- }
- }
- });
- htmlParser.addAttributeFilter('data-mce-type', function (nodes, name, args) {
- var i = nodes.length, node;
- while (i--) {
- node = nodes[i];
- if (node.attributes.map['data-mce-type'] === 'bookmark' && !args.cleanup) {
- var hasChildren = Option.from(node.firstChild).exists(function (firstChild) {
- return !Zwsp.isZwsp(firstChild.value);
- });
- if (hasChildren) {
- node.unwrap();
- } else {
- node.remove();
- }
- }
- }
- });
- htmlParser.addNodeFilter('noscript', function (nodes) {
- var i = nodes.length, node;
- while (i--) {
- node = nodes[i].firstChild;
- if (node) {
- node.value = Entities.decode(node.value);
- }
- }
- });
- htmlParser.addNodeFilter('script,style', function (nodes, name) {
- var i = nodes.length, node, value, type;
- var trim = function (value) {
- return value.replace(/()/g, '\n').replace(/^[\r\n]*|[\r\n]*$/g, '').replace(/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g, '');
- };
- while (i--) {
- node = nodes[i];
- value = node.firstChild ? node.firstChild.value : '';
- if (name === 'script') {
- type = node.attr('type');
- if (type) {
- node.attr('type', type === 'mce-no/type' ? null : type.replace(/^mce\-/, ''));
- }
- if (settings.element_format === 'xhtml' && value.length > 0) {
- node.firstChild.value = '// ';
- }
- } else {
- if (settings.element_format === 'xhtml' && value.length > 0) {
- node.firstChild.value = '';
- }
- }
- }
- });
- htmlParser.addNodeFilter('#comment', function (nodes) {
- var i = nodes.length, node;
- while (i--) {
- node = nodes[i];
- if (node.value.indexOf('[CDATA[') === 0) {
- node.name = '#cdata';
- node.type = 4;
- node.value = node.value.replace(/^\[CDATA\[|\]\]$/g, '');
- } else if (node.value.indexOf('mce:protected ') === 0) {
- node.name = '#text';
- node.type = 3;
- node.raw = true;
- node.value = unescape(node.value).substr(14);
- }
- }
- });
- htmlParser.addNodeFilter('xml:namespace,input', function (nodes, name) {
- var i = nodes.length, node;
- while (i--) {
- node = nodes[i];
- if (node.type === 7) {
- node.remove();
- } else if (node.type === 1) {
- if (name === 'input' && !('type' in node.attributes.map)) {
- node.attr('type', 'text');
- }
- }
- }
- });
- htmlParser.addAttributeFilter('data-mce-type', function (nodes) {
- each(nodes, function (node) {
- if (node.attr('data-mce-type') === 'format-caret') {
- if (node.isEmpty(htmlParser.schema.getNonEmptyElements())) {
- node.remove();
- } else {
- node.unwrap();
- }
- }
- });
- });
- htmlParser.addAttributeFilter('data-mce-src,data-mce-href,data-mce-style,' + 'data-mce-selected,data-mce-expando,' + 'data-mce-type,data-mce-resize', function (nodes, name) {
- var i = nodes.length;
- while (i--) {
- nodes[i].attr(name, null);
- }
- });
- };
- var trimTrailingBr = function (rootNode) {
- var brNode1, brNode2;
- var isBr = function (node) {
- return node && node.name === 'br';
- };
- brNode1 = rootNode.lastChild;
- if (isBr(brNode1)) {
- brNode2 = brNode1.prev;
- if (isBr(brNode2)) {
- brNode1.remove();
- brNode2.remove();
- }
- }
- };
- var DomSerializerFilters = {
- register: register,
- trimTrailingBr: trimTrailingBr
- };
-
- var preProcess = function (editor, node, args) {
- var impl, doc, oldDoc;
- var dom = editor.dom;
- node = node.cloneNode(true);
- impl = domGlobals.document.implementation;
- if (impl.createHTMLDocument) {
- doc = impl.createHTMLDocument('');
- Tools.each(node.nodeName === 'BODY' ? node.childNodes : [node], function (node) {
- doc.body.appendChild(doc.importNode(node, true));
- });
- if (node.nodeName !== 'BODY') {
- node = doc.body.firstChild;
- } else {
- node = doc.body;
- }
- oldDoc = dom.doc;
- dom.doc = doc;
- }
- Events.firePreProcess(editor, merge(args, { node: node }));
- if (oldDoc) {
- dom.doc = oldDoc;
- }
- return node;
- };
- var shouldFireEvent = function (editor, args) {
- return editor && editor.hasEventListeners('PreProcess') && !args.no_events;
- };
- var process = function (editor, node, args) {
- return shouldFireEvent(editor, args) ? preProcess(editor, node, args) : node;
- };
- var DomSerializerPreProcess = { process: process };
-
- var removeAttrs = function (node, names) {
- each(names, function (name) {
- node.attr(name, null);
- });
- };
- var addFontToSpansFilter = function (domParser, styles, fontSizes) {
- domParser.addNodeFilter('font', function (nodes) {
- each(nodes, function (node) {
- var props = styles.parse(node.attr('style'));
- var color = node.attr('color');
- var face = node.attr('face');
- var size = node.attr('size');
- if (color) {
- props.color = color;
- }
- if (face) {
- props['font-family'] = face;
- }
- if (size) {
- props['font-size'] = fontSizes[parseInt(node.attr('size'), 10) - 1];
- }
- node.name = 'span';
- node.attr('style', styles.serialize(props));
- removeAttrs(node, [
- 'color',
- 'face',
- 'size'
- ]);
- });
- });
- };
- var addStrikeToSpanFilter = function (domParser, styles) {
- domParser.addNodeFilter('strike', function (nodes) {
- each(nodes, function (node) {
- var props = styles.parse(node.attr('style'));
- props['text-decoration'] = 'line-through';
- node.name = 'span';
- node.attr('style', styles.serialize(props));
- });
- });
- };
- var addFilters = function (domParser, settings) {
- var styles = Styles();
- if (settings.convert_fonts_to_spans) {
- addFontToSpansFilter(domParser, styles, Tools.explode(settings.font_size_legacy_values));
- }
- addStrikeToSpanFilter(domParser, styles);
- };
- var register$1 = function (domParser, settings) {
- if (settings.inline_styles) {
- addFilters(domParser, settings);
- }
- };
- var LegacyFilter = { register: register$1 };
-
- var whiteSpaceRegExp$3 = /^[ \t\r\n]*$/;
- var typeLookup = {
- '#text': 3,
- '#comment': 8,
- '#cdata': 4,
- '#pi': 7,
- '#doctype': 10,
- '#document-fragment': 11
- };
- var walk$2 = function (node, root, prev) {
- var sibling;
- var parent;
- var startName = prev ? 'lastChild' : 'firstChild';
- var siblingName = prev ? 'prev' : 'next';
- if (node[startName]) {
- return node[startName];
- }
- if (node !== root) {
- sibling = node[siblingName];
- if (sibling) {
- return sibling;
- }
- for (parent = node.parent; parent && parent !== root; parent = parent.parent) {
- sibling = parent[siblingName];
- if (sibling) {
- return sibling;
- }
- }
- }
- };
- var Node$1 = function () {
- function Node(name, type) {
- this.name = name;
- this.type = type;
- if (type === 1) {
- this.attributes = [];
- this.attributes.map = {};
- }
- }
- Node.create = function (name, attrs) {
- var node, attrName;
- node = new Node(name, typeLookup[name] || 1);
- if (attrs) {
- for (attrName in attrs) {
- node.attr(attrName, attrs[attrName]);
- }
- }
- return node;
- };
- Node.prototype.replace = function (node) {
- var self = this;
- if (node.parent) {
- node.remove();
- }
- self.insert(node, self);
- self.remove();
- return self;
- };
- Node.prototype.attr = function (name, value) {
- var self = this;
- var attrs, i;
- if (typeof name !== 'string') {
- for (i in name) {
- self.attr(i, name[i]);
- }
- return self;
- }
- if (attrs = self.attributes) {
- if (value !== undefined) {
- if (value === null) {
- if (name in attrs.map) {
- delete attrs.map[name];
- i = attrs.length;
- while (i--) {
- if (attrs[i].name === name) {
- attrs = attrs.splice(i, 1);
- return self;
- }
- }
- }
- return self;
- }
- if (name in attrs.map) {
- i = attrs.length;
- while (i--) {
- if (attrs[i].name === name) {
- attrs[i].value = value;
- break;
- }
- }
- } else {
- attrs.push({
- name: name,
- value: value
- });
- }
- attrs.map[name] = value;
- return self;
- }
- return attrs.map[name];
- }
- };
- Node.prototype.clone = function () {
- var self = this;
- var clone = new Node(self.name, self.type);
- var i, l, selfAttrs, selfAttr, cloneAttrs;
- if (selfAttrs = self.attributes) {
- cloneAttrs = [];
- cloneAttrs.map = {};
- for (i = 0, l = selfAttrs.length; i < l; i++) {
- selfAttr = selfAttrs[i];
- if (selfAttr.name !== 'id') {
- cloneAttrs[cloneAttrs.length] = {
- name: selfAttr.name,
- value: selfAttr.value
- };
- cloneAttrs.map[selfAttr.name] = selfAttr.value;
- }
- }
- clone.attributes = cloneAttrs;
- }
- clone.value = self.value;
- clone.shortEnded = self.shortEnded;
- return clone;
- };
- Node.prototype.wrap = function (wrapper) {
- var self = this;
- self.parent.insert(wrapper, self);
- wrapper.append(self);
- return self;
- };
- Node.prototype.unwrap = function () {
- var self = this;
- var node, next;
- for (node = self.firstChild; node;) {
- next = node.next;
- self.insert(node, self, true);
- node = next;
- }
- self.remove();
- };
- Node.prototype.remove = function () {
- var self = this, parent = self.parent, next = self.next, prev = self.prev;
- if (parent) {
- if (parent.firstChild === self) {
- parent.firstChild = next;
- if (next) {
- next.prev = null;
- }
- } else {
- prev.next = next;
- }
- if (parent.lastChild === self) {
- parent.lastChild = prev;
- if (prev) {
- prev.next = null;
- }
- } else {
- next.prev = prev;
- }
- self.parent = self.next = self.prev = null;
- }
- return self;
- };
- Node.prototype.append = function (node) {
- var self = this;
- var last;
- if (node.parent) {
- node.remove();
- }
- last = self.lastChild;
- if (last) {
- last.next = node;
- node.prev = last;
- self.lastChild = node;
- } else {
- self.lastChild = self.firstChild = node;
- }
- node.parent = self;
- return node;
- };
- Node.prototype.insert = function (node, refNode, before) {
- var parent;
- if (node.parent) {
- node.remove();
- }
- parent = refNode.parent || this;
- if (before) {
- if (refNode === parent.firstChild) {
- parent.firstChild = node;
- } else {
- refNode.prev.next = node;
- }
- node.prev = refNode.prev;
- node.next = refNode;
- refNode.prev = node;
- } else {
- if (refNode === parent.lastChild) {
- parent.lastChild = node;
- } else {
- refNode.next.prev = node;
- }
- node.next = refNode.next;
- node.prev = refNode;
- refNode.next = node;
- }
- node.parent = parent;
- return node;
- };
- Node.prototype.getAll = function (name) {
- var self = this;
- var node;
- var collection = [];
- for (node = self.firstChild; node; node = walk$2(node, self)) {
- if (node.name === name) {
- collection.push(node);
- }
- }
- return collection;
- };
- Node.prototype.empty = function () {
- var self = this;
- var nodes, i, node;
- if (self.firstChild) {
- nodes = [];
- for (node = self.firstChild; node; node = walk$2(node, self)) {
- nodes.push(node);
- }
- i = nodes.length;
- while (i--) {
- node = nodes[i];
- node.parent = node.firstChild = node.lastChild = node.next = node.prev = null;
- }
- }
- self.firstChild = self.lastChild = null;
- return self;
- };
- Node.prototype.isEmpty = function (elements, whitespace, predicate) {
- var self = this;
- var node = self.firstChild, i, name;
- whitespace = whitespace || {};
- if (node) {
- do {
- if (node.type === 1) {
- if (node.attributes.map['data-mce-bogus']) {
- continue;
- }
- if (elements[node.name]) {
- return false;
- }
- i = node.attributes.length;
- while (i--) {
- name = node.attributes[i].name;
- if (name === 'name' || name.indexOf('data-mce-bookmark') === 0) {
- return false;
- }
- }
- }
- if (node.type === 8) {
- return false;
- }
- if (node.type === 3 && !whiteSpaceRegExp$3.test(node.value)) {
- return false;
- }
- if (node.type === 3 && node.parent && whitespace[node.parent.name] && whiteSpaceRegExp$3.test(node.value)) {
- return false;
- }
- if (predicate && predicate(node)) {
- return false;
- }
- } while (node = walk$2(node, self));
- }
- return true;
- };
- Node.prototype.walk = function (prev) {
- return walk$2(this, null, prev);
- };
- return Node;
- }();
-
- var paddEmptyNode = function (settings, args, blockElements, node) {
- var brPreferred = settings.padd_empty_with_br || args.insert;
- if (brPreferred && blockElements[node.name]) {
- node.empty().append(new Node$1('br', 1)).shortEnded = true;
- } else {
- node.empty().append(new Node$1('#text', 3)).value = '\xA0';
- }
- };
- var isPaddedWithNbsp = function (node) {
- return hasOnlyChild(node, '#text') && node.firstChild.value === '\xA0';
- };
- var hasOnlyChild = function (node, name) {
- return node && node.firstChild && node.firstChild === node.lastChild && node.firstChild.name === name;
- };
- var isPadded = function (schema, node) {
- var rule = schema.getElementRule(node.name);
- return rule && rule.paddEmpty;
- };
- var isEmpty$2 = function (schema, nonEmptyElements, whitespaceElements, node) {
- return node.isEmpty(nonEmptyElements, whitespaceElements, function (node) {
- return isPadded(schema, node);
- });
- };
- var isLineBreakNode = function (node, blockElements) {
- return node && (blockElements[node.name] || node.name === 'br');
- };
-
- var register$2 = function (parser, settings) {
- var schema = parser.schema;
- if (settings.remove_trailing_brs) {
- parser.addNodeFilter('br', function (nodes, _, args) {
- var i;
- var l = nodes.length;
- var node;
- var blockElements = Tools.extend({}, schema.getBlockElements());
- var nonEmptyElements = schema.getNonEmptyElements();
- var parent, lastParent, prev, prevName;
- var whiteSpaceElements = schema.getWhiteSpaceElements();
- var elementRule, textNode;
- blockElements.body = 1;
- for (i = 0; i < l; i++) {
- node = nodes[i];
- parent = node.parent;
- if (blockElements[node.parent.name] && node === parent.lastChild) {
- prev = node.prev;
- while (prev) {
- prevName = prev.name;
- if (prevName !== 'span' || prev.attr('data-mce-type') !== 'bookmark') {
- if (prevName !== 'br') {
- break;
- }
- if (prevName === 'br') {
- node = null;
- break;
- }
- }
- prev = prev.prev;
- }
- if (node) {
- node.remove();
- if (isEmpty$2(schema, nonEmptyElements, whiteSpaceElements, parent)) {
- elementRule = schema.getElementRule(parent.name);
- if (elementRule) {
- if (elementRule.removeEmpty) {
- parent.remove();
- } else if (elementRule.paddEmpty) {
- paddEmptyNode(settings, args, blockElements, parent);
- }
- }
- }
- }
- } else {
- lastParent = node;
- while (parent && parent.firstChild === lastParent && parent.lastChild === lastParent) {
- lastParent = parent;
- if (blockElements[parent.name]) {
- break;
- }
- parent = parent.parent;
- }
- if (lastParent === parent && settings.padd_empty_with_br !== true) {
- textNode = new Node$1('#text', 3);
- textNode.value = '\xA0';
- node.replace(textNode);
- }
- }
- }
- });
- }
- parser.addAttributeFilter('href', function (nodes) {
- var i = nodes.length, node;
- var appendRel = function (rel) {
- var parts = rel.split(' ').filter(function (p) {
- return p.length > 0;
- });
- return parts.concat(['noopener']).sort().join(' ');
- };
- var addNoOpener = function (rel) {
- var newRel = rel ? Tools.trim(rel) : '';
- if (!/\b(noopener)\b/g.test(newRel)) {
- return appendRel(newRel);
- } else {
- return newRel;
- }
- };
- if (!settings.allow_unsafe_link_target) {
- while (i--) {
- node = nodes[i];
- if (node.name === 'a' && node.attr('target') === '_blank') {
- node.attr('rel', addNoOpener(node.attr('rel')));
- }
- }
- }
- });
- if (!settings.allow_html_in_named_anchor) {
- parser.addAttributeFilter('id,name', function (nodes) {
- var i = nodes.length, sibling, prevSibling, parent, node;
- while (i--) {
- node = nodes[i];
- if (node.name === 'a' && node.firstChild && !node.attr('href')) {
- parent = node.parent;
- sibling = node.lastChild;
- do {
- prevSibling = sibling.prev;
- parent.insert(sibling, node);
- sibling = prevSibling;
- } while (sibling);
- }
- }
- });
- }
- if (settings.fix_list_elements) {
- parser.addNodeFilter('ul,ol', function (nodes) {
- var i = nodes.length, node, parentNode;
- while (i--) {
- node = nodes[i];
- parentNode = node.parent;
- if (parentNode.name === 'ul' || parentNode.name === 'ol') {
- if (node.prev && node.prev.name === 'li') {
- node.prev.append(node);
- } else {
- var li = new Node$1('li', 1);
- li.attr('style', 'list-style-type: none');
- node.wrap(li);
- }
- }
- }
- });
- }
- if (settings.validate && schema.getValidClasses()) {
- parser.addAttributeFilter('class', function (nodes) {
- var i = nodes.length, node, classList, ci, className, classValue;
- var validClasses = schema.getValidClasses();
- var validClassesMap, valid;
- while (i--) {
- node = nodes[i];
- classList = node.attr('class').split(' ');
- classValue = '';
- for (ci = 0; ci < classList.length; ci++) {
- className = classList[ci];
- valid = false;
- validClassesMap = validClasses['*'];
- if (validClassesMap && validClassesMap[className]) {
- valid = true;
- }
- validClassesMap = validClasses[node.name];
- if (!valid && validClassesMap && validClassesMap[className]) {
- valid = true;
- }
- if (valid) {
- if (classValue) {
- classValue += ' ';
- }
- classValue += className;
- }
- }
- if (!classValue.length) {
- classValue = null;
- }
- node.attr('class', classValue);
- }
- });
- }
- };
-
- var makeMap$4 = Tools.makeMap, each$i = Tools.each, explode$3 = Tools.explode, extend$3 = Tools.extend;
- function DomParser (settings, schema) {
- if (schema === void 0) {
- schema = Schema();
- }
- var nodeFilters = {};
- var attributeFilters = [];
- var matchedNodes = {};
- var matchedAttributes = {};
- settings = settings || {};
- settings.validate = 'validate' in settings ? settings.validate : true;
- settings.root_name = settings.root_name || 'body';
- var fixInvalidChildren = function (nodes) {
- var ni, node, parent, parents, newParent, currentNode, tempNode, childNode, i;
- var nonEmptyElements, whitespaceElements, nonSplitableElements, textBlockElements, specialElements, sibling, nextNode;
- nonSplitableElements = makeMap$4('tr,td,th,tbody,thead,tfoot,table');
- nonEmptyElements = schema.getNonEmptyElements();
- whitespaceElements = schema.getWhiteSpaceElements();
- textBlockElements = schema.getTextBlockElements();
- specialElements = schema.getSpecialElements();
- for (ni = 0; ni < nodes.length; ni++) {
- node = nodes[ni];
- if (!node.parent || node.fixed) {
- continue;
- }
- if (textBlockElements[node.name] && node.parent.name === 'li') {
- sibling = node.next;
- while (sibling) {
- if (textBlockElements[sibling.name]) {
- sibling.name = 'li';
- sibling.fixed = true;
- node.parent.insert(sibling, node.parent);
- } else {
- break;
- }
- sibling = sibling.next;
- }
- node.unwrap(node);
- continue;
- }
- parents = [node];
- for (parent = node.parent; parent && !schema.isValidChild(parent.name, node.name) && !nonSplitableElements[parent.name]; parent = parent.parent) {
- parents.push(parent);
- }
- if (parent && parents.length > 1) {
- parents.reverse();
- newParent = currentNode = filterNode(parents[0].clone());
- for (i = 0; i < parents.length - 1; i++) {
- if (schema.isValidChild(currentNode.name, parents[i].name)) {
- tempNode = filterNode(parents[i].clone());
- currentNode.append(tempNode);
- } else {
- tempNode = currentNode;
- }
- for (childNode = parents[i].firstChild; childNode && childNode !== parents[i + 1];) {
- nextNode = childNode.next;
- tempNode.append(childNode);
- childNode = nextNode;
- }
- currentNode = tempNode;
- }
- if (!isEmpty$2(schema, nonEmptyElements, whitespaceElements, newParent)) {
- parent.insert(newParent, parents[0], true);
- parent.insert(node, newParent);
- } else {
- parent.insert(node, parents[0], true);
- }
- parent = parents[0];
- if (isEmpty$2(schema, nonEmptyElements, whitespaceElements, parent) || hasOnlyChild(parent, 'br')) {
- parent.empty().remove();
- }
- } else if (node.parent) {
- if (node.name === 'li') {
- sibling = node.prev;
- if (sibling && (sibling.name === 'ul' || sibling.name === 'ul')) {
- sibling.append(node);
- continue;
- }
- sibling = node.next;
- if (sibling && (sibling.name === 'ul' || sibling.name === 'ul')) {
- sibling.insert(node, sibling.firstChild, true);
- continue;
- }
- node.wrap(filterNode(new Node$1('ul', 1)));
- continue;
- }
- if (schema.isValidChild(node.parent.name, 'div') && schema.isValidChild('div', node.name)) {
- node.wrap(filterNode(new Node$1('div', 1)));
- } else {
- if (specialElements[node.name]) {
- node.empty().remove();
- } else {
- node.unwrap();
- }
- }
- }
- }
- };
- var filterNode = function (node) {
- var i, name, list;
- name = node.name;
- if (name in nodeFilters) {
- list = matchedNodes[name];
- if (list) {
- list.push(node);
- } else {
- matchedNodes[name] = [node];
- }
- }
- i = attributeFilters.length;
- while (i--) {
- name = attributeFilters[i].name;
- if (name in node.attributes.map) {
- list = matchedAttributes[name];
- if (list) {
- list.push(node);
- } else {
- matchedAttributes[name] = [node];
- }
- }
- }
- return node;
- };
- var addNodeFilter = function (name, callback) {
- each$i(explode$3(name), function (name) {
- var list = nodeFilters[name];
- if (!list) {
- nodeFilters[name] = list = [];
- }
- list.push(callback);
- });
- };
- var getNodeFilters = function () {
- var out = [];
- for (var name in nodeFilters) {
- if (nodeFilters.hasOwnProperty(name)) {
- out.push({
- name: name,
- callbacks: nodeFilters[name]
- });
- }
- }
- return out;
- };
- var addAttributeFilter = function (name, callback) {
- each$i(explode$3(name), function (name) {
- var i;
- for (i = 0; i < attributeFilters.length; i++) {
- if (attributeFilters[i].name === name) {
- attributeFilters[i].callbacks.push(callback);
- return;
- }
- }
- attributeFilters.push({
- name: name,
- callbacks: [callback]
- });
- });
- };
- var getAttributeFilters = function () {
- return [].concat(attributeFilters);
- };
- var parse = function (html, args) {
- var parser, nodes, i, l, fi, fl, list, name;
- var blockElements;
- var invalidChildren = [];
- var isInWhiteSpacePreservedElement;
- var node;
- args = args || {};
- matchedNodes = {};
- matchedAttributes = {};
- blockElements = extend$3(makeMap$4('script,style,head,html,body,title,meta,param'), schema.getBlockElements());
- var nonEmptyElements = schema.getNonEmptyElements();
- var children = schema.children;
- var validate = settings.validate;
- var rootBlockName = 'forced_root_block' in args ? args.forced_root_block : settings.forced_root_block;
- var whiteSpaceElements = schema.getWhiteSpaceElements();
- var startWhiteSpaceRegExp = /^[ \t\r\n]+/;
- var endWhiteSpaceRegExp = /[ \t\r\n]+$/;
- var allWhiteSpaceRegExp = /[ \t\r\n]+/g;
- var isAllWhiteSpaceRegExp = /^[ \t\r\n]+$/;
- isInWhiteSpacePreservedElement = whiteSpaceElements.hasOwnProperty(args.context) || whiteSpaceElements.hasOwnProperty(settings.root_name);
- var addRootBlocks = function () {
- var node = rootNode.firstChild, next, rootBlockNode;
- var trim = function (rootBlockNode) {
- if (rootBlockNode) {
- node = rootBlockNode.firstChild;
- if (node && node.type === 3) {
- node.value = node.value.replace(startWhiteSpaceRegExp, '');
- }
- node = rootBlockNode.lastChild;
- if (node && node.type === 3) {
- node.value = node.value.replace(endWhiteSpaceRegExp, '');
- }
- }
- };
- if (!schema.isValidChild(rootNode.name, rootBlockName.toLowerCase())) {
- return;
- }
- while (node) {
- next = node.next;
- if (node.type === 3 || node.type === 1 && node.name !== 'p' && !blockElements[node.name] && !node.attr('data-mce-type')) {
- if (!rootBlockNode) {
- rootBlockNode = createNode(rootBlockName, 1);
- rootBlockNode.attr(settings.forced_root_block_attrs);
- rootNode.insert(rootBlockNode, node);
- rootBlockNode.append(node);
- } else {
- rootBlockNode.append(node);
- }
- } else {
- trim(rootBlockNode);
- rootBlockNode = null;
- }
- node = next;
- }
- trim(rootBlockNode);
- };
- var createNode = function (name, type) {
- var node = new Node$1(name, type);
- var list;
- if (name in nodeFilters) {
- list = matchedNodes[name];
- if (list) {
- list.push(node);
- } else {
- matchedNodes[name] = [node];
- }
- }
- return node;
- };
- var removeWhitespaceBefore = function (node) {
- var textNode, textNodeNext, textVal, sibling;
- var blockElements = schema.getBlockElements();
- for (textNode = node.prev; textNode && textNode.type === 3;) {
- textVal = textNode.value.replace(endWhiteSpaceRegExp, '');
- if (textVal.length > 0) {
- textNode.value = textVal;
- return;
- }
- textNodeNext = textNode.next;
- if (textNodeNext) {
- if (textNodeNext.type === 3 && textNodeNext.value.length) {
- textNode = textNode.prev;
- continue;
- }
- if (!blockElements[textNodeNext.name] && textNodeNext.name !== 'script' && textNodeNext.name !== 'style') {
- textNode = textNode.prev;
- continue;
- }
- }
- sibling = textNode.prev;
- textNode.remove();
- textNode = sibling;
- }
- };
- var cloneAndExcludeBlocks = function (input) {
- var name;
- var output = {};
- for (name in input) {
- if (name !== 'li' && name !== 'p') {
- output[name] = input[name];
- }
- }
- return output;
- };
- parser = SaxParser$1({
- validate: validate,
- allow_script_urls: settings.allow_script_urls,
- allow_conditional_comments: settings.allow_conditional_comments,
- self_closing_elements: cloneAndExcludeBlocks(schema.getSelfClosingElements()),
- cdata: function (text) {
- node.append(createNode('#cdata', 4)).value = text;
- },
- text: function (text, raw) {
- var textNode;
- if (!isInWhiteSpacePreservedElement) {
- text = text.replace(allWhiteSpaceRegExp, ' ');
- if (isLineBreakNode(node.lastChild, blockElements)) {
- text = text.replace(startWhiteSpaceRegExp, '');
- }
- }
- if (text.length !== 0) {
- textNode = createNode('#text', 3);
- textNode.raw = !!raw;
- node.append(textNode).value = text;
- }
- },
- comment: function (text) {
- node.append(createNode('#comment', 8)).value = text;
- },
- pi: function (name, text) {
- node.append(createNode(name, 7)).value = text;
- removeWhitespaceBefore(node);
- },
- doctype: function (text) {
- var newNode;
- newNode = node.append(createNode('#doctype', 10));
- newNode.value = text;
- removeWhitespaceBefore(node);
- },
- start: function (name, attrs, empty) {
- var newNode, attrFiltersLen, elementRule, attrName, parent;
- elementRule = validate ? schema.getElementRule(name) : {};
- if (elementRule) {
- newNode = createNode(elementRule.outputName || name, 1);
- newNode.attributes = attrs;
- newNode.shortEnded = empty;
- node.append(newNode);
- parent = children[node.name];
- if (parent && children[newNode.name] && !parent[newNode.name]) {
- invalidChildren.push(newNode);
- }
- attrFiltersLen = attributeFilters.length;
- while (attrFiltersLen--) {
- attrName = attributeFilters[attrFiltersLen].name;
- if (attrName in attrs.map) {
- list = matchedAttributes[attrName];
- if (list) {
- list.push(newNode);
- } else {
- matchedAttributes[attrName] = [newNode];
- }
- }
- }
- if (blockElements[name]) {
- removeWhitespaceBefore(newNode);
- }
- if (!empty) {
- node = newNode;
- }
- if (!isInWhiteSpacePreservedElement && whiteSpaceElements[name]) {
- isInWhiteSpacePreservedElement = true;
- }
- }
- },
- end: function (name) {
- var textNode, elementRule, text, sibling, tempNode;
- elementRule = validate ? schema.getElementRule(name) : {};
- if (elementRule) {
- if (blockElements[name]) {
- if (!isInWhiteSpacePreservedElement) {
- textNode = node.firstChild;
- if (textNode && textNode.type === 3) {
- text = textNode.value.replace(startWhiteSpaceRegExp, '');
- if (text.length > 0) {
- textNode.value = text;
- textNode = textNode.next;
- } else {
- sibling = textNode.next;
- textNode.remove();
- textNode = sibling;
- while (textNode && textNode.type === 3) {
- text = textNode.value;
- sibling = textNode.next;
- if (text.length === 0 || isAllWhiteSpaceRegExp.test(text)) {
- textNode.remove();
- textNode = sibling;
- }
- textNode = sibling;
- }
- }
- }
- textNode = node.lastChild;
- if (textNode && textNode.type === 3) {
- text = textNode.value.replace(endWhiteSpaceRegExp, '');
- if (text.length > 0) {
- textNode.value = text;
- textNode = textNode.prev;
- } else {
- sibling = textNode.prev;
- textNode.remove();
- textNode = sibling;
- while (textNode && textNode.type === 3) {
- text = textNode.value;
- sibling = textNode.prev;
- if (text.length === 0 || isAllWhiteSpaceRegExp.test(text)) {
- textNode.remove();
- textNode = sibling;
- }
- textNode = sibling;
- }
- }
- }
- }
- }
- if (isInWhiteSpacePreservedElement && whiteSpaceElements[name]) {
- isInWhiteSpacePreservedElement = false;
- }
- if (elementRule.removeEmpty && isEmpty$2(schema, nonEmptyElements, whiteSpaceElements, node)) {
- if (!node.attributes.map.name && !node.attr('id')) {
- tempNode = node.parent;
- if (blockElements[node.name]) {
- node.empty().remove();
- } else {
- node.unwrap();
- }
- node = tempNode;
- return;
- }
- }
- if (elementRule.paddEmpty && (isPaddedWithNbsp(node) || isEmpty$2(schema, nonEmptyElements, whiteSpaceElements, node))) {
- paddEmptyNode(settings, args, blockElements, node);
- }
- node = node.parent;
- }
- }
- }, schema);
- var rootNode = node = new Node$1(args.context || settings.root_name, 11);
- parser.parse(html);
- if (validate && invalidChildren.length) {
- if (!args.context) {
- fixInvalidChildren(invalidChildren);
- } else {
- args.invalid = true;
- }
- }
- if (rootBlockName && (rootNode.name === 'body' || args.isRootContent)) {
- addRootBlocks();
- }
- if (!args.invalid) {
- for (name in matchedNodes) {
- list = nodeFilters[name];
- nodes = matchedNodes[name];
- fi = nodes.length;
- while (fi--) {
- if (!nodes[fi].parent) {
- nodes.splice(fi, 1);
- }
- }
- for (i = 0, l = list.length; i < l; i++) {
- list[i](nodes, name, args);
- }
- }
- for (i = 0, l = attributeFilters.length; i < l; i++) {
- list = attributeFilters[i];
- if (list.name in matchedAttributes) {
- nodes = matchedAttributes[list.name];
- fi = nodes.length;
- while (fi--) {
- if (!nodes[fi].parent) {
- nodes.splice(fi, 1);
- }
- }
- for (fi = 0, fl = list.callbacks.length; fi < fl; fi++) {
- list.callbacks[fi](nodes, list.name, args);
- }
- }
- }
- }
- return rootNode;
- };
- var exports = {
- schema: schema,
- addAttributeFilter: addAttributeFilter,
- getAttributeFilters: getAttributeFilters,
- addNodeFilter: addNodeFilter,
- getNodeFilters: getNodeFilters,
- filterNode: filterNode,
- parse: parse
- };
- register$2(exports, settings);
- LegacyFilter.register(exports, settings);
- return exports;
- }
-
- var addTempAttr = function (htmlParser, tempAttrs, name) {
- if (Tools.inArray(tempAttrs, name) === -1) {
- htmlParser.addAttributeFilter(name, function (nodes, name) {
- var i = nodes.length;
- while (i--) {
- nodes[i].attr(name, null);
- }
- });
- tempAttrs.push(name);
- }
- };
- var postProcess$1 = function (editor, args, content) {
- if (!args.no_events && editor) {
- var outArgs = Events.firePostProcess(editor, merge(args, { content: content }));
- return outArgs.content;
- } else {
- return content;
- }
- };
- var getHtmlFromNode = function (dom, node, args) {
- var html = Zwsp.trim(args.getInner ? node.innerHTML : dom.getOuterHTML(node));
- return args.selection || isWsPreserveElement(Element.fromDom(node)) ? html : Tools.trim(html);
- };
- var parseHtml = function (htmlParser, html, args) {
- var parserArgs = args.selection ? merge({ forced_root_block: false }, args) : args;
- var rootNode = htmlParser.parse(html, parserArgs);
- DomSerializerFilters.trimTrailingBr(rootNode);
- return rootNode;
- };
- var serializeNode = function (settings, schema, node) {
- var htmlSerializer = HtmlSerializer(settings, schema);
- return htmlSerializer.serialize(node);
- };
- var toHtml = function (editor, settings, schema, rootNode, args) {
- var content = serializeNode(settings, schema, rootNode);
- return postProcess$1(editor, args, content);
- };
- function DomSerializer (settings, editor) {
- var dom, schema, htmlParser;
- var tempAttrs = ['data-mce-selected'];
- dom = editor && editor.dom ? editor.dom : DOMUtils$1.DOM;
- schema = editor && editor.schema ? editor.schema : Schema(settings);
- settings.entity_encoding = settings.entity_encoding || 'named';
- settings.remove_trailing_brs = 'remove_trailing_brs' in settings ? settings.remove_trailing_brs : true;
- htmlParser = DomParser(settings, schema);
- DomSerializerFilters.register(htmlParser, settings, dom);
- var serialize = function (node, parserArgs) {
- var args = merge({ format: 'html' }, parserArgs ? parserArgs : {});
- var targetNode = DomSerializerPreProcess.process(editor, node, args);
- var html = getHtmlFromNode(dom, targetNode, args);
- var rootNode = parseHtml(htmlParser, html, args);
- return args.format === 'tree' ? rootNode : toHtml(editor, settings, schema, rootNode, args);
- };
- return {
- schema: schema,
- addNodeFilter: htmlParser.addNodeFilter,
- addAttributeFilter: htmlParser.addAttributeFilter,
- serialize: serialize,
- addRules: function (rules) {
- schema.addValidElements(rules);
- },
- setRules: function (rules) {
- schema.setValidElements(rules);
- },
- addTempAttr: curry(addTempAttr, htmlParser, tempAttrs),
- getTempAttrs: function () {
- return tempAttrs;
- }
- };
- }
-
- function DomSerializer$1 (settings, editor) {
- var domSerializer = DomSerializer(settings, editor);
- return {
- schema: domSerializer.schema,
- addNodeFilter: domSerializer.addNodeFilter,
- addAttributeFilter: domSerializer.addAttributeFilter,
- serialize: domSerializer.serialize,
- addRules: domSerializer.addRules,
- setRules: domSerializer.setRules,
- addTempAttr: domSerializer.addTempAttr,
- getTempAttrs: domSerializer.getTempAttrs
- };
- }
-
- function BookmarkManager(selection) {
- return {
- getBookmark: curry(Bookmarks.getBookmark, selection),
- moveToBookmark: curry(Bookmarks.moveToBookmark, selection)
- };
- }
- (function (BookmarkManager) {
- BookmarkManager.isBookmarkNode = Bookmarks.isBookmarkNode;
- }(BookmarkManager || (BookmarkManager = {})));
- var BookmarkManager$1 = BookmarkManager;
-
- var isContentEditableFalse$a = NodeType.isContentEditableFalse;
- var isContentEditableTrue$5 = NodeType.isContentEditableTrue;
- var getContentEditableRoot$2 = function (root, node) {
- while (node && node !== root) {
- if (isContentEditableTrue$5(node) || isContentEditableFalse$a(node)) {
- return node;
- }
- node = node.parentNode;
- }
- return null;
- };
- var ControlSelection = function (selection, editor) {
- var dom = editor.dom, each = Tools.each;
- var selectedElm, selectedElmGhost, resizeHelper, resizeHandles, selectedHandle;
- var startX, startY, selectedElmX, selectedElmY, startW, startH, ratio, resizeStarted;
- var width, height;
- var editableDoc = editor.getDoc(), rootDocument = domGlobals.document;
- var abs = Math.abs, round = Math.round, rootElement = editor.getBody();
- var startScrollWidth, startScrollHeight;
- resizeHandles = {
- nw: [
- 0,
- 0,
- -1,
- -1
- ],
- ne: [
- 1,
- 0,
- 1,
- -1
- ],
- se: [
- 1,
- 1,
- 1,
- 1
- ],
- sw: [
- 0,
- 1,
- -1,
- 1
- ]
- };
- var rootClass = '.mce-content-body';
- editor.contentStyles.push(rootClass + ' div.mce-resizehandle {' + 'position: absolute;' + 'border: 1px solid black;' + 'box-sizing: content-box;' + 'background: #FFF;' + 'width: 7px;' + 'height: 7px;' + 'z-index: 10000' + '}' + rootClass + ' .mce-resizehandle:hover {' + 'background: #000' + '}' + rootClass + ' img[data-mce-selected],' + rootClass + ' hr[data-mce-selected] {' + 'outline: 1px solid black;' + 'resize: none' + '}' + rootClass + ' .mce-clonedresizable {' + 'position: absolute;' + (Env.gecko ? '' : 'outline: 1px dashed black;') + 'opacity: .5;' + 'filter: alpha(opacity=50);' + 'z-index: 10000' + '}' + rootClass + ' .mce-resize-helper {' + 'background: #555;' + 'background: rgba(0,0,0,0.75);' + 'border-radius: 3px;' + 'border: 1px;' + 'color: white;' + 'display: none;' + 'font-family: sans-serif;' + 'font-size: 12px;' + 'white-space: nowrap;' + 'line-height: 14px;' + 'margin: 5px 10px;' + 'padding: 5px;' + 'position: absolute;' + 'z-index: 10001' + '}');
- var isImage = function (elm) {
- return elm && (elm.nodeName === 'IMG' || editor.dom.is(elm, 'figure.image'));
- };
- var isEventOnImageOutsideRange = function (evt, range) {
- return isImage(evt.target) && !RangePoint.isXYWithinRange(evt.clientX, evt.clientY, range);
- };
- var contextMenuSelectImage = function (evt) {
- var target = evt.target;
- if (isEventOnImageOutsideRange(evt, editor.selection.getRng()) && !evt.isDefaultPrevented()) {
- editor.selection.select(target);
- }
- };
- var getResizeTarget = function (elm) {
- return editor.dom.is(elm, 'figure.image') ? elm.querySelector('img') : elm;
- };
- var isResizable = function (elm) {
- var selector = editor.settings.object_resizing;
- if (selector === false || Env.iOS) {
- return false;
- }
- if (typeof selector !== 'string') {
- selector = 'table,img,figure.image,div';
- }
- if (elm.getAttribute('data-mce-resize') === 'false') {
- return false;
- }
- if (elm === editor.getBody()) {
- return false;
- }
- return is$1(Element.fromDom(elm), selector);
- };
- var resizeGhostElement = function (e) {
- var deltaX, deltaY, proportional;
- var resizeHelperX, resizeHelperY;
- deltaX = e.screenX - startX;
- deltaY = e.screenY - startY;
- width = deltaX * selectedHandle[2] + startW;
- height = deltaY * selectedHandle[3] + startH;
- width = width < 5 ? 5 : width;
- height = height < 5 ? 5 : height;
- if (isImage(selectedElm) && editor.settings.resize_img_proportional !== false) {
- proportional = !VK.modifierPressed(e);
- } else {
- proportional = VK.modifierPressed(e) || isImage(selectedElm) && selectedHandle[2] * selectedHandle[3] !== 0;
- }
- if (proportional) {
- if (abs(deltaX) > abs(deltaY)) {
- height = round(width * ratio);
- width = round(height / ratio);
- } else {
- width = round(height / ratio);
- height = round(width * ratio);
- }
- }
- dom.setStyles(getResizeTarget(selectedElmGhost), {
- width: width,
- height: height
- });
- resizeHelperX = selectedHandle.startPos.x + deltaX;
- resizeHelperY = selectedHandle.startPos.y + deltaY;
- resizeHelperX = resizeHelperX > 0 ? resizeHelperX : 0;
- resizeHelperY = resizeHelperY > 0 ? resizeHelperY : 0;
- dom.setStyles(resizeHelper, {
- left: resizeHelperX,
- top: resizeHelperY,
- display: 'block'
- });
- resizeHelper.innerHTML = width + ' × ' + height;
- if (selectedHandle[2] < 0 && selectedElmGhost.clientWidth <= width) {
- dom.setStyle(selectedElmGhost, 'left', selectedElmX + (startW - width));
- }
- if (selectedHandle[3] < 0 && selectedElmGhost.clientHeight <= height) {
- dom.setStyle(selectedElmGhost, 'top', selectedElmY + (startH - height));
- }
- deltaX = rootElement.scrollWidth - startScrollWidth;
- deltaY = rootElement.scrollHeight - startScrollHeight;
- if (deltaX + deltaY !== 0) {
- dom.setStyles(resizeHelper, {
- left: resizeHelperX - deltaX,
- top: resizeHelperY - deltaY
- });
- }
- if (!resizeStarted) {
- Events.fireObjectResizeStart(editor, selectedElm, startW, startH);
- resizeStarted = true;
- }
- };
- var endGhostResize = function () {
- resizeStarted = false;
- var setSizeProp = function (name, value) {
- if (value) {
- if (selectedElm.style[name] || !editor.schema.isValid(selectedElm.nodeName.toLowerCase(), name)) {
- dom.setStyle(getResizeTarget(selectedElm), name, value);
- } else {
- dom.setAttrib(getResizeTarget(selectedElm), name, value);
- }
- }
- };
- setSizeProp('width', width);
- setSizeProp('height', height);
- dom.unbind(editableDoc, 'mousemove', resizeGhostElement);
- dom.unbind(editableDoc, 'mouseup', endGhostResize);
- if (rootDocument !== editableDoc) {
- dom.unbind(rootDocument, 'mousemove', resizeGhostElement);
- dom.unbind(rootDocument, 'mouseup', endGhostResize);
- }
- dom.remove(selectedElmGhost);
- dom.remove(resizeHelper);
- showResizeRect(selectedElm);
- Events.fireObjectResized(editor, selectedElm, width, height);
- dom.setAttrib(selectedElm, 'style', dom.getAttrib(selectedElm, 'style'));
- editor.nodeChanged();
- };
- var showResizeRect = function (targetElm) {
- var position, targetWidth, targetHeight, e, rect;
- hideResizeRect();
- unbindResizeHandleEvents();
- position = dom.getPos(targetElm, rootElement);
- selectedElmX = position.x;
- selectedElmY = position.y;
- rect = targetElm.getBoundingClientRect();
- targetWidth = rect.width || rect.right - rect.left;
- targetHeight = rect.height || rect.bottom - rect.top;
- if (selectedElm !== targetElm) {
- selectedElm = targetElm;
- width = height = 0;
- }
- e = editor.fire('ObjectSelected', { target: targetElm });
- if (isResizable(targetElm) && !e.isDefaultPrevented()) {
- each(resizeHandles, function (handle, name) {
- var handleElm;
- var startDrag = function (e) {
- startX = e.screenX;
- startY = e.screenY;
- startW = getResizeTarget(selectedElm).clientWidth;
- startH = getResizeTarget(selectedElm).clientHeight;
- ratio = startH / startW;
- selectedHandle = handle;
- handle.startPos = {
- x: targetWidth * handle[0] + selectedElmX,
- y: targetHeight * handle[1] + selectedElmY
- };
- startScrollWidth = rootElement.scrollWidth;
- startScrollHeight = rootElement.scrollHeight;
- selectedElmGhost = selectedElm.cloneNode(true);
- dom.addClass(selectedElmGhost, 'mce-clonedresizable');
- dom.setAttrib(selectedElmGhost, 'data-mce-bogus', 'all');
- selectedElmGhost.contentEditable = false;
- selectedElmGhost.unSelectabe = true;
- dom.setStyles(selectedElmGhost, {
- left: selectedElmX,
- top: selectedElmY,
- margin: 0
- });
- selectedElmGhost.removeAttribute('data-mce-selected');
- rootElement.appendChild(selectedElmGhost);
- dom.bind(editableDoc, 'mousemove', resizeGhostElement);
- dom.bind(editableDoc, 'mouseup', endGhostResize);
- if (rootDocument !== editableDoc) {
- dom.bind(rootDocument, 'mousemove', resizeGhostElement);
- dom.bind(rootDocument, 'mouseup', endGhostResize);
- }
- resizeHelper = dom.add(rootElement, 'div', {
- 'class': 'mce-resize-helper',
- 'data-mce-bogus': 'all'
- }, startW + ' × ' + startH);
- };
- handleElm = dom.get('mceResizeHandle' + name);
- if (handleElm) {
- dom.remove(handleElm);
- }
- handleElm = dom.add(rootElement, 'div', {
- 'id': 'mceResizeHandle' + name,
- 'data-mce-bogus': 'all',
- 'class': 'mce-resizehandle',
- 'unselectable': true,
- 'style': 'cursor:' + name + '-resize; margin:0; padding:0'
- });
- if (Env.ie === 11) {
- handleElm.contentEditable = false;
- }
- dom.bind(handleElm, 'mousedown', function (e) {
- e.stopImmediatePropagation();
- e.preventDefault();
- startDrag(e);
- });
- handle.elm = handleElm;
- dom.setStyles(handleElm, {
- left: targetWidth * handle[0] + selectedElmX - handleElm.offsetWidth / 2,
- top: targetHeight * handle[1] + selectedElmY - handleElm.offsetHeight / 2
- });
- });
- } else {
- hideResizeRect();
- }
- selectedElm.setAttribute('data-mce-selected', '1');
- };
- var hideResizeRect = function () {
- var name, handleElm;
- unbindResizeHandleEvents();
- if (selectedElm) {
- selectedElm.removeAttribute('data-mce-selected');
- }
- for (name in resizeHandles) {
- handleElm = dom.get('mceResizeHandle' + name);
- if (handleElm) {
- dom.unbind(handleElm);
- dom.remove(handleElm);
- }
- }
- };
- var updateResizeRect = function (e) {
- var startElm, controlElm;
- var isChildOrEqual = function (node, parent) {
- if (node) {
- do {
- if (node === parent) {
- return true;
- }
- } while (node = node.parentNode);
- }
- };
- if (resizeStarted || editor.removed) {
- return;
- }
- each(dom.select('img[data-mce-selected],hr[data-mce-selected]'), function (img) {
- img.removeAttribute('data-mce-selected');
- });
- controlElm = e.type === 'mousedown' ? e.target : selection.getNode();
- controlElm = dom.$(controlElm).closest('table,img,figure.image,hr')[0];
- if (isChildOrEqual(controlElm, rootElement)) {
- disableGeckoResize();
- startElm = selection.getStart(true);
- if (isChildOrEqual(startElm, controlElm) && isChildOrEqual(selection.getEnd(true), controlElm)) {
- showResizeRect(controlElm);
- return;
- }
- }
- hideResizeRect();
- };
- var isWithinContentEditableFalse = function (elm) {
- return isContentEditableFalse$a(getContentEditableRoot$2(editor.getBody(), elm));
- };
- var unbindResizeHandleEvents = function () {
- for (var name in resizeHandles) {
- var handle = resizeHandles[name];
- if (handle.elm) {
- dom.unbind(handle.elm);
- delete handle.elm;
- }
- }
- };
- var disableGeckoResize = function () {
- try {
- editor.getDoc().execCommand('enableObjectResizing', false, false);
- } catch (ex) {
- }
- };
- editor.on('init', function () {
- disableGeckoResize();
- if (Env.ie && Env.ie >= 11) {
- editor.on('mousedown click', function (e) {
- var target = e.target, nodeName = target.nodeName;
- if (!resizeStarted && /^(TABLE|IMG|HR)$/.test(nodeName) && !isWithinContentEditableFalse(target)) {
- if (e.button !== 2) {
- editor.selection.select(target, nodeName === 'TABLE');
- }
- if (e.type === 'mousedown') {
- editor.nodeChanged();
- }
- }
- });
- editor.dom.bind(rootElement, 'mscontrolselect', function (e) {
- var delayedSelect = function (node) {
- Delay.setEditorTimeout(editor, function () {
- editor.selection.select(node);
- });
- };
- if (isWithinContentEditableFalse(e.target)) {
- e.preventDefault();
- delayedSelect(e.target);
- return;
- }
- if (/^(TABLE|IMG|HR)$/.test(e.target.nodeName)) {
- e.preventDefault();
- if (e.target.tagName === 'IMG') {
- delayedSelect(e.target);
- }
- }
- });
- }
- var throttledUpdateResizeRect = Delay.throttle(function (e) {
- if (!editor.composing) {
- updateResizeRect(e);
- }
- });
- editor.on('nodechange ResizeEditor ResizeWindow drop FullscreenStateChanged', throttledUpdateResizeRect);
- editor.on('keyup compositionend', function (e) {
- if (selectedElm && selectedElm.nodeName === 'TABLE') {
- throttledUpdateResizeRect(e);
- }
- });
- editor.on('hide blur', hideResizeRect);
- editor.on('contextmenu', contextMenuSelectImage);
- });
- editor.on('remove', unbindResizeHandleEvents);
- var destroy = function () {
- selectedElm = selectedElmGhost = null;
- };
- return {
- isResizable: isResizable,
- showResizeRect: showResizeRect,
- hideResizeRect: hideResizeRect,
- updateResizeRect: updateResizeRect,
- destroy: destroy
- };
- };
-
- var hasCeProperty = function (node) {
- return NodeType.isContentEditableTrue(node) || NodeType.isContentEditableFalse(node);
- };
- var findParent$1 = function (node, rootNode, predicate) {
- while (node && node !== rootNode) {
- if (predicate(node)) {
- return node;
- }
- node = node.parentNode;
- }
- return null;
- };
- var findClosestIeRange = function (clientX, clientY, doc) {
- var element, rng, rects;
- element = doc.elementFromPoint(clientX, clientY);
- rng = doc.body.createTextRange();
- if (!element || element.tagName === 'HTML') {
- element = doc.body;
- }
- rng.moveToElementText(element);
- rects = Tools.toArray(rng.getClientRects());
- rects = rects.sort(function (a, b) {
- a = Math.abs(Math.max(a.top - clientY, a.bottom - clientY));
- b = Math.abs(Math.max(b.top - clientY, b.bottom - clientY));
- return a - b;
- });
- if (rects.length > 0) {
- clientY = (rects[0].bottom + rects[0].top) / 2;
- try {
- rng.moveToPoint(clientX, clientY);
- rng.collapse(true);
- return rng;
- } catch (ex) {
- }
- }
- return null;
- };
- var moveOutOfContentEditableFalse = function (rng, rootNode) {
- var parentElement = rng && rng.parentElement ? rng.parentElement() : null;
- return NodeType.isContentEditableFalse(findParent$1(parentElement, rootNode, hasCeProperty)) ? null : rng;
- };
- var fromPoint$1 = function (clientX, clientY, doc) {
- var rng, point;
- var pointDoc = doc;
- if (pointDoc.caretPositionFromPoint) {
- point = pointDoc.caretPositionFromPoint(clientX, clientY);
- if (point) {
- rng = doc.createRange();
- rng.setStart(point.offsetNode, point.offset);
- rng.collapse(true);
- }
- } else if (doc.caretRangeFromPoint) {
- rng = doc.caretRangeFromPoint(clientX, clientY);
- } else if (pointDoc.body.createTextRange) {
- rng = pointDoc.body.createTextRange();
- try {
- rng.moveToPoint(clientX, clientY);
- rng.collapse(true);
- } catch (ex) {
- rng = findClosestIeRange(clientX, clientY, doc);
- }
- return moveOutOfContentEditableFalse(rng, doc.body);
- }
- return rng;
- };
- var CaretRangeFromPoint = { fromPoint: fromPoint$1 };
-
- var processRanges = function (editor, ranges) {
- return map(ranges, function (range) {
- var evt = editor.fire('GetSelectionRange', { range: range });
- return evt.range !== range ? evt.range : range;
- });
- };
- var EventProcessRanges = { processRanges: processRanges };
-
- var fromElements = function (elements, scope) {
- var doc = scope || domGlobals.document;
- var fragment = doc.createDocumentFragment();
- each(elements, function (element) {
- fragment.appendChild(element.dom());
- });
- return Element.fromDom(fragment);
- };
-
- var tableModel = Immutable('element', 'width', 'rows');
- var tableRow = Immutable('element', 'cells');
- var cellPosition = Immutable('x', 'y');
- var getSpan = function (td, key) {
- var value = parseInt(get(td, key), 10);
- return isNaN(value) ? 1 : value;
- };
- var fillout = function (table, x, y, tr, td) {
- var rowspan = getSpan(td, 'rowspan');
- var colspan = getSpan(td, 'colspan');
- var rows = table.rows();
- for (var y2 = y; y2 < y + rowspan; y2++) {
- if (!rows[y2]) {
- rows[y2] = tableRow(deep(tr), []);
- }
- for (var x2 = x; x2 < x + colspan; x2++) {
- var cells = rows[y2].cells();
- cells[x2] = y2 === y && x2 === x ? td : shallow(td);
- }
- }
- };
- var cellExists = function (table, x, y) {
- var rows = table.rows();
- var cells = rows[y] ? rows[y].cells() : [];
- return !!cells[x];
- };
- var skipCellsX = function (table, x, y) {
- while (cellExists(table, x, y)) {
- x++;
- }
- return x;
- };
- var getWidth = function (rows) {
- return foldl(rows, function (acc, row) {
- return row.cells().length > acc ? row.cells().length : acc;
- }, 0);
- };
- var findElementPos = function (table, element) {
- var rows = table.rows();
- for (var y = 0; y < rows.length; y++) {
- var cells = rows[y].cells();
- for (var x = 0; x < cells.length; x++) {
- if (eq(cells[x], element)) {
- return Option.some(cellPosition(x, y));
- }
- }
- }
- return Option.none();
- };
- var extractRows = function (table, sx, sy, ex, ey) {
- var newRows = [];
- var rows = table.rows();
- for (var y = sy; y <= ey; y++) {
- var cells = rows[y].cells();
- var slice = sx < ex ? cells.slice(sx, ex + 1) : cells.slice(ex, sx + 1);
- newRows.push(tableRow(rows[y].element(), slice));
- }
- return newRows;
- };
- var subTable = function (table, startPos, endPos) {
- var sx = startPos.x(), sy = startPos.y();
- var ex = endPos.x(), ey = endPos.y();
- var newRows = sy < ey ? extractRows(table, sx, sy, ex, ey) : extractRows(table, sx, ey, ex, sy);
- return tableModel(table.element(), getWidth(newRows), newRows);
- };
- var createDomTable = function (table, rows) {
- var tableElement = shallow(table.element());
- var tableBody = Element.fromTag('tbody');
- append$1(tableBody, rows);
- append(tableElement, tableBody);
- return tableElement;
- };
- var modelRowsToDomRows = function (table) {
- return map(table.rows(), function (row) {
- var cells = map(row.cells(), function (cell) {
- var td = deep(cell);
- remove(td, 'colspan');
- remove(td, 'rowspan');
- return td;
- });
- var tr = shallow(row.element());
- append$1(tr, cells);
- return tr;
- });
- };
- var fromDom$1 = function (tableElm) {
- var table = tableModel(shallow(tableElm), 0, []);
- each(descendants$1(tableElm, 'tr'), function (tr, y) {
- each(descendants$1(tr, 'td,th'), function (td, x) {
- fillout(table, skipCellsX(table, x, y), y, tr, td);
- });
- });
- return tableModel(table.element(), getWidth(table.rows()), table.rows());
- };
- var toDom = function (table) {
- return createDomTable(table, modelRowsToDomRows(table));
- };
- var subsection = function (table, startElement, endElement) {
- return findElementPos(table, startElement).bind(function (startPos) {
- return findElementPos(table, endElement).map(function (endPos) {
- return subTable(table, startPos, endPos);
- });
- });
- };
- var SimpleTableModel = {
- fromDom: fromDom$1,
- toDom: toDom,
- subsection: subsection
- };
-
- var findParentListContainer = function (parents) {
- return find(parents, function (elm) {
- return name(elm) === 'ul' || name(elm) === 'ol';
- });
- };
- var getFullySelectedListWrappers = function (parents, rng) {
- return find(parents, function (elm) {
- return name(elm) === 'li' && hasAllContentsSelected(elm, rng);
- }).fold(constant([]), function (li) {
- return findParentListContainer(parents).map(function (listCont) {
- return [
- Element.fromTag('li'),
- Element.fromTag(name(listCont))
- ];
- }).getOr([]);
- });
- };
- var wrap$3 = function (innerElm, elms) {
- var wrapped = foldl(elms, function (acc, elm) {
- append(elm, acc);
- return elm;
- }, innerElm);
- return elms.length > 0 ? fromElements([wrapped]) : wrapped;
- };
- var directListWrappers = function (commonAnchorContainer) {
- if (isListItem(commonAnchorContainer)) {
- return parent(commonAnchorContainer).filter(isList).fold(constant([]), function (listElm) {
- return [
- commonAnchorContainer,
- listElm
- ];
- });
- } else {
- return isList(commonAnchorContainer) ? [commonAnchorContainer] : [];
- }
- };
- var getWrapElements = function (rootNode, rng) {
- var commonAnchorContainer = Element.fromDom(rng.commonAncestorContainer);
- var parents = Parents.parentsAndSelf(commonAnchorContainer, rootNode);
- var wrapElements = filter(parents, function (elm) {
- return isInline(elm) || isHeading(elm);
- });
- var listWrappers = getFullySelectedListWrappers(parents, rng);
- var allWrappers = wrapElements.concat(listWrappers.length ? listWrappers : directListWrappers(commonAnchorContainer));
- return map(allWrappers, shallow);
- };
- var emptyFragment = function () {
- return fromElements([]);
- };
- var getFragmentFromRange = function (rootNode, rng) {
- return wrap$3(Element.fromDom(rng.cloneContents()), getWrapElements(rootNode, rng));
- };
- var getParentTable = function (rootElm, cell) {
- return ancestor$1(cell, 'table', curry(eq, rootElm));
- };
- var getTableFragment = function (rootNode, selectedTableCells) {
- return getParentTable(rootNode, selectedTableCells[0]).bind(function (tableElm) {
- var firstCell = selectedTableCells[0];
- var lastCell = selectedTableCells[selectedTableCells.length - 1];
- var fullTableModel = SimpleTableModel.fromDom(tableElm);
- return SimpleTableModel.subsection(fullTableModel, firstCell, lastCell).map(function (sectionedTableModel) {
- return fromElements([SimpleTableModel.toDom(sectionedTableModel)]);
- });
- }).getOrThunk(emptyFragment);
- };
- var getSelectionFragment = function (rootNode, ranges) {
- return ranges.length > 0 && ranges[0].collapsed ? emptyFragment() : getFragmentFromRange(rootNode, ranges[0]);
- };
- var read$4 = function (rootNode, ranges) {
- var selectedCells = TableCellSelection.getCellsFromElementOrRanges(ranges, rootNode);
- return selectedCells.length > 0 ? getTableFragment(rootNode, selectedCells) : getSelectionFragment(rootNode, ranges);
- };
- var FragmentReader = { read: read$4 };
-
- var getTextContent = function (editor) {
- return Option.from(editor.selection.getRng()).map(function (rng) {
- var bin = editor.dom.add(editor.getBody(), 'div', {
- 'data-mce-bogus': 'all',
- 'style': 'overflow: hidden; opacity: 0;'
- }, rng.cloneContents());
- var text = Zwsp.trim(bin.innerText);
- editor.dom.remove(bin);
- return text;
- }).getOr('');
- };
- var getHtmlContent = function (editor, args) {
- var rng = editor.selection.getRng(), tmpElm = editor.dom.create('body');
- var sel = editor.selection.getSel();
- var fragment;
- var ranges = EventProcessRanges.processRanges(editor, MultiRange.getRanges(sel));
- fragment = args.contextual ? FragmentReader.read(Element.fromDom(editor.getBody()), ranges).dom() : rng.cloneContents();
- if (fragment) {
- tmpElm.appendChild(fragment);
- }
- return editor.selection.serializer.serialize(tmpElm, args);
- };
- var getContent = function (editor, args) {
- if (args === void 0) {
- args = {};
- }
- args.get = true;
- args.format = args.format || 'html';
- args.selection = true;
- args = editor.fire('BeforeGetContent', args);
- if (args.isDefaultPrevented()) {
- editor.fire('GetContent', args);
- return args.content;
- }
- if (args.format === 'text') {
- return getTextContent(editor);
- } else {
- args.getInner = true;
- var content = getHtmlContent(editor, args);
- if (args.format === 'tree') {
- return content;
- } else {
- args.content = editor.selection.isCollapsed() ? '' : content;
- editor.fire('GetContent', args);
- return args.content;
- }
- }
- };
- var GetSelectionContent = { getContent: getContent };
-
- var setupArgs = function (args, content) {
- return __assign(__assign({ format: 'html' }, args), {
- set: true,
- selection: true,
- content: content
- });
- };
- var cleanContent = function (editor, args) {
- if (args.format !== 'raw') {
- var node = editor.parser.parse(args.content, __assign({
- isRootContent: true,
- forced_root_block: false
- }, args));
- return HtmlSerializer({ validate: editor.validate }, editor.schema).serialize(node);
- } else {
- return args.content;
- }
- };
- var setContent = function (editor, content, args) {
- var contentArgs = setupArgs(args, content);
- var rng = editor.selection.getRng(), caretNode;
- var doc = editor.getDoc();
- var frag, temp;
- if (!contentArgs.no_events) {
- contentArgs = editor.fire('BeforeSetContent', contentArgs);
- if (contentArgs.isDefaultPrevented()) {
- editor.fire('SetContent', contentArgs);
- return;
- }
- }
- content = cleanContent(editor, contentArgs);
- if (rng.insertNode) {
- content += '_ ';
- if (rng.startContainer === doc && rng.endContainer === doc) {
- doc.body.innerHTML = content;
- } else {
- rng.deleteContents();
- if (doc.body.childNodes.length === 0) {
- doc.body.innerHTML = content;
- } else {
- if (rng.createContextualFragment) {
- rng.insertNode(rng.createContextualFragment(content));
- } else {
- frag = doc.createDocumentFragment();
- temp = doc.createElement('div');
- frag.appendChild(temp);
- temp.outerHTML = content;
- rng.insertNode(frag);
- }
- }
- }
- caretNode = editor.dom.get('__caret');
- rng = doc.createRange();
- rng.setStartBefore(caretNode);
- rng.setEndBefore(caretNode);
- editor.selection.setRng(rng);
- editor.dom.remove('__caret');
- try {
- editor.selection.setRng(rng);
- } catch (ex) {
- }
- } else {
- var anyRng = rng;
- if (anyRng.item) {
- doc.execCommand('Delete', false, null);
- anyRng = editor.selection.getRng();
- }
- if (/^\s+/.test(content)) {
- anyRng.pasteHTML('_ ' + content);
- editor.dom.remove('__mce_tmp');
- } else {
- anyRng.pasteHTML(content);
- }
- }
- if (!contentArgs.no_events) {
- editor.fire('SetContent', contentArgs);
- }
- };
- var SetSelectionContent = { setContent: setContent };
-
- var getEndpointElement = function (root, rng, start, real, resolve) {
- var container = start ? rng.startContainer : rng.endContainer;
- var offset = start ? rng.startOffset : rng.endOffset;
- return Option.from(container).map(Element.fromDom).map(function (elm) {
- return !real || !rng.collapsed ? child(elm, resolve(elm, offset)).getOr(elm) : elm;
- }).bind(function (elm) {
- return isElement(elm) ? Option.some(elm) : parent(elm);
- }).map(function (elm) {
- return elm.dom();
- }).getOr(root);
- };
- var getStart$2 = function (root, rng, real) {
- return getEndpointElement(root, rng, true, real, function (elm, offset) {
- return Math.min(childNodesCount(elm), offset);
- });
- };
- var getEnd = function (root, rng, real) {
- return getEndpointElement(root, rng, false, real, function (elm, offset) {
- return offset > 0 ? offset - 1 : offset;
- });
- };
- var skipEmptyTextNodes = function (node, forwards) {
- var orig = node;
- while (node && NodeType.isText(node) && node.length === 0) {
- node = forwards ? node.nextSibling : node.previousSibling;
- }
- return node || orig;
- };
- var getNode$1 = function (root, rng) {
- var elm, startContainer, endContainer, startOffset, endOffset;
- if (!rng) {
- return root;
- }
- startContainer = rng.startContainer;
- endContainer = rng.endContainer;
- startOffset = rng.startOffset;
- endOffset = rng.endOffset;
- elm = rng.commonAncestorContainer;
- if (!rng.collapsed) {
- if (startContainer === endContainer) {
- if (endOffset - startOffset < 2) {
- if (startContainer.hasChildNodes()) {
- elm = startContainer.childNodes[startOffset];
- }
- }
- }
- if (startContainer.nodeType === 3 && endContainer.nodeType === 3) {
- if (startContainer.length === startOffset) {
- startContainer = skipEmptyTextNodes(startContainer.nextSibling, true);
- } else {
- startContainer = startContainer.parentNode;
- }
- if (endOffset === 0) {
- endContainer = skipEmptyTextNodes(endContainer.previousSibling, false);
- } else {
- endContainer = endContainer.parentNode;
- }
- if (startContainer && startContainer === endContainer) {
- return startContainer;
- }
- }
- }
- if (elm && elm.nodeType === 3) {
- return elm.parentNode;
- }
- return elm;
- };
- var getSelectedBlocks = function (dom, rng, startElm, endElm) {
- var node, root;
- var selectedBlocks = [];
- root = dom.getRoot();
- startElm = dom.getParent(startElm || getStart$2(root, rng, rng.collapsed), dom.isBlock);
- endElm = dom.getParent(endElm || getEnd(root, rng, rng.collapsed), dom.isBlock);
- if (startElm && startElm !== root) {
- selectedBlocks.push(startElm);
- }
- if (startElm && endElm && startElm !== endElm) {
- node = startElm;
- var walker = new TreeWalker(startElm, root);
- while ((node = walker.next()) && node !== endElm) {
- if (dom.isBlock(node)) {
- selectedBlocks.push(node);
- }
- }
- }
- if (endElm && startElm !== endElm && endElm !== root) {
- selectedBlocks.push(endElm);
- }
- return selectedBlocks;
- };
- var select$1 = function (dom, node, content) {
- return Option.from(node).map(function (node) {
- var idx = dom.nodeIndex(node);
- var rng = dom.createRng();
- rng.setStart(node.parentNode, idx);
- rng.setEnd(node.parentNode, idx + 1);
- if (content) {
- moveEndPoint$1(dom, rng, node, true);
- moveEndPoint$1(dom, rng, node, false);
- }
- return rng;
- });
- };
-
- var each$j = Tools.each;
- var isNativeIeSelection = function (rng) {
- return !!rng.select;
- };
- var isAttachedToDom = function (node) {
- return !!(node && node.ownerDocument) && contains$3(Element.fromDom(node.ownerDocument), Element.fromDom(node));
- };
- var isValidRange = function (rng) {
- if (!rng) {
- return false;
- } else if (isNativeIeSelection(rng)) {
- return true;
- } else {
- return isAttachedToDom(rng.startContainer) && isAttachedToDom(rng.endContainer);
- }
- };
- var Selection$1 = function (dom, win, serializer, editor) {
- var bookmarkManager, controlSelection;
- var selectedRange, explicitRange, selectorChangedData;
- var setCursorLocation = function (node, offset) {
- var rng = dom.createRng();
- if (!node) {
- moveEndPoint$1(dom, rng, editor.getBody(), true);
- setRng(rng);
- } else {
- rng.setStart(node, offset);
- rng.setEnd(node, offset);
- setRng(rng);
- collapse(false);
- }
- };
- var getContent = function (args) {
- return GetSelectionContent.getContent(editor, args);
- };
- var setContent = function (content, args) {
- return SetSelectionContent.setContent(editor, content, args);
- };
- var getStart = function (real) {
- return getStart$2(editor.getBody(), getRng(), real);
- };
- var getEnd$1 = function (real) {
- return getEnd(editor.getBody(), getRng(), real);
- };
- var getBookmark = function (type, normalized) {
- return bookmarkManager.getBookmark(type, normalized);
- };
- var moveToBookmark = function (bookmark) {
- return bookmarkManager.moveToBookmark(bookmark);
- };
- var select = function (node, content) {
- select$1(dom, node, content).each(setRng);
- return node;
- };
- var isCollapsed = function () {
- var rng = getRng(), sel = getSel();
- if (!rng || rng.item) {
- return false;
- }
- if (rng.compareEndPoints) {
- return rng.compareEndPoints('StartToEnd', rng) === 0;
- }
- return !sel || rng.collapsed;
- };
- var collapse = function (toStart) {
- var rng = getRng();
- rng.collapse(!!toStart);
- setRng(rng);
- };
- var getSel = function () {
- return win.getSelection ? win.getSelection() : win.document.selection;
- };
- var getRng = function () {
- var selection, rng, elm, doc;
- var tryCompareBoundaryPoints = function (how, sourceRange, destinationRange) {
- try {
- return sourceRange.compareBoundaryPoints(how, destinationRange);
- } catch (ex) {
- return -1;
- }
- };
- if (!win) {
- return null;
- }
- doc = win.document;
- if (typeof doc === 'undefined' || doc === null) {
- return null;
- }
- if (editor.bookmark !== undefined && EditorFocus.hasFocus(editor) === false) {
- var bookmark = SelectionBookmark.getRng(editor);
- if (bookmark.isSome()) {
- return bookmark.map(function (r) {
- return EventProcessRanges.processRanges(editor, [r])[0];
- }).getOr(doc.createRange());
- }
- }
- try {
- if ((selection = getSel()) && !NodeType.isRestrictedNode(selection.anchorNode)) {
- if (selection.rangeCount > 0) {
- rng = selection.getRangeAt(0);
- } else {
- rng = selection.createRange ? selection.createRange() : doc.createRange();
- }
- }
- } catch (ex) {
- }
- rng = EventProcessRanges.processRanges(editor, [rng])[0];
- if (!rng) {
- rng = doc.createRange ? doc.createRange() : doc.body.createTextRange();
- }
- if (rng.setStart && rng.startContainer.nodeType === 9 && rng.collapsed) {
- elm = dom.getRoot();
- rng.setStart(elm, 0);
- rng.setEnd(elm, 0);
- }
- if (selectedRange && explicitRange) {
- if (tryCompareBoundaryPoints(rng.START_TO_START, rng, selectedRange) === 0 && tryCompareBoundaryPoints(rng.END_TO_END, rng, selectedRange) === 0) {
- rng = explicitRange;
- } else {
- selectedRange = null;
- explicitRange = null;
- }
- }
- return rng;
- };
- var setRng = function (rng, forward) {
- var sel, node, evt;
- if (!isValidRange(rng)) {
- return;
- }
- var ieRange = isNativeIeSelection(rng) ? rng : null;
- if (ieRange) {
- explicitRange = null;
- try {
- ieRange.select();
- } catch (ex) {
- }
- return;
- }
- sel = getSel();
- evt = editor.fire('SetSelectionRange', {
- range: rng,
- forward: forward
- });
- rng = evt.range;
- if (sel) {
- explicitRange = rng;
- try {
- sel.removeAllRanges();
- sel.addRange(rng);
- } catch (ex) {
- }
- if (forward === false && sel.extend) {
- sel.collapse(rng.endContainer, rng.endOffset);
- sel.extend(rng.startContainer, rng.startOffset);
- }
- selectedRange = sel.rangeCount > 0 ? sel.getRangeAt(0) : null;
- }
- if (!rng.collapsed && rng.startContainer === rng.endContainer && sel.setBaseAndExtent && !Env.ie) {
- if (rng.endOffset - rng.startOffset < 2) {
- if (rng.startContainer.hasChildNodes()) {
- node = rng.startContainer.childNodes[rng.startOffset];
- if (node && node.tagName === 'IMG') {
- sel.setBaseAndExtent(rng.startContainer, rng.startOffset, rng.endContainer, rng.endOffset);
- if (sel.anchorNode !== rng.startContainer || sel.focusNode !== rng.endContainer) {
- sel.setBaseAndExtent(node, 0, node, 1);
- }
- }
- }
- }
- }
- editor.fire('AfterSetSelectionRange', {
- range: rng,
- forward: forward
- });
- };
- var setNode = function (elm) {
- setContent(dom.getOuterHTML(elm));
- return elm;
- };
- var getNode = function () {
- return getNode$1(editor.getBody(), getRng());
- };
- var getSelectedBlocks$1 = function (startElm, endElm) {
- return getSelectedBlocks(dom, getRng(), startElm, endElm);
- };
- var isForward = function () {
- var sel = getSel();
- var anchorRange, focusRange;
- if (!sel || !sel.anchorNode || !sel.focusNode) {
- return true;
- }
- anchorRange = dom.createRng();
- anchorRange.setStart(sel.anchorNode, sel.anchorOffset);
- anchorRange.collapse(true);
- focusRange = dom.createRng();
- focusRange.setStart(sel.focusNode, sel.focusOffset);
- focusRange.collapse(true);
- return anchorRange.compareBoundaryPoints(anchorRange.START_TO_START, focusRange) <= 0;
- };
- var normalize = function () {
- var rng = getRng();
- var sel = getSel();
- if (!MultiRange.hasMultipleRanges(sel) && hasAnyRanges(editor)) {
- var normRng = NormalizeRange.normalize(dom, rng);
- normRng.each(function (normRng) {
- setRng(normRng, isForward());
- });
- return normRng.getOr(rng);
- }
- return rng;
- };
- var selectorChanged = function (selector, callback) {
- var currentSelectors;
- if (!selectorChangedData) {
- selectorChangedData = {};
- currentSelectors = {};
- editor.on('NodeChange', function (e) {
- var node = e.element, parents = dom.getParents(node, null, dom.getRoot()), matchedSelectors = {};
- each$j(selectorChangedData, function (callbacks, selector) {
- each$j(parents, function (node) {
- if (dom.is(node, selector)) {
- if (!currentSelectors[selector]) {
- each$j(callbacks, function (callback) {
- callback(true, {
- node: node,
- selector: selector,
- parents: parents
- });
- });
- currentSelectors[selector] = callbacks;
- }
- matchedSelectors[selector] = callbacks;
- return false;
- }
- });
- });
- each$j(currentSelectors, function (callbacks, selector) {
- if (!matchedSelectors[selector]) {
- delete currentSelectors[selector];
- each$j(callbacks, function (callback) {
- callback(false, {
- node: node,
- selector: selector,
- parents: parents
- });
- });
- }
- });
- });
- }
- if (!selectorChangedData[selector]) {
- selectorChangedData[selector] = [];
- }
- selectorChangedData[selector].push(callback);
- return exports;
- };
- var getScrollContainer = function () {
- var scrollContainer;
- var node = dom.getRoot();
- while (node && node.nodeName !== 'BODY') {
- if (node.scrollHeight > node.clientHeight) {
- scrollContainer = node;
- break;
- }
- node = node.parentNode;
- }
- return scrollContainer;
- };
- var scrollIntoView = function (elm, alignToTop) {
- return ScrollIntoView.scrollElementIntoView(editor, elm, alignToTop);
- };
- var placeCaretAt = function (clientX, clientY) {
- return setRng(CaretRangeFromPoint.fromPoint(clientX, clientY, editor.getDoc()));
- };
- var getBoundingClientRect = function () {
- var rng = getRng();
- return rng.collapsed ? CaretPosition$1.fromRangeStart(rng).getClientRects()[0] : rng.getBoundingClientRect();
- };
- var destroy = function () {
- win = selectedRange = explicitRange = null;
- controlSelection.destroy();
- };
- var exports = {
- bookmarkManager: null,
- controlSelection: null,
- dom: dom,
- win: win,
- serializer: serializer,
- editor: editor,
- collapse: collapse,
- setCursorLocation: setCursorLocation,
- getContent: getContent,
- setContent: setContent,
- getBookmark: getBookmark,
- moveToBookmark: moveToBookmark,
- select: select,
- isCollapsed: isCollapsed,
- isForward: isForward,
- setNode: setNode,
- getNode: getNode,
- getSel: getSel,
- setRng: setRng,
- getRng: getRng,
- getStart: getStart,
- getEnd: getEnd$1,
- getSelectedBlocks: getSelectedBlocks$1,
- normalize: normalize,
- selectorChanged: selectorChanged,
- getScrollContainer: getScrollContainer,
- scrollIntoView: scrollIntoView,
- placeCaretAt: placeCaretAt,
- getBoundingClientRect: getBoundingClientRect,
- destroy: destroy
- };
- bookmarkManager = BookmarkManager$1(exports);
- controlSelection = ControlSelection(exports, editor);
- exports.bookmarkManager = bookmarkManager;
- exports.controlSelection = controlSelection;
- return exports;
- };
-
- var BreakType;
- (function (BreakType) {
- BreakType[BreakType['Br'] = 0] = 'Br';
- BreakType[BreakType['Block'] = 1] = 'Block';
- BreakType[BreakType['Wrap'] = 2] = 'Wrap';
- BreakType[BreakType['Eol'] = 3] = 'Eol';
- }(BreakType || (BreakType = {})));
- var flip = function (direction, positions) {
- return direction === HDirection.Backwards ? positions.reverse() : positions;
- };
- var walk$3 = function (direction, caretWalker, pos) {
- return direction === HDirection.Forwards ? caretWalker.next(pos) : caretWalker.prev(pos);
- };
- var getBreakType = function (scope, direction, currentPos, nextPos) {
- if (NodeType.isBr(nextPos.getNode(direction === HDirection.Forwards))) {
- return BreakType.Br;
- } else if (isInSameBlock(currentPos, nextPos) === false) {
- return BreakType.Block;
- } else {
- return BreakType.Wrap;
- }
- };
- var getPositionsUntil = function (predicate, direction, scope, start) {
- var caretWalker = CaretWalker(scope);
- var currentPos = start, nextPos;
- var positions = [];
- while (currentPos) {
- nextPos = walk$3(direction, caretWalker, currentPos);
- if (!nextPos) {
- break;
- }
- if (NodeType.isBr(nextPos.getNode(false))) {
- if (direction === HDirection.Forwards) {
- return {
- positions: flip(direction, positions).concat([nextPos]),
- breakType: BreakType.Br,
- breakAt: Option.some(nextPos)
- };
- } else {
- return {
- positions: flip(direction, positions),
- breakType: BreakType.Br,
- breakAt: Option.some(nextPos)
- };
- }
- }
- if (!nextPos.isVisible()) {
- currentPos = nextPos;
- continue;
- }
- if (predicate(currentPos, nextPos)) {
- var breakType = getBreakType(scope, direction, currentPos, nextPos);
- return {
- positions: flip(direction, positions),
- breakType: breakType,
- breakAt: Option.some(nextPos)
- };
- }
- positions.push(nextPos);
- currentPos = nextPos;
- }
- return {
- positions: flip(direction, positions),
- breakType: BreakType.Eol,
- breakAt: Option.none()
- };
- };
- var getAdjacentLinePositions = function (direction, getPositionsUntilBreak, scope, start) {
- return getPositionsUntilBreak(scope, start).breakAt.map(function (pos) {
- var positions = getPositionsUntilBreak(scope, pos).positions;
- return direction === HDirection.Backwards ? positions.concat(pos) : [pos].concat(positions);
- }).getOr([]);
- };
- var findClosestHorizontalPositionFromPoint = function (positions, x) {
- return foldl(positions, function (acc, newPos) {
- return acc.fold(function () {
- return Option.some(newPos);
- }, function (lastPos) {
- return lift2(head(lastPos.getClientRects()), head(newPos.getClientRects()), function (lastRect, newRect) {
- var lastDist = Math.abs(x - lastRect.left);
- var newDist = Math.abs(x - newRect.left);
- return newDist <= lastDist ? newPos : lastPos;
- }).or(acc);
- });
- }, Option.none());
- };
- var findClosestHorizontalPosition = function (positions, pos) {
- return head(pos.getClientRects()).bind(function (targetRect) {
- return findClosestHorizontalPositionFromPoint(positions, targetRect.left);
- });
- };
- var getPositionsUntilPreviousLine = curry(getPositionsUntil, CaretPosition.isAbove, -1);
- var getPositionsUntilNextLine = curry(getPositionsUntil, CaretPosition.isBelow, 1);
- var isAtFirstLine = function (scope, pos) {
- return getPositionsUntilPreviousLine(scope, pos).breakAt.isNone();
- };
- var isAtLastLine = function (scope, pos) {
- return getPositionsUntilNextLine(scope, pos).breakAt.isNone();
- };
- var getPositionsAbove = curry(getAdjacentLinePositions, -1, getPositionsUntilPreviousLine);
- var getPositionsBelow = curry(getAdjacentLinePositions, 1, getPositionsUntilNextLine);
- var getFirstLinePositions = function (scope) {
- return CaretFinder.firstPositionIn(scope).map(function (pos) {
- return [pos].concat(getPositionsUntilNextLine(scope, pos).positions);
- }).getOr([]);
- };
- var getLastLinePositions = function (scope) {
- return CaretFinder.lastPositionIn(scope).map(function (pos) {
- return getPositionsUntilPreviousLine(scope, pos).positions.concat(pos);
- }).getOr([]);
- };
-
- var isContentEditableFalse$b = NodeType.isContentEditableFalse;
- var getSelectedNode$1 = getSelectedNode;
- var moveToCeFalseHorizontally = function (direction, editor, getNextPosFn, range) {
- var forwards = direction === HDirection.Forwards;
- var isBeforeContentEditableFalseFn = forwards ? isBeforeContentEditableFalse : isAfterContentEditableFalse;
- if (!range.collapsed) {
- var node = getSelectedNode$1(range);
- if (isContentEditableFalse$b(node)) {
- return showCaret(direction, editor, node, direction === HDirection.Backwards, true);
- }
- }
- var rangeIsInContainerBlock = isRangeInCaretContainerBlock(range);
- var caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);
- if (isBeforeContentEditableFalseFn(caretPosition)) {
- return selectNode(editor, caretPosition.getNode(!forwards));
- }
- var nextCaretPosition = InlineUtils.normalizePosition(forwards, getNextPosFn(caretPosition));
- if (!nextCaretPosition) {
- if (rangeIsInContainerBlock) {
- return range;
- }
- return null;
- }
- if (isBeforeContentEditableFalseFn(nextCaretPosition)) {
- return showCaret(direction, editor, nextCaretPosition.getNode(!forwards), forwards, true);
- }
- var peekCaretPosition = getNextPosFn(nextCaretPosition);
- if (peekCaretPosition && isBeforeContentEditableFalseFn(peekCaretPosition)) {
- if (isMoveInsideSameBlock(nextCaretPosition, peekCaretPosition)) {
- return showCaret(direction, editor, peekCaretPosition.getNode(!forwards), forwards, true);
- }
- }
- if (rangeIsInContainerBlock) {
- return renderRangeCaret(editor, nextCaretPosition.toRange(), true);
- }
- return null;
- };
- var moveToCeFalseVertically = function (direction, editor, walkerFn, range) {
- var caretPosition, linePositions, nextLinePositions;
- var closestNextLineRect, caretClientRect, clientX;
- var dist1, dist2, contentEditableFalseNode;
- contentEditableFalseNode = getSelectedNode$1(range);
- caretPosition = getNormalizedRangeEndPoint(direction, editor.getBody(), range);
- linePositions = walkerFn(editor.getBody(), isAboveLine(1), caretPosition);
- nextLinePositions = filter(linePositions, isLine(1));
- caretClientRect = ArrUtils.last(caretPosition.getClientRects());
- if (isBeforeContentEditableFalse(caretPosition) || isBeforeTable(caretPosition)) {
- contentEditableFalseNode = caretPosition.getNode();
- }
- if (isAfterContentEditableFalse(caretPosition) || isAfterTable(caretPosition)) {
- contentEditableFalseNode = caretPosition.getNode(true);
- }
- if (!caretClientRect) {
- return null;
- }
- clientX = caretClientRect.left;
- closestNextLineRect = findClosestClientRect(nextLinePositions, clientX);
- if (closestNextLineRect) {
- if (isContentEditableFalse$b(closestNextLineRect.node)) {
- dist1 = Math.abs(clientX - closestNextLineRect.left);
- dist2 = Math.abs(clientX - closestNextLineRect.right);
- return showCaret(direction, editor, closestNextLineRect.node, dist1 < dist2, true);
- }
- }
- if (contentEditableFalseNode) {
- var caretPositions = positionsUntil(direction, editor.getBody(), isAboveLine(1), contentEditableFalseNode);
- closestNextLineRect = findClosestClientRect(filter(caretPositions, isLine(1)), clientX);
- if (closestNextLineRect) {
- return renderRangeCaret(editor, closestNextLineRect.position.toRange(), true);
- }
- closestNextLineRect = ArrUtils.last(filter(caretPositions, isLine(0)));
- if (closestNextLineRect) {
- return renderRangeCaret(editor, closestNextLineRect.position.toRange(), true);
- }
- }
- };
- var createTextBlock = function (editor) {
- var textBlock = editor.dom.create(Settings.getForcedRootBlock(editor));
- if (!Env.ie || Env.ie >= 11) {
- textBlock.innerHTML = ' ';
- }
- return textBlock;
- };
- var exitPreBlock = function (editor, direction, range) {
- var pre, caretPos, newBlock;
- var caretWalker = CaretWalker(editor.getBody());
- var getNextVisualCaretPosition = curry(getVisualCaretPosition, caretWalker.next);
- var getPrevVisualCaretPosition = curry(getVisualCaretPosition, caretWalker.prev);
- if (range.collapsed && editor.settings.forced_root_block) {
- pre = editor.dom.getParent(range.startContainer, 'PRE');
- if (!pre) {
- return;
- }
- if (direction === 1) {
- caretPos = getNextVisualCaretPosition(CaretPosition$1.fromRangeStart(range));
- } else {
- caretPos = getPrevVisualCaretPosition(CaretPosition$1.fromRangeStart(range));
- }
- if (!caretPos) {
- newBlock = createTextBlock(editor);
- if (direction === 1) {
- editor.$(pre).after(newBlock);
- } else {
- editor.$(pre).before(newBlock);
- }
- editor.selection.select(newBlock, true);
- editor.selection.collapse();
- }
- }
- };
- var getHorizontalRange = function (editor, forward) {
- var caretWalker = CaretWalker(editor.getBody());
- var getNextVisualCaretPosition = curry(getVisualCaretPosition, caretWalker.next);
- var getPrevVisualCaretPosition = curry(getVisualCaretPosition, caretWalker.prev);
- var newRange;
- var direction = forward ? HDirection.Forwards : HDirection.Backwards;
- var getNextPosFn = forward ? getNextVisualCaretPosition : getPrevVisualCaretPosition;
- var range = editor.selection.getRng();
- newRange = moveToCeFalseHorizontally(direction, editor, getNextPosFn, range);
- if (newRange) {
- return newRange;
- }
- newRange = exitPreBlock(editor, direction, range);
- if (newRange) {
- return newRange;
- }
- return null;
- };
- var getVerticalRange = function (editor, down) {
- var newRange;
- var direction = down ? 1 : -1;
- var walkerFn = down ? downUntil : upUntil;
- var range = editor.selection.getRng();
- newRange = moveToCeFalseVertically(direction, editor, walkerFn, range);
- if (newRange) {
- return newRange;
- }
- newRange = exitPreBlock(editor, direction, range);
- if (newRange) {
- return newRange;
- }
- return null;
- };
- var moveH = function (editor, forward) {
- return function () {
- var newRng = getHorizontalRange(editor, forward);
- if (newRng) {
- moveToRange(editor, newRng);
- return true;
- } else {
- return false;
- }
- };
- };
- var moveV = function (editor, down) {
- return function () {
- var newRng = getVerticalRange(editor, down);
- if (newRng) {
- moveToRange(editor, newRng);
- return true;
- } else {
- return false;
- }
- };
- };
- var isCefPosition = function (forward) {
- return function (pos) {
- return forward ? isAfterContentEditableFalse(pos) : isBeforeContentEditableFalse(pos);
- };
- };
- var moveToLineEndPoint = function (editor, forward) {
- return function () {
- var from = forward ? CaretPosition$1.fromRangeEnd(editor.selection.getRng()) : CaretPosition$1.fromRangeStart(editor.selection.getRng());
- var result = forward ? getPositionsUntilNextLine(editor.getBody(), from) : getPositionsUntilPreviousLine(editor.getBody(), from);
- var to = forward ? last(result.positions) : head(result.positions);
- return to.filter(isCefPosition(forward)).fold(constant(false), function (pos) {
- editor.selection.setRng(pos.toRange());
- return true;
- });
- };
- };
-
- var deflate = function (rect, delta) {
- return {
- left: rect.left - delta,
- top: rect.top - delta,
- right: rect.right + delta * 2,
- bottom: rect.bottom + delta * 2,
- width: rect.width + delta,
- height: rect.height + delta
- };
- };
- var getCorners = function (getYAxisValue, tds) {
- return bind(tds, function (td) {
- var rect = deflate(clone$1(td.getBoundingClientRect()), -1);
- return [
- {
- x: rect.left,
- y: getYAxisValue(rect),
- cell: td
- },
- {
- x: rect.right,
- y: getYAxisValue(rect),
- cell: td
- }
- ];
- });
- };
- var findClosestCorner = function (corners, x, y) {
- return foldl(corners, function (acc, newCorner) {
- return acc.fold(function () {
- return Option.some(newCorner);
- }, function (oldCorner) {
- var oldDist = Math.sqrt(Math.abs(oldCorner.x - x) + Math.abs(oldCorner.y - y));
- var newDist = Math.sqrt(Math.abs(newCorner.x - x) + Math.abs(newCorner.y - y));
- return Option.some(newDist < oldDist ? newCorner : oldCorner);
- });
- }, Option.none());
- };
- var getClosestCell$1 = function (getYAxisValue, isTargetCorner, table, x, y) {
- var cells = descendants$1(Element.fromDom(table), 'td,th,caption').map(function (e) {
- return e.dom();
- });
- var corners = filter(getCorners(getYAxisValue, cells), function (corner) {
- return isTargetCorner(corner, y);
- });
- return findClosestCorner(corners, x, y).map(function (corner) {
- return corner.cell;
- });
- };
- var getBottomValue = function (rect) {
- return rect.bottom;
- };
- var getTopValue = function (rect) {
- return rect.top;
- };
- var isAbove$1 = function (corner, y) {
- return corner.y < y;
- };
- var isBelow$1 = function (corner, y) {
- return corner.y > y;
- };
- var getClosestCellAbove = curry(getClosestCell$1, getBottomValue, isAbove$1);
- var getClosestCellBelow = curry(getClosestCell$1, getTopValue, isBelow$1);
- var findClosestPositionInAboveCell = function (table, pos) {
- return head(pos.getClientRects()).bind(function (rect) {
- return getClosestCellAbove(table, rect.left, rect.top);
- }).bind(function (cell) {
- return findClosestHorizontalPosition(getLastLinePositions(cell), pos);
- });
- };
- var findClosestPositionInBelowCell = function (table, pos) {
- return last(pos.getClientRects()).bind(function (rect) {
- return getClosestCellBelow(table, rect.left, rect.top);
- }).bind(function (cell) {
- return findClosestHorizontalPosition(getFirstLinePositions(cell), pos);
- });
- };
-
- var hasNextBreak = function (getPositionsUntil, scope, lineInfo) {
- return lineInfo.breakAt.map(function (breakPos) {
- return getPositionsUntil(scope, breakPos).breakAt.isSome();
- }).getOr(false);
- };
- var startsWithWrapBreak = function (lineInfo) {
- return lineInfo.breakType === BreakType.Wrap && lineInfo.positions.length === 0;
- };
- var startsWithBrBreak = function (lineInfo) {
- return lineInfo.breakType === BreakType.Br && lineInfo.positions.length === 1;
- };
- var isAtTableCellLine = function (getPositionsUntil, scope, pos) {
- var lineInfo = getPositionsUntil(scope, pos);
- if (startsWithWrapBreak(lineInfo) || !NodeType.isBr(pos.getNode()) && startsWithBrBreak(lineInfo)) {
- return !hasNextBreak(getPositionsUntil, scope, lineInfo);
- } else {
- return lineInfo.breakAt.isNone();
- }
- };
- var isAtFirstTableCellLine = curry(isAtTableCellLine, getPositionsUntilPreviousLine);
- var isAtLastTableCellLine = curry(isAtTableCellLine, getPositionsUntilNextLine);
- var isCaretAtStartOrEndOfTable = function (forward, rng, table) {
- var caretPos = CaretPosition$1.fromRangeStart(rng);
- return CaretFinder.positionIn(!forward, table).map(function (pos) {
- return pos.isEqual(caretPos);
- }).getOr(false);
- };
- var navigateHorizontally = function (editor, forward, table, td) {
- var rng = editor.selection.getRng();
- var direction = forward ? 1 : -1;
- if (isFakeCaretTableBrowser() && isCaretAtStartOrEndOfTable(forward, rng, table)) {
- var newRng = showCaret(direction, editor, table, !forward, true);
- moveToRange(editor, newRng);
- return true;
- }
- return false;
- };
- var getClosestAbovePosition = function (root, table, start) {
- return findClosestPositionInAboveCell(table, start).orThunk(function () {
- return head(start.getClientRects()).bind(function (rect) {
- return findClosestHorizontalPositionFromPoint(getPositionsAbove(root, CaretPosition$1.before(table)), rect.left);
- });
- }).getOr(CaretPosition$1.before(table));
- };
- var getClosestBelowPosition = function (root, table, start) {
- return findClosestPositionInBelowCell(table, start).orThunk(function () {
- return head(start.getClientRects()).bind(function (rect) {
- return findClosestHorizontalPositionFromPoint(getPositionsBelow(root, CaretPosition$1.after(table)), rect.left);
- });
- }).getOr(CaretPosition$1.after(table));
- };
- var getTable = function (previous, pos) {
- var node = pos.getNode(previous);
- return NodeType.isElement(node) && node.nodeName === 'TABLE' ? Option.some(node) : Option.none();
- };
- var renderBlock = function (down, editor, table, pos) {
- var forcedRootBlock = Settings.getForcedRootBlock(editor);
- if (forcedRootBlock) {
- editor.undoManager.transact(function () {
- var element = Element.fromTag(forcedRootBlock);
- setAll(element, Settings.getForcedRootBlockAttrs(editor));
- append(element, Element.fromTag('br'));
- if (down) {
- after(Element.fromDom(table), element);
- } else {
- before(Element.fromDom(table), element);
- }
- var rng = editor.dom.createRng();
- rng.setStart(element.dom(), 0);
- rng.setEnd(element.dom(), 0);
- moveToRange(editor, rng);
- });
- } else {
- moveToRange(editor, pos.toRange());
- }
- };
- var moveCaret = function (editor, down, pos) {
- var table = down ? getTable(true, pos) : getTable(false, pos);
- var last = down === false;
- table.fold(function () {
- return moveToRange(editor, pos.toRange());
- }, function (table) {
- return CaretFinder.positionIn(last, editor.getBody()).filter(function (lastPos) {
- return lastPos.isEqual(pos);
- }).fold(function () {
- return moveToRange(editor, pos.toRange());
- }, function (_) {
- return renderBlock(down, editor, table, pos);
- });
- });
- };
- var navigateVertically = function (editor, down, table, td) {
- var rng = editor.selection.getRng();
- var pos = CaretPosition$1.fromRangeStart(rng);
- var root = editor.getBody();
- if (!down && isAtFirstTableCellLine(td, pos)) {
- var newPos = getClosestAbovePosition(root, table, pos);
- moveCaret(editor, down, newPos);
- return true;
- } else if (down && isAtLastTableCellLine(td, pos)) {
- var newPos = getClosestBelowPosition(root, table, pos);
- moveCaret(editor, down, newPos);
- return true;
- } else {
- return false;
- }
- };
- var moveH$1 = function (editor, forward) {
- return function () {
- return Option.from(editor.dom.getParent(editor.selection.getNode(), 'td,th')).bind(function (td) {
- return Option.from(editor.dom.getParent(td, 'table')).map(function (table) {
- return navigateHorizontally(editor, forward, table);
- });
- }).getOr(false);
- };
- };
- var moveV$1 = function (editor, forward) {
- return function () {
- return Option.from(editor.dom.getParent(editor.selection.getNode(), 'td,th')).bind(function (td) {
- return Option.from(editor.dom.getParent(td, 'table')).map(function (table) {
- return navigateVertically(editor, forward, table, td);
- });
- }).getOr(false);
- };
- };
-
- var isTarget = function (node) {
- return contains(['figcaption'], name(node));
- };
- var rangeBefore = function (target) {
- var rng = domGlobals.document.createRange();
- rng.setStartBefore(target.dom());
- rng.setEndBefore(target.dom());
- return rng;
- };
- var insertElement = function (root, elm, forward) {
- if (forward) {
- append(root, elm);
- } else {
- prepend(root, elm);
- }
- };
- var insertBr = function (root, forward) {
- var br = Element.fromTag('br');
- insertElement(root, br, forward);
- return rangeBefore(br);
- };
- var insertBlock$1 = function (root, forward, blockName, attrs) {
- var block = Element.fromTag(blockName);
- var br = Element.fromTag('br');
- setAll(block, attrs);
- append(block, br);
- insertElement(root, block, forward);
- return rangeBefore(br);
- };
- var insertEmptyLine = function (root, rootBlockName, attrs, forward) {
- if (rootBlockName === '') {
- return insertBr(root, forward);
- } else {
- return insertBlock$1(root, forward, rootBlockName, attrs);
- }
- };
- var getClosestTargetBlock = function (pos, root) {
- var isRoot = curry(eq, root);
- return closest(Element.fromDom(pos.container()), isBlock, isRoot).filter(isTarget);
- };
- var isAtFirstOrLastLine = function (root, forward, pos) {
- return forward ? isAtLastLine(root.dom(), pos) : isAtFirstLine(root.dom(), pos);
- };
- var moveCaretToNewEmptyLine = function (editor, forward) {
- var root = Element.fromDom(editor.getBody());
- var pos = CaretPosition$1.fromRangeStart(editor.selection.getRng());
- var rootBlock = Settings.getForcedRootBlock(editor);
- var rootBlockAttrs = Settings.getForcedRootBlockAttrs(editor);
- return getClosestTargetBlock(pos, root).exists(function () {
- if (isAtFirstOrLastLine(root, forward, pos)) {
- var rng = insertEmptyLine(root, rootBlock, rootBlockAttrs, forward);
- editor.selection.setRng(rng);
- return true;
- } else {
- return false;
- }
- });
- };
- var moveV$2 = function (editor, forward) {
- return function () {
- if (editor.selection.isCollapsed()) {
- return moveCaretToNewEmptyLine(editor, forward);
- } else {
- return false;
- }
- };
- };
-
- var defaultPatterns = function (patterns) {
- return map(patterns, function (pattern) {
- return merge({
- shiftKey: false,
- altKey: false,
- ctrlKey: false,
- metaKey: false,
- keyCode: 0,
- action: noop
- }, pattern);
- });
- };
- var matchesEvent = function (pattern, evt) {
- return evt.keyCode === pattern.keyCode && evt.shiftKey === pattern.shiftKey && evt.altKey === pattern.altKey && evt.ctrlKey === pattern.ctrlKey && evt.metaKey === pattern.metaKey;
- };
- var match$1 = function (patterns, evt) {
- return bind(defaultPatterns(patterns), function (pattern) {
- return matchesEvent(pattern, evt) ? [pattern] : [];
- });
- };
- var action = function (f) {
- var x = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- x[_i - 1] = arguments[_i];
- }
- var args = Array.prototype.slice.call(arguments, 1);
- return function () {
- return f.apply(null, args);
- };
- };
- var execute = function (patterns, evt) {
- return find(match$1(patterns, evt), function (pattern) {
- return pattern.action();
- });
- };
- var MatchKeys = {
- match: match$1,
- action: action,
- execute: execute
- };
-
- var executeKeydownOverride = function (editor, caret, evt) {
- var os = PlatformDetection$1.detect().os;
- MatchKeys.execute([
- {
- keyCode: VK.RIGHT,
- action: moveH(editor, true)
- },
- {
- keyCode: VK.LEFT,
- action: moveH(editor, false)
- },
- {
- keyCode: VK.UP,
- action: moveV(editor, false)
- },
- {
- keyCode: VK.DOWN,
- action: moveV(editor, true)
- },
- {
- keyCode: VK.RIGHT,
- action: moveH$1(editor, true)
- },
- {
- keyCode: VK.LEFT,
- action: moveH$1(editor, false)
- },
- {
- keyCode: VK.UP,
- action: moveV$1(editor, false)
- },
- {
- keyCode: VK.DOWN,
- action: moveV$1(editor, true)
- },
- {
- keyCode: VK.RIGHT,
- action: BoundarySelection.move(editor, caret, true)
- },
- {
- keyCode: VK.LEFT,
- action: BoundarySelection.move(editor, caret, false)
- },
- {
- keyCode: VK.RIGHT,
- ctrlKey: !os.isOSX(),
- altKey: os.isOSX(),
- action: BoundarySelection.moveNextWord(editor, caret)
- },
- {
- keyCode: VK.LEFT,
- ctrlKey: !os.isOSX(),
- altKey: os.isOSX(),
- action: BoundarySelection.movePrevWord(editor, caret)
- },
- {
- keyCode: VK.UP,
- action: moveV$2(editor, false)
- },
- {
- keyCode: VK.DOWN,
- action: moveV$2(editor, true)
- }
- ], evt).each(function (_) {
- evt.preventDefault();
- });
- };
- var setup$7 = function (editor, caret) {
- editor.on('keydown', function (evt) {
- if (evt.isDefaultPrevented() === false) {
- executeKeydownOverride(editor, caret, evt);
- }
- });
- };
- var ArrowKeys = { setup: setup$7 };
-
- var executeKeydownOverride$1 = function (editor, caret, evt) {
- MatchKeys.execute([
- {
- keyCode: VK.BACKSPACE,
- action: MatchKeys.action(CefDelete.backspaceDelete, editor, false)
- },
- {
- keyCode: VK.DELETE,
- action: MatchKeys.action(CefDelete.backspaceDelete, editor, true)
- },
- {
- keyCode: VK.BACKSPACE,
- action: MatchKeys.action(CefBoundaryDelete.backspaceDelete, editor, false)
- },
- {
- keyCode: VK.DELETE,
- action: MatchKeys.action(CefBoundaryDelete.backspaceDelete, editor, true)
- },
- {
- keyCode: VK.BACKSPACE,
- action: MatchKeys.action(InlineBoundaryDelete.backspaceDelete, editor, caret, false)
- },
- {
- keyCode: VK.DELETE,
- action: MatchKeys.action(InlineBoundaryDelete.backspaceDelete, editor, caret, true)
- },
- {
- keyCode: VK.BACKSPACE,
- action: MatchKeys.action(TableDelete.backspaceDelete, editor, false)
- },
- {
- keyCode: VK.DELETE,
- action: MatchKeys.action(TableDelete.backspaceDelete, editor, true)
- },
- {
- keyCode: VK.BACKSPACE,
- action: MatchKeys.action(BlockRangeDelete.backspaceDelete, editor, false)
- },
- {
- keyCode: VK.DELETE,
- action: MatchKeys.action(BlockRangeDelete.backspaceDelete, editor, true)
- },
- {
- keyCode: VK.BACKSPACE,
- action: MatchKeys.action(BlockBoundaryDelete.backspaceDelete, editor, false)
- },
- {
- keyCode: VK.DELETE,
- action: MatchKeys.action(BlockBoundaryDelete.backspaceDelete, editor, true)
- },
- {
- keyCode: VK.BACKSPACE,
- action: MatchKeys.action(InlineFormatDelete.backspaceDelete, editor, false)
- },
- {
- keyCode: VK.DELETE,
- action: MatchKeys.action(InlineFormatDelete.backspaceDelete, editor, true)
- }
- ], evt).each(function (_) {
- evt.preventDefault();
- });
- };
- var executeKeyupOverride = function (editor, evt) {
- MatchKeys.execute([
- {
- keyCode: VK.BACKSPACE,
- action: MatchKeys.action(CefDelete.paddEmptyElement, editor)
- },
- {
- keyCode: VK.DELETE,
- action: MatchKeys.action(CefDelete.paddEmptyElement, editor)
- }
- ], evt);
- };
- var setup$8 = function (editor, caret) {
- editor.on('keydown', function (evt) {
- if (evt.isDefaultPrevented() === false) {
- executeKeydownOverride$1(editor, caret, evt);
- }
- });
- editor.on('keyup', function (evt) {
- if (evt.isDefaultPrevented() === false) {
- executeKeyupOverride(editor, evt);
- }
- });
- };
- var DeleteBackspaceKeys = { setup: setup$8 };
-
- var firstNonWhiteSpaceNodeSibling = function (node) {
- while (node) {
- if (node.nodeType === 1 || node.nodeType === 3 && node.data && /[\r\n\s]/.test(node.data)) {
- return node;
- }
- node = node.nextSibling;
- }
- };
- var moveToCaretPosition = function (editor, root) {
- var walker, node, rng, lastNode = root, tempElm;
- var dom = editor.dom;
- var moveCaretBeforeOnEnterElementsMap = editor.schema.getMoveCaretBeforeOnEnterElements();
- if (!root) {
- return;
- }
- if (/^(LI|DT|DD)$/.test(root.nodeName)) {
- var firstChild = firstNonWhiteSpaceNodeSibling(root.firstChild);
- if (firstChild && /^(UL|OL|DL)$/.test(firstChild.nodeName)) {
- root.insertBefore(dom.doc.createTextNode('\xA0'), root.firstChild);
- }
- }
- rng = dom.createRng();
- root.normalize();
- if (root.hasChildNodes()) {
- walker = new TreeWalker(root, root);
- while (node = walker.current()) {
- if (NodeType.isText(node)) {
- rng.setStart(node, 0);
- rng.setEnd(node, 0);
- break;
- }
- if (moveCaretBeforeOnEnterElementsMap[node.nodeName.toLowerCase()]) {
- rng.setStartBefore(node);
- rng.setEndBefore(node);
- break;
- }
- lastNode = node;
- node = walker.next();
- }
- if (!node) {
- rng.setStart(lastNode, 0);
- rng.setEnd(lastNode, 0);
- }
- } else {
- if (NodeType.isBr(root)) {
- if (root.nextSibling && dom.isBlock(root.nextSibling)) {
- rng.setStartBefore(root);
- rng.setEndBefore(root);
- } else {
- rng.setStartAfter(root);
- rng.setEndAfter(root);
- }
- } else {
- rng.setStart(root, 0);
- rng.setEnd(root, 0);
- }
- }
- editor.selection.setRng(rng);
- dom.remove(tempElm);
- editor.selection.scrollIntoView(root);
- };
- var getEditableRoot = function (dom, node) {
- var root = dom.getRoot();
- var parent, editableRoot;
- parent = node;
- while (parent !== root && dom.getContentEditable(parent) !== 'false') {
- if (dom.getContentEditable(parent) === 'true') {
- editableRoot = parent;
- }
- parent = parent.parentNode;
- }
- return parent !== root ? editableRoot : root;
- };
- var getParentBlock$2 = function (editor) {
- return Option.from(editor.dom.getParent(editor.selection.getStart(true), editor.dom.isBlock));
- };
- var getParentBlockName = function (editor) {
- return getParentBlock$2(editor).fold(constant(''), function (parentBlock) {
- return parentBlock.nodeName.toUpperCase();
- });
- };
- var isListItemParentBlock = function (editor) {
- return getParentBlock$2(editor).filter(function (elm) {
- return isListItem(Element.fromDom(elm));
- }).isSome();
- };
- var NewLineUtils = {
- moveToCaretPosition: moveToCaretPosition,
- getEditableRoot: getEditableRoot,
- getParentBlock: getParentBlock$2,
- getParentBlockName: getParentBlockName,
- isListItemParentBlock: isListItemParentBlock
- };
-
- var hasFirstChild = function (elm, name) {
- return elm.firstChild && elm.firstChild.nodeName === name;
- };
- var hasParent$1 = function (elm, parentName) {
- return elm && elm.parentNode && elm.parentNode.nodeName === parentName;
- };
- var isListBlock = function (elm) {
- return elm && /^(OL|UL|LI)$/.test(elm.nodeName);
- };
- var isNestedList = function (elm) {
- return isListBlock(elm) && isListBlock(elm.parentNode);
- };
- var getContainerBlock = function (containerBlock) {
- var containerBlockParent = containerBlock.parentNode;
- if (/^(LI|DT|DD)$/.test(containerBlockParent.nodeName)) {
- return containerBlockParent;
- }
- return containerBlock;
- };
- var isFirstOrLastLi = function (containerBlock, parentBlock, first) {
- var node = containerBlock[first ? 'firstChild' : 'lastChild'];
- while (node) {
- if (NodeType.isElement(node)) {
- break;
- }
- node = node[first ? 'nextSibling' : 'previousSibling'];
- }
- return node === parentBlock;
- };
- var insert$1 = function (editor, createNewBlock, containerBlock, parentBlock, newBlockName) {
- var dom = editor.dom;
- var rng = editor.selection.getRng();
- if (containerBlock === editor.getBody()) {
- return;
- }
- if (isNestedList(containerBlock)) {
- newBlockName = 'LI';
- }
- var newBlock = newBlockName ? createNewBlock(newBlockName) : dom.create('BR');
- if (isFirstOrLastLi(containerBlock, parentBlock, true) && isFirstOrLastLi(containerBlock, parentBlock, false)) {
- if (hasParent$1(containerBlock, 'LI')) {
- dom.insertAfter(newBlock, getContainerBlock(containerBlock));
- } else {
- dom.replace(newBlock, containerBlock);
- }
- } else if (isFirstOrLastLi(containerBlock, parentBlock, true)) {
- if (hasParent$1(containerBlock, 'LI')) {
- dom.insertAfter(newBlock, getContainerBlock(containerBlock));
- newBlock.appendChild(dom.doc.createTextNode(' '));
- newBlock.appendChild(containerBlock);
- } else {
- containerBlock.parentNode.insertBefore(newBlock, containerBlock);
- }
- } else if (isFirstOrLastLi(containerBlock, parentBlock, false)) {
- dom.insertAfter(newBlock, getContainerBlock(containerBlock));
- } else {
- containerBlock = getContainerBlock(containerBlock);
- var tmpRng = rng.cloneRange();
- tmpRng.setStartAfter(parentBlock);
- tmpRng.setEndAfter(containerBlock);
- var fragment = tmpRng.extractContents();
- if (newBlockName === 'LI' && hasFirstChild(fragment, 'LI')) {
- newBlock = fragment.firstChild;
- dom.insertAfter(fragment, containerBlock);
- } else {
- dom.insertAfter(fragment, containerBlock);
- dom.insertAfter(newBlock, containerBlock);
- }
- }
- dom.remove(parentBlock);
- NewLineUtils.moveToCaretPosition(editor, newBlock);
- };
- var InsertLi = { insert: insert$1 };
-
- var trimZwsp = function (fragment) {
- each(descendants(Element.fromDom(fragment), isText), function (text) {
- var rawNode = text.dom();
- rawNode.nodeValue = Zwsp.trim(rawNode.nodeValue);
- });
- };
- var isEmptyAnchor = function (dom, elm) {
- return elm && elm.nodeName === 'A' && dom.isEmpty(elm);
- };
- var isTableCell$5 = function (node) {
- return node && /^(TD|TH|CAPTION)$/.test(node.nodeName);
- };
- var emptyBlock = function (elm) {
- elm.innerHTML = ' ';
- };
- var containerAndSiblingName = function (container, nodeName) {
- return container.nodeName === nodeName || container.previousSibling && container.previousSibling.nodeName === nodeName;
- };
- var canSplitBlock = function (dom, node) {
- return node && dom.isBlock(node) && !/^(TD|TH|CAPTION|FORM)$/.test(node.nodeName) && !/^(fixed|absolute)/i.test(node.style.position) && dom.getContentEditable(node) !== 'true';
- };
- var trimInlineElementsOnLeftSideOfBlock = function (dom, nonEmptyElementsMap, block) {
- var node = block;
- var firstChilds = [];
- var i;
- if (!node) {
- return;
- }
- while (node = node.firstChild) {
- if (dom.isBlock(node)) {
- return;
- }
- if (NodeType.isElement(node) && !nonEmptyElementsMap[node.nodeName.toLowerCase()]) {
- firstChilds.push(node);
- }
- }
- i = firstChilds.length;
- while (i--) {
- node = firstChilds[i];
- if (!node.hasChildNodes() || node.firstChild === node.lastChild && node.firstChild.nodeValue === '') {
- dom.remove(node);
- } else {
- if (isEmptyAnchor(dom, node)) {
- dom.remove(node);
- }
- }
- }
- };
- var normalizeZwspOffset = function (start, container, offset) {
- if (NodeType.isText(container) === false) {
- return offset;
- } else if (start) {
- return offset === 1 && container.data.charAt(offset - 1) === Zwsp.ZWSP ? 0 : offset;
- } else {
- return offset === container.data.length - 1 && container.data.charAt(offset) === Zwsp.ZWSP ? container.data.length : offset;
- }
- };
- var includeZwspInRange = function (rng) {
- var newRng = rng.cloneRange();
- newRng.setStart(rng.startContainer, normalizeZwspOffset(true, rng.startContainer, rng.startOffset));
- newRng.setEnd(rng.endContainer, normalizeZwspOffset(false, rng.endContainer, rng.endOffset));
- return newRng;
- };
- var trimLeadingLineBreaks = function (node) {
- do {
- if (NodeType.isText(node)) {
- node.nodeValue = node.nodeValue.replace(/^[\r\n]+/, '');
- }
- node = node.firstChild;
- } while (node);
- };
- var getEditableRoot$1 = function (dom, node) {
- var root = dom.getRoot();
- var parent, editableRoot;
- parent = node;
- while (parent !== root && dom.getContentEditable(parent) !== 'false') {
- if (dom.getContentEditable(parent) === 'true') {
- editableRoot = parent;
- }
- parent = parent.parentNode;
- }
- return parent !== root ? editableRoot : root;
- };
- var applyAttributes = function (editor, node, forcedRootBlockAttrs) {
- Option.from(forcedRootBlockAttrs.style).map(editor.dom.parseStyle).each(function (attrStyles) {
- var currentStyles = getAllRaw(Element.fromDom(node));
- var newStyles = __assign(__assign({}, currentStyles), attrStyles);
- editor.dom.setStyles(node, newStyles);
- });
- var attrClassesOpt = Option.from(forcedRootBlockAttrs.class).map(function (attrClasses) {
- return attrClasses.split(/\s+/);
- });
- var currentClassesOpt = Option.from(node.className).map(function (currentClasses) {
- return filter(currentClasses.split(/\s+/), function (clazz) {
- return clazz !== '';
- });
- });
- lift2(attrClassesOpt, currentClassesOpt, function (attrClasses, currentClasses) {
- var filteredClasses = filter(currentClasses, function (clazz) {
- return !contains(attrClasses, clazz);
- });
- var newClasses = __spreadArrays(attrClasses, filteredClasses);
- editor.dom.setAttrib(node, 'class', newClasses.join(' '));
- });
- var appliedAttrs = [
- 'style',
- 'class'
- ];
- var remainingAttrs = bifilter(forcedRootBlockAttrs, function (_, attrs) {
- return !contains(appliedAttrs, attrs);
- }).t;
- editor.dom.setAttribs(node, remainingAttrs);
- };
- var setForcedBlockAttrs = function (editor, node) {
- var forcedRootBlockName = Settings.getForcedRootBlock(editor);
- if (forcedRootBlockName && forcedRootBlockName.toLowerCase() === node.tagName.toLowerCase()) {
- var forcedRootBlockAttrs = Settings.getForcedRootBlockAttrs(editor);
- applyAttributes(editor, node, forcedRootBlockAttrs);
- }
- };
- var wrapSelfAndSiblingsInDefaultBlock = function (editor, newBlockName, rng, container, offset) {
- var newBlock, parentBlock, startNode, node, next, rootBlockName;
- var blockName = newBlockName || 'P';
- var dom = editor.dom, editableRoot = getEditableRoot$1(dom, container);
- parentBlock = dom.getParent(container, dom.isBlock);
- if (!parentBlock || !canSplitBlock(dom, parentBlock)) {
- parentBlock = parentBlock || editableRoot;
- if (parentBlock === editor.getBody() || isTableCell$5(parentBlock)) {
- rootBlockName = parentBlock.nodeName.toLowerCase();
- } else {
- rootBlockName = parentBlock.parentNode.nodeName.toLowerCase();
- }
- if (!parentBlock.hasChildNodes()) {
- newBlock = dom.create(blockName);
- setForcedBlockAttrs(editor, newBlock);
- parentBlock.appendChild(newBlock);
- rng.setStart(newBlock, 0);
- rng.setEnd(newBlock, 0);
- return newBlock;
- }
- node = container;
- while (node.parentNode !== parentBlock) {
- node = node.parentNode;
- }
- while (node && !dom.isBlock(node)) {
- startNode = node;
- node = node.previousSibling;
- }
- if (startNode && editor.schema.isValidChild(rootBlockName, blockName.toLowerCase())) {
- newBlock = dom.create(blockName);
- setForcedBlockAttrs(editor, newBlock);
- startNode.parentNode.insertBefore(newBlock, startNode);
- node = startNode;
- while (node && !dom.isBlock(node)) {
- next = node.nextSibling;
- newBlock.appendChild(node);
- node = next;
- }
- rng.setStart(container, offset);
- rng.setEnd(container, offset);
- }
- }
- return container;
- };
- var addBrToBlockIfNeeded = function (dom, block) {
- var lastChild;
- block.normalize();
- lastChild = block.lastChild;
- if (!lastChild || /^(left|right)$/gi.test(dom.getStyle(lastChild, 'float', true))) {
- dom.add(block, 'br');
- }
- };
- var insert$2 = function (editor, evt) {
- var tmpRng, editableRoot, container, offset, parentBlock, shiftKey;
- var newBlock, fragment, containerBlock, parentBlockName, containerBlockName, newBlockName, isAfterLastNodeInContainer;
- var dom = editor.dom;
- var schema = editor.schema, nonEmptyElementsMap = schema.getNonEmptyElements();
- var rng = editor.selection.getRng();
- var createNewBlock = function (name) {
- var node = container, block, clonedNode, caretNode;
- var textInlineElements = schema.getTextInlineElements();
- if (name || parentBlockName === 'TABLE' || parentBlockName === 'HR') {
- block = dom.create(name || newBlockName);
- } else {
- block = parentBlock.cloneNode(false);
- }
- caretNode = block;
- if (Settings.shouldKeepStyles(editor) === false) {
- dom.setAttrib(block, 'style', null);
- dom.setAttrib(block, 'class', null);
- } else {
- do {
- if (textInlineElements[node.nodeName]) {
- if (isCaretNode(node) || Bookmarks.isBookmarkNode(node)) {
- continue;
- }
- clonedNode = node.cloneNode(false);
- dom.setAttrib(clonedNode, 'id', '');
- if (block.hasChildNodes()) {
- clonedNode.appendChild(block.firstChild);
- block.appendChild(clonedNode);
- } else {
- caretNode = clonedNode;
- block.appendChild(clonedNode);
- }
- }
- } while ((node = node.parentNode) && node !== editableRoot);
- }
- setForcedBlockAttrs(editor, block);
- emptyBlock(caretNode);
- return block;
- };
- var isCaretAtStartOrEndOfBlock = function (start) {
- var walker, node, name, normalizedOffset;
- normalizedOffset = normalizeZwspOffset(start, container, offset);
- if (NodeType.isText(container) && (start ? normalizedOffset > 0 : normalizedOffset < container.nodeValue.length)) {
- return false;
- }
- if (container.parentNode === parentBlock && isAfterLastNodeInContainer && !start) {
- return true;
- }
- if (start && NodeType.isElement(container) && container === parentBlock.firstChild) {
- return true;
- }
- if (containerAndSiblingName(container, 'TABLE') || containerAndSiblingName(container, 'HR')) {
- return isAfterLastNodeInContainer && !start || !isAfterLastNodeInContainer && start;
- }
- walker = new TreeWalker(container, parentBlock);
- if (NodeType.isText(container)) {
- if (start && normalizedOffset === 0) {
- walker.prev();
- } else if (!start && normalizedOffset === container.nodeValue.length) {
- walker.next();
- }
- }
- while (node = walker.current()) {
- if (NodeType.isElement(node)) {
- if (!node.getAttribute('data-mce-bogus')) {
- name = node.nodeName.toLowerCase();
- if (nonEmptyElementsMap[name] && name !== 'br') {
- return false;
- }
- }
- } else if (NodeType.isText(node) && !/^[ \t\r\n]*$/.test(node.nodeValue)) {
- return false;
- }
- if (start) {
- walker.prev();
- } else {
- walker.next();
- }
- }
- return true;
- };
- var insertNewBlockAfter = function () {
- if (/^(H[1-6]|PRE|FIGURE)$/.test(parentBlockName) && containerBlockName !== 'HGROUP') {
- newBlock = createNewBlock(newBlockName);
- } else {
- newBlock = createNewBlock();
- }
- if (Settings.shouldEndContainerOnEmptyBlock(editor) && canSplitBlock(dom, containerBlock) && dom.isEmpty(parentBlock)) {
- newBlock = dom.split(containerBlock, parentBlock);
- } else {
- dom.insertAfter(newBlock, parentBlock);
- }
- NewLineUtils.moveToCaretPosition(editor, newBlock);
- };
- NormalizeRange.normalize(dom, rng).each(function (normRng) {
- rng.setStart(normRng.startContainer, normRng.startOffset);
- rng.setEnd(normRng.endContainer, normRng.endOffset);
- });
- container = rng.startContainer;
- offset = rng.startOffset;
- newBlockName = Settings.getForcedRootBlock(editor);
- shiftKey = evt.shiftKey;
- if (NodeType.isElement(container) && container.hasChildNodes()) {
- isAfterLastNodeInContainer = offset > container.childNodes.length - 1;
- container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;
- if (isAfterLastNodeInContainer && NodeType.isText(container)) {
- offset = container.nodeValue.length;
- } else {
- offset = 0;
- }
- }
- editableRoot = getEditableRoot$1(dom, container);
- if (!editableRoot) {
- return;
- }
- if (newBlockName && !shiftKey || !newBlockName && shiftKey) {
- container = wrapSelfAndSiblingsInDefaultBlock(editor, newBlockName, rng, container, offset);
- }
- parentBlock = dom.getParent(container, dom.isBlock);
- containerBlock = parentBlock ? dom.getParent(parentBlock.parentNode, dom.isBlock) : null;
- parentBlockName = parentBlock ? parentBlock.nodeName.toUpperCase() : '';
- containerBlockName = containerBlock ? containerBlock.nodeName.toUpperCase() : '';
- if (containerBlockName === 'LI' && !evt.ctrlKey) {
- parentBlock = containerBlock;
- containerBlock = containerBlock.parentNode;
- parentBlockName = containerBlockName;
- }
- if (/^(LI|DT|DD)$/.test(parentBlockName)) {
- if (dom.isEmpty(parentBlock)) {
- InsertLi.insert(editor, createNewBlock, containerBlock, parentBlock, newBlockName);
- return;
- }
- }
- if (newBlockName && parentBlock === editor.getBody()) {
- return;
- }
- newBlockName = newBlockName || 'P';
- if (isCaretContainerBlock(parentBlock)) {
- newBlock = showCaretContainerBlock(parentBlock);
- if (dom.isEmpty(parentBlock)) {
- emptyBlock(parentBlock);
- }
- setForcedBlockAttrs(editor, newBlock);
- NewLineUtils.moveToCaretPosition(editor, newBlock);
- } else if (isCaretAtStartOrEndOfBlock()) {
- insertNewBlockAfter();
- } else if (isCaretAtStartOrEndOfBlock(true)) {
- newBlock = parentBlock.parentNode.insertBefore(createNewBlock(), parentBlock);
- NewLineUtils.moveToCaretPosition(editor, containerAndSiblingName(parentBlock, 'HR') ? newBlock : parentBlock);
- } else {
- tmpRng = includeZwspInRange(rng).cloneRange();
- tmpRng.setEndAfter(parentBlock);
- fragment = tmpRng.extractContents();
- trimZwsp(fragment);
- trimLeadingLineBreaks(fragment);
- newBlock = fragment.firstChild;
- dom.insertAfter(fragment, parentBlock);
- trimInlineElementsOnLeftSideOfBlock(dom, nonEmptyElementsMap, newBlock);
- addBrToBlockIfNeeded(dom, parentBlock);
- if (dom.isEmpty(parentBlock)) {
- emptyBlock(parentBlock);
- }
- newBlock.normalize();
- if (dom.isEmpty(newBlock)) {
- dom.remove(newBlock);
- insertNewBlockAfter();
- } else {
- setForcedBlockAttrs(editor, newBlock);
- NewLineUtils.moveToCaretPosition(editor, newBlock);
- }
- }
- dom.setAttrib(newBlock, 'id', '');
- editor.fire('NewBlock', { newBlock: newBlock });
- };
- var InsertBlock = { insert: insert$2 };
-
- var matchesSelector = function (editor, selector) {
- return NewLineUtils.getParentBlock(editor).filter(function (parentBlock) {
- return selector.length > 0 && is$1(Element.fromDom(parentBlock), selector);
- }).isSome();
- };
- var shouldInsertBr = function (editor) {
- return matchesSelector(editor, Settings.getBrNewLineSelector(editor));
- };
- var shouldBlockNewLine = function (editor) {
- return matchesSelector(editor, Settings.getNoNewLineSelector(editor));
- };
- var ContextSelectors = {
- shouldInsertBr: shouldInsertBr,
- shouldBlockNewLine: shouldBlockNewLine
- };
-
- var newLineAction = Adt.generate([
- { br: [] },
- { block: [] },
- { none: [] }
- ]);
- var shouldBlockNewLine$1 = function (editor, shiftKey) {
- return ContextSelectors.shouldBlockNewLine(editor);
- };
- var isBrMode = function (requiredState) {
- return function (editor, shiftKey) {
- var brMode = Settings.getForcedRootBlock(editor) === '';
- return brMode === requiredState;
- };
- };
- var inListBlock = function (requiredState) {
- return function (editor, shiftKey) {
- return NewLineUtils.isListItemParentBlock(editor) === requiredState;
- };
- };
- var inBlock = function (blockName, requiredState) {
- return function (editor, shiftKey) {
- var state = NewLineUtils.getParentBlockName(editor) === blockName.toUpperCase();
- return state === requiredState;
- };
- };
- var inPreBlock = function (requiredState) {
- return inBlock('pre', requiredState);
- };
- var inSummaryBlock = function () {
- return inBlock('summary', true);
- };
- var shouldPutBrInPre$1 = function (requiredState) {
- return function (editor, shiftKey) {
- return Settings.shouldPutBrInPre(editor) === requiredState;
- };
- };
- var inBrContext = function (editor, shiftKey) {
- return ContextSelectors.shouldInsertBr(editor);
- };
- var hasShiftKey = function (editor, shiftKey) {
- return shiftKey;
- };
- var canInsertIntoEditableRoot = function (editor) {
- var forcedRootBlock = Settings.getForcedRootBlock(editor);
- var rootEditable = NewLineUtils.getEditableRoot(editor.dom, editor.selection.getStart());
- return rootEditable && editor.schema.isValidChild(rootEditable.nodeName, forcedRootBlock ? forcedRootBlock : 'P');
- };
- var match$2 = function (predicates, action) {
- return function (editor, shiftKey) {
- var isMatch = foldl(predicates, function (res, p) {
- return res && p(editor, shiftKey);
- }, true);
- return isMatch ? Option.some(action) : Option.none();
- };
- };
- var getAction$1 = function (editor, evt) {
- return LazyEvaluator.evaluateUntil([
- match$2([shouldBlockNewLine$1], newLineAction.none()),
- match$2([inSummaryBlock()], newLineAction.br()),
- match$2([
- inPreBlock(true),
- shouldPutBrInPre$1(false),
- hasShiftKey
- ], newLineAction.br()),
- match$2([
- inPreBlock(true),
- shouldPutBrInPre$1(false)
- ], newLineAction.block()),
- match$2([
- inPreBlock(true),
- shouldPutBrInPre$1(true),
- hasShiftKey
- ], newLineAction.block()),
- match$2([
- inPreBlock(true),
- shouldPutBrInPre$1(true)
- ], newLineAction.br()),
- match$2([
- inListBlock(true),
- hasShiftKey
- ], newLineAction.br()),
- match$2([inListBlock(true)], newLineAction.block()),
- match$2([
- isBrMode(true),
- hasShiftKey,
- canInsertIntoEditableRoot
- ], newLineAction.block()),
- match$2([isBrMode(true)], newLineAction.br()),
- match$2([inBrContext], newLineAction.br()),
- match$2([
- isBrMode(false),
- hasShiftKey
- ], newLineAction.br()),
- match$2([canInsertIntoEditableRoot], newLineAction.block())
- ], [
- editor,
- evt.shiftKey
- ]).getOr(newLineAction.none());
- };
- var NewLineAction = { getAction: getAction$1 };
-
- var insert$3 = function (editor, evt) {
- NewLineAction.getAction(editor, evt).fold(function () {
- InsertBr.insert(editor, evt);
- }, function () {
- InsertBlock.insert(editor, evt);
- }, noop);
- };
- var InsertNewLine = { insert: insert$3 };
-
- var endTypingLevel = function (undoManager) {
- if (undoManager.typing) {
- undoManager.typing = false;
- undoManager.add();
- }
- };
- var handleEnterKeyEvent = function (editor, event) {
- if (event.isDefaultPrevented()) {
- return;
- }
- event.preventDefault();
- endTypingLevel(editor.undoManager);
- editor.undoManager.transact(function () {
- if (editor.selection.isCollapsed() === false) {
- editor.execCommand('Delete');
- }
- InsertNewLine.insert(editor, event);
- });
- };
- var setup$9 = function (editor) {
- editor.on('keydown', function (event) {
- if (event.keyCode === VK.ENTER) {
- handleEnterKeyEvent(editor, event);
- }
- });
- };
- var EnterKey = { setup: setup$9 };
-
- var insertTextAtPosition = function (text, pos) {
- var container = pos.container();
- var offset = pos.offset();
- if (NodeType.isText(container)) {
- container.insertData(offset, text);
- return Option.some(CaretPosition(container, offset + text.length));
- } else {
- return getElementFromPosition(pos).map(function (elm) {
- var textNode = Element.fromText(text);
- if (pos.isAtEnd()) {
- after(elm, textNode);
- } else {
- before(elm, textNode);
- }
- return CaretPosition(textNode.dom(), text.length);
- });
- }
- };
- var insertNbspAtPosition = curry(insertTextAtPosition, '\xA0');
- var insertSpaceAtPosition = curry(insertTextAtPosition, ' ');
-
- var navigateIgnoreEmptyTextNodes = function (forward, root, from) {
- return CaretFinder.navigateIgnore(forward, root, from, isEmptyText);
- };
- var getClosestBlock = function (root, pos) {
- return find(Parents.parentsAndSelf(Element.fromDom(pos.container()), root), isBlock);
- };
- var isAtBeforeAfterBlockBoundary = function (forward, root, pos) {
- return navigateIgnoreEmptyTextNodes(forward, root.dom(), pos).forall(function (newPos) {
- return getClosestBlock(root, pos).fold(function () {
- return isInSameBlock(newPos, pos, root.dom()) === false;
- }, function (fromBlock) {
- return isInSameBlock(newPos, pos, root.dom()) === false && contains$3(fromBlock, Element.fromDom(newPos.container()));
- });
- });
- };
- var isAtBlockBoundary = function (forward, root, pos) {
- return getClosestBlock(root, pos).fold(function () {
- return navigateIgnoreEmptyTextNodes(forward, root.dom(), pos).forall(function (newPos) {
- return isInSameBlock(newPos, pos, root.dom()) === false;
- });
- }, function (parent) {
- return navigateIgnoreEmptyTextNodes(forward, parent.dom(), pos).isNone();
- });
- };
- var isAtStartOfBlock = curry(isAtBlockBoundary, false);
- var isAtEndOfBlock = curry(isAtBlockBoundary, true);
- var isBeforeBlock = curry(isAtBeforeAfterBlockBoundary, false);
- var isAfterBlock = curry(isAtBeforeAfterBlockBoundary, true);
-
- var nbsp = '\xA0';
- var isInMiddleOfText = function (pos) {
- return CaretPosition.isTextPosition(pos) && !pos.isAtStart() && !pos.isAtEnd();
- };
- var getClosestBlock$1 = function (root, pos) {
- var parentBlocks = filter(Parents.parentsAndSelf(Element.fromDom(pos.container()), root), isBlock);
- return head(parentBlocks).getOr(root);
- };
- var hasSpaceBefore = function (root, pos) {
- if (isInMiddleOfText(pos)) {
- return isAfterSpace(pos);
- } else {
- return isAfterSpace(pos) || CaretFinder.prevPosition(getClosestBlock$1(root, pos).dom(), pos).exists(isAfterSpace);
- }
- };
- var hasSpaceAfter = function (root, pos) {
- if (isInMiddleOfText(pos)) {
- return isBeforeSpace(pos);
- } else {
- return isBeforeSpace(pos) || CaretFinder.nextPosition(getClosestBlock$1(root, pos).dom(), pos).exists(isBeforeSpace);
- }
- };
- var isPreValue = function (value) {
- return contains([
- 'pre',
- 'pre-wrap'
- ], value);
- };
- var isInPre = function (pos) {
- return getElementFromPosition(pos).bind(function (elm) {
- return closest(elm, isElement);
- }).exists(function (elm) {
- return isPreValue(get$1(elm, 'white-space'));
- });
- };
- var isAtBeginningOfBody = function (root, pos) {
- return CaretFinder.prevPosition(root.dom(), pos).isNone();
- };
- var isAtEndOfBody = function (root, pos) {
- return CaretFinder.nextPosition(root.dom(), pos).isNone();
- };
- var isAtLineBoundary = function (root, pos) {
- return isAtBeginningOfBody(root, pos) || isAtEndOfBody(root, pos) || isAtStartOfBlock(root, pos) || isAtEndOfBlock(root, pos) || isAfterBr(root, pos) || isBeforeBr(root, pos);
- };
- var needsToHaveNbsp = function (root, pos) {
- if (isInPre(pos)) {
- return false;
- } else {
- return isAtLineBoundary(root, pos) || hasSpaceBefore(root, pos) || hasSpaceAfter(root, pos);
- }
- };
- var needsToBeNbspLeft = function (root, pos) {
- if (isInPre(pos)) {
- return false;
- } else {
- return isAtStartOfBlock(root, pos) || isBeforeBlock(root, pos) || isAfterBr(root, pos) || hasSpaceBefore(root, pos);
- }
- };
- var leanRight = function (pos) {
- var container = pos.container();
- var offset = pos.offset();
- if (NodeType.isText(container) && offset < container.data.length) {
- return CaretPosition(container, offset + 1);
- } else {
- return pos;
- }
- };
- var needsToBeNbspRight = function (root, pos) {
- var afterPos = leanRight(pos);
- if (isInPre(afterPos)) {
- return false;
- } else {
- return isAtEndOfBlock(root, afterPos) || isAfterBlock(root, afterPos) || isBeforeBr(root, afterPos) || hasSpaceAfter(root, afterPos);
- }
- };
- var needsToBeNbsp = function (root, pos) {
- return needsToBeNbspLeft(root, pos) || needsToBeNbspRight(root, pos);
- };
- var isNbspAt = function (text, offset) {
- return isNbsp(text.charAt(offset));
- };
- var hasNbsp = function (pos) {
- var container = pos.container();
- return NodeType.isText(container) && contains$2(container.data, nbsp);
- };
- var normalizeNbspMiddle = function (text) {
- var chars = text.split('');
- return map(chars, function (chr, i) {
- if (isNbsp(chr) && i > 0 && i < chars.length - 1 && isContent$1(chars[i - 1]) && isContent$1(chars[i + 1])) {
- return ' ';
- } else {
- return chr;
- }
- }).join('');
- };
- var normalizeNbspAtStart = function (root, node) {
- var text = node.data;
- var firstPos = CaretPosition(node, 0);
- if (isNbspAt(text, 0) && !needsToBeNbsp(root, firstPos)) {
- node.data = ' ' + text.slice(1);
- return true;
- } else {
- return false;
- }
- };
- var normalizeNbspInMiddleOfTextNode = function (node) {
- var text = node.data;
- var newText = normalizeNbspMiddle(text);
- if (newText !== text) {
- node.data = newText;
- return true;
- } else {
- return false;
- }
- };
- var normalizeNbspAtEnd = function (root, node) {
- var text = node.data;
- var lastPos = CaretPosition(node, text.length - 1);
- if (isNbspAt(text, text.length - 1) && !needsToBeNbsp(root, lastPos)) {
- node.data = text.slice(0, -1) + ' ';
- return true;
- } else {
- return false;
- }
- };
- var normalizeNbsps = function (root, pos) {
- return Option.some(pos).filter(hasNbsp).bind(function (pos) {
- var container = pos.container();
- var normalized = normalizeNbspAtStart(root, container) || normalizeNbspInMiddleOfTextNode(container) || normalizeNbspAtEnd(root, container);
- return normalized ? Option.some(pos) : Option.none();
- });
- };
- var normalizeNbspsInEditor = function (editor) {
- var root = Element.fromDom(editor.getBody());
- if (editor.selection.isCollapsed()) {
- normalizeNbsps(root, CaretPosition.fromRangeStart(editor.selection.getRng())).each(function (pos) {
- editor.selection.setRng(pos.toRange());
- });
- }
- };
-
- var locationToCaretPosition = function (root) {
- return function (location) {
- return location.fold(function (element) {
- return CaretFinder.prevPosition(root.dom(), CaretPosition$1.before(element));
- }, function (element) {
- return CaretFinder.firstPositionIn(element);
- }, function (element) {
- return CaretFinder.lastPositionIn(element);
- }, function (element) {
- return CaretFinder.nextPosition(root.dom(), CaretPosition$1.after(element));
- });
- };
- };
- var insertInlineBoundarySpaceOrNbsp = function (root, pos) {
- return function (checkPos) {
- return needsToHaveNbsp(root, checkPos) ? insertNbspAtPosition(pos) : insertSpaceAtPosition(pos);
- };
- };
- var setSelection$1 = function (editor) {
- return function (pos) {
- editor.selection.setRng(pos.toRange());
- editor.nodeChanged();
- return true;
- };
- };
- var insertSpaceOrNbspAtSelection = function (editor) {
- var pos = CaretPosition$1.fromRangeStart(editor.selection.getRng());
- var root = Element.fromDom(editor.getBody());
- if (editor.selection.isCollapsed()) {
- var isInlineTarget = curry(InlineUtils.isInlineTarget, editor);
- var caretPosition = CaretPosition$1.fromRangeStart(editor.selection.getRng());
- return BoundaryLocation.readLocation(isInlineTarget, editor.getBody(), caretPosition).bind(locationToCaretPosition(root)).bind(insertInlineBoundarySpaceOrNbsp(root, pos)).exists(setSelection$1(editor));
- } else {
- return false;
- }
- };
-
- var executeKeydownOverride$2 = function (editor, evt) {
- MatchKeys.execute([{
- keyCode: VK.SPACEBAR,
- action: MatchKeys.action(insertSpaceOrNbspAtSelection, editor)
- }], evt).each(function (_) {
- evt.preventDefault();
- });
- };
- var setup$a = function (editor) {
- editor.on('keydown', function (evt) {
- if (evt.isDefaultPrevented() === false) {
- executeKeydownOverride$2(editor, evt);
- }
- });
- };
- var SpaceKey = { setup: setup$a };
-
- var findBlockCaretContainer = function (editor) {
- return descendant(Element.fromDom(editor.getBody()), '*[data-mce-caret]').fold(constant(null), function (elm) {
- return elm.dom();
- });
- };
- var removeIeControlRect = function (editor) {
- editor.selection.setRng(editor.selection.getRng());
- };
- var showBlockCaretContainer = function (editor, blockCaretContainer) {
- if (blockCaretContainer.hasAttribute('data-mce-caret')) {
- showCaretContainerBlock(blockCaretContainer);
- removeIeControlRect(editor);
- editor.selection.scrollIntoView(blockCaretContainer);
- }
- };
- var handleBlockContainer = function (editor, e) {
- var blockCaretContainer = findBlockCaretContainer(editor);
- if (!blockCaretContainer) {
- return;
- }
- if (e.type === 'compositionstart') {
- e.preventDefault();
- e.stopPropagation();
- showBlockCaretContainer(editor, blockCaretContainer);
- return;
- }
- if (hasContent(blockCaretContainer)) {
- showBlockCaretContainer(editor, blockCaretContainer);
- editor.undoManager.add();
- }
- };
- var setup$b = function (editor) {
- editor.on('keyup compositionstart', curry(handleBlockContainer, editor));
- };
- var CaretContainerInput = { setup: setup$b };
-
- var browser$4 = PlatformDetection$1.detect().browser;
- var setupIeInput = function (editor) {
- var keypressThrotter = first(function () {
- if (!editor.composing) {
- normalizeNbspsInEditor(editor);
- }
- }, 0);
- if (browser$4.isIE()) {
- editor.on('keypress', function (e) {
- keypressThrotter.throttle();
- });
- editor.on('remove', function (e) {
- keypressThrotter.cancel();
- });
- }
- };
- var setup$c = function (editor) {
- setupIeInput(editor);
- editor.on('input', function (e) {
- if (e.isComposing === false) {
- normalizeNbspsInEditor(editor);
- }
- });
- };
-
- var executeKeydownOverride$3 = function (editor, evt) {
- MatchKeys.execute([
- {
- keyCode: VK.END,
- action: moveToLineEndPoint(editor, true)
- },
- {
- keyCode: VK.HOME,
- action: moveToLineEndPoint(editor, false)
- }
- ], evt).each(function (_) {
- evt.preventDefault();
- });
- };
- var setup$d = function (editor) {
- editor.on('keydown', function (evt) {
- if (evt.isDefaultPrevented() === false) {
- executeKeydownOverride$3(editor, evt);
- }
- });
- };
- var HomeEndKeys = { setup: setup$d };
-
- var setup$e = function (editor) {
- var caret = BoundarySelection.setupSelectedState(editor);
- CaretContainerInput.setup(editor);
- ArrowKeys.setup(editor, caret);
- DeleteBackspaceKeys.setup(editor, caret);
- EnterKey.setup(editor);
- SpaceKey.setup(editor);
- setup$c(editor);
- HomeEndKeys.setup(editor);
- };
- var KeyboardOverrides = { setup: setup$e };
-
- function Quirks (editor) {
- var each = Tools.each;
- var BACKSPACE = VK.BACKSPACE, DELETE = VK.DELETE, dom = editor.dom, selection = editor.selection, settings = editor.settings, parser = editor.parser;
- var isGecko = Env.gecko, isIE = Env.ie, isWebKit = Env.webkit;
- var mceInternalUrlPrefix = 'data:text/mce-internal,';
- var mceInternalDataType = isIE ? 'Text' : 'URL';
- var setEditorCommandState = function (cmd, state) {
- try {
- editor.getDoc().execCommand(cmd, false, state);
- } catch (ex) {
- }
- };
- var isDefaultPrevented = function (e) {
- return e.isDefaultPrevented();
- };
- var setMceInternalContent = function (e) {
- var selectionHtml, internalContent;
- if (e.dataTransfer) {
- if (editor.selection.isCollapsed() && e.target.tagName === 'IMG') {
- selection.select(e.target);
- }
- selectionHtml = editor.selection.getContent();
- if (selectionHtml.length > 0) {
- internalContent = mceInternalUrlPrefix + escape(editor.id) + ',' + escape(selectionHtml);
- e.dataTransfer.setData(mceInternalDataType, internalContent);
- }
- }
- };
- var getMceInternalContent = function (e) {
- var internalContent;
- if (e.dataTransfer) {
- internalContent = e.dataTransfer.getData(mceInternalDataType);
- if (internalContent && internalContent.indexOf(mceInternalUrlPrefix) >= 0) {
- internalContent = internalContent.substr(mceInternalUrlPrefix.length).split(',');
- return {
- id: unescape(internalContent[0]),
- html: unescape(internalContent[1])
- };
- }
- }
- return null;
- };
- var insertClipboardContents = function (content, internal) {
- if (editor.queryCommandSupported('mceInsertClipboardContent')) {
- editor.execCommand('mceInsertClipboardContent', false, {
- content: content,
- internal: internal
- });
- } else {
- editor.execCommand('mceInsertContent', false, content);
- }
- };
- var emptyEditorWhenDeleting = function () {
- var serializeRng = function (rng) {
- var body = dom.create('body');
- var contents = rng.cloneContents();
- body.appendChild(contents);
- return selection.serializer.serialize(body, { format: 'html' });
- };
- var allContentsSelected = function (rng) {
- var selection = serializeRng(rng);
- var allRng = dom.createRng();
- allRng.selectNode(editor.getBody());
- var allSelection = serializeRng(allRng);
- return selection === allSelection;
- };
- editor.on('keydown', function (e) {
- var keyCode = e.keyCode;
- var isCollapsed, body;
- if (!isDefaultPrevented(e) && (keyCode === DELETE || keyCode === BACKSPACE)) {
- isCollapsed = editor.selection.isCollapsed();
- body = editor.getBody();
- if (isCollapsed && !dom.isEmpty(body)) {
- return;
- }
- if (!isCollapsed && !allContentsSelected(editor.selection.getRng())) {
- return;
- }
- e.preventDefault();
- editor.setContent('');
- if (body.firstChild && dom.isBlock(body.firstChild)) {
- editor.selection.setCursorLocation(body.firstChild, 0);
- } else {
- editor.selection.setCursorLocation(body, 0);
- }
- editor.nodeChanged();
- }
- });
- };
- var selectAll = function () {
- editor.shortcuts.add('meta+a', null, 'SelectAll');
- };
- var inputMethodFocus = function () {
- if (!editor.settings.content_editable) {
- dom.bind(editor.getDoc(), 'mousedown mouseup', function (e) {
- var rng;
- if (e.target === editor.getDoc().documentElement) {
- rng = selection.getRng();
- editor.getBody().focus();
- if (e.type === 'mousedown') {
- if (isCaretContainer(rng.startContainer)) {
- return;
- }
- selection.placeCaretAt(e.clientX, e.clientY);
- } else {
- selection.setRng(rng);
- }
- }
- });
- }
- };
- var removeHrOnBackspace = function () {
- editor.on('keydown', function (e) {
- if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {
- if (!editor.getBody().getElementsByTagName('hr').length) {
- return;
- }
- if (selection.isCollapsed() && selection.getRng().startOffset === 0) {
- var node = selection.getNode();
- var previousSibling = node.previousSibling;
- if (node.nodeName === 'HR') {
- dom.remove(node);
- e.preventDefault();
- return;
- }
- if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === 'hr') {
- dom.remove(previousSibling);
- e.preventDefault();
- }
- }
- }
- });
- };
- var focusBody = function () {
- if (!domGlobals.Range.prototype.getClientRects) {
- editor.on('mousedown', function (e) {
- if (!isDefaultPrevented(e) && e.target.nodeName === 'HTML') {
- var body_1 = editor.getBody();
- body_1.blur();
- Delay.setEditorTimeout(editor, function () {
- body_1.focus();
- });
- }
- });
- }
- };
- var selectControlElements = function () {
- editor.on('click', function (e) {
- var target = e.target;
- if (/^(IMG|HR)$/.test(target.nodeName) && dom.getContentEditableParent(target) !== 'false') {
- e.preventDefault();
- editor.selection.select(target);
- editor.nodeChanged();
- }
- if (target.nodeName === 'A' && dom.hasClass(target, 'mce-item-anchor')) {
- e.preventDefault();
- selection.select(target);
- }
- });
- };
- var removeStylesWhenDeletingAcrossBlockElements = function () {
- var getAttributeApplyFunction = function () {
- var template = dom.getAttribs(selection.getStart().cloneNode(false));
- return function () {
- var target = selection.getStart();
- if (target !== editor.getBody()) {
- dom.setAttrib(target, 'style', null);
- each(template, function (attr) {
- target.setAttributeNode(attr.cloneNode(true));
- });
- }
- };
- };
- var isSelectionAcrossElements = function () {
- return !selection.isCollapsed() && dom.getParent(selection.getStart(), dom.isBlock) !== dom.getParent(selection.getEnd(), dom.isBlock);
- };
- editor.on('keypress', function (e) {
- var applyAttributes;
- if (!isDefaultPrevented(e) && (e.keyCode === 8 || e.keyCode === 46) && isSelectionAcrossElements()) {
- applyAttributes = getAttributeApplyFunction();
- editor.getDoc().execCommand('delete', false, null);
- applyAttributes();
- e.preventDefault();
- return false;
- }
- });
- dom.bind(editor.getDoc(), 'cut', function (e) {
- var applyAttributes;
- if (!isDefaultPrevented(e) && isSelectionAcrossElements()) {
- applyAttributes = getAttributeApplyFunction();
- Delay.setEditorTimeout(editor, function () {
- applyAttributes();
- });
- }
- });
- };
- var disableBackspaceIntoATable = function () {
- editor.on('keydown', function (e) {
- if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {
- if (selection.isCollapsed() && selection.getRng().startOffset === 0) {
- var previousSibling = selection.getNode().previousSibling;
- if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === 'table') {
- e.preventDefault();
- return false;
- }
- }
- }
- });
- };
- var removeBlockQuoteOnBackSpace = function () {
- editor.on('keydown', function (e) {
- var rng, container, offset, root, parent;
- if (isDefaultPrevented(e) || e.keyCode !== VK.BACKSPACE) {
- return;
- }
- rng = selection.getRng();
- container = rng.startContainer;
- offset = rng.startOffset;
- root = dom.getRoot();
- parent = container;
- if (!rng.collapsed || offset !== 0) {
- return;
- }
- while (parent && parent.parentNode && parent.parentNode.firstChild === parent && parent.parentNode !== root) {
- parent = parent.parentNode;
- }
- if (parent.tagName === 'BLOCKQUOTE') {
- editor.formatter.toggle('blockquote', null, parent);
- rng = dom.createRng();
- rng.setStart(container, 0);
- rng.setEnd(container, 0);
- selection.setRng(rng);
- }
- });
- };
- var setGeckoEditingOptions = function () {
- var setOpts = function () {
- setEditorCommandState('StyleWithCSS', false);
- setEditorCommandState('enableInlineTableEditing', false);
- if (!settings.object_resizing) {
- setEditorCommandState('enableObjectResizing', false);
- }
- };
- if (!settings.readonly) {
- editor.on('BeforeExecCommand MouseDown', setOpts);
- }
- };
- var addBrAfterLastLinks = function () {
- var fixLinks = function () {
- each(dom.select('a'), function (node) {
- var parentNode = node.parentNode;
- var root = dom.getRoot();
- if (parentNode.lastChild === node) {
- while (parentNode && !dom.isBlock(parentNode)) {
- if (parentNode.parentNode.lastChild !== parentNode || parentNode === root) {
- return;
- }
- parentNode = parentNode.parentNode;
- }
- dom.add(parentNode, 'br', { 'data-mce-bogus': 1 });
- }
- });
- };
- editor.on('SetContent ExecCommand', function (e) {
- if (e.type === 'setcontent' || e.command === 'mceInsertLink') {
- fixLinks();
- }
- });
- };
- var setDefaultBlockType = function () {
- if (settings.forced_root_block) {
- editor.on('init', function () {
- setEditorCommandState('DefaultParagraphSeparator', settings.forced_root_block);
- });
- }
- };
- var normalizeSelection = function () {
- editor.on('keyup focusin mouseup', function (e) {
- if (!VK.modifierPressed(e)) {
- selection.normalize();
- }
- }, true);
- };
- var showBrokenImageIcon = function () {
- editor.contentStyles.push('img:-moz-broken {' + '-moz-force-broken-image-icon:1;' + 'min-width:24px;' + 'min-height:24px' + '}');
- };
- var restoreFocusOnKeyDown = function () {
- if (!editor.inline) {
- editor.on('keydown', function () {
- if (domGlobals.document.activeElement === domGlobals.document.body) {
- editor.getWin().focus();
- }
- });
- }
- };
- var bodyHeight = function () {
- if (!editor.inline) {
- editor.contentStyles.push('body {min-height: 150px}');
- editor.on('click', function (e) {
- var rng;
- if (e.target.nodeName === 'HTML') {
- if (Env.ie > 11) {
- editor.getBody().focus();
- return;
- }
- rng = editor.selection.getRng();
- editor.getBody().focus();
- editor.selection.setRng(rng);
- editor.selection.normalize();
- editor.nodeChanged();
- }
- });
- }
- };
- var blockCmdArrowNavigation = function () {
- if (Env.mac) {
- editor.on('keydown', function (e) {
- if (VK.metaKeyPressed(e) && !e.shiftKey && (e.keyCode === 37 || e.keyCode === 39)) {
- e.preventDefault();
- editor.selection.getSel().modify('move', e.keyCode === 37 ? 'backward' : 'forward', 'lineboundary');
- }
- });
- }
- };
- var disableAutoUrlDetect = function () {
- setEditorCommandState('AutoUrlDetect', false);
- };
- var tapLinksAndImages = function () {
- editor.on('click', function (e) {
- var elm = e.target;
- do {
- if (elm.tagName === 'A') {
- e.preventDefault();
- return;
- }
- } while (elm = elm.parentNode);
- });
- editor.contentStyles.push('.mce-content-body {-webkit-touch-callout: none}');
- };
- var blockFormSubmitInsideEditor = function () {
- editor.on('init', function () {
- editor.dom.bind(editor.getBody(), 'submit', function (e) {
- e.preventDefault();
- });
- });
- };
- var removeAppleInterchangeBrs = function () {
- parser.addNodeFilter('br', function (nodes) {
- var i = nodes.length;
- while (i--) {
- if (nodes[i].attr('class') === 'Apple-interchange-newline') {
- nodes[i].remove();
- }
- }
- });
- };
- var ieInternalDragAndDrop = function () {
- editor.on('dragstart', function (e) {
- setMceInternalContent(e);
- });
- editor.on('drop', function (e) {
- if (!isDefaultPrevented(e)) {
- var internalContent = getMceInternalContent(e);
- if (internalContent && internalContent.id !== editor.id) {
- e.preventDefault();
- var rng = CaretRangeFromPoint.fromPoint(e.x, e.y, editor.getDoc());
- selection.setRng(rng);
- insertClipboardContents(internalContent.html, true);
- }
- }
- });
- };
- var refreshContentEditable = function () {
- };
- var isHidden = function () {
- var sel;
- if (!isGecko || editor.removed) {
- return 0;
- }
- sel = editor.selection.getSel();
- return !sel || !sel.rangeCount || sel.rangeCount === 0;
- };
- removeBlockQuoteOnBackSpace();
- emptyEditorWhenDeleting();
- if (!Env.windowsPhone) {
- normalizeSelection();
- }
- if (isWebKit) {
- inputMethodFocus();
- selectControlElements();
- setDefaultBlockType();
- blockFormSubmitInsideEditor();
- disableBackspaceIntoATable();
- removeAppleInterchangeBrs();
- if (Env.iOS) {
- restoreFocusOnKeyDown();
- bodyHeight();
- tapLinksAndImages();
- } else {
- selectAll();
- }
- }
- if (Env.ie >= 11) {
- bodyHeight();
- disableBackspaceIntoATable();
- }
- if (Env.ie) {
- selectAll();
- disableAutoUrlDetect();
- ieInternalDragAndDrop();
- }
- if (isGecko) {
- removeHrOnBackspace();
- focusBody();
- removeStylesWhenDeletingAcrossBlockElements();
- setGeckoEditingOptions();
- addBrAfterLastLinks();
- showBrokenImageIcon();
- blockCmdArrowNavigation();
- disableBackspaceIntoATable();
- }
- return {
- refreshContentEditable: refreshContentEditable,
- isHidden: isHidden
- };
- }
-
- var isTextBlockNode = function (node) {
- return NodeType.isElement(node) && isTextBlock(Element.fromDom(node));
- };
- var normalizeSelection$1 = function (editor) {
- var rng = editor.selection.getRng();
- var startPos = CaretPosition.fromRangeStart(rng);
- var endPos = CaretPosition.fromRangeEnd(rng);
- if (CaretPosition.isElementPosition(startPos)) {
- var container = startPos.container();
- if (isTextBlockNode(container)) {
- CaretFinder.firstPositionIn(container).each(function (pos) {
- return rng.setStart(pos.container(), pos.offset());
- });
- }
- }
- if (CaretPosition.isElementPosition(endPos)) {
- var container = startPos.container();
- if (isTextBlockNode(container)) {
- CaretFinder.lastPositionIn(container).each(function (pos) {
- return rng.setEnd(pos.container(), pos.offset());
- });
- }
- }
- editor.selection.setRng(RangeNormalizer.normalize(rng));
- };
- var setup$f = function (editor) {
- editor.on('click', function (e) {
- if (e.detail >= 3) {
- normalizeSelection$1(editor);
- }
- });
- };
-
- var preventSummaryToggle = function (editor) {
- editor.on('click', function (e) {
- if (editor.dom.getParent(e.target, 'details')) {
- e.preventDefault();
- }
- });
- };
- var filterDetails = function (editor) {
- editor.parser.addNodeFilter('details', function (elms) {
- each(elms, function (details) {
- details.attr('data-mce-open', details.attr('open'));
- details.attr('open', 'open');
- });
- });
- editor.serializer.addNodeFilter('details', function (elms) {
- each(elms, function (details) {
- var open = details.attr('data-mce-open');
- details.attr('open', isString(open) ? open : null);
- details.attr('data-mce-open', null);
- });
- });
- };
- var setup$g = function (editor) {
- preventSummaryToggle(editor);
- filterDetails(editor);
- };
-
- var DOM$2 = DOMUtils$1.DOM;
- var appendStyle = function (editor, text) {
- var head = Element.fromDom(editor.getDoc().head);
- var tag = Element.fromTag('style');
- set(tag, 'type', 'text/css');
- append(tag, Element.fromText(text));
- append(head, tag);
- };
- var createParser = function (editor) {
- var parser = DomParser(editor.settings, editor.schema);
- parser.addAttributeFilter('src,href,style,tabindex', function (nodes, name) {
- var i = nodes.length, node;
- var dom = editor.dom;
- var value, internalName;
- while (i--) {
- node = nodes[i];
- value = node.attr(name);
- internalName = 'data-mce-' + name;
- if (!node.attributes.map[internalName]) {
- if (value.indexOf('data:') === 0 || value.indexOf('blob:') === 0) {
- continue;
- }
- if (name === 'style') {
- value = dom.serializeStyle(dom.parseStyle(value), node.name);
- if (!value.length) {
- value = null;
- }
- node.attr(internalName, value);
- node.attr(name, value);
- } else if (name === 'tabindex') {
- node.attr(internalName, value);
- node.attr(name, null);
- } else {
- node.attr(internalName, editor.convertURL(value, name, node.name));
- }
- }
- }
- });
- parser.addNodeFilter('script', function (nodes) {
- var i = nodes.length, node, type;
- while (i--) {
- node = nodes[i];
- type = node.attr('type') || 'no/type';
- if (type.indexOf('mce-') !== 0) {
- node.attr('type', 'mce-' + type);
- }
- }
- });
- parser.addNodeFilter('#cdata', function (nodes) {
- var i = nodes.length, node;
- while (i--) {
- node = nodes[i];
- node.type = 8;
- node.name = '#comment';
- node.value = '[CDATA[' + node.value + ']]';
- }
- });
- parser.addNodeFilter('p,h1,h2,h3,h4,h5,h6,div', function (nodes) {
- var i = nodes.length, node;
- var nonEmptyElements = editor.schema.getNonEmptyElements();
- while (i--) {
- node = nodes[i];
- if (node.isEmpty(nonEmptyElements) && node.getAll('br').length === 0) {
- node.append(new Node$1('br', 1)).shortEnded = true;
- }
- }
- });
- return parser;
- };
- var autoFocus = function (editor) {
- if (editor.settings.auto_focus) {
- Delay.setEditorTimeout(editor, function () {
- var focusEditor;
- if (editor.settings.auto_focus === true) {
- focusEditor = editor;
- } else {
- focusEditor = editor.editorManager.get(editor.settings.auto_focus);
- }
- if (!focusEditor.destroyed) {
- focusEditor.focus();
- }
- }, 100);
- }
- };
- var initEditor = function (editor) {
- editor.bindPendingEventDelegates();
- editor.initialized = true;
- editor.fire('init');
- editor.focus(true);
- editor.nodeChanged({ initial: true });
- editor.execCallback('init_instance_callback', editor);
- autoFocus(editor);
- };
- var getStyleSheetLoader = function (editor) {
- return editor.inline ? DOM$2.styleSheetLoader : editor.dom.styleSheetLoader;
- };
- var initContentBody = function (editor, skipWrite) {
- var settings = editor.settings;
- var targetElm = editor.getElement();
- var doc = editor.getDoc(), body, contentCssText;
- if (!settings.inline) {
- editor.getElement().style.visibility = editor.orgVisibility;
- }
- if (!skipWrite && !settings.content_editable) {
- doc.open();
- doc.write(editor.iframeHTML);
- doc.close();
- }
- if (settings.content_editable) {
- editor.on('remove', function () {
- var bodyEl = this.getBody();
- DOM$2.removeClass(bodyEl, 'mce-content-body');
- DOM$2.removeClass(bodyEl, 'mce-edit-focus');
- DOM$2.setAttrib(bodyEl, 'contentEditable', null);
- });
- DOM$2.addClass(targetElm, 'mce-content-body');
- editor.contentDocument = doc = settings.content_document || domGlobals.document;
- editor.contentWindow = settings.content_window || domGlobals.window;
- editor.bodyElement = targetElm;
- settings.content_document = settings.content_window = null;
- settings.root_name = targetElm.nodeName.toLowerCase();
- }
- body = editor.getBody();
- body.disabled = true;
- editor.readonly = settings.readonly;
- if (!editor.readonly) {
- if (editor.inline && DOM$2.getStyle(body, 'position', true) === 'static') {
- body.style.position = 'relative';
- }
- body.contentEditable = editor.getParam('content_editable_state', true);
- }
- body.disabled = false;
- editor.editorUpload = EditorUpload(editor);
- editor.schema = Schema(settings);
- editor.dom = DOMUtils$1(doc, {
- keep_values: true,
- url_converter: editor.convertURL,
- url_converter_scope: editor,
- hex_colors: settings.force_hex_style_colors,
- class_filter: settings.class_filter,
- update_styles: true,
- root_element: editor.inline ? editor.getBody() : null,
- collect: settings.content_editable,
- schema: editor.schema,
- contentCssCors: Settings.shouldUseContentCssCors(editor),
- onSetAttrib: function (e) {
- editor.fire('SetAttrib', e);
- }
- });
- editor.parser = createParser(editor);
- editor.serializer = DomSerializer$1(settings, editor);
- editor.selection = Selection$1(editor.dom, editor.getWin(), editor.serializer, editor);
- editor.annotator = Annotator(editor);
- editor.formatter = Formatter(editor);
- editor.undoManager = UndoManager(editor);
- editor._nodeChangeDispatcher = new NodeChange(editor);
- editor._selectionOverrides = SelectionOverrides(editor);
- setup$g(editor);
- setup$f(editor);
- KeyboardOverrides.setup(editor);
- ForceBlocks.setup(editor);
- editor.fire('PreInit');
- if (!settings.browser_spellcheck && !settings.gecko_spellcheck) {
- doc.body.spellcheck = false;
- DOM$2.setAttrib(body, 'spellcheck', 'false');
- }
- editor.quirks = Quirks(editor);
- editor.fire('PostRender');
- if (settings.directionality) {
- body.dir = settings.directionality;
- }
- if (settings.nowrap) {
- body.style.whiteSpace = 'nowrap';
- }
- if (settings.protect) {
- editor.on('BeforeSetContent', function (e) {
- Tools.each(settings.protect, function (pattern) {
- e.content = e.content.replace(pattern, function (str) {
- return '';
- });
- });
- });
- }
- editor.on('SetContent', function () {
- editor.addVisual(editor.getBody());
- });
- editor.load({
- initial: true,
- format: 'html'
- });
- editor.startContent = editor.getContent({ format: 'raw' });
- editor.on('compositionstart compositionend', function (e) {
- editor.composing = e.type === 'compositionstart';
- });
- if (editor.contentStyles.length > 0) {
- contentCssText = '';
- Tools.each(editor.contentStyles, function (style) {
- contentCssText += style + '\r\n';
- });
- editor.dom.addStyle(contentCssText);
- }
- getStyleSheetLoader(editor).loadAll(editor.contentCSS, function (_) {
- initEditor(editor);
- }, function (urls) {
- initEditor(editor);
- });
- if (settings.content_style) {
- appendStyle(editor, settings.content_style);
- }
- };
- var InitContentBody = { initContentBody: initContentBody };
-
- var DOM$3 = DOMUtils$1.DOM;
- var relaxDomain = function (editor, ifr) {
- if (domGlobals.document.domain !== domGlobals.window.location.hostname && Env.ie && Env.ie < 12) {
- var bodyUuid = Uuid.uuid('mce');
- editor[bodyUuid] = function () {
- InitContentBody.initContentBody(editor);
- };
- var domainRelaxUrl = 'javascript:(function(){' + 'document.open();document.domain="' + domGlobals.document.domain + '";' + 'var ed = window.parent.tinymce.get("' + editor.id + '");document.write(ed.iframeHTML);' + 'document.close();ed.' + bodyUuid + '(true);})()';
- DOM$3.setAttrib(ifr, 'src', domainRelaxUrl);
- return true;
- }
- return false;
- };
- var normalizeHeight = function (height) {
- var normalizedHeight = typeof height === 'number' ? height + 'px' : height;
- return normalizedHeight ? normalizedHeight : '';
- };
- var createIframeElement = function (id, title, height, customAttrs) {
- var iframe = Element.fromTag('iframe');
- setAll(iframe, customAttrs);
- setAll(iframe, {
- id: id + '_ifr',
- frameBorder: '0',
- allowTransparency: 'true',
- title: title
- });
- setAll$1(iframe, {
- width: '100%',
- height: normalizeHeight(height),
- display: 'block'
- });
- return iframe;
- };
- var getIframeHtml = function (editor) {
- var bodyId, bodyClass, iframeHTML;
- iframeHTML = Settings.getDocType(editor) + '';
- if (Settings.getDocumentBaseUrl(editor) !== editor.documentBaseUrl) {
- iframeHTML += ' ';
- }
- iframeHTML += ' ';
- bodyId = Settings.getBodyId(editor);
- bodyClass = Settings.getBodyClass(editor);
- if (Settings.getContentSecurityPolicy(editor)) {
- iframeHTML += ' ';
- }
- iframeHTML += ' ';
- return iframeHTML;
- };
- var createIframe = function (editor, o) {
- var title = editor.editorManager.translate('Rich Text Area. Press ALT-F9 for menu. ' + 'Press ALT-F10 for toolbar. Press ALT-0 for help');
- var ifr = createIframeElement(editor.id, title, o.height, Settings.getIframeAttrs(editor)).dom();
- ifr.onload = function () {
- ifr.onload = null;
- editor.fire('load');
- };
- var isDomainRelaxed = relaxDomain(editor, ifr);
- editor.contentAreaContainer = o.iframeContainer;
- editor.iframeElement = ifr;
- editor.iframeHTML = getIframeHtml(editor);
- DOM$3.add(o.iframeContainer, ifr);
- return isDomainRelaxed;
- };
- var init$1 = function (editor, boxInfo) {
- var isDomainRelaxed = createIframe(editor, boxInfo);
- if (boxInfo.editorContainer) {
- DOM$3.get(boxInfo.editorContainer).style.display = editor.orgDisplay;
- editor.hidden = DOM$3.isHidden(boxInfo.editorContainer);
- }
- editor.getElement().style.display = 'none';
- DOM$3.setAttrib(editor.id, 'aria-hidden', 'true');
- if (!isDomainRelaxed) {
- InitContentBody.initContentBody(editor);
- }
- };
- var InitIframe = { init: init$1 };
-
- var DOM$4 = DOMUtils$1.DOM;
- var initPlugin = function (editor, initializedPlugins, plugin) {
- var Plugin = PluginManager$1.get(plugin);
- var pluginUrl = PluginManager$1.urls[plugin] || editor.documentBaseUrl.replace(/\/$/, '');
- plugin = Tools.trim(plugin);
- if (Plugin && Tools.inArray(initializedPlugins, plugin) === -1) {
- Tools.each(PluginManager$1.dependencies(plugin), function (dep) {
- initPlugin(editor, initializedPlugins, dep);
- });
- if (editor.plugins[plugin]) {
- return;
- }
- try {
- var pluginInstance = new Plugin(editor, pluginUrl, editor.$);
- editor.plugins[plugin] = pluginInstance;
- if (pluginInstance.init) {
- pluginInstance.init(editor, pluginUrl);
- initializedPlugins.push(plugin);
- }
- } catch (e) {
- ErrorReporter.pluginInitError(editor, plugin, e);
- }
- }
- };
- var trimLegacyPrefix = function (name) {
- return name.replace(/^\-/, '');
- };
- var initPlugins = function (editor) {
- var initializedPlugins = [];
- Tools.each(editor.settings.plugins.split(/[ ,]/), function (name) {
- initPlugin(editor, initializedPlugins, trimLegacyPrefix(name));
- });
- };
- var initTheme = function (editor) {
- var Theme;
- var theme = editor.settings.theme;
- if (isString(theme)) {
- editor.settings.theme = trimLegacyPrefix(theme);
- Theme = ThemeManager.get(theme);
- editor.theme = new Theme(editor, ThemeManager.urls[theme]);
- if (editor.theme.init) {
- editor.theme.init(editor, ThemeManager.urls[theme] || editor.documentBaseUrl.replace(/\/$/, ''), editor.$);
- }
- } else {
- editor.theme = {};
- }
- };
- var renderFromLoadedTheme = function (editor) {
- var w, h, minHeight, re, info;
- var settings = editor.settings;
- var elm = editor.getElement();
- w = settings.width || DOM$4.getStyle(elm, 'width') || '100%';
- h = settings.height || DOM$4.getStyle(elm, 'height') || elm.offsetHeight;
- minHeight = settings.min_height || 100;
- re = /^[0-9\.]+(|px)$/i;
- if (re.test('' + w)) {
- w = Math.max(parseInt(w, 10), 100);
- }
- if (re.test('' + h)) {
- h = Math.max(parseInt(h, 10), minHeight);
- }
- info = editor.theme.renderUI({
- targetNode: elm,
- width: w,
- height: h,
- deltaWidth: settings.delta_width,
- deltaHeight: settings.delta_height
- });
- if (!settings.content_editable) {
- h = (info.iframeHeight || h) + (typeof h === 'number' ? info.deltaHeight || 0 : '');
- if (h < minHeight) {
- h = minHeight;
- }
- }
- info.height = h;
- return info;
- };
- var renderFromThemeFunc = function (editor) {
- var info;
- var elm = editor.getElement();
- info = editor.settings.theme(editor, elm);
- if (info.editorContainer.nodeType) {
- info.editorContainer.id = info.editorContainer.id || editor.id + '_parent';
- }
- if (info.iframeContainer && info.iframeContainer.nodeType) {
- info.iframeContainer.id = info.iframeContainer.id || editor.id + '_iframecontainer';
- }
- info.height = info.iframeHeight ? info.iframeHeight : elm.offsetHeight;
- return info;
- };
- var createThemeFalseResult = function (element) {
- return {
- editorContainer: element,
- iframeContainer: element
- };
- };
- var renderThemeFalseIframe = function (targetElement) {
- var iframeContainer = DOM$4.create('div');
- DOM$4.insertAfter(iframeContainer, targetElement);
- return createThemeFalseResult(iframeContainer);
- };
- var renderThemeFalse = function (editor) {
- var targetElement = editor.getElement();
- return editor.inline ? createThemeFalseResult(null) : renderThemeFalseIframe(targetElement);
- };
- var renderThemeUi = function (editor) {
- var settings = editor.settings, elm = editor.getElement();
- editor.orgDisplay = elm.style.display;
- if (isString(settings.theme)) {
- return renderFromLoadedTheme(editor);
- } else if (isFunction(settings.theme)) {
- return renderFromThemeFunc(editor);
- } else {
- return renderThemeFalse(editor);
- }
- };
- var init$2 = function (editor) {
- var settings = editor.settings;
- var elm = editor.getElement();
- var boxInfo;
- editor.rtl = settings.rtl_ui || editor.editorManager.i18n.rtl;
- editor.editorManager.i18n.setCode(settings.language);
- settings.aria_label = settings.aria_label || DOM$4.getAttrib(elm, 'aria-label', editor.getLang('aria.rich_text_area'));
- editor.fire('ScriptsLoaded');
- initTheme(editor);
- initPlugins(editor);
- boxInfo = renderThemeUi(editor);
- editor.editorContainer = boxInfo.editorContainer ? boxInfo.editorContainer : null;
- if (settings.content_css) {
- Tools.each(Tools.explode(settings.content_css), function (u) {
- editor.contentCSS.push(editor.documentBaseURI.toAbsolute(u));
- });
- }
- if (settings.content_editable) {
- return InitContentBody.initContentBody(editor);
- } else {
- return InitIframe.init(editor, boxInfo);
- }
- };
- var Init = { init: init$2 };
-
- var DOM$5 = DOMUtils$1.DOM;
- var hasSkipLoadPrefix = function (name) {
- return name.charAt(0) === '-';
- };
- var loadLanguage = function (scriptLoader, editor) {
- var settings = editor.settings;
- if (settings.language && settings.language !== 'en' && !settings.language_url) {
- settings.language_url = editor.editorManager.baseURL + '/langs/' + settings.language + '.js';
- }
- if (settings.language_url && !editor.editorManager.i18n.data[settings.language]) {
- scriptLoader.add(settings.language_url);
- }
- };
- var loadTheme = function (scriptLoader, editor, suffix, callback) {
- var settings = editor.settings, theme = settings.theme;
- if (isString(theme)) {
- if (!hasSkipLoadPrefix(theme) && !ThemeManager.urls.hasOwnProperty(theme)) {
- var themeUrl = settings.theme_url;
- if (themeUrl) {
- ThemeManager.load(theme, editor.documentBaseURI.toAbsolute(themeUrl));
- } else {
- ThemeManager.load(theme, 'themes/' + theme + '/theme' + suffix + '.js');
- }
- }
- scriptLoader.loadQueue(function () {
- ThemeManager.waitFor(theme, callback);
- });
- } else {
- callback();
- }
- };
- var loadPlugins = function (settings, suffix) {
- if (Tools.isArray(settings.plugins)) {
- settings.plugins = settings.plugins.join(' ');
- }
- Tools.each(settings.external_plugins, function (url, name) {
- PluginManager$1.load(name, url);
- settings.plugins += ' ' + name;
- });
- Tools.each(settings.plugins.split(/[ ,]/), function (plugin) {
- plugin = Tools.trim(plugin);
- if (plugin && !PluginManager$1.urls[plugin]) {
- if (hasSkipLoadPrefix(plugin)) {
- plugin = plugin.substr(1, plugin.length);
- var dependencies = PluginManager$1.dependencies(plugin);
- Tools.each(dependencies, function (dep) {
- var defaultSettings = {
- prefix: 'plugins/',
- resource: dep,
- suffix: '/plugin' + suffix + '.js'
- };
- dep = PluginManager$1.createUrl(defaultSettings, dep);
- PluginManager$1.load(dep.resource, dep);
- });
- } else {
- PluginManager$1.load(plugin, {
- prefix: 'plugins/',
- resource: plugin,
- suffix: '/plugin' + suffix + '.js'
- });
- }
- }
- });
- };
- var loadScripts = function (editor, suffix) {
- var scriptLoader = ScriptLoader.ScriptLoader;
- loadTheme(scriptLoader, editor, suffix, function () {
- loadLanguage(scriptLoader, editor);
- loadPlugins(editor.settings, suffix);
- scriptLoader.loadQueue(function () {
- if (!editor.removed) {
- Init.init(editor);
- }
- }, editor, function (urls) {
- ErrorReporter.pluginLoadError(editor, urls[0]);
- if (!editor.removed) {
- Init.init(editor);
- }
- });
- });
- };
- var render = function (editor) {
- var settings = editor.settings, id = editor.id;
- var readyHandler = function () {
- DOM$5.unbind(domGlobals.window, 'ready', readyHandler);
- editor.render();
- };
- if (!EventUtils.Event.domLoaded) {
- DOM$5.bind(domGlobals.window, 'ready', readyHandler);
- return;
- }
- if (!editor.getElement()) {
- return;
- }
- if (!Env.contentEditable) {
- return;
- }
- if (!settings.inline) {
- editor.orgVisibility = editor.getElement().style.visibility;
- editor.getElement().style.visibility = 'hidden';
- } else {
- editor.inline = true;
- }
- var form = editor.getElement().form || DOM$5.getParent(id, 'form');
- if (form) {
- editor.formElement = form;
- if (settings.hidden_input && !/TEXTAREA|INPUT/i.test(editor.getElement().nodeName)) {
- DOM$5.insertAfter(DOM$5.create('input', {
- type: 'hidden',
- name: id
- }), id);
- editor.hasHiddenInput = true;
- }
- editor.formEventDelegate = function (e) {
- editor.fire(e.type, e);
- };
- DOM$5.bind(form, 'submit reset', editor.formEventDelegate);
- editor.on('reset', function () {
- editor.setContent(editor.startContent, { format: 'raw' });
- });
- if (settings.submit_patch && !form.submit.nodeType && !form.submit.length && !form._mceOldSubmit) {
- form._mceOldSubmit = form.submit;
- form.submit = function () {
- editor.editorManager.triggerSave();
- editor.setDirty(false);
- return form._mceOldSubmit(form);
- };
- }
- }
- editor.windowManager = WindowManager(editor);
- editor.notificationManager = NotificationManager(editor);
- if (settings.encoding === 'xml') {
- editor.on('GetContent', function (e) {
- if (e.save) {
- e.content = DOM$5.encode(e.content);
- }
- });
- }
- if (settings.add_form_submit_trigger) {
- editor.on('submit', function () {
- if (editor.initialized) {
- editor.save();
- }
- });
- }
- if (settings.add_unload_trigger) {
- editor._beforeUnload = function () {
- if (editor.initialized && !editor.destroyed && !editor.isHidden()) {
- editor.save({
- format: 'raw',
- no_events: true,
- set_dirty: false
- });
- }
- };
- editor.editorManager.on('BeforeUnload', editor._beforeUnload);
- }
- editor.editorManager.add(editor);
- loadScripts(editor, editor.suffix);
- };
- var Render = { render: render };
-
- var add$4 = function (editor, name, settings) {
- var sidebars = editor.sidebars ? editor.sidebars : [];
- sidebars.push({
- name: name,
- settings: settings
- });
- editor.sidebars = sidebars;
- };
- var Sidebar = { add: add$4 };
-
- var each$k = Tools.each, trim$4 = Tools.trim;
- var queryParts = 'source protocol authority userInfo user password host port relative path directory file query anchor'.split(' ');
- var DEFAULT_PORTS = {
- ftp: 21,
- http: 80,
- https: 443,
- mailto: 25
- };
- var URI = function (url, settings) {
- var self = this;
- var baseUri, baseUrl;
- url = trim$4(url);
- settings = self.settings = settings || {};
- baseUri = settings.base_uri;
- if (/^([\w\-]+):([^\/]{2})/i.test(url) || /^\s*#/.test(url)) {
- self.source = url;
- return;
- }
- var isProtocolRelative = url.indexOf('//') === 0;
- if (url.indexOf('/') === 0 && !isProtocolRelative) {
- url = (baseUri ? baseUri.protocol || 'http' : 'http') + '://mce_host' + url;
- }
- if (!/^[\w\-]*:?\/\//.test(url)) {
- baseUrl = settings.base_uri ? settings.base_uri.path : new URI(domGlobals.document.location.href).directory;
- if (settings.base_uri.protocol == '') {
- url = '//mce_host' + self.toAbsPath(baseUrl, url);
- } else {
- url = /([^#?]*)([#?]?.*)/.exec(url);
- url = (baseUri && baseUri.protocol || 'http') + '://mce_host' + self.toAbsPath(baseUrl, url[1]) + url[2];
- }
- }
- url = url.replace(/@@/g, '(mce_at)');
- url = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(url);
- each$k(queryParts, function (v, i) {
- var part = url[i];
- if (part) {
- part = part.replace(/\(mce_at\)/g, '@@');
- }
- self[v] = part;
- });
- if (baseUri) {
- if (!self.protocol) {
- self.protocol = baseUri.protocol;
- }
- if (!self.userInfo) {
- self.userInfo = baseUri.userInfo;
- }
- if (!self.port && self.host === 'mce_host') {
- self.port = baseUri.port;
- }
- if (!self.host || self.host === 'mce_host') {
- self.host = baseUri.host;
- }
- self.source = '';
- }
- if (isProtocolRelative) {
- self.protocol = '';
- }
- };
- URI.prototype = {
- setPath: function (path) {
- var self = this;
- path = /^(.*?)\/?(\w+)?$/.exec(path);
- self.path = path[0];
- self.directory = path[1];
- self.file = path[2];
- self.source = '';
- self.getURI();
- },
- toRelative: function (uri) {
- var self = this;
- var output;
- if (uri === './') {
- return uri;
- }
- uri = new URI(uri, { base_uri: self });
- if (uri.host !== 'mce_host' && self.host !== uri.host && uri.host || self.port !== uri.port || self.protocol !== uri.protocol && uri.protocol !== '') {
- return uri.getURI();
- }
- var tu = self.getURI(), uu = uri.getURI();
- if (tu === uu || tu.charAt(tu.length - 1) === '/' && tu.substr(0, tu.length - 1) === uu) {
- return tu;
- }
- output = self.toRelPath(self.path, uri.path);
- if (uri.query) {
- output += '?' + uri.query;
- }
- if (uri.anchor) {
- output += '#' + uri.anchor;
- }
- return output;
- },
- toAbsolute: function (uri, noHost) {
- uri = new URI(uri, { base_uri: this });
- return uri.getURI(noHost && this.isSameOrigin(uri));
- },
- isSameOrigin: function (uri) {
- if (this.host == uri.host && this.protocol == uri.protocol) {
- if (this.port == uri.port) {
- return true;
- }
- var defaultPort = DEFAULT_PORTS[this.protocol];
- if (defaultPort && (this.port || defaultPort) == (uri.port || defaultPort)) {
- return true;
- }
- }
- return false;
- },
- toRelPath: function (base, path) {
- var items, breakPoint = 0, out = '', i, l;
- base = base.substring(0, base.lastIndexOf('/'));
- base = base.split('/');
- items = path.split('/');
- if (base.length >= items.length) {
- for (i = 0, l = base.length; i < l; i++) {
- if (i >= items.length || base[i] !== items[i]) {
- breakPoint = i + 1;
- break;
- }
- }
- }
- if (base.length < items.length) {
- for (i = 0, l = items.length; i < l; i++) {
- if (i >= base.length || base[i] !== items[i]) {
- breakPoint = i + 1;
- break;
- }
- }
- }
- if (breakPoint === 1) {
- return path;
- }
- for (i = 0, l = base.length - (breakPoint - 1); i < l; i++) {
- out += '../';
- }
- for (i = breakPoint - 1, l = items.length; i < l; i++) {
- if (i !== breakPoint - 1) {
- out += '/' + items[i];
- } else {
- out += items[i];
- }
- }
- return out;
- },
- toAbsPath: function (base, path) {
- var i, nb = 0, o = [], tr, outPath;
- tr = /\/$/.test(path) ? '/' : '';
- base = base.split('/');
- path = path.split('/');
- each$k(base, function (k) {
- if (k) {
- o.push(k);
- }
- });
- base = o;
- for (i = path.length - 1, o = []; i >= 0; i--) {
- if (path[i].length === 0 || path[i] === '.') {
- continue;
- }
- if (path[i] === '..') {
- nb++;
- continue;
- }
- if (nb > 0) {
- nb--;
- continue;
- }
- o.push(path[i]);
- }
- i = base.length - nb;
- if (i <= 0) {
- outPath = o.reverse().join('/');
- } else {
- outPath = base.slice(0, i).join('/') + '/' + o.reverse().join('/');
- }
- if (outPath.indexOf('/') !== 0) {
- outPath = '/' + outPath;
- }
- if (tr && outPath.lastIndexOf('/') !== outPath.length - 1) {
- outPath += tr;
- }
- return outPath;
- },
- getURI: function (noProtoHost) {
- var s;
- var self = this;
- if (!self.source || noProtoHost) {
- s = '';
- if (!noProtoHost) {
- if (self.protocol) {
- s += self.protocol + '://';
- } else {
- s += '//';
- }
- if (self.userInfo) {
- s += self.userInfo + '@';
- }
- if (self.host) {
- s += self.host;
- }
- if (self.port) {
- s += ':' + self.port;
- }
- }
- if (self.path) {
- s += self.path;
- }
- if (self.query) {
- s += '?' + self.query;
- }
- if (self.anchor) {
- s += '#' + self.anchor;
- }
- self.source = s;
- }
- return self.source;
- }
- };
- URI.parseDataUri = function (uri) {
- var type, matches;
- uri = decodeURIComponent(uri).split(',');
- matches = /data:([^;]+)/.exec(uri[0]);
- if (matches) {
- type = matches[1];
- }
- return {
- type: type,
- data: uri[1]
- };
- };
- URI.getDocumentBaseUrl = function (loc) {
- var baseUrl;
- if (loc.protocol.indexOf('http') !== 0 && loc.protocol !== 'file:') {
- baseUrl = loc.href;
- } else {
- baseUrl = loc.protocol + '//' + loc.host + loc.pathname;
- }
- if (/^[^:]+:\/\/\/?[^\/]+\//.test(baseUrl)) {
- baseUrl = baseUrl.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');
- if (!/[\/\\]$/.test(baseUrl)) {
- baseUrl += '/';
- }
- }
- return baseUrl;
- };
-
- var defaultFormat = 'html';
- var trimEmptyContents = function (editor, html) {
- var blockName = Settings.getForcedRootBlock(editor);
- var emptyRegExp = new RegExp('^(<' + blockName + '[^>]*>( | |\\s|\xA0| |)<\\/' + blockName + '>[\r\n]*| [\r\n]*)$');
- return html.replace(emptyRegExp, '');
- };
- var getContentFromBody = function (editor, args, body) {
- var content;
- args.format = args.format ? args.format : defaultFormat;
- args.get = true;
- args.getInner = true;
- if (!args.no_events) {
- editor.fire('BeforeGetContent', args);
- }
- if (args.format === 'raw') {
- content = Tools.trim(TrimHtml.trimExternal(editor.serializer, body.innerHTML));
- } else if (args.format === 'text') {
- content = Zwsp.trim(body.innerText || body.textContent);
- } else if (args.format === 'tree') {
- return editor.serializer.serialize(body, args);
- } else {
- content = trimEmptyContents(editor, editor.serializer.serialize(body, args));
- }
- if (args.format !== 'text' && !isWsPreserveElement(Element.fromDom(body))) {
- args.content = Tools.trim(content);
- } else {
- args.content = content;
- }
- if (!args.no_events) {
- editor.fire('GetContent', args);
- }
- return args.content;
- };
- var getContent$1 = function (editor, args) {
- if (args === void 0) {
- args = {};
- }
- return Option.from(editor.getBody()).fold(constant(args.format === 'tree' ? new Node$1('body', 11) : ''), function (body) {
- return getContentFromBody(editor, args, body);
- });
- };
-
- var traverse = function (node, fn) {
- fn(node);
- if (node.firstChild) {
- traverse(node.firstChild, fn);
- }
- if (node.next) {
- traverse(node.next, fn);
- }
- };
- var findMatchingNodes = function (nodeFilters, attributeFilters, node) {
- var nodeMatches = {};
- var attrMatches = {};
- var matches = [];
- if (node.firstChild) {
- traverse(node.firstChild, function (node) {
- each(nodeFilters, function (filter) {
- if (filter.name === node.name) {
- if (nodeMatches[filter.name]) {
- nodeMatches[filter.name].nodes.push(node);
- } else {
- nodeMatches[filter.name] = {
- filter: filter,
- nodes: [node]
- };
- }
- }
- });
- each(attributeFilters, function (filter) {
- if (typeof node.attr(filter.name) === 'string') {
- if (attrMatches[filter.name]) {
- attrMatches[filter.name].nodes.push(node);
- } else {
- attrMatches[filter.name] = {
- filter: filter,
- nodes: [node]
- };
- }
- }
- });
- });
- }
- for (var name in nodeMatches) {
- if (nodeMatches.hasOwnProperty(name)) {
- matches.push(nodeMatches[name]);
- }
- }
- for (var name in attrMatches) {
- if (attrMatches.hasOwnProperty(name)) {
- matches.push(attrMatches[name]);
- }
- }
- return matches;
- };
- var filter$3 = function (nodeFilters, attributeFilters, node) {
- var matches = findMatchingNodes(nodeFilters, attributeFilters, node);
- each(matches, function (match) {
- each(match.filter.callbacks, function (callback) {
- callback(match.nodes, match.filter.name, {});
- });
- });
- };
-
- var defaultFormat$1 = 'html';
- var isTreeNode = function (content) {
- return content instanceof Node$1;
- };
- var moveSelection = function (editor) {
- if (EditorFocus.hasFocus(editor)) {
- CaretFinder.firstPositionIn(editor.getBody()).each(function (pos) {
- var node = pos.getNode();
- var caretPos = NodeType.isTable(node) ? CaretFinder.firstPositionIn(node).getOr(pos) : pos;
- editor.selection.setRng(caretPos.toRange());
- });
- }
- };
- var setEditorHtml = function (editor, html) {
- editor.dom.setHTML(editor.getBody(), html);
- moveSelection(editor);
- };
- var setContentString = function (editor, body, content, args) {
- var forcedRootBlockName, padd;
- if (content.length === 0 || /^\s+$/.test(content)) {
- padd = ' ';
- if (body.nodeName === 'TABLE') {
- content = '' + padd + ' ';
- } else if (/^(UL|OL)$/.test(body.nodeName)) {
- content = '' + padd + ' ';
- }
- forcedRootBlockName = Settings.getForcedRootBlock(editor);
- if (forcedRootBlockName && editor.schema.isValidChild(body.nodeName.toLowerCase(), forcedRootBlockName.toLowerCase())) {
- content = padd;
- content = editor.dom.createHTML(forcedRootBlockName, editor.settings.forced_root_block_attrs, content);
- } else if (!content) {
- content = ' ';
- }
- setEditorHtml(editor, content);
- editor.fire('SetContent', args);
- } else {
- if (args.format !== 'raw') {
- content = HtmlSerializer({ validate: editor.validate }, editor.schema).serialize(editor.parser.parse(content, {
- isRootContent: true,
- insert: true
- }));
- }
- args.content = isWsPreserveElement(Element.fromDom(body)) ? content : Tools.trim(content);
- setEditorHtml(editor, args.content);
- if (!args.no_events) {
- editor.fire('SetContent', args);
- }
- }
- return args.content;
- };
- var setContentTree = function (editor, body, content, args) {
- filter$3(editor.parser.getNodeFilters(), editor.parser.getAttributeFilters(), content);
- var html = HtmlSerializer({ validate: editor.validate }, editor.schema).serialize(content);
- args.content = isWsPreserveElement(Element.fromDom(body)) ? html : Tools.trim(html);
- setEditorHtml(editor, args.content);
- if (!args.no_events) {
- editor.fire('SetContent', args);
- }
- return content;
- };
- var setContent$1 = function (editor, content, args) {
- if (args === void 0) {
- args = {};
- }
- args.format = args.format ? args.format : defaultFormat$1;
- args.set = true;
- args.content = isTreeNode(content) ? '' : content;
- if (!isTreeNode(content) && !args.no_events) {
- editor.fire('BeforeSetContent', args);
- content = args.content;
- }
- return Option.from(editor.getBody()).fold(constant(content), function (body) {
- return isTreeNode(content) ? setContentTree(editor, body, content, args) : setContentString(editor, body, content, args);
- });
- };
-
- var DOM$6 = DOMUtils$1.DOM;
- var restoreOriginalStyles = function (editor) {
- DOM$6.setStyle(editor.id, 'display', editor.orgDisplay);
- };
- var safeDestroy = function (x) {
- return Option.from(x).each(function (x) {
- return x.destroy();
- });
- };
- var clearDomReferences = function (editor) {
- editor.contentAreaContainer = editor.formElement = editor.container = editor.editorContainer = null;
- editor.bodyElement = editor.contentDocument = editor.contentWindow = null;
- editor.iframeElement = editor.targetElm = null;
- if (editor.selection) {
- editor.selection = editor.selection.win = editor.selection.dom = editor.selection.dom.doc = null;
- }
- };
- var restoreForm = function (editor) {
- var form = editor.formElement;
- if (form) {
- if (form._mceOldSubmit) {
- form.submit = form._mceOldSubmit;
- form._mceOldSubmit = null;
- }
- DOM$6.unbind(form, 'submit reset', editor.formEventDelegate);
- }
- };
- var remove$7 = function (editor) {
- if (!editor.removed) {
- var _selectionOverrides = editor._selectionOverrides, editorUpload = editor.editorUpload;
- var body = editor.getBody();
- var element = editor.getElement();
- if (body) {
- editor.save({ is_removing: true });
- }
- editor.removed = true;
- editor.unbindAllNativeEvents();
- if (editor.hasHiddenInput && element) {
- DOM$6.remove(element.nextSibling);
- }
- Events.fireRemove(editor);
- editor.editorManager.remove(editor);
- if (!editor.inline && body) {
- restoreOriginalStyles(editor);
- }
- Events.fireDetach(editor);
- DOM$6.remove(editor.getContainer());
- safeDestroy(_selectionOverrides);
- safeDestroy(editorUpload);
- editor.destroy();
- }
- };
- var destroy = function (editor, automatic) {
- var selection = editor.selection, dom = editor.dom;
- if (editor.destroyed) {
- return;
- }
- if (!automatic && !editor.removed) {
- editor.remove();
- return;
- }
- if (!automatic) {
- editor.editorManager.off('beforeunload', editor._beforeUnload);
- if (editor.theme && editor.theme.destroy) {
- editor.theme.destroy();
- }
- safeDestroy(selection);
- safeDestroy(dom);
- }
- restoreForm(editor);
- clearDomReferences(editor);
- editor.destroyed = true;
- };
-
- var DOM$7 = DOMUtils$1.DOM;
- var extend$4 = Tools.extend, each$l = Tools.each;
- var resolve$4 = Tools.resolve;
- var ie$2 = Env.ie;
- var Editor = function (id, settings, editorManager) {
- var self = this;
- var documentBaseUrl = self.documentBaseUrl = editorManager.documentBaseURL;
- var baseUri = editorManager.baseURI;
- settings = getEditorSettings(self, id, documentBaseUrl, editorManager.defaultSettings, settings);
- self.settings = settings;
- AddOnManager.language = settings.language || 'en';
- AddOnManager.languageLoad = settings.language_load;
- AddOnManager.baseURL = editorManager.baseURL;
- self.id = id;
- self.setDirty(false);
- self.plugins = {};
- self.documentBaseURI = new URI(settings.document_base_url, { base_uri: baseUri });
- self.baseURI = baseUri;
- self.contentCSS = [];
- self.contentStyles = [];
- self.shortcuts = new Shortcuts(self);
- self.loadedCSS = {};
- self.editorCommands = new EditorCommands(self);
- self.suffix = editorManager.suffix;
- self.editorManager = editorManager;
- self.inline = settings.inline;
- self.buttons = {};
- self.menuItems = {};
- if (settings.cache_suffix) {
- Env.cacheSuffix = settings.cache_suffix.replace(/^[\?\&]+/, '');
- }
- if (settings.override_viewport === false) {
- Env.overrideViewPort = false;
- }
- editorManager.fire('SetupEditor', { editor: self });
- self.execCallback('setup', self);
- self.$ = DomQuery.overrideDefaults(function () {
- return {
- context: self.inline ? self.getBody() : self.getDoc(),
- element: self.getBody()
- };
- });
- };
- Editor.prototype = {
- render: function () {
- Render.render(this);
- },
- focus: function (skipFocus) {
- EditorFocus.focus(this, skipFocus);
- },
- hasFocus: function () {
- return EditorFocus.hasFocus(this);
- },
- execCallback: function (name) {
- var x = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- x[_i - 1] = arguments[_i];
- }
- var self = this;
- var callback = self.settings[name], scope;
- if (!callback) {
- return;
- }
- if (self.callbackLookup && (scope = self.callbackLookup[name])) {
- callback = scope.func;
- scope = scope.scope;
- }
- if (typeof callback === 'string') {
- scope = callback.replace(/\.\w+$/, '');
- scope = scope ? resolve$4(scope) : 0;
- callback = resolve$4(callback);
- self.callbackLookup = self.callbackLookup || {};
- self.callbackLookup[name] = {
- func: callback,
- scope: scope
- };
- }
- return callback.apply(scope || self, Array.prototype.slice.call(arguments, 1));
- },
- translate: function (text) {
- if (text && Tools.is(text, 'string')) {
- var lang_1 = this.settings.language || 'en', i18n_1 = this.editorManager.i18n;
- text = i18n_1.data[lang_1 + '.' + text] || text.replace(/\{\#([^\}]+)\}/g, function (a, b) {
- return i18n_1.data[lang_1 + '.' + b] || '{#' + b + '}';
- });
- }
- return this.editorManager.translate(text);
- },
- getLang: function (name, defaultVal) {
- return this.editorManager.i18n.data[(this.settings.language || 'en') + '.' + name] || (defaultVal !== undefined ? defaultVal : '{#' + name + '}');
- },
- getParam: function (name, defaultVal, type) {
- return getParam(this, name, defaultVal, type);
- },
- nodeChanged: function (args) {
- this._nodeChangeDispatcher.nodeChanged(args);
- },
- addButton: function (name, settings) {
- var self = this;
- if (settings.cmd) {
- settings.onclick = function () {
- self.execCommand(settings.cmd);
- };
- }
- if (settings.stateSelector && typeof settings.active === 'undefined') {
- settings.active = false;
- }
- if (!settings.text && !settings.icon) {
- settings.icon = name;
- }
- settings.tooltip = settings.tooltip || settings.title;
- self.buttons[name] = settings;
- },
- addSidebar: function (name, settings) {
- return Sidebar.add(this, name, settings);
- },
- addMenuItem: function (name, settings) {
- var self = this;
- if (settings.cmd) {
- settings.onclick = function () {
- self.execCommand(settings.cmd);
- };
- }
- self.menuItems[name] = settings;
- },
- addContextToolbar: function (predicate, items) {
- var self = this;
- var selector;
- self.contextToolbars = self.contextToolbars || [];
- if (typeof predicate === 'string') {
- selector = predicate;
- predicate = function (elm) {
- return self.dom.is(elm, selector);
- };
- }
- self.contextToolbars.push({
- id: Uuid.uuid('mcet'),
- predicate: predicate,
- items: items
- });
- },
- addCommand: function (name, callback, scope) {
- this.editorCommands.addCommand(name, callback, scope);
- },
- addQueryStateHandler: function (name, callback, scope) {
- this.editorCommands.addQueryStateHandler(name, callback, scope);
- },
- addQueryValueHandler: function (name, callback, scope) {
- this.editorCommands.addQueryValueHandler(name, callback, scope);
- },
- addShortcut: function (pattern, desc, cmdFunc, scope) {
- this.shortcuts.add(pattern, desc, cmdFunc, scope);
- },
- execCommand: function (cmd, ui, value, args) {
- return this.editorCommands.execCommand(cmd, ui, value, args);
- },
- queryCommandState: function (cmd) {
- return this.editorCommands.queryCommandState(cmd);
- },
- queryCommandValue: function (cmd) {
- return this.editorCommands.queryCommandValue(cmd);
- },
- queryCommandSupported: function (cmd) {
- return this.editorCommands.queryCommandSupported(cmd);
- },
- show: function () {
- var self = this;
- if (self.hidden) {
- self.hidden = false;
- if (self.inline) {
- self.getBody().contentEditable = true;
- } else {
- DOM$7.show(self.getContainer());
- DOM$7.hide(self.id);
- }
- self.load();
- self.fire('show');
- }
- },
- hide: function () {
- var self = this, doc = self.getDoc();
- if (!self.hidden) {
- if (ie$2 && doc && !self.inline) {
- doc.execCommand('SelectAll');
- }
- self.save();
- if (self.inline) {
- self.getBody().contentEditable = false;
- if (self === self.editorManager.focusedEditor) {
- self.editorManager.focusedEditor = null;
- }
- } else {
- DOM$7.hide(self.getContainer());
- DOM$7.setStyle(self.id, 'display', self.orgDisplay);
- }
- self.hidden = true;
- self.fire('hide');
- }
- },
- isHidden: function () {
- return !!this.hidden;
- },
- setProgressState: function (state, time) {
- this.fire('ProgressState', {
- state: state,
- time: time
- });
- },
- load: function (args) {
- var self = this;
- var elm = self.getElement(), html;
- if (self.removed) {
- return '';
- }
- if (elm) {
- args = args || {};
- args.load = true;
- html = self.setContent(elm.value !== undefined ? elm.value : elm.innerHTML, args);
- args.element = elm;
- if (!args.no_events) {
- self.fire('LoadContent', args);
- }
- args.element = elm = null;
- return html;
- }
- },
- save: function (args) {
- var self = this;
- var elm = self.getElement(), html, form;
- if (!elm || !self.initialized || self.removed) {
- return;
- }
- args = args || {};
- args.save = true;
- args.element = elm;
- html = args.content = self.getContent(args);
- if (!args.no_events) {
- self.fire('SaveContent', args);
- }
- if (args.format === 'raw') {
- self.fire('RawSaveContent', args);
- }
- html = args.content;
- if (!/TEXTAREA|INPUT/i.test(elm.nodeName)) {
- if (args.is_removing || !self.inline) {
- elm.innerHTML = html;
- }
- if (form = DOM$7.getParent(self.id, 'form')) {
- each$l(form.elements, function (elm) {
- if (elm.name === self.id) {
- elm.value = html;
- return false;
- }
- });
- }
- } else {
- elm.value = html;
- }
- args.element = elm = null;
- if (args.set_dirty !== false) {
- self.setDirty(false);
- }
- return html;
- },
- setContent: function (content, args) {
- return setContent$1(this, content, args);
- },
- getContent: function (args) {
- return getContent$1(this, args);
- },
- insertContent: function (content, args) {
- if (args) {
- content = extend$4({ content: content }, args);
- }
- this.execCommand('mceInsertContent', false, content);
- },
- isDirty: function () {
- return !this.isNotDirty;
- },
- setDirty: function (state) {
- var oldState = !this.isNotDirty;
- this.isNotDirty = !state;
- if (state && state !== oldState) {
- this.fire('dirty');
- }
- },
- setMode: function (mode) {
- setMode(this, mode);
- },
- getContainer: function () {
- var self = this;
- if (!self.container) {
- self.container = DOM$7.get(self.editorContainer || self.id + '_parent');
- }
- return self.container;
- },
- getContentAreaContainer: function () {
- return this.contentAreaContainer;
- },
- getElement: function () {
- if (!this.targetElm) {
- this.targetElm = DOM$7.get(this.id);
- }
- return this.targetElm;
- },
- getWin: function () {
- var self = this;
- var elm;
- if (!self.contentWindow) {
- elm = self.iframeElement;
- if (elm) {
- self.contentWindow = elm.contentWindow;
- }
- }
- return self.contentWindow;
- },
- getDoc: function () {
- var self = this;
- var win;
- if (!self.contentDocument) {
- win = self.getWin();
- if (win) {
- self.contentDocument = win.document;
- }
- }
- return self.contentDocument;
- },
- getBody: function () {
- var doc = this.getDoc();
- return this.bodyElement || (doc ? doc.body : null);
- },
- convertURL: function (url, name, elm) {
- var self = this, settings = self.settings;
- if (settings.urlconverter_callback) {
- return self.execCallback('urlconverter_callback', url, elm, true, name);
- }
- if (!settings.convert_urls || elm && elm.nodeName === 'LINK' || url.indexOf('file:') === 0 || url.length === 0) {
- return url;
- }
- if (settings.relative_urls) {
- return self.documentBaseURI.toRelative(url);
- }
- url = self.documentBaseURI.toAbsolute(url, settings.remove_script_host);
- return url;
- },
- addVisual: function (elm) {
- var self = this;
- var settings = self.settings;
- var dom = self.dom;
- var cls;
- elm = elm || self.getBody();
- if (self.hasVisual === undefined) {
- self.hasVisual = settings.visual;
- }
- each$l(dom.select('table,a', elm), function (elm) {
- var value;
- switch (elm.nodeName) {
- case 'TABLE':
- cls = settings.visual_table_class || 'mce-item-table';
- value = dom.getAttrib(elm, 'border');
- if ((!value || value === '0') && self.hasVisual) {
- dom.addClass(elm, cls);
- } else {
- dom.removeClass(elm, cls);
- }
- return;
- case 'A':
- if (!dom.getAttrib(elm, 'href')) {
- value = dom.getAttrib(elm, 'name') || elm.id;
- cls = settings.visual_anchor_class || 'mce-item-anchor';
- if (value && self.hasVisual) {
- dom.addClass(elm, cls);
- } else {
- dom.removeClass(elm, cls);
- }
- }
- return;
- }
- });
- self.fire('VisualAid', {
- element: elm,
- hasVisual: self.hasVisual
- });
- },
- remove: function () {
- remove$7(this);
- },
- destroy: function (automatic) {
- destroy(this, automatic);
- },
- uploadImages: function (callback) {
- return this.editorUpload.uploadImages(callback);
- },
- _scanForImages: function () {
- return this.editorUpload.scanForImages();
- }
- };
- extend$4(Editor.prototype, EditorObservable$1);
-
- var isEditorUIElement = function (elm) {
- return elm.className.toString().indexOf('mce-') !== -1;
- };
- var FocusManager = { isEditorUIElement: isEditorUIElement };
-
- var isManualNodeChange = function (e) {
- return e.type === 'nodechange' && e.selectionChange;
- };
- var registerPageMouseUp = function (editor, throttledStore) {
- var mouseUpPage = function () {
- throttledStore.throttle();
- };
- DOMUtils$1.DOM.bind(domGlobals.document, 'mouseup', mouseUpPage);
- editor.on('remove', function () {
- DOMUtils$1.DOM.unbind(domGlobals.document, 'mouseup', mouseUpPage);
- });
- };
- var registerFocusOut = function (editor) {
- editor.on('focusout', function () {
- SelectionBookmark.store(editor);
- });
- };
- var registerMouseUp = function (editor, throttledStore) {
- editor.on('mouseup touchend', function (e) {
- throttledStore.throttle();
- });
- };
- var registerEditorEvents = function (editor, throttledStore) {
- var browser = PlatformDetection$1.detect().browser;
- if (browser.isIE()) {
- registerFocusOut(editor);
- } else {
- registerMouseUp(editor, throttledStore);
- }
- editor.on('keyup nodechange', function (e) {
- if (!isManualNodeChange(e)) {
- SelectionBookmark.store(editor);
- }
- });
- };
- var register$3 = function (editor) {
- var throttledStore = first(function () {
- SelectionBookmark.store(editor);
- }, 0);
- if (editor.inline) {
- registerPageMouseUp(editor, throttledStore);
- }
- editor.on('init', function () {
- registerEditorEvents(editor, throttledStore);
- });
- editor.on('remove', function () {
- throttledStore.cancel();
- });
- };
- var SelectionRestore = { register: register$3 };
-
- var documentFocusInHandler;
- var DOM$8 = DOMUtils$1.DOM;
- var isEditorUIElement$1 = function (elm) {
- return FocusManager.isEditorUIElement(elm);
- };
- var isUIElement = function (editor, elm) {
- var customSelector = editor ? editor.settings.custom_ui_selector : '';
- var parent = DOM$8.getParent(elm, function (elm) {
- return isEditorUIElement$1(elm) || (customSelector ? editor.dom.is(elm, customSelector) : false);
- });
- return parent !== null;
- };
- var getActiveElement = function () {
- try {
- return domGlobals.document.activeElement;
- } catch (ex) {
- return domGlobals.document.body;
- }
- };
- var registerEvents = function (editorManager, e) {
- var editor = e.editor;
- SelectionRestore.register(editor);
- editor.on('focusin', function () {
- var self = this;
- var focusedEditor = editorManager.focusedEditor;
- if (focusedEditor !== self) {
- if (focusedEditor) {
- focusedEditor.fire('blur', { focusedEditor: self });
- }
- editorManager.setActive(self);
- editorManager.focusedEditor = self;
- self.fire('focus', { blurredEditor: focusedEditor });
- self.focus(true);
- }
- });
- editor.on('focusout', function () {
- var self = this;
- Delay.setEditorTimeout(self, function () {
- var focusedEditor = editorManager.focusedEditor;
- if (!isUIElement(self, getActiveElement()) && focusedEditor === self) {
- self.fire('blur', { focusedEditor: null });
- editorManager.focusedEditor = null;
- }
- });
- });
- if (!documentFocusInHandler) {
- documentFocusInHandler = function (e) {
- var activeEditor = editorManager.activeEditor;
- var target;
- target = e.target;
- if (activeEditor && target.ownerDocument === domGlobals.document) {
- if (target !== domGlobals.document.body && !isUIElement(activeEditor, target) && editorManager.focusedEditor === activeEditor) {
- activeEditor.fire('blur', { focusedEditor: null });
- editorManager.focusedEditor = null;
- }
- }
- };
- DOM$8.bind(domGlobals.document, 'focusin', documentFocusInHandler);
- }
- };
- var unregisterDocumentEvents = function (editorManager, e) {
- if (editorManager.focusedEditor === e.editor) {
- editorManager.focusedEditor = null;
- }
- if (!editorManager.activeEditor) {
- DOM$8.unbind(domGlobals.document, 'focusin', documentFocusInHandler);
- documentFocusInHandler = null;
- }
- };
- var setup$h = function (editorManager) {
- editorManager.on('AddEditor', curry(registerEvents, editorManager));
- editorManager.on('RemoveEditor', curry(unregisterDocumentEvents, editorManager));
- };
- var FocusController = {
- setup: setup$h,
- isEditorUIElement: isEditorUIElement$1,
- isUIElement: isUIElement
- };
-
- var DOM$9 = DOMUtils$1.DOM;
- var explode$4 = Tools.explode, each$m = Tools.each, extend$5 = Tools.extend;
- var instanceCounter = 0, beforeUnloadDelegate, EditorManager, boundGlobalEvents = false;
- var legacyEditors = [];
- var editors = [];
- var isValidLegacyKey = function (id) {
- return id !== 'length';
- };
- var globalEventDelegate = function (e) {
- var type = e.type;
- each$m(EditorManager.get(), function (editor) {
- switch (type) {
- case 'scroll':
- editor.fire('ScrollWindow', e);
- break;
- case 'resize':
- editor.fire('ResizeWindow', e);
- break;
- }
- });
- };
- var toggleGlobalEvents = function (state) {
- if (state !== boundGlobalEvents) {
- if (state) {
- DomQuery(window).on('resize scroll', globalEventDelegate);
- } else {
- DomQuery(window).off('resize scroll', globalEventDelegate);
- }
- boundGlobalEvents = state;
- }
- };
- var removeEditorFromList = function (targetEditor) {
- var oldEditors = editors;
- delete legacyEditors[targetEditor.id];
- for (var i = 0; i < legacyEditors.length; i++) {
- if (legacyEditors[i] === targetEditor) {
- legacyEditors.splice(i, 1);
- break;
- }
- }
- editors = filter(editors, function (editor) {
- return targetEditor !== editor;
- });
- if (EditorManager.activeEditor === targetEditor) {
- EditorManager.activeEditor = editors.length > 0 ? editors[0] : null;
- }
- if (EditorManager.focusedEditor === targetEditor) {
- EditorManager.focusedEditor = null;
- }
- return oldEditors.length !== editors.length;
- };
- var purgeDestroyedEditor = function (editor) {
- if (editor && editor.initialized && !(editor.getContainer() || editor.getBody()).parentNode) {
- removeEditorFromList(editor);
- editor.unbindAllNativeEvents();
- editor.destroy(true);
- editor.removed = true;
- editor = null;
- }
- return editor;
- };
- EditorManager = {
- defaultSettings: {},
- $: DomQuery,
- majorVersion: '4',
- minorVersion: '9.11',
- releaseDate: '2020-07-13',
- editors: legacyEditors,
- i18n: I18n,
- activeEditor: null,
- settings: {},
- setup: function () {
- var self = this;
- var baseURL, documentBaseURL, suffix = '';
- documentBaseURL = URI.getDocumentBaseUrl(domGlobals.document.location);
- if (/^[^:]+:\/\/\/?[^\/]+\//.test(documentBaseURL)) {
- documentBaseURL = documentBaseURL.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');
- if (!/[\/\\]$/.test(documentBaseURL)) {
- documentBaseURL += '/';
- }
- }
- var preInit = window.tinymce || window.tinyMCEPreInit;
- if (preInit) {
- baseURL = preInit.base || preInit.baseURL;
- suffix = preInit.suffix;
- } else {
- var scripts = domGlobals.document.getElementsByTagName('script');
- for (var i = 0; i < scripts.length; i++) {
- var src = scripts[i].src || '';
- if (src === '') {
- continue;
- }
- var srcScript = src.substring(src.lastIndexOf('/'));
- if (/tinymce(\.full|\.jquery|)(\.min|\.dev|)\.js/.test(src)) {
- if (srcScript.indexOf('.min') !== -1) {
- suffix = '.min';
- }
- baseURL = src.substring(0, src.lastIndexOf('/'));
- break;
- }
- }
- if (!baseURL && domGlobals.document.currentScript) {
- var src = domGlobals.document.currentScript.src;
- if (src.indexOf('.min') !== -1) {
- suffix = '.min';
- }
- baseURL = src.substring(0, src.lastIndexOf('/'));
- }
- }
- self.baseURL = new URI(documentBaseURL).toAbsolute(baseURL);
- self.documentBaseURL = documentBaseURL;
- self.baseURI = new URI(self.baseURL);
- self.suffix = suffix;
- FocusController.setup(self);
- },
- overrideDefaults: function (defaultSettings) {
- var baseUrl, suffix;
- baseUrl = defaultSettings.base_url;
- if (baseUrl) {
- this.baseURL = new URI(this.documentBaseURL).toAbsolute(baseUrl.replace(/\/+$/, ''));
- this.baseURI = new URI(this.baseURL);
- }
- suffix = defaultSettings.suffix;
- if (defaultSettings.suffix) {
- this.suffix = suffix;
- }
- this.defaultSettings = defaultSettings;
- var pluginBaseUrls = defaultSettings.plugin_base_urls;
- for (var name in pluginBaseUrls) {
- AddOnManager.PluginManager.urls[name] = pluginBaseUrls[name];
- }
- },
- init: function (settings) {
- var self = this;
- var result, invalidInlineTargets;
- invalidInlineTargets = Tools.makeMap('area base basefont br col frame hr img input isindex link meta param embed source wbr track ' + 'colgroup option tbody tfoot thead tr script noscript style textarea video audio iframe object menu', ' ');
- var isInvalidInlineTarget = function (settings, elm) {
- return settings.inline && elm.tagName.toLowerCase() in invalidInlineTargets;
- };
- var createId = function (elm) {
- var id = elm.id;
- if (!id) {
- id = elm.name;
- if (id && !DOM$9.get(id)) {
- id = elm.name;
- } else {
- id = DOM$9.uniqueId();
- }
- elm.setAttribute('id', id);
- }
- return id;
- };
- var execCallback = function (name) {
- var callback = settings[name];
- if (!callback) {
- return;
- }
- return callback.apply(self, Array.prototype.slice.call(arguments, 2));
- };
- var hasClass = function (elm, className) {
- return className.constructor === RegExp ? className.test(elm.className) : DOM$9.hasClass(elm, className);
- };
- var findTargets = function (settings) {
- var l, targets = [];
- if (Env.ie && Env.ie < 11) {
- ErrorReporter.initError('TinyMCE does not support the browser you are using. For a list of supported' + ' browsers please see: https://www.tinymce.com/docs/get-started/system-requirements/');
- return [];
- }
- if (settings.types) {
- each$m(settings.types, function (type) {
- targets = targets.concat(DOM$9.select(type.selector));
- });
- return targets;
- } else if (settings.selector) {
- return DOM$9.select(settings.selector);
- } else if (settings.target) {
- return [settings.target];
- }
- switch (settings.mode) {
- case 'exact':
- l = settings.elements || '';
- if (l.length > 0) {
- each$m(explode$4(l), function (id) {
- var elm;
- if (elm = DOM$9.get(id)) {
- targets.push(elm);
- } else {
- each$m(domGlobals.document.forms, function (f) {
- each$m(f.elements, function (e) {
- if (e.name === id) {
- id = 'mce_editor_' + instanceCounter++;
- DOM$9.setAttrib(e, 'id', id);
- targets.push(e);
- }
- });
- });
- }
- });
- }
- break;
- case 'textareas':
- case 'specific_textareas':
- each$m(DOM$9.select('textarea'), function (elm) {
- if (settings.editor_deselector && hasClass(elm, settings.editor_deselector)) {
- return;
- }
- if (!settings.editor_selector || hasClass(elm, settings.editor_selector)) {
- targets.push(elm);
- }
- });
- break;
- }
- return targets;
- };
- var provideResults = function (editors) {
- result = editors;
- };
- var initEditors = function () {
- var initCount = 0;
- var editors = [];
- var targets;
- var createEditor = function (id, settings, targetElm) {
- var editor = new Editor(id, settings, self);
- editors.push(editor);
- editor.on('init', function () {
- if (++initCount === targets.length) {
- provideResults(editors);
- }
- });
- editor.targetElm = editor.targetElm || targetElm;
- editor.render();
- };
- DOM$9.unbind(window, 'ready', initEditors);
- execCallback('onpageload');
- targets = DomQuery.unique(findTargets(settings));
- if (settings.types) {
- each$m(settings.types, function (type) {
- Tools.each(targets, function (elm) {
- if (DOM$9.is(elm, type.selector)) {
- createEditor(createId(elm), extend$5({}, settings, type), elm);
- return false;
- }
- return true;
- });
- });
- return;
- }
- Tools.each(targets, function (elm) {
- purgeDestroyedEditor(self.get(elm.id));
- });
- targets = Tools.grep(targets, function (elm) {
- return !self.get(elm.id);
- });
- if (targets.length === 0) {
- provideResults([]);
- } else {
- each$m(targets, function (elm) {
- if (isInvalidInlineTarget(settings, elm)) {
- ErrorReporter.initError('Could not initialize inline editor on invalid inline target element', elm);
- } else {
- createEditor(createId(elm), settings, elm);
- }
- });
- }
- };
- self.settings = settings;
- DOM$9.bind(window, 'ready', initEditors);
- return new promiseObj(function (resolve) {
- if (result) {
- resolve(result);
- } else {
- provideResults = function (editors) {
- resolve(editors);
- };
- }
- });
- },
- get: function (id) {
- if (arguments.length === 0) {
- return editors.slice(0);
- } else if (isString(id)) {
- return find(editors, function (editor) {
- return editor.id === id;
- }).getOr(null);
- } else if (isNumber(id)) {
- return editors[id] ? editors[id] : null;
- } else {
- return null;
- }
- },
- add: function (editor) {
- var self = this;
- var existingEditor;
- existingEditor = legacyEditors[editor.id];
- if (existingEditor === editor) {
- return editor;
- }
- if (self.get(editor.id) === null) {
- if (isValidLegacyKey(editor.id)) {
- legacyEditors[editor.id] = editor;
- }
- legacyEditors.push(editor);
- editors.push(editor);
- }
- toggleGlobalEvents(true);
- self.activeEditor = editor;
- self.fire('AddEditor', { editor: editor });
- if (!beforeUnloadDelegate) {
- beforeUnloadDelegate = function () {
- self.fire('BeforeUnload');
- };
- DOM$9.bind(window, 'beforeunload', beforeUnloadDelegate);
- }
- return editor;
- },
- createEditor: function (id, settings) {
- return this.add(new Editor(id, settings, this));
- },
- remove: function (selector) {
- var self = this;
- var i, editor;
- if (!selector) {
- for (i = editors.length - 1; i >= 0; i--) {
- self.remove(editors[i]);
- }
- return;
- }
- if (isString(selector)) {
- each$m(DOM$9.select(selector), function (elm) {
- editor = self.get(elm.id);
- if (editor) {
- self.remove(editor);
- }
- });
- return;
- }
- editor = selector;
- if (isNull(self.get(editor.id))) {
- return null;
- }
- if (removeEditorFromList(editor)) {
- self.fire('RemoveEditor', { editor: editor });
- }
- if (editors.length === 0) {
- DOM$9.unbind(window, 'beforeunload', beforeUnloadDelegate);
- }
- editor.remove();
- toggleGlobalEvents(editors.length > 0);
- return editor;
- },
- execCommand: function (cmd, ui, value) {
- var self = this, editor = self.get(value);
- switch (cmd) {
- case 'mceAddEditor':
- if (!self.get(value)) {
- new Editor(value, self.settings, self).render();
- }
- return true;
- case 'mceRemoveEditor':
- if (editor) {
- editor.remove();
- }
- return true;
- case 'mceToggleEditor':
- if (!editor) {
- self.execCommand('mceAddEditor', 0, value);
- return true;
- }
- if (editor.isHidden()) {
- editor.show();
- } else {
- editor.hide();
- }
- return true;
- }
- if (self.activeEditor) {
- return self.activeEditor.execCommand(cmd, ui, value);
- }
- return false;
- },
- triggerSave: function () {
- each$m(editors, function (editor) {
- editor.save();
- });
- },
- addI18n: function (code, items) {
- I18n.add(code, items);
- },
- translate: function (text) {
- return I18n.translate(text);
- },
- setActive: function (editor) {
- var activeEditor = this.activeEditor;
- if (this.activeEditor !== editor) {
- if (activeEditor) {
- activeEditor.fire('deactivate', { relatedTarget: editor });
- }
- editor.fire('activate', { relatedTarget: activeEditor });
- }
- this.activeEditor = editor;
- }
- };
- extend$5(EditorManager, Observable);
- EditorManager.setup();
- var EditorManager$1 = EditorManager;
-
- function RangeUtils(dom) {
- var walk = function (rng, callback) {
- return RangeWalk.walk(dom, rng, callback);
- };
- var split = SplitRange.split;
- var normalize = function (rng) {
- return NormalizeRange.normalize(dom, rng).fold(constant(false), function (normalizedRng) {
- rng.setStart(normalizedRng.startContainer, normalizedRng.startOffset);
- rng.setEnd(normalizedRng.endContainer, normalizedRng.endOffset);
- return true;
- });
- };
- return {
- walk: walk,
- split: split,
- normalize: normalize
- };
- }
- (function (RangeUtils) {
- RangeUtils.compareRanges = RangeCompare.isEq;
- RangeUtils.getCaretRangeFromPoint = CaretRangeFromPoint.fromPoint;
- RangeUtils.getSelectedNode = getSelectedNode;
- RangeUtils.getNode = getNode;
- }(RangeUtils || (RangeUtils = {})));
- var RangeUtils$1 = RangeUtils;
-
- var min = Math.min, max = Math.max, round$2 = Math.round;
- var relativePosition = function (rect, targetRect, rel) {
- var x, y, w, h, targetW, targetH;
- x = targetRect.x;
- y = targetRect.y;
- w = rect.w;
- h = rect.h;
- targetW = targetRect.w;
- targetH = targetRect.h;
- rel = (rel || '').split('');
- if (rel[0] === 'b') {
- y += targetH;
- }
- if (rel[1] === 'r') {
- x += targetW;
- }
- if (rel[0] === 'c') {
- y += round$2(targetH / 2);
- }
- if (rel[1] === 'c') {
- x += round$2(targetW / 2);
- }
- if (rel[3] === 'b') {
- y -= h;
- }
- if (rel[4] === 'r') {
- x -= w;
- }
- if (rel[3] === 'c') {
- y -= round$2(h / 2);
- }
- if (rel[4] === 'c') {
- x -= round$2(w / 2);
- }
- return create$4(x, y, w, h);
- };
- var findBestRelativePosition = function (rect, targetRect, constrainRect, rels) {
- var pos, i;
- for (i = 0; i < rels.length; i++) {
- pos = relativePosition(rect, targetRect, rels[i]);
- if (pos.x >= constrainRect.x && pos.x + pos.w <= constrainRect.w + constrainRect.x && pos.y >= constrainRect.y && pos.y + pos.h <= constrainRect.h + constrainRect.y) {
- return rels[i];
- }
- }
- return null;
- };
- var inflate = function (rect, w, h) {
- return create$4(rect.x - w, rect.y - h, rect.w + w * 2, rect.h + h * 2);
- };
- var intersect = function (rect, cropRect) {
- var x1, y1, x2, y2;
- x1 = max(rect.x, cropRect.x);
- y1 = max(rect.y, cropRect.y);
- x2 = min(rect.x + rect.w, cropRect.x + cropRect.w);
- y2 = min(rect.y + rect.h, cropRect.y + cropRect.h);
- if (x2 - x1 < 0 || y2 - y1 < 0) {
- return null;
- }
- return create$4(x1, y1, x2 - x1, y2 - y1);
- };
- var clamp$1 = function (rect, clampRect, fixedSize) {
- var underflowX1, underflowY1, overflowX2, overflowY2, x1, y1, x2, y2, cx2, cy2;
- x1 = rect.x;
- y1 = rect.y;
- x2 = rect.x + rect.w;
- y2 = rect.y + rect.h;
- cx2 = clampRect.x + clampRect.w;
- cy2 = clampRect.y + clampRect.h;
- underflowX1 = max(0, clampRect.x - x1);
- underflowY1 = max(0, clampRect.y - y1);
- overflowX2 = max(0, x2 - cx2);
- overflowY2 = max(0, y2 - cy2);
- x1 += underflowX1;
- y1 += underflowY1;
- if (fixedSize) {
- x2 += underflowX1;
- y2 += underflowY1;
- x1 -= overflowX2;
- y1 -= overflowY2;
- }
- x2 -= overflowX2;
- y2 -= overflowY2;
- return create$4(x1, y1, x2 - x1, y2 - y1);
- };
- var create$4 = function (x, y, w, h) {
- return {
- x: x,
- y: y,
- w: w,
- h: h
- };
- };
- var fromClientRect = function (clientRect) {
- return create$4(clientRect.left, clientRect.top, clientRect.width, clientRect.height);
- };
- var Rect = {
- inflate: inflate,
- relativePosition: relativePosition,
- findBestRelativePosition: findBestRelativePosition,
- intersect: intersect,
- clamp: clamp$1,
- create: create$4,
- fromClientRect: fromClientRect
- };
-
- var types = {};
- var Factory = {
- add: function (type, typeClass) {
- types[type.toLowerCase()] = typeClass;
- },
- has: function (type) {
- return !!types[type.toLowerCase()];
- },
- get: function (type) {
- var lctype = type.toLowerCase();
- var controlType = types.hasOwnProperty(lctype) ? types[lctype] : null;
- if (controlType === null) {
- throw new Error('Could not find module for type: ' + type);
- }
- return controlType;
- },
- create: function (type, settings) {
- var ControlType;
- if (typeof type === 'string') {
- settings = settings || {};
- settings.type = type;
- } else {
- settings = type;
- type = settings.type;
- }
- type = type.toLowerCase();
- ControlType = types[type];
- if (!ControlType) {
- throw new Error('Could not find control by type: ' + type);
- }
- ControlType = new ControlType(settings);
- ControlType.type = type;
- return ControlType;
- }
- };
-
- var each$n = Tools.each, extend$6 = Tools.extend;
- var extendClass, initializing;
- var Class = function () {
- };
- Class.extend = extendClass = function (prop) {
- var self = this;
- var _super = self.prototype;
- var prototype, name, member;
- var Class = function () {
- var i, mixins, mixin;
- var self = this;
- if (!initializing) {
- if (self.init) {
- self.init.apply(self, arguments);
- }
- mixins = self.Mixins;
- if (mixins) {
- i = mixins.length;
- while (i--) {
- mixin = mixins[i];
- if (mixin.init) {
- mixin.init.apply(self, arguments);
- }
- }
- }
- }
- };
- var dummy = function () {
- return this;
- };
- var createMethod = function (name, fn) {
- return function () {
- var self = this;
- var tmp = self._super;
- var ret;
- self._super = _super[name];
- ret = fn.apply(self, arguments);
- self._super = tmp;
- return ret;
- };
- };
- initializing = true;
- prototype = new self();
- initializing = false;
- if (prop.Mixins) {
- each$n(prop.Mixins, function (mixin) {
- for (var name_1 in mixin) {
- if (name_1 !== 'init') {
- prop[name_1] = mixin[name_1];
- }
- }
- });
- if (_super.Mixins) {
- prop.Mixins = _super.Mixins.concat(prop.Mixins);
- }
- }
- if (prop.Methods) {
- each$n(prop.Methods.split(','), function (name) {
- prop[name] = dummy;
- });
- }
- if (prop.Properties) {
- each$n(prop.Properties.split(','), function (name) {
- var fieldName = '_' + name;
- prop[name] = function (value) {
- var self = this;
- if (value !== undefined) {
- self[fieldName] = value;
- return self;
- }
- return self[fieldName];
- };
- });
- }
- if (prop.Statics) {
- each$n(prop.Statics, function (func, name) {
- Class[name] = func;
- });
- }
- if (prop.Defaults && _super.Defaults) {
- prop.Defaults = extend$6({}, _super.Defaults, prop.Defaults);
- }
- for (name in prop) {
- member = prop[name];
- if (typeof member === 'function' && _super[name]) {
- prototype[name] = createMethod(name, member);
- } else {
- prototype[name] = member;
- }
- }
- Class.prototype = prototype;
- Class.constructor = Class;
- Class.extend = extendClass;
- return Class;
- };
-
- var min$1 = Math.min, max$1 = Math.max, round$3 = Math.round;
- var Color = function (value) {
- var self = {};
- var r = 0, g = 0, b = 0;
- var rgb2hsv = function (r, g, b) {
- var h, s, v, d, minRGB, maxRGB;
- h = 0;
- s = 0;
- v = 0;
- r = r / 255;
- g = g / 255;
- b = b / 255;
- minRGB = min$1(r, min$1(g, b));
- maxRGB = max$1(r, max$1(g, b));
- if (minRGB === maxRGB) {
- v = minRGB;
- return {
- h: 0,
- s: 0,
- v: v * 100
- };
- }
- d = r === minRGB ? g - b : b === minRGB ? r - g : b - r;
- h = r === minRGB ? 3 : b === minRGB ? 1 : 5;
- h = 60 * (h - d / (maxRGB - minRGB));
- s = (maxRGB - minRGB) / maxRGB;
- v = maxRGB;
- return {
- h: round$3(h),
- s: round$3(s * 100),
- v: round$3(v * 100)
- };
- };
- var hsvToRgb = function (hue, saturation, brightness) {
- var side, chroma, x, match;
- hue = (parseInt(hue, 10) || 0) % 360;
- saturation = parseInt(saturation, 10) / 100;
- brightness = parseInt(brightness, 10) / 100;
- saturation = max$1(0, min$1(saturation, 1));
- brightness = max$1(0, min$1(brightness, 1));
- if (saturation === 0) {
- r = g = b = round$3(255 * brightness);
- return;
- }
- side = hue / 60;
- chroma = brightness * saturation;
- x = chroma * (1 - Math.abs(side % 2 - 1));
- match = brightness - chroma;
- switch (Math.floor(side)) {
- case 0:
- r = chroma;
- g = x;
- b = 0;
- break;
- case 1:
- r = x;
- g = chroma;
- b = 0;
- break;
- case 2:
- r = 0;
- g = chroma;
- b = x;
- break;
- case 3:
- r = 0;
- g = x;
- b = chroma;
- break;
- case 4:
- r = x;
- g = 0;
- b = chroma;
- break;
- case 5:
- r = chroma;
- g = 0;
- b = x;
- break;
- default:
- r = g = b = 0;
- }
- r = round$3(255 * (r + match));
- g = round$3(255 * (g + match));
- b = round$3(255 * (b + match));
- };
- var toHex = function () {
- var hex = function (val) {
- val = parseInt(val, 10).toString(16);
- return val.length > 1 ? val : '0' + val;
- };
- return '#' + hex(r) + hex(g) + hex(b);
- };
- var toRgb = function () {
- return {
- r: r,
- g: g,
- b: b
- };
- };
- var toHsv = function () {
- return rgb2hsv(r, g, b);
- };
- var parse = function (value) {
- var matches;
- if (typeof value === 'object') {
- if ('r' in value) {
- r = value.r;
- g = value.g;
- b = value.b;
- } else if ('v' in value) {
- hsvToRgb(value.h, value.s, value.v);
- }
- } else {
- if (matches = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)[^\)]*\)/gi.exec(value)) {
- r = parseInt(matches[1], 10);
- g = parseInt(matches[2], 10);
- b = parseInt(matches[3], 10);
- } else if (matches = /#([0-F]{2})([0-F]{2})([0-F]{2})/gi.exec(value)) {
- r = parseInt(matches[1], 16);
- g = parseInt(matches[2], 16);
- b = parseInt(matches[3], 16);
- } else if (matches = /#([0-F])([0-F])([0-F])/gi.exec(value)) {
- r = parseInt(matches[1] + matches[1], 16);
- g = parseInt(matches[2] + matches[2], 16);
- b = parseInt(matches[3] + matches[3], 16);
- }
- }
- r = r < 0 ? 0 : r > 255 ? 255 : r;
- g = g < 0 ? 0 : g > 255 ? 255 : g;
- b = b < 0 ? 0 : b > 255 ? 255 : b;
- return self;
- };
- if (value) {
- parse(value);
- }
- self.toRgb = toRgb;
- self.toHsv = toHsv;
- self.toHex = toHex;
- self.parse = parse;
- return self;
- };
-
- var serialize = function (o, quote) {
- var i, v, t, name;
- quote = quote || '"';
- if (o === null) {
- return 'null';
- }
- t = typeof o;
- if (t === 'string') {
- v = '\bb\tt\nn\ff\rr""\'\'\\\\';
- return quote + o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g, function (a, b) {
- if (quote === '"' && a === '\'') {
- return a;
- }
- i = v.indexOf(b);
- if (i + 1) {
- return '\\' + v.charAt(i + 1);
- }
- a = b.charCodeAt().toString(16);
- return '\\u' + '0000'.substring(a.length) + a;
- }) + quote;
- }
- if (t === 'object') {
- if (o.hasOwnProperty && Object.prototype.toString.call(o) === '[object Array]') {
- for (i = 0, v = '['; i < o.length; i++) {
- v += (i > 0 ? ',' : '') + serialize(o[i], quote);
- }
- return v + ']';
- }
- v = '{';
- for (name in o) {
- if (o.hasOwnProperty(name)) {
- v += typeof o[name] !== 'function' ? (v.length > 1 ? ',' + quote : quote) + name + quote + ':' + serialize(o[name], quote) : '';
- }
- }
- return v + '}';
- }
- return '' + o;
- };
- var JSON$1 = {
- serialize: serialize,
- parse: function (text) {
- try {
- return JSON.parse(text);
- } catch (ex) {
- }
- }
- };
-
- var JSONP = {
- callbacks: {},
- count: 0,
- send: function (settings) {
- var self = this, dom = DOMUtils$1.DOM, count = settings.count !== undefined ? settings.count : self.count;
- var id = 'tinymce_jsonp_' + count;
- self.callbacks[count] = function (json) {
- dom.remove(id);
- delete self.callbacks[count];
- settings.callback(json);
- };
- dom.add(dom.doc.body, 'script', {
- id: id,
- src: settings.url,
- type: 'text/javascript'
- });
- self.count++;
- }
- };
-
- var XHR = {
- send: function (settings) {
- var xhr, count = 0;
- var ready = function () {
- if (!settings.async || xhr.readyState === 4 || count++ > 10000) {
- if (settings.success && count < 10000 && xhr.status === 200) {
- settings.success.call(settings.success_scope, '' + xhr.responseText, xhr, settings);
- } else if (settings.error) {
- settings.error.call(settings.error_scope, count > 10000 ? 'TIMED_OUT' : 'GENERAL', xhr, settings);
- }
- xhr = null;
- } else {
- setTimeout(ready, 10);
- }
- };
- settings.scope = settings.scope || this;
- settings.success_scope = settings.success_scope || settings.scope;
- settings.error_scope = settings.error_scope || settings.scope;
- settings.async = settings.async === false ? false : true;
- settings.data = settings.data || '';
- XHR.fire('beforeInitialize', { settings: settings });
- xhr = XMLHttpRequest();
- if (xhr) {
- if (xhr.overrideMimeType) {
- xhr.overrideMimeType(settings.content_type);
- }
- xhr.open(settings.type || (settings.data ? 'POST' : 'GET'), settings.url, settings.async);
- if (settings.crossDomain) {
- xhr.withCredentials = true;
- }
- if (settings.content_type) {
- xhr.setRequestHeader('Content-Type', settings.content_type);
- }
- if (settings.requestheaders) {
- Tools.each(settings.requestheaders, function (header) {
- xhr.setRequestHeader(header.key, header.value);
- });
- }
- xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
- xhr = XHR.fire('beforeSend', {
- xhr: xhr,
- settings: settings
- }).xhr;
- xhr.send(settings.data);
- if (!settings.async) {
- return ready();
- }
- setTimeout(ready, 10);
- }
- }
- };
- Tools.extend(XHR, Observable);
-
- var extend$7 = Tools.extend;
- var JSONRequest = function (settings) {
- this.settings = extend$7({}, settings);
- this.count = 0;
- };
- JSONRequest.sendRPC = function (o) {
- return new JSONRequest().send(o);
- };
- JSONRequest.prototype = {
- send: function (args) {
- var ecb = args.error, scb = args.success;
- args = extend$7(this.settings, args);
- args.success = function (c, x) {
- c = JSON$1.parse(c);
- if (typeof c === 'undefined') {
- c = { error: 'JSON Parse error.' };
- }
- if (c.error) {
- ecb.call(args.error_scope || args.scope, c.error, x);
- } else {
- scb.call(args.success_scope || args.scope, c.result);
- }
- };
- args.error = function (ty, x) {
- if (ecb) {
- ecb.call(args.error_scope || args.scope, ty, x);
- }
- };
- args.data = JSON$1.serialize({
- id: args.id || 'c' + this.count++,
- method: args.method,
- params: args.params
- });
- args.content_type = 'application/json';
- XHR.send(args);
- }
- };
-
- var create$5 = function () {
- return function () {
- var data = {};
- var keys = [];
- var storage = {
- getItem: function (key) {
- var item = data[key];
- return item ? item : null;
- },
- setItem: function (key, value) {
- keys.push(key);
- data[key] = String(value);
- },
- key: function (index) {
- return keys[index];
- },
- removeItem: function (key) {
- keys = keys.filter(function (k) {
- return k === key;
- });
- delete data[key];
- },
- clear: function () {
- keys = [];
- data = {};
- },
- length: 0
- };
- Object.defineProperty(storage, 'length', {
- get: function () {
- return keys.length;
- },
- configurable: false,
- enumerable: false
- });
- return storage;
- }();
- };
-
- var localStorage;
- try {
- localStorage = domGlobals.window.localStorage;
- } catch (e) {
- localStorage = create$5();
- }
- var LocalStorage = localStorage;
-
- var tinymce = EditorManager$1;
- var publicApi = {
- geom: { Rect: Rect },
- util: {
- Promise: promiseObj,
- Delay: Delay,
- Tools: Tools,
- VK: VK,
- URI: URI,
- Class: Class,
- EventDispatcher: Dispatcher,
- Observable: Observable,
- I18n: I18n,
- XHR: XHR,
- JSON: JSON$1,
- JSONRequest: JSONRequest,
- JSONP: JSONP,
- LocalStorage: LocalStorage,
- Color: Color
- },
- dom: {
- EventUtils: EventUtils,
- Sizzle: Sizzle,
- DomQuery: DomQuery,
- TreeWalker: TreeWalker,
- DOMUtils: DOMUtils$1,
- ScriptLoader: ScriptLoader,
- RangeUtils: RangeUtils$1,
- Serializer: DomSerializer$1,
- ControlSelection: ControlSelection,
- BookmarkManager: BookmarkManager$1,
- Selection: Selection$1,
- Event: EventUtils.Event
- },
- html: {
- Styles: Styles,
- Entities: Entities,
- Node: Node$1,
- Schema: Schema,
- SaxParser: SaxParser$1,
- DomParser: DomParser,
- Writer: Writer,
- Serializer: HtmlSerializer
- },
- ui: { Factory: Factory },
- Env: Env,
- AddOnManager: AddOnManager,
- Annotator: Annotator,
- Formatter: Formatter,
- UndoManager: UndoManager,
- EditorCommands: EditorCommands,
- WindowManager: WindowManager,
- NotificationManager: NotificationManager,
- EditorObservable: EditorObservable$1,
- Shortcuts: Shortcuts,
- Editor: Editor,
- FocusManager: FocusManager,
- EditorManager: EditorManager$1,
- DOM: DOMUtils$1.DOM,
- ScriptLoader: ScriptLoader.ScriptLoader,
- PluginManager: AddOnManager.PluginManager,
- ThemeManager: AddOnManager.ThemeManager,
- trim: Tools.trim,
- isArray: Tools.isArray,
- is: Tools.is,
- toArray: Tools.toArray,
- makeMap: Tools.makeMap,
- each: Tools.each,
- map: Tools.map,
- grep: Tools.grep,
- inArray: Tools.inArray,
- extend: Tools.extend,
- create: Tools.create,
- walk: Tools.walk,
- createNS: Tools.createNS,
- resolve: Tools.resolve,
- explode: Tools.explode,
- _addCacheSuffix: Tools._addCacheSuffix,
- isOpera: Env.opera,
- isWebKit: Env.webkit,
- isIE: Env.ie,
- isGecko: Env.gecko,
- isMac: Env.mac
- };
- tinymce = Tools.extend(tinymce, publicApi);
- var Tinymce = tinymce;
-
- var exportToModuleLoaders = function (tinymce) {
- if (typeof module === 'object') {
- try {
- module.exports = tinymce;
- } catch (_) {
- }
- }
- };
- var exportToWindowGlobal = function (tinymce) {
- window.tinymce = tinymce;
- window.tinyMCE = tinymce;
- };
- exportToWindowGlobal(Tinymce);
- exportToModuleLoaders(Tinymce);
-
-}(window));
-})();
diff --git a/src/js/_enqueues/vendor/tinymce/tinymce.min.js b/src/js/_enqueues/vendor/tinymce/tinymce.min.js
index e9681abaaf3dd..e69de29bb2d1d 100644
--- a/src/js/_enqueues/vendor/tinymce/tinymce.min.js
+++ b/src/js/_enqueues/vendor/tinymce/tinymce.min.js
@@ -1,2 +0,0 @@
-// 4.9.11 (2020-07-13)
-!function(V){"use strict";var o=function(){},H=function(n,r){return function(){for(var e=[],t=0;t+~]|"+at+")"+at+"*"),mt=new RegExp("="+at+"*([^\\]'\"]*?)"+at+"*\\]","g"),gt=new RegExp(ct),pt=new RegExp("^"+ut+"$"),ht={ID:new RegExp("^#("+ut+")"),CLASS:new RegExp("^\\.("+ut+")"),TAG:new RegExp("^("+ut+"|[*])"),ATTR:new RegExp("^"+st),PSEUDO:new RegExp("^"+ct),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+at+"*(even|odd|(([+-]|)(\\d*)n|)"+at+"*(?:([+-]|)"+at+"*(\\d+)|))"+at+"*\\)|)","i"),bool:new RegExp("^(?:checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$","i"),needsContext:new RegExp("^"+at+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+at+"*((?:-\\d)?\\d*)"+at+"*\\)|)(?=[^-]|$)","i")},vt=/^(?:input|select|textarea|button)$/i,yt=/^h\d$/i,bt=/^[^{]+\{\s*\[native \w/,Ct=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,xt=/[+~]/,wt=/'|\\/g,Nt=new RegExp("\\\\([\\da-f]{1,6}"+at+"?|("+at+")|.)","ig"),Et=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)};try{rt.apply(et=ot.call($e.childNodes),$e.childNodes),et[$e.childNodes.length].nodeType}catch(iE){rt={apply:et.length?function(e,t){nt.apply(e,ot.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}var St=function(e,t,n,r){var o,i,a,u,s,c,l,f,d,m;if((t?t.ownerDocument||t:$e)!==Me&&Fe(t),n=n||[],!e||"string"!=typeof e)return n;if(1!==(u=(t=t||Me).nodeType)&&9!==u)return[];if(Ue&&!r){if(o=Ct.exec(e))if(a=o[1]){if(9===u){if(!(i=t.getElementById(a))||!i.parentNode)return n;if(i.id===a)return n.push(i),n}else if(t.ownerDocument&&(i=t.ownerDocument.getElementById(a))&&He(t,i)&&i.id===a)return n.push(i),n}else{if(o[2])return rt.apply(n,t.getElementsByTagName(e)),n;if((a=o[3])&&ke.getElementsByClassName)return rt.apply(n,t.getElementsByClassName(a)),n}if(ke.qsa&&(!je||!je.test(e))){if(f=l=qe,d=t,m=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){for(c=De(e),(l=t.getAttribute("id"))?f=l.replace(wt,"\\$&"):t.setAttribute("id",f),f="[id='"+f+"'] ",s=c.length;s--;)c[s]=f+Pt(c[s]);d=xt.test(e)&&Ot(t.parentNode)||t,m=c.join(",")}if(m)try{return rt.apply(n,d.querySelectorAll(m)),n}catch(g){}finally{l||t.removeAttribute("id")}}}return Be(e.replace(lt,"$1"),t,n,r)};function Tt(){var r=[];return function e(t,n){return r.push(t+" ")>_e.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function kt(e){return e[qe]=!0,e}function _t(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||1<<31)-(~e.sourceIndex||1<<31);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function At(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function Rt(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function Dt(a){return kt(function(i){return i=+i,kt(function(e,t){for(var n,r=a([],e.length,i),o=r.length;o--;)e[n=r[o]]&&(e[n]=!(t[n]=e[n]))})})}function Ot(e){return e&&typeof e.getElementsByTagName!==Qe&&e}for(Te in ke=St.support={},Re=St.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},Fe=St.setDocument=function(e){var t,s=e?e.ownerDocument||e:$e,n=s.defaultView;return s!==Me&&9===s.nodeType&&s.documentElement?(ze=(Me=s).documentElement,Ue=!Re(s),n&&n!==function(e){try{return e.top}catch(t){}return null}(n)&&(n.addEventListener?n.addEventListener("unload",function(){Fe()},!1):n.attachEvent&&n.attachEvent("onunload",function(){Fe()})),ke.attributes=!0,ke.getElementsByTagName=!0,ke.getElementsByClassName=bt.test(s.getElementsByClassName),ke.getById=!0,_e.find.ID=function(e,t){if(typeof t.getElementById!==Qe&&Ue){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},_e.filter.ID=function(e){var t=e.replace(Nt,Et);return function(e){return e.getAttribute("id")===t}},_e.find.TAG=ke.getElementsByTagName?function(e,t){if(typeof t.getElementsByTagName!==Qe)return t.getElementsByTagName(e)}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},_e.find.CLASS=ke.getElementsByClassName&&function(e,t){if(Ue)return t.getElementsByClassName(e)},Ve=[],je=[],ke.disconnectedMatch=!0,je=je.length&&new RegExp(je.join("|")),Ve=Ve.length&&new RegExp(Ve.join("|")),t=bt.test(ze.compareDocumentPosition),He=t||bt.test(ze.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},Je=t?function(e,t){if(e===t)return Le=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!ke.sortDetached&&t.compareDocumentPosition(e)===n?e===s||e.ownerDocument===$e&&He($e,e)?-1:t===s||t.ownerDocument===$e&&He($e,t)?1:Ie?it.call(Ie,e)-it.call(Ie,t):0:4&n?-1:1)}:function(e,t){if(e===t)return Le=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===s?-1:t===s?1:o?-1:i?1:Ie?it.call(Ie,e)-it.call(Ie,t):0;if(o===i)return _t(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?_t(a[r],u[r]):a[r]===$e?-1:u[r]===$e?1:0},s):Me},St.matches=function(e,t){return St(e,null,null,t)},St.matchesSelector=function(e,t){if((e.ownerDocument||e)!==Me&&Fe(e),t=t.replace(mt,"='$1']"),ke.matchesSelector&&Ue&&(!Ve||!Ve.test(t))&&(!je||!je.test(t)))try{var n=(void 0).call(e,t);if(n||ke.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(iE){}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Nt,Et),e[3]=(e[3]||e[4]||e[5]||"").replace(Nt,Et),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||St.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&St.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return ht.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&>.test(n)&&(t=De(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Nt,Et).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=Xe[e+" "];return t||(t=new RegExp("(^|"+at+")"+e+"("+at+"|$)"))&&Xe(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==Qe&&e.getAttribute("class")||"")})},ATTR:function(n,r,o){return function(e){var t=St.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===o:"!="===r?t!==o:"^="===r?o&&0===t.indexOf(o):"*="===r?o&&-1)[^>]*$|#([\w\-]*)$)/,Zt=Se.Event,en=Xt.makeMap("children,contents,next,prev"),tn=function(e){return void 0!==e},nn=function(e){return"string"==typeof e},rn=function(e,t){var n,r,o;for(o=(t=t||Yt).createElement("div"),n=t.createDocumentFragment(),o.innerHTML=e;r=o.firstChild;)n.appendChild(r);return n},on=function(e,t,n,r){var o;if(nn(t))t=rn(t,bn(e[0]));else if(t.length&&!t.nodeType){if(t=gn.makeArray(t),r)for(o=t.length-1;0<=o;o--)on(e,t[o],n,r);else for(o=0;o"===e.charAt(e.length-1)&&3<=e.length?[null,e,null]:Qt.exec(e)))return gn(t).find(e);if(n[1])for(r=rn(e,bn(t)).firstChild;r;)Gt.call(o,r),r=r.nextSibling;else{if(!(r=bn(t).getElementById(n[2])))return o;if(r.id!==n[2])return o.find(e);o.length=1,o[0]=r}}else this.add(e,!1);return o},toArray:function(){return Xt.toArray(this)},add:function(e,t){var n,r,o=this;if(nn(e))return o.add(gn(e));if(!1!==t)for(n=gn.unique(o.toArray().concat(gn.makeArray(e))),o.length=n.length,r=0;r=a.length&&r(o)}))})})},co=function(e){return so(e,uo.nu)},lo=function(n){return{is:function(e){return n===e},isValue:C,isError:b,getOr:q(n),getOrThunk:q(n),getOrDie:q(n),or:function(e){return lo(n)},orThunk:function(e){return lo(n)},fold:function(e,t){return t(n)},map:function(e){return lo(e(n))},mapError:function(e){return lo(n)},each:function(e){e(n)},bind:function(e){return e(n)},exists:function(e){return e(n)},forall:function(e){return e(n)},toOption:function(){return _.some(n)}}},fo=function(n){return{is:b,isValue:b,isError:C,getOr:$,getOrThunk:function(e){return e()},getOrDie:function(){return e=String(n),function(){throw new Error(e)}();var e},or:function(e){return e},orThunk:function(e){return e()},fold:function(e,t){return e(n)},map:function(e){return fo(n)},mapError:function(e){return fo(e(n))},each:o,bind:function(e){return fo(n)},exists:b,forall:C,toOption:_.none}},mo={value:lo,error:fo,fromOption:function(e,t){return e.fold(function(){return fo(t)},lo)}};function go(e,u){var t=e,n=function(e,t,n,r){var o,i;if(e){if(!r&&e[t])return e[t];if(e!==u){if(o=e[n])return o;for(i=e.parentNode;i&&i!==u;i=i.parentNode)if(o=i[n])return o}}};this.current=function(){return t},this.next=function(e){return t=n(t,"firstChild","nextSibling",e)},this.prev=function(e){return t=n(t,"lastChild","previousSibling",e)},this.prev2=function(e){return t=function(e,t,n,r){var o,i,a;if(e){if(o=e[n],u&&o===u)return;if(o){if(!r)for(a=o[t];a;a=a[t])if(!a[t])return a;return o}if((i=e.parentNode)&&i!==u)return i}}(t,"lastChild","previousSibling",e)}}var po,ho,vo,yo=function(t){var n;return function(e){return(n=n||function(e,t){for(var n={},r=0,o=e.length;r\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Ko=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Xo=/[<>&\"\']/g,Yo=/([a-z0-9]+);?|&([a-z0-9]+);/gi,Go={128:"\u20ac",130:"\u201a",131:"\u0192",132:"\u201e",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02c6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017d",145:"\u2018",146:"\u2019",147:"\u201c",148:"\u201d",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02dc",153:"\u2122",154:"\u0161",155:"\u203a",156:"\u0153",158:"\u017e",159:"\u0178"};ho={'"':""","'":"'","<":"<",">":">","&":"&","`":"`"},vo={"<":"<",">":">","&":"&",""":'"',"'":"'"};var Jo=function(e,t){var n,r,o,i={};if(e){for(e=e.split(","),t=t||10,n=0;n>10),56320+(1023&t))):Go[t]||String.fromCharCode(t):vo[e]||po[e]||(n=e,(r=ar.fromTag("div").dom()).innerHTML=n,r.textContent||r.innerText||n);var n,r})}},ni={},ri={},oi=Xt.makeMap,ii=Xt.each,ai=Xt.extend,ui=Xt.explode,si=Xt.inArray,ci=function(e,t){return(e=Xt.trim(e))?e.split(t||" "):[]},li=function(e){var u,t,n,r,o,i,s={},a=function(e,t,n){var r,o,i,a=function(e,t){var n,r,o={};for(n=0,r=e.length;n]*>","gi")});var S=function(e){return new RegExp("^"+e.replace(/([?+*])/g,".$1")+"$")},y=function(e){var t,n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,y,b,C=/^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)\])?$/,x=/^([!\-])?(\w+[\\:]:\w+|[^=:<]+)?(?:([=:<])(.*))?$/,w=/[*?+]/;if(e)for(e=ci(e,","),N["@"]&&(h=N["@"].attributes,v=N["@"].attributesOrder),t=0,n=e.length;t"+r,t.removeChild(t.firstChild)}catch(n){gn("
").html(" "+r).contents().slice(1).appendTo(t)}return r}}):t.html(r)},R=function(e,n,r,o,i){return k(e,function(e){var t="string"==typeof n?a.createElement(n):n;return _(t,r),o&&("string"!=typeof o&&o.nodeType?t.appendChild(o):"string"==typeof o&&A(t,o)),i?t:e.appendChild(t)})},D=function(e,t,n){return R(a.createElement(e),e,t,n,!0)},O=ti.decode,B=ti.encodeAllRaw,P=function(e,t){var n=h(e);return t?n.each(function(){for(var e;e=this.firstChild;)3===e.nodeType&&0===e.data.length?this.removeChild(e):this.parentNode.insertBefore(e,this)}).remove():n.remove(),1"+n+""+e+">":o+" />"},createFragment:function(e){var t,n=a.createElement("div"),r=a.createDocumentFragment();for(r.appendChild(n),e&&(n.innerHTML=e);t=n.firstChild;)r.appendChild(t);return r.removeChild(n),r},remove:P,setStyle:function(e,t,n){var r=h(e).css(t,n);u.update_styles&&wi(d,r)},getStyle:w,setStyles:function(e,t){var n=h(e).css(t);u.update_styles&&wi(d,n)},removeAllAttribs:function(e){return k(e,function(e){var t,n=e.attributes;for(t=n.length-1;0<=t;t--)e.removeAttributeNode(n.item(t))})},setAttrib:b,setAttribs:_,getAttrib:v,getPos:x,parseStyle:function(e){return d.parse(e)},serializeStyle:function(e,t){return d.serialize(e,t)},addStyle:function(e){var t,n;if(j!==Ei.DOM&&a===V.document){if(r[e])return;r[e]=!0}(n=a.getElementById("mceDefaultStyles"))||((n=a.createElement("style")).id="mceDefaultStyles",n.type="text/css",(t=a.getElementsByTagName("head")[0]).firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n)),n.styleSheet?n.styleSheet.cssText+=e:n.appendChild(a.createTextNode(e))},loadCSS:function(e){var n;j===Ei.DOM||a!==V.document?(e||(e=""),n=a.getElementsByTagName("head")[0],hi(e.split(","),function(e){var t;e=Xt._addCacheSuffix(e),o[e]||(o[e]=!0,t=D("link",{rel:"stylesheet",href:e}),n.appendChild(t))})):Ei.DOM.loadCSS(e)},addClass:function(e,t){h(e).addClass(t)},removeClass:function(e,t){I(e,t,!1)},hasClass:function(e,t){return h(e).hasClass(t)},toggleClass:I,show:function(e){h(e).show()},hide:function(e){h(e).hide()},isHidden:function(e){return"none"===h(e).css("display")},uniqueId:function(e){return(e||"mce_")+t++},setHTML:A,getOuterHTML:function(e){var t="string"==typeof e?p(e):e;return jo.isElement(t)?t.outerHTML:gn("
").append(gn(t).clone()).html()},setOuterHTML:function(e,t){h(e).each(function(){try{if("outerHTML"in this)return void(this.outerHTML=t)}catch(e){}P(gn(this).html(t),!0)})},decode:O,encode:B,insertAfter:function(e,t){var r=p(t);return k(e,function(e){var t,n;return t=r.parentNode,(n=r.nextSibling)?t.insertBefore(e,n):t.appendChild(e),e})},replace:L,rename:function(t,e){var n;return t.nodeName!==e.toUpperCase()&&(n=D(e),hi(y(t),function(e){b(n,e.nodeName,v(t,e.nodeName))}),L(n,t,!0)),n||t},findCommonAncestor:function(e,t){for(var n,r=e;r;){for(n=t;n&&r!==n;)n=n.parentNode;if(r===n)break;r=r.parentNode}return!r&&e.ownerDocument?e.ownerDocument.documentElement:r},toHex:function(e){return d.toHex(Xt.trim(e))},run:k,getAttribs:y,isEmpty:function(e,t){var n,r,o,i,a,u,s=0;if(e=e.firstChild){a=new go(e,e.parentNode),t=t||(f?f.getNonEmptyElements():null),i=f?f.getWhiteSpaceElements():{};do{if(o=e.nodeType,jo.isElement(e)){var c=e.getAttribute("data-mce-bogus");if(c){e=a.next("all"===c);continue}if(u=e.nodeName.toLowerCase(),t&&t[u]){if("br"===u){s++,e=a.next();continue}return!1}for(n=(r=y(e)).length;n--;)if("name"===(u=r[n].nodeName)||"data-mce-bookmark"===u)return!1}if(8===o)return!1;if(3===o&&!Ci.test(e.nodeValue))return!1;if(3===o&&e.parentNode&&i[e.parentNode.nodeName]&&Ci.test(e.nodeValue))return!1;e=a.next()}while(e)}return s<=1},createRng:F,nodeIndex:Ni,split:function(e,t,n){var r,o,i,a=F();if(e&&t)return a.setStart(e.parentNode,Ni(e)),a.setEnd(t.parentNode,Ni(t)),r=a.extractContents(),(a=F()).setStart(t.parentNode,Ni(t)+1),a.setEnd(e.parentNode,Ni(e)+1),o=a.extractContents(),(i=e.parentNode).insertBefore(qo.trimNode(j,r),e),n?i.insertBefore(n,e):i.insertBefore(t,e),i.insertBefore(qo.trimNode(j,o),e),P(e),n||t},bind:M,unbind:z,fire:function(e,t,n){return m.fire(e,t,n)},getContentEditable:U,getContentEditableParent:function(e){for(var t=C(),n=null;e&&e!==t&&null===(n=U(e));e=e.parentNode);return n},destroy:function(){if(l)for(var e=l.length;e--;){var t=l[e];m.unbind(t[0],t[1],t[2])}St.setDocument&&St.setDocument()},isChildOf:function(e,t){for(;e;){if(t===e)return!0;e=e.parentNode}return!1},dumpRng:function(e){return"startContainer: "+e.startContainer.nodeName+", startOffset: "+e.startOffset+", endContainer: "+e.endContainer.nodeName+", endOffset: "+e.endOffset}};return s=xi(d,u,function(){return j}),j}(pi=Ei||(Ei={})).DOM=pi(V.document),pi.nodeIndex=Ni;var Si=Ei,Ti=Si.DOM,ki=Xt.each,_i=Xt.grep,Ai=function(e){return"function"==typeof e},Ri=function(){var l={},o=[],i={},a=[],f=0;this.isDone=function(e){return 2===l[e]},this.markDone=function(e){l[e]=2},this.add=this.load=function(e,t,n,r){l[e]===undefined&&(o.push(e),l[e]=0),t&&(i[e]||(i[e]=[]),i[e].push({success:t,failure:r,scope:n||this}))},this.remove=function(e){delete l[e],delete i[e]},this.loadQueue=function(e,t,n){this.loadScripts(o,e,t,n)},this.loadScripts=function(n,e,t,r){var u,s=[],c=function(t,e){ki(i[e],function(e){Ai(e[t])&&e[t].call(e.scope)}),i[e]=undefined};a.push({success:e,failure:r,scope:t||this}),(u=function(){var e=_i(n);if(n.length=0,ki(e,function(e){var t,n,r,o,i,a;2!==l[e]?3!==l[e]?1!==l[e]&&(l[e]=1,f++,t=e,n=function(){l[e]=2,f--,c("success",e),u()},r=function(){l[e]=3,f--,s.push(e),c("failure",e),u()},i=(a=Ti).uniqueId(),(o=V.document.createElement("script")).id=i,o.type="text/javascript",o.src=Xt._addCacheSuffix(t),o.onload=function(){a.remove(i),o&&(o.onreadystatechange=o.onload=o=null),n()},o.onerror=function(){Ai(r)?r():"undefined"!=typeof console&&console.log&&console.log("Failed to load script: "+t)},(V.document.getElementsByTagName("head")[0]||V.document.body).appendChild(o)):c("failure",e):c("success",e)}),!f){var t=a.slice(0);a.length=0,ki(t,function(e){0===s.length?Ai(e.success)&&e.success.call(e.scope):Ai(e.failure)&&e.failure.call(e.scope,s)})}})()}};Ri.ScriptLoader=new Ri;var Di,Oi=Xt.each;function Bi(){var r=this,o=[],a={},u={},i=[],s=function(e){var t;return u[e]&&(t=u[e].dependencies),t||[]},c=function(e,t){return"object"==typeof t?t:"string"==typeof e?{prefix:"",resource:t,suffix:""}:{prefix:e.prefix,resource:t,suffix:e.suffix}},l=function(e,n,t,r){var o=s(e);Oi(o,function(e){var t=c(n,e);f(t.resource,t,undefined,undefined)}),t&&(r?t.call(r):t.call(Ri))},f=function(e,t,n,r,o){if(!a[e]){var i="string"==typeof t?t:t.prefix+t.resource+t.suffix;0!==i.indexOf("/")&&-1===i.indexOf("://")&&(i=Bi.baseURL+"/"+i),a[e]=i.substring(0,i.lastIndexOf("/")),u[e]?l(e,t,n,r):Ri.ScriptLoader.add(i,function(){return l(e,t,n,r)},r,o)}};return{items:o,urls:a,lookup:u,_listeners:i,get:function(e){return u[e]?u[e].instance:undefined},dependencies:s,requireLangPack:function(e,t){var n=Bi.language;if(n&&!1!==Bi.languageLoad){if(t)if(-1!==(t=","+t+",").indexOf(","+n.substr(0,2)+","))n=n.substr(0,2);else if(-1===t.indexOf(","+n+","))return;Ri.ScriptLoader.add(a[e]+"/langs/"+n+".js")}},add:function(t,e,n){o.push(e),u[t]={instance:e,dependencies:n};var r=K(i,function(e){return e.name===t});return i=r.fail,Oi(r.pass,function(e){e.callback()}),e},remove:function(e){delete a[e],delete u[e]},createUrl:c,addComponents:function(e,t){var n=r.urls[e];Oi(t,function(e){Ri.ScriptLoader.add(n+"/"+e)})},load:f,waitFor:function(e,t){u.hasOwnProperty(e)?t():i.push({name:e,callback:t})}}}(Di=Bi||(Bi={})).PluginManager=Di(),Di.ThemeManager=Di();var Pi=function(t,n){Vr(t).each(function(e){e.dom().insertBefore(n.dom(),t.dom())})},Ii=function(e,t){qr(e).fold(function(){Vr(e).each(function(e){Fi(e,t)})},function(e){Pi(e,t)})},Li=function(t,n){Yr(t).fold(function(){Fi(t,n)},function(e){t.dom().insertBefore(n.dom(),e.dom())})},Fi=function(e,t){e.dom().appendChild(t.dom())},Mi=function(t,e){z(e,function(e){Fi(t,e)})},zi=function(e){e.dom().textContent="",z(Kr(e),function(e){Ui(e)})},Ui=function(e){var t=e.dom();null!==t.parentNode&&t.parentNode.removeChild(t)},ji=function(e){var t,n=Kr(e);0t.bottom)&&Ya(t.top-e.bottom,e,t)},Ja=function(e,t){return e.top>t.bottom||!(e.bottom=e.left&&t<=e.right&&n>=e.top&&n<=e.bottom},Za=function(e){var t=e.startContainer,n=e.startOffset;return t.hasChildNodes()&&e.endOffset===n+1?t.childNodes[n]:null},eu=function(e,t){return 1===e.nodeType&&e.hasChildNodes()&&(t>=e.childNodes.length&&(t=e.childNodes.length-1),e=e.childNodes[t]),e},tu=new RegExp("[\u0300-\u036f\u0483-\u0487\u0488-\u0489\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e3-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2-\u09e3\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62-\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc-\u0ccd\u0cd5-\u0cd6\u0ce2-\u0ce3\u0d01\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62-\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1abe\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9\u1dc0-\u1df5\u1dfc-\u1dff\u200c-\u200d\u20d0-\u20dc\u20dd-\u20e0\u20e1\u20e2-\u20e4\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u302e-\u302f\u3099-\u309a\ua66f\ua670-\ua672\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1\ua802\ua806\ua80b\ua825-\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\uff9e-\uff9f]"),nu=function(e){return"string"==typeof e&&768<=e.charCodeAt(0)&&tu.test(e)},ru=function(e,t,n){return e.isSome()&&t.isSome()?_.some(n(e.getOrDie(),t.getOrDie())):_.none()},ou=[].slice,iu=function(){for(var e=[],t=0;t=t.data.length:n>=t.childNodes.length},isEqual:function(e){return e&&t===e.container()&&n===e.offset()},getNode:function(e){return hu(t,e?n-1:n)}}}(ea=Su||(Su={})).fromRangeStart=function(e){return ea(e.startContainer,e.startOffset)},ea.fromRangeEnd=function(e){return ea(e.endContainer,e.endOffset)},ea.after=function(e){return ea(e.parentNode,pu(e)+1)},ea.before=function(e){return ea(e.parentNode,pu(e))},ea.isAbove=function(e,t){return ru(Z(t.getClientRects()),ee(e.getClientRects()),Ga).getOr(!1)},ea.isBelow=function(e,t){return ru(ee(t.getClientRects()),Z(e.getClientRects()),Ja).getOr(!1)},ea.isAtStart=function(e){return!!e&&e.isAtStart()},ea.isAtEnd=function(e){return!!e&&e.isAtEnd()},ea.isTextPosition=function(e){return!!e&&jo.isText(e.container())},ea.isElementPosition=function(e){return!1===ea.isTextPosition(e)};var Tu,ku,_u=Su,Au=jo.isText,Ru=jo.isBogus,Du=Si.nodeIndex,Ou=function(e){var t=e.parentNode;return Ru(t)?Ou(t):t},Bu=function(e){return e?Ht.reduce(e.childNodes,function(e,t){return Ru(t)&&"BR"!==t.nodeName?e=e.concat(Bu(t)):e.push(t),e},[]):[]},Pu=function(t){return function(e){return t===e}},Iu=function(e){var t,r,n,o;return(Au(e)?"text()":e.nodeName.toLowerCase())+"["+(r=Bu(Ou(t=e)),n=Ht.findIndex(r,Pu(t),t),r=r.slice(0,n+1),o=Ht.reduce(r,function(e,t,n){return Au(t)&&Au(r[n-1])&&e++,e},0),r=Ht.filter(r,jo.matchNodeNames(t.nodeName)),(n=Ht.findIndex(r,Pu(t),t))-o)+"]"},Lu=function(e,t){var n,r,o,i,a,u=[];return n=t.container(),r=t.offset(),Au(n)?o=function(e,t){for(;(e=e.previousSibling)&&Au(e);)t+=e.data.length;return t}(n,r):(r>=(i=n.childNodes).length?(o="after",r=i.length-1):o="before",n=i[r]),u.push(Iu(n)),a=function(e,t,n){var r=[];for(t=t.parentNode;!(t===e||n&&n(t));t=t.parentNode)r.push(t);return r}(e,n),a=Ht.filter(a,y(jo.isBogus)),(u=u.concat(Ht.map(a,function(e){return Iu(e)}))).reverse().join("/")+","+o},Fu=function(e,t){var n,r,o;return t?(t=(n=t.split(","))[0].split("/"),o=1e.data.length&&(t=e.data.length),_u(e,t)}(r,parseInt(o,10)):(o="after"===o?Du(r)+1:Du(r),_u(r.parentNode,o)):null):null},Mu=function(e,t){jo.isText(t)&&0===t.data.length&&e.remove(t)},zu=function(e,t,n){var r,o,i,a,u,s,c;jo.isDocumentFragment(n)?(i=e,a=t,u=n,s=_.from(u.firstChild),c=_.from(u.lastChild),a.insertNode(u),s.each(function(e){return Mu(i,e.previousSibling)}),c.each(function(e){return Mu(i,e.nextSibling)})):(r=e,o=n,t.insertNode(o),Mu(r,o.previousSibling),Mu(r,o.nextSibling))},Uu=jo.isContentEditableFalse,ju=function(e,t,n,r,o){var i,a=r[o?"startContainer":"endContainer"],u=r[o?"startOffset":"endOffset"],s=[],c=0,l=e.getRoot();for(jo.isText(a)?s.push(n?function(e,t,n){var r,o;for(o=e(t.data.slice(0,n)).length,r=t.previousSibling;r&&jo.isText(r);r=r.previousSibling)o+=e(r.data).length;return o}(t,a,u):u):(u>=(i=a.childNodes).length&&i.length&&(c=1,u=Math.max(0,i.length-1)),s.push(e.nodeIndex(i[u],n)+c));a&&a!==l;a=a.parentNode)s.push(e.nodeIndex(a,n));return s},Vu=function(e,t,n){var r=0;return Xt.each(e.select(t),function(e){if("all"!==e.getAttribute("data-mce-bogus"))return e!==n&&void r++}),r},Hu=function(e,t){var n,r,o,i=t?"start":"end";n=e[i+"Container"],r=e[i+"Offset"],jo.isElement(n)&&"TR"===n.nodeName&&(n=(o=n.childNodes)[Math.min(t?r:r-1,o.length-1)])&&(r=t?0:n.childNodes.length,e["set"+(t?"Start":"End")](n,r))},qu=function(e){return Hu(e,!0),Hu(e,!1),e},$u=function(e,t){var n;if(jo.isElement(e)&&(e=eu(e,t),Uu(e)))return e;if(ka(e)){if(jo.isText(e)&&Sa(e)&&(e=e.parentNode),n=e.previousSibling,Uu(n))return n;if(n=e.nextSibling,Uu(n))return n}},Wu=function(e,t,n){var r=n.getNode(),o=r?r.nodeName:null,i=n.getRng();if(Uu(r)||"IMG"===o)return{name:o,index:Vu(n.dom,o,r)};var a,u,s,c,l,f,d,m=$u((a=i).startContainer,a.startOffset)||$u(a.endContainer,a.endOffset);return m?{name:o=m.tagName,index:Vu(n.dom,o,m)}:(u=e,c=t,l=i,f=(s=n).dom,(d={}).start=ju(f,u,c,l,!0),s.isCollapsed()||(d.end=ju(f,u,c,l,!1)),d)},Ku=function(e,t,n){var r={"data-mce-type":"bookmark",id:t,style:"overflow:hidden;line-height:0px"};return n?e.create("span",r,""):e.create("span",r)},Xu=function(e,t){var n=e.dom,r=e.getRng(),o=n.uniqueId(),i=e.isCollapsed(),a=e.getNode(),u=a.nodeName;if("IMG"===u)return{name:u,index:Vu(n,u,a)};var s=qu(r.cloneRange());if(!i){s.collapse(!1);var c=Ku(n,o+"_end",t);zu(n,s,c)}(r=qu(r)).collapse(!0);var l=Ku(n,o+"_start",t);return zu(n,r,l),e.moveToBookmark({id:o,keep:1}),{id:o}},Yu={getBookmark:function(e,t,n){return 2===t?Wu(wa,n,e):3===t?(o=(r=e).getRng(),{start:Lu(r.dom.getRoot(),_u.fromRangeStart(o)),end:Lu(r.dom.getRoot(),_u.fromRangeEnd(o))}):t?{rng:e.getRng()}:Xu(e,!1);var r,o},getUndoBookmark:d(Wu,$,!0),getPersistentBookmark:Xu},Gu="_mce_caret",Ju=function(e){return jo.isElement(e)&&e.id===Gu},Qu=function(e,t){for(;t&&t!==e;){if(t.id===Gu)return t;t=t.parentNode}return null},Zu=jo.isElement,es=jo.isText,ts=function(e){var t=e.parentNode;t&&t.removeChild(e)},ns=function(e,t){0===t.length?ts(e):e.nodeValue=t},rs=function(e){var t=wa(e);return{count:e.length-t.length,text:t}},os=function(e,t){return us(e),t},is=function(e,t){var n,r,o,i=t.container(),a=(n=te(i.childNodes),r=e,o=L(n,r),-1===o?_.none():_.some(o)).map(function(e){return e ').css(n).appendTo(a)[0];return c.set(_.some({caret:i,element:e,before:t})),c.get().each(function(e){t&&gn(e.caret).addClass("mce-visual-caret-before")}),f(),(r=e.ownerDocument.createRange()).setStart(s,0),r.setEnd(s,0),r},hide:l,getCss:function(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"},reposition:function(){c.get().each(function(e){var t=fs(a,e.element,e.before);gn(e.caret).css(t)})},destroy:function(){return he.clearInterval(t)}}},ms=function(){return cs.isIE()||cs.isEdge()||cs.isFirefox()},gs=function(e){return ls(e)||jo.isTable(e)&&ms()},ps=jo.isContentEditableFalse,hs=jo.matchStyleValues("display","block table table-cell table-caption list-item"),vs=ka,ys=Sa,bs=jo.isElement,Cs=Ha,xs=function(e){return 0