Diff: STRATO-apps/wordpress_03/app/wp-includes/js/tinymce/plugins/media/plugin.js

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + (function () {
2 + var media = (function () {
3 + 'use strict';
4 +
5 + var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
6 +
7 + var global$1 = tinymce.util.Tools.resolve('tinymce.Env');
8 +
9 + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools');
10 +
11 + var getScripts = function (editor) {
12 + return editor.getParam('media_scripts');
13 + };
14 + var getAudioTemplateCallback = function (editor) {
15 + return editor.getParam('audio_template_callback');
16 + };
17 + var getVideoTemplateCallback = function (editor) {
18 + return editor.getParam('video_template_callback');
19 + };
20 + var hasLiveEmbeds = function (editor) {
21 + return editor.getParam('media_live_embeds', true);
22 + };
23 + var shouldFilterHtml = function (editor) {
24 + return editor.getParam('media_filter_html', true);
25 + };
26 + var getUrlResolver = function (editor) {
27 + return editor.getParam('media_url_resolver');
28 + };
29 + var hasAltSource = function (editor) {
30 + return editor.getParam('media_alt_source', true);
31 + };
32 + var hasPoster = function (editor) {
33 + return editor.getParam('media_poster', true);
34 + };
35 + var hasDimensions = function (editor) {
36 + return editor.getParam('media_dimensions', true);
37 + };
38 + var Settings = {
39 + getScripts: getScripts,
40 + getAudioTemplateCallback: getAudioTemplateCallback,
41 + getVideoTemplateCallback: getVideoTemplateCallback,
42 + hasLiveEmbeds: hasLiveEmbeds,
43 + shouldFilterHtml: shouldFilterHtml,
44 + getUrlResolver: getUrlResolver,
45 + hasAltSource: hasAltSource,
46 + hasPoster: hasPoster,
47 + hasDimensions: hasDimensions
48 + };
49 +
50 + var Cell = function (initial) {
51 + var value = initial;
52 + var get = function () {
53 + return value;
54 + };
55 + var set = function (v) {
56 + value = v;
57 + };
58 + var clone = function () {
59 + return Cell(get());
60 + };
61 + return {
62 + get: get,
63 + set: set,
64 + clone: clone
65 + };
66 + };
67 +
68 + var noop = function () {
69 + };
70 + var constant = function (value) {
71 + return function () {
72 + return value;
73 + };
74 + };
75 + var never = constant(false);
76 + var always = constant(true);
77 +
78 + var none = function () {
79 + return NONE;
80 + };
81 + var NONE = function () {
82 + var eq = function (o) {
83 + return o.isNone();
84 + };
85 + var call = function (thunk) {
86 + return thunk();
87 + };
88 + var id = function (n) {
89 + return n;
90 + };
91 + var me = {
92 + fold: function (n, s) {
93 + return n();
94 + },
95 + is: never,
96 + isSome: never,
97 + isNone: always,
98 + getOr: id,
99 + getOrThunk: call,
100 + getOrDie: function (msg) {
101 + throw new Error(msg || 'error: getOrDie called on none.');
102 + },
103 + getOrNull: constant(null),
104 + getOrUndefined: constant(undefined),
105 + or: id,
106 + orThunk: call,
107 + map: none,
108 + each: noop,
109 + bind: none,
110 + exists: never,
111 + forall: always,
112 + filter: none,
113 + equals: eq,
114 + equals_: eq,
115 + toArray: function () {
116 + return [];
117 + },
118 + toString: constant('none()')
119 + };
120 + if (Object.freeze) {
121 + Object.freeze(me);
122 + }
123 + return me;
124 + }();
125 + var some = function (a) {
126 + var constant_a = constant(a);
127 + var self = function () {
128 + return me;
129 + };
130 + var bind = function (f) {
131 + return f(a);
132 + };
133 + var me = {
134 + fold: function (n, s) {
135 + return s(a);
136 + },
137 + is: function (v) {
138 + return a === v;
139 + },
140 + isSome: always,
141 + isNone: never,
142 + getOr: constant_a,
143 + getOrThunk: constant_a,
144 + getOrDie: constant_a,
145 + getOrNull: constant_a,
146 + getOrUndefined: constant_a,
147 + or: self,
148 + orThunk: self,
149 + map: function (f) {
150 + return some(f(a));
151 + },
152 + each: function (f) {
153 + f(a);
154 + },
155 + bind: bind,
156 + exists: bind,
157 + forall: bind,
158 + filter: function (f) {
159 + return f(a) ? me : NONE;
160 + },
161 + toArray: function () {
162 + return [a];
163 + },
164 + toString: function () {
165 + return 'some(' + a + ')';
166 + },
167 + equals: function (o) {
168 + return o.is(a);
169 + },
170 + equals_: function (o, elementEq) {
171 + return o.fold(never, function (b) {
172 + return elementEq(a, b);
173 + });
174 + }
175 + };
176 + return me;
177 + };
178 + var from = function (value) {
179 + return value === null || value === undefined ? NONE : some(value);
180 + };
181 + var Option = {
182 + some: some,
183 + none: none,
184 + from: from
185 + };
186 +
187 + var hasOwnProperty = Object.hasOwnProperty;
188 + var get = function (obj, key) {
189 + return has(obj, key) ? Option.from(obj[key]) : Option.none();
190 + };
191 + var has = function (obj, key) {
192 + return hasOwnProperty.call(obj, key);
193 + };
194 +
195 + var global$3 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
196 +
197 + var global$4 = tinymce.util.Tools.resolve('tinymce.html.SaxParser');
198 +
199 + var getVideoScriptMatch = function (prefixes, src) {
200 + if (prefixes) {
201 + for (var i = 0; i < prefixes.length; i++) {
202 + if (src.indexOf(prefixes[i].filter) !== -1) {
203 + return prefixes[i];
204 + }
205 + }
206 + }
207 + };
208 + var VideoScript = { getVideoScriptMatch: getVideoScriptMatch };
209 +
210 + var DOM = global$3.DOM;
211 + var trimPx = function (value) {
212 + return value.replace(/px$/, '');
213 + };
214 + var getEphoxEmbedData = function (attrs) {
215 + var style = attrs.map.style;
216 + var styles = style ? DOM.parseStyle(style) : {};
217 + return {
218 + type: 'ephox-embed-iri',
219 + source1: attrs.map['data-ephox-embed-iri'],
220 + source2: '',
221 + poster: '',
222 + width: get(styles, 'max-width').map(trimPx).getOr(''),
223 + height: get(styles, 'max-height').map(trimPx).getOr('')
224 + };
225 + };
226 + var htmlToData = function (prefixes, html) {
227 + var isEphoxEmbed = Cell(false);
228 + var data = {};
229 + global$4({
230 + validate: false,
231 + allow_conditional_comments: true,
232 + special: 'script,noscript',
233 + start: function (name, attrs) {
234 + if (isEphoxEmbed.get()) ; else if (has(attrs.map, 'data-ephox-embed-iri')) {
235 + isEphoxEmbed.set(true);
236 + data = getEphoxEmbedData(attrs);
237 + } else {
238 + if (!data.source1 && name === 'param') {
239 + data.source1 = attrs.map.movie;
240 + }
241 + if (name === 'iframe' || name === 'object' || name === 'embed' || name === 'video' || name === 'audio') {
242 + if (!data.type) {
243 + data.type = name;
244 + }
245 + data = global$2.extend(attrs.map, data);
246 + }
247 + if (name === 'script') {
248 + var videoScript = VideoScript.getVideoScriptMatch(prefixes, attrs.map.src);
249 + if (!videoScript) {
250 + return;
251 + }
252 + data = {
253 + type: 'script',
254 + source1: attrs.map.src,
255 + width: videoScript.width,
256 + height: videoScript.height
257 + };
258 + }
259 + if (name === 'source') {
260 + if (!data.source1) {
261 + data.source1 = attrs.map.src;
262 + } else if (!data.source2) {
263 + data.source2 = attrs.map.src;
264 + }
265 + }
266 + if (name === 'img' && !data.poster) {
267 + data.poster = attrs.map.src;
268 + }
269 + }
270 + }
271 + }).parse(html);
272 + data.source1 = data.source1 || data.src || data.data;
273 + data.source2 = data.source2 || '';
274 + data.poster = data.poster || '';
275 + return data;
276 + };
277 + var HtmlToData = { htmlToData: htmlToData };
278 +
279 + var global$5 = tinymce.util.Tools.resolve('tinymce.util.Promise');
280 +
281 + var guess = function (url) {
282 + var mimes = {
283 + mp3: 'audio/mpeg',
284 + wav: 'audio/wav',
285 + mp4: 'video/mp4',
286 + webm: 'video/webm',
287 + ogg: 'video/ogg',
288 + swf: 'application/x-shockwave-flash'
289 + };
290 + var fileEnd = url.toLowerCase().split('.').pop();
291 + var mime = mimes[fileEnd];
292 + return mime ? mime : '';
293 + };
294 + var Mime = { guess: guess };
295 +
296 + var global$6 = tinymce.util.Tools.resolve('tinymce.html.Schema');
297 +
298 + var global$7 = tinymce.util.Tools.resolve('tinymce.html.Writer');
299 +
300 + var DOM$1 = global$3.DOM;
301 + var addPx = function (value) {
302 + return /^[0-9.]+$/.test(value) ? value + 'px' : value;
303 + };
304 + var setAttributes = function (attrs, updatedAttrs) {
305 + for (var name in updatedAttrs) {
306 + var value = '' + updatedAttrs[name];
307 + if (attrs.map[name]) {
308 + var i = attrs.length;
309 + while (i--) {
310 + var attr = attrs[i];
311 + if (attr.name === name) {
312 + if (value) {
313 + attrs.map[name] = value;
314 + attr.value = value;
315 + } else {
316 + delete attrs.map[name];
317 + attrs.splice(i, 1);
318 + }
319 + }
320 + }
321 + } else if (value) {
322 + attrs.push({
323 + name: name,
324 + value: value
325 + });
326 + attrs.map[name] = value;
327 + }
328 + }
329 + };
330 + var updateEphoxEmbed = function (data, attrs) {
331 + var style = attrs.map.style;
332 + var styleMap = style ? DOM$1.parseStyle(style) : {};
333 + styleMap['max-width'] = addPx(data.width);
334 + styleMap['max-height'] = addPx(data.height);
335 + setAttributes(attrs, { style: DOM$1.serializeStyle(styleMap) });
336 + };
337 + var updateHtml = function (html, data, updateAll) {
338 + var writer = global$7();
339 + var isEphoxEmbed = Cell(false);
340 + var sourceCount = 0;
341 + var hasImage;
342 + global$4({
343 + validate: false,
344 + allow_conditional_comments: true,
345 + special: 'script,noscript',
346 + comment: function (text) {
347 + writer.comment(text);
348 + },
349 + cdata: function (text) {
350 + writer.cdata(text);
351 + },
352 + text: function (text, raw) {
353 + writer.text(text, raw);
354 + },
355 + start: function (name, attrs, empty) {
356 + if (isEphoxEmbed.get()) ; else if (has(attrs.map, 'data-ephox-embed-iri')) {
357 + isEphoxEmbed.set(true);
358 + updateEphoxEmbed(data, attrs);
359 + } else {
360 + switch (name) {
361 + case 'video':
362 + case 'object':
363 + case 'embed':
364 + case 'img':
365 + case 'iframe':
366 + if (data.height !== undefined && data.width !== undefined) {
367 + setAttributes(attrs, {
368 + width: data.width,
369 + height: data.height
370 + });
371 + }
372 + break;
373 + }
374 + if (updateAll) {
375 + switch (name) {
376 + case 'video':
377 + setAttributes(attrs, {
378 + poster: data.poster,
379 + src: ''
380 + });
381 + if (data.source2) {
382 + setAttributes(attrs, { src: '' });
383 + }
384 + break;
385 + case 'iframe':
386 + setAttributes(attrs, { src: data.source1 });
387 + break;
388 + case 'source':
389 + sourceCount++;
390 + if (sourceCount <= 2) {
391 + setAttributes(attrs, {
392 + src: data['source' + sourceCount],
393 + type: data['source' + sourceCount + 'mime']
394 + });
395 + if (!data['source' + sourceCount]) {
396 + return;
397 + }
398 + }
399 + break;
400 + case 'img':
401 + if (!data.poster) {
402 + return;
403 + }
404 + hasImage = true;
405 + break;
406 + }
407 + }
408 + }
409 + writer.start(name, attrs, empty);
410 + },
411 + end: function (name) {
412 + if (!isEphoxEmbed.get()) {
413 + if (name === 'video' && updateAll) {
414 + for (var index = 1; index <= 2; index++) {
415 + if (data['source' + index]) {
416 + var attrs = [];
417 + attrs.map = {};
418 + if (sourceCount < index) {
419 + setAttributes(attrs, {
420 + src: data['source' + index],
421 + type: data['source' + index + 'mime']
422 + });
423 + writer.start('source', attrs, true);
424 + }
425 + }
426 + }
427 + }
428 + if (data.poster && name === 'object' && updateAll && !hasImage) {
429 + var imgAttrs = [];
430 + imgAttrs.map = {};
431 + setAttributes(imgAttrs, {
432 + src: data.poster,
433 + width: data.width,
434 + height: data.height
435 + });
436 + writer.start('img', imgAttrs, true);
437 + }
438 + }
439 + writer.end(name);
440 + }
441 + }, global$6({})).parse(html);
442 + return writer.getContent();
443 + };
444 + var UpdateHtml = { updateHtml: updateHtml };
445 +
446 + var urlPatterns = [
447 + {
448 + regex: /youtu\.be\/([\w\-_\?&=.]+)/i,
449 + type: 'iframe',
450 + w: 560,
451 + h: 314,
452 + url: '//www.youtube.com/embed/$1',
453 + allowFullscreen: true
454 + },
455 + {
456 + regex: /youtube\.com(.+)v=([^&]+)(&([a-z0-9&=\-_]+))?/i,
457 + type: 'iframe',
458 + w: 560,
459 + h: 314,
460 + url: '//www.youtube.com/embed/$2?$4',
461 + allowFullscreen: true
462 + },
463 + {
464 + regex: /youtube.com\/embed\/([a-z0-9\?&=\-_]+)/i,
465 + type: 'iframe',
466 + w: 560,
467 + h: 314,
468 + url: '//www.youtube.com/embed/$1',
469 + allowFullscreen: true
470 + },
471 + {
472 + regex: /vimeo\.com\/([0-9]+)/,
473 + type: 'iframe',
474 + w: 425,
475 + h: 350,
476 + url: '//player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc',
477 + allowFullscreen: true
478 + },
479 + {
480 + regex: /vimeo\.com\/(.*)\/([0-9]+)/,
481 + type: 'iframe',
482 + w: 425,
483 + h: 350,
484 + url: '//player.vimeo.com/video/$2?title=0&amp;byline=0',
485 + allowFullscreen: true
486 + },
487 + {
488 + regex: /maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/,
489 + type: 'iframe',
490 + w: 425,
491 + h: 350,
492 + url: '//maps.google.com/maps/ms?msid=$2&output=embed"',
493 + allowFullscreen: false
494 + },
495 + {
496 + regex: /dailymotion\.com\/video\/([^_]+)/,
497 + type: 'iframe',
498 + w: 480,
499 + h: 270,
500 + url: '//www.dailymotion.com/embed/video/$1',
501 + allowFullscreen: true
502 + },
503 + {
504 + regex: /dai\.ly\/([^_]+)/,
505 + type: 'iframe',
506 + w: 480,
507 + h: 270,
508 + url: '//www.dailymotion.com/embed/video/$1',
509 + allowFullscreen: true
510 + }
511 + ];
512 + var getUrl = function (pattern, url) {
513 + var match = pattern.regex.exec(url);
514 + var newUrl = pattern.url;
515 + var _loop_1 = function (i) {
516 + newUrl = newUrl.replace('$' + i, function () {
517 + return match[i] ? match[i] : '';
518 + });
519 + };
520 + for (var i = 0; i < match.length; i++) {
521 + _loop_1(i);
522 + }
523 + return newUrl.replace(/\?$/, '');
524 + };
525 + var matchPattern = function (url) {
526 + var pattern = urlPatterns.filter(function (pattern) {
527 + return pattern.regex.test(url);
528 + });
529 + if (pattern.length > 0) {
530 + return global$2.extend({}, pattern[0], { url: getUrl(pattern[0], url) });
531 + } else {
532 + return null;
533 + }
534 + };
535 +
536 + var getIframeHtml = function (data) {
537 + var allowFullscreen = data.allowFullscreen ? ' allowFullscreen="1"' : '';
538 + return '<iframe src="' + data.source1 + '" width="' + data.width + '" height="' + data.height + '"' + allowFullscreen + '></iframe>';
539 + };
540 + var getFlashHtml = function (data) {
541 + var html = '<object data="' + data.source1 + '" width="' + data.width + '" height="' + data.height + '" type="application/x-shockwave-flash">';
542 + if (data.poster) {
543 + html += '<img src="' + data.poster + '" width="' + data.width + '" height="' + data.height + '" />';
544 + }
545 + html += '</object>';
546 + return html;
547 + };
548 + var getAudioHtml = function (data, audioTemplateCallback) {
549 + if (audioTemplateCallback) {
550 + return audioTemplateCallback(data);
551 + } else {
552 + return '<audio controls="controls" src="' + data.source1 + '">' + (data.source2 ? '\n<source src="' + data.source2 + '"' + (data.source2mime ? ' type="' + data.source2mime + '"' : '') + ' />\n' : '') + '</audio>';
553 + }
554 + };
555 + var getVideoHtml = function (data, videoTemplateCallback) {
556 + if (videoTemplateCallback) {
557 + return videoTemplateCallback(data);
558 + } else {
559 + return '<video width="' + data.width + '" height="' + data.height + '"' + (data.poster ? ' poster="' + data.poster + '"' : '') + ' controls="controls">\n' + '<source src="' + data.source1 + '"' + (data.source1mime ? ' type="' + data.source1mime + '"' : '') + ' />\n' + (data.source2 ? '<source src="' + data.source2 + '"' + (data.source2mime ? ' type="' + data.source2mime + '"' : '') + ' />\n' : '') + '</video>';
560 + }
561 + };
562 + var getScriptHtml = function (data) {
563 + return '<script src="' + data.source1 + '"></script>';
564 + };
565 + var dataToHtml = function (editor, dataIn) {
566 + var data = global$2.extend({}, dataIn);
567 + if (!data.source1) {
568 + global$2.extend(data, HtmlToData.htmlToData(Settings.getScripts(editor), data.embed));
569 + if (!data.source1) {
570 + return '';
571 + }
572 + }
573 + if (!data.source2) {
574 + data.source2 = '';
575 + }
576 + if (!data.poster) {
577 + data.poster = '';
578 + }
579 + data.source1 = editor.convertURL(data.source1, 'source');
580 + data.source2 = editor.convertURL(data.source2, 'source');
581 + data.source1mime = Mime.guess(data.source1);
582 + data.source2mime = Mime.guess(data.source2);
583 + data.poster = editor.convertURL(data.poster, 'poster');
584 + var pattern = matchPattern(data.source1);
585 + if (pattern) {
586 + data.source1 = pattern.url;
587 + data.type = pattern.type;
588 + data.allowFullscreen = pattern.allowFullscreen;
589 + data.width = data.width || pattern.w;
590 + data.height = data.height || pattern.h;
591 + }
592 + if (data.embed) {
593 + return UpdateHtml.updateHtml(data.embed, data, true);
594 + } else {
595 + var videoScript = VideoScript.getVideoScriptMatch(Settings.getScripts(editor), data.source1);
596 + if (videoScript) {
597 + data.type = 'script';
598 + data.width = videoScript.width;
599 + data.height = videoScript.height;
600 + }
601 + var audioTemplateCallback = Settings.getAudioTemplateCallback(editor);
602 + var videoTemplateCallback = Settings.getVideoTemplateCallback(editor);
603 + data.width = data.width || 300;
604 + data.height = data.height || 150;
605 + global$2.each(data, function (value, key) {
606 + data[key] = editor.dom.encode(value);
607 + });
608 + if (data.type === 'iframe') {
609 + return getIframeHtml(data);
610 + } else if (data.source1mime === 'application/x-shockwave-flash') {
611 + return getFlashHtml(data);
612 + } else if (data.source1mime.indexOf('audio') !== -1) {
613 + return getAudioHtml(data, audioTemplateCallback);
614 + } else if (data.type === 'script') {
615 + return getScriptHtml(data);
616 + } else {
617 + return getVideoHtml(data, videoTemplateCallback);
618 + }
619 + }
620 + };
621 + var DataToHtml = { dataToHtml: dataToHtml };
622 +
623 + var cache = {};
624 + var embedPromise = function (data, dataToHtml, handler) {
625 + return new global$5(function (res, rej) {
626 + var wrappedResolve = function (response) {
627 + if (response.html) {
628 + cache[data.source1] = response;
629 + }
630 + return res({
631 + url: data.source1,
632 + html: response.html ? response.html : dataToHtml(data)
633 + });
634 + };
635 + if (cache[data.source1]) {
636 + wrappedResolve(cache[data.source1]);
637 + } else {
638 + handler({ url: data.source1 }, wrappedResolve, rej);
639 + }
640 + });
641 + };
642 + var defaultPromise = function (data, dataToHtml) {
643 + return new global$5(function (res) {
644 + res({
645 + html: dataToHtml(data),
646 + url: data.source1
647 + });
648 + });
649 + };
650 + var loadedData = function (editor) {
651 + return function (data) {
652 + return DataToHtml.dataToHtml(editor, data);
653 + };
654 + };
655 + var getEmbedHtml = function (editor, data) {
656 + var embedHandler = Settings.getUrlResolver(editor);
657 + return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor));
658 + };
659 + var isCached = function (url) {
660 + return cache.hasOwnProperty(url);
661 + };
662 + var Service = {
663 + getEmbedHtml: getEmbedHtml,
664 + isCached: isCached
665 + };
666 +
667 + var trimPx$1 = function (value) {
668 + return value.replace(/px$/, '');
669 + };
670 + var addPx$1 = function (value) {
671 + return /^[0-9.]+$/.test(value) ? value + 'px' : value;
672 + };
673 + var getSize = function (name) {
674 + return function (elm) {
675 + return elm ? trimPx$1(elm.style[name]) : '';
676 + };
677 + };
678 + var setSize = function (name) {
679 + return function (elm, value) {
680 + if (elm) {
681 + elm.style[name] = addPx$1(value);
682 + }
683 + };
684 + };
685 + var Size = {
686 + getMaxWidth: getSize('maxWidth'),
687 + getMaxHeight: getSize('maxHeight'),
688 + setMaxWidth: setSize('maxWidth'),
689 + setMaxHeight: setSize('maxHeight')
690 + };
691 +
692 + var doSyncSize = function (widthCtrl, heightCtrl) {
693 + widthCtrl.state.set('oldVal', widthCtrl.value());
694 + heightCtrl.state.set('oldVal', heightCtrl.value());
695 + };
696 + var doSizeControls = function (win, f) {
697 + var widthCtrl = win.find('#width')[0];
698 + var heightCtrl = win.find('#height')[0];
699 + var constrained = win.find('#constrain')[0];
700 + if (widthCtrl && heightCtrl && constrained) {
701 + f(widthCtrl, heightCtrl, constrained.checked());
702 + }
703 + };
704 + var doUpdateSize = function (widthCtrl, heightCtrl, isContrained) {
705 + var oldWidth = widthCtrl.state.get('oldVal');
706 + var oldHeight = heightCtrl.state.get('oldVal');
707 + var newWidth = widthCtrl.value();
708 + var newHeight = heightCtrl.value();
709 + if (isContrained && oldWidth && oldHeight && newWidth && newHeight) {
710 + if (newWidth !== oldWidth) {
711 + newHeight = Math.round(newWidth / oldWidth * newHeight);
712 + if (!isNaN(newHeight)) {
713 + heightCtrl.value(newHeight);
714 + }
715 + } else {
716 + newWidth = Math.round(newHeight / oldHeight * newWidth);
717 + if (!isNaN(newWidth)) {
718 + widthCtrl.value(newWidth);
719 + }
720 + }
721 + }
722 + doSyncSize(widthCtrl, heightCtrl);
723 + };
724 + var syncSize = function (win) {
725 + doSizeControls(win, doSyncSize);
726 + };
727 + var updateSize = function (win) {
728 + doSizeControls(win, doUpdateSize);
729 + };
730 + var createUi = function (onChange) {
731 + var recalcSize = function () {
732 + onChange(function (win) {
733 + updateSize(win);
734 + });
735 + };
736 + return {
737 + type: 'container',
738 + label: 'Dimensions',
739 + layout: 'flex',
740 + align: 'center',
741 + spacing: 5,
742 + items: [
743 + {
744 + name: 'width',
745 + type: 'textbox',
746 + maxLength: 5,
747 + size: 5,
748 + onchange: recalcSize,
749 + ariaLabel: 'Width'
750 + },
751 + {
752 + type: 'label',
753 + text: 'x'
754 + },
755 + {
756 + name: 'height',
757 + type: 'textbox',
758 + maxLength: 5,
759 + size: 5,
760 + onchange: recalcSize,
761 + ariaLabel: 'Height'
762 + },
763 + {
764 + name: 'constrain',
765 + type: 'checkbox',
766 + checked: true,
767 + text: 'Constrain proportions'
768 + }
769 + ]
770 + };
771 + };
772 + var SizeManager = {
773 + createUi: createUi,
774 + syncSize: syncSize,
775 + updateSize: updateSize
776 + };
777 +
778 + var embedChange = global$1.ie && global$1.ie <= 8 ? 'onChange' : 'onInput';
779 + var handleError = function (editor) {
780 + return function (error) {
781 + var errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.';
782 + editor.notificationManager.open({
783 + type: 'error',
784 + text: errorMessage
785 + });
786 + };
787 + };
788 + var getData = function (editor) {
789 + var element = editor.selection.getNode();
790 + var dataEmbed = element.getAttribute('data-ephox-embed-iri');
791 + if (dataEmbed) {
792 + return {
793 + 'source1': dataEmbed,
794 + 'data-ephox-embed-iri': dataEmbed,
795 + 'width': Size.getMaxWidth(element),
796 + 'height': Size.getMaxHeight(element)
797 + };
798 + }
799 + return element.getAttribute('data-mce-object') ? HtmlToData.htmlToData(Settings.getScripts(editor), editor.serializer.serialize(element, { selection: true })) : {};
800 + };
801 + var getSource = function (editor) {
802 + var elm = editor.selection.getNode();
803 + if (elm.getAttribute('data-mce-object') || elm.getAttribute('data-ephox-embed-iri')) {
804 + return editor.selection.getContent();
805 + }
806 + };
807 + var addEmbedHtml = function (win, editor) {
808 + return function (response) {
809 + var html = response.html;
810 + var embed = win.find('#embed')[0];
811 + var data = global$2.extend(HtmlToData.htmlToData(Settings.getScripts(editor), html), { source1: response.url });
812 + win.fromJSON(data);
813 + if (embed) {
814 + embed.value(html);
815 + SizeManager.updateSize(win);
816 + }
817 + };
818 + };
819 + var selectPlaceholder = function (editor, beforeObjects) {
820 + var i;
821 + var y;
822 + var afterObjects = editor.dom.select('img[data-mce-object]');
823 + for (i = 0; i < beforeObjects.length; i++) {
824 + for (y = afterObjects.length - 1; y >= 0; y--) {
825 + if (beforeObjects[i] === afterObjects[y]) {
826 + afterObjects.splice(y, 1);
827 + }
828 + }
829 + }
830 + editor.selection.select(afterObjects[0]);
831 + };
832 + var handleInsert = function (editor, html) {
833 + var beforeObjects = editor.dom.select('img[data-mce-object]');
834 + editor.insertContent(html);
835 + selectPlaceholder(editor, beforeObjects);
836 + editor.nodeChanged();
837 + };
838 + var submitForm = function (win, editor) {
839 + var data = win.toJSON();
840 + data.embed = UpdateHtml.updateHtml(data.embed, data);
841 + if (data.embed && Service.isCached(data.source1)) {
842 + handleInsert(editor, data.embed);
843 + } else {
844 + Service.getEmbedHtml(editor, data).then(function (response) {
845 + handleInsert(editor, response.html);
846 + }).catch(handleError(editor));
847 + }
848 + };
849 + var populateMeta = function (win, meta) {
850 + global$2.each(meta, function (value, key) {
851 + win.find('#' + key).value(value);
852 + });
853 + };
854 + var showDialog = function (editor) {
855 + var win;
856 + var data;
857 + var generalFormItems = [{
858 + name: 'source1',
859 + type: 'filepicker',
860 + filetype: 'media',
861 + size: 40,
862 + autofocus: true,
863 + label: 'Source',
864 + onpaste: function () {
865 + setTimeout(function () {
866 + Service.getEmbedHtml(editor, win.toJSON()).then(addEmbedHtml(win, editor)).catch(handleError(editor));
867 + }, 1);
868 + },
869 + onchange: function (e) {
870 + Service.getEmbedHtml(editor, win.toJSON()).then(addEmbedHtml(win, editor)).catch(handleError(editor));
871 + populateMeta(win, e.meta);
872 + },
873 + onbeforecall: function (e) {
874 + e.meta = win.toJSON();
875 + }
876 + }];
877 + var advancedFormItems = [];
878 + var reserialise = function (update) {
879 + update(win);
880 + data = win.toJSON();
881 + win.find('#embed').value(UpdateHtml.updateHtml(data.embed, data));
882 + };
883 + if (Settings.hasAltSource(editor)) {
884 + advancedFormItems.push({
885 + name: 'source2',
886 + type: 'filepicker',
887 + filetype: 'media',
888 + size: 40,
889 + label: 'Alternative source'
890 + });
891 + }
892 + if (Settings.hasPoster(editor)) {
893 + advancedFormItems.push({
894 + name: 'poster',
895 + type: 'filepicker',
896 + filetype: 'image',
897 + size: 40,
898 + label: 'Poster'
899 + });
900 + }
901 + if (Settings.hasDimensions(editor)) {
902 + var control = SizeManager.createUi(reserialise);
903 + generalFormItems.push(control);
904 + }
905 + data = getData(editor);
906 + var embedTextBox = {
907 + id: 'mcemediasource',
908 + type: 'textbox',
909 + flex: 1,
910 + name: 'embed',
911 + value: getSource(editor),
912 + multiline: true,
913 + rows: 5,
914 + label: 'Source'
915 + };
916 + var updateValueOnChange = function () {
917 + data = global$2.extend({}, HtmlToData.htmlToData(Settings.getScripts(editor), this.value()));
918 + this.parent().parent().fromJSON(data);
919 + };
920 + embedTextBox[embedChange] = updateValueOnChange;
921 + var body = [
922 + {
923 + title: 'General',
924 + type: 'form',
925 + items: generalFormItems
926 + },
927 + {
928 + title: 'Embed',
929 + type: 'container',
930 + layout: 'flex',
931 + direction: 'column',
932 + align: 'stretch',
933 + padding: 10,
934 + spacing: 10,
935 + items: [
936 + {
937 + type: 'label',
938 + text: 'Paste your embed code below:',
939 + forId: 'mcemediasource'
940 + },
941 + embedTextBox
942 + ]
943 + }
944 + ];
945 + if (advancedFormItems.length > 0) {
946 + body.push({
947 + title: 'Advanced',
948 + type: 'form',
949 + items: advancedFormItems
950 + });
951 + }
952 + win = editor.windowManager.open({
953 + title: 'Insert/edit media',
954 + data: data,
955 + bodyType: 'tabpanel',
956 + body: body,
957 + onSubmit: function () {
958 + SizeManager.updateSize(win);
959 + submitForm(win, editor);
960 + }
961 + });
962 + SizeManager.syncSize(win);
963 + };
964 + var Dialog = { showDialog: showDialog };
965 +
966 + var get$1 = function (editor) {
967 + var showDialog = function () {
968 + Dialog.showDialog(editor);
969 + };
970 + return { showDialog: showDialog };
971 + };
972 + var Api = { get: get$1 };
973 +
974 + var register = function (editor) {
975 + var showDialog = function () {
976 + Dialog.showDialog(editor);
977 + };
978 + editor.addCommand('mceMedia', showDialog);
979 + };
980 + var Commands = { register: register };
981 +
982 + var global$8 = tinymce.util.Tools.resolve('tinymce.html.Node');
983 +
984 + var sanitize = function (editor, html) {
985 + if (Settings.shouldFilterHtml(editor) === false) {
986 + return html;
987 + }
988 + var writer = global$7();
989 + var blocked;
990 + global$4({
991 + validate: false,
992 + allow_conditional_comments: false,
993 + special: 'script,noscript',
994 + comment: function (text) {
995 + writer.comment(text);
996 + },
997 + cdata: function (text) {
998 + writer.cdata(text);
999 + },
1000 + text: function (text, raw) {
1001 + writer.text(text, raw);
1002 + },
1003 + start: function (name, attrs, empty) {
1004 + blocked = true;
1005 + if (name === 'script' || name === 'noscript' || name === 'svg') {
1006 + return;
1007 + }
1008 + for (var i = attrs.length - 1; i >= 0; i--) {
1009 + var attrName = attrs[i].name;
1010 + if (attrName.indexOf('on') === 0) {
1011 + delete attrs.map[attrName];
1012 + attrs.splice(i, 1);
1013 + }
1014 + if (attrName === 'style') {
1015 + attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name);
1016 + }
1017 + }
1018 + writer.start(name, attrs, empty);
1019 + blocked = false;
1020 + },
1021 + end: function (name) {
1022 + if (blocked) {
1023 + return;
1024 + }
1025 + writer.end(name);
1026 + }
1027 + }, global$6({})).parse(html);
1028 + return writer.getContent();
1029 + };
1030 + var Sanitize = { sanitize: sanitize };
1031 +
1032 + var createPlaceholderNode = function (editor, node) {
1033 + var placeHolder;
1034 + var name = node.name;
1035 + placeHolder = new global$8('img', 1);
1036 + placeHolder.shortEnded = true;
1037 + retainAttributesAndInnerHtml(editor, node, placeHolder);
1038 + placeHolder.attr({
1039 + 'width': node.attr('width') || '300',
1040 + 'height': node.attr('height') || (name === 'audio' ? '30' : '150'),
1041 + 'style': node.attr('style'),
1042 + 'src': global$1.transparentSrc,
1043 + 'data-mce-object': name,
1044 + 'class': 'mce-object mce-object-' + name
1045 + });
1046 + return placeHolder;
1047 + };
1048 + var createPreviewIframeNode = function (editor, node) {
1049 + var previewWrapper;
1050 + var previewNode;
1051 + var shimNode;
1052 + var name = node.name;
1053 + previewWrapper = new global$8('span', 1);
1054 + previewWrapper.attr({
1055 + 'contentEditable': 'false',
1056 + 'style': node.attr('style'),
1057 + 'data-mce-object': name,
1058 + 'class': 'mce-preview-object mce-object-' + name
1059 + });
1060 + retainAttributesAndInnerHtml(editor, node, previewWrapper);
1061 + previewNode = new global$8(name, 1);
1062 + previewNode.attr({
1063 + src: node.attr('src'),
1064 + allowfullscreen: node.attr('allowfullscreen'),
1065 + style: node.attr('style'),
1066 + class: node.attr('class'),
1067 + width: node.attr('width'),
1068 + height: node.attr('height'),
1069 + frameborder: '0'
1070 + });
1071 + shimNode = new global$8('span', 1);
1072 + shimNode.attr('class', 'mce-shim');
1073 + previewWrapper.append(previewNode);
1074 + previewWrapper.append(shimNode);
1075 + return previewWrapper;
1076 + };
1077 + var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) {
1078 + var attrName;
1079 + var attrValue;
1080 + var attribs;
1081 + var ai;
1082 + var innerHtml;
1083 + attribs = sourceNode.attributes;
1084 + ai = attribs.length;
1085 + while (ai--) {
1086 + attrName = attribs[ai].name;
1087 + attrValue = attribs[ai].value;
1088 + if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') {
1089 + if (attrName === 'data' || attrName === 'src') {
1090 + attrValue = editor.convertURL(attrValue, attrName);
1091 + }
1092 + targetNode.attr('data-mce-p-' + attrName, attrValue);
1093 + }
1094 + }
1095 + innerHtml = sourceNode.firstChild && sourceNode.firstChild.value;
1096 + if (innerHtml) {
1097 + targetNode.attr('data-mce-html', escape(Sanitize.sanitize(editor, innerHtml)));
1098 + targetNode.firstChild = null;
1099 + }
1100 + };
1101 + var isWithinEphoxEmbed = function (node) {
1102 + while (node = node.parent) {
1103 + if (node.attr('data-ephox-embed-iri')) {
1104 + return true;
1105 + }
1106 + }
1107 + return false;
1108 + };
1109 + var placeHolderConverter = function (editor) {
1110 + return function (nodes) {
1111 + var i = nodes.length;
1112 + var node;
1113 + var videoScript;
1114 + while (i--) {
1115 + node = nodes[i];
1116 + if (!node.parent) {
1117 + continue;
1118 + }
1119 + if (node.parent.attr('data-mce-object')) {
1120 + continue;
1121 + }
1122 + if (node.name === 'script') {
1123 + videoScript = VideoScript.getVideoScriptMatch(Settings.getScripts(editor), node.attr('src'));
1124 + if (!videoScript) {
1125 + continue;
1126 + }
1127 + }
1128 + if (videoScript) {
1129 + if (videoScript.width) {
1130 + node.attr('width', videoScript.width.toString());
1131 + }
1132 + if (videoScript.height) {
1133 + node.attr('height', videoScript.height.toString());
1134 + }
1135 + }
1136 + if (node.name === 'iframe' && Settings.hasLiveEmbeds(editor) && global$1.ceFalse) {
1137 + if (!isWithinEphoxEmbed(node)) {
1138 + node.replace(createPreviewIframeNode(editor, node));
1139 + }
1140 + } else {
1141 + if (!isWithinEphoxEmbed(node)) {
1142 + node.replace(createPlaceholderNode(editor, node));
1143 + }
1144 + }
1145 + }
1146 + };
1147 + };
1148 + var Nodes = {
1149 + createPreviewIframeNode: createPreviewIframeNode,
1150 + createPlaceholderNode: createPlaceholderNode,
1151 + placeHolderConverter: placeHolderConverter
1152 + };
1153 +
1154 + var setup = function (editor) {
1155 + editor.on('preInit', function () {
1156 + var specialElements = editor.schema.getSpecialElements();
1157 + global$2.each('video audio iframe object'.split(' '), function (name) {
1158 + specialElements[name] = new RegExp('</' + name + '[^>]*>', 'gi');
1159 + });
1160 + var boolAttrs = editor.schema.getBoolAttrs();
1161 + global$2.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) {
1162 + boolAttrs[name] = {};
1163 + });
1164 + editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', Nodes.placeHolderConverter(editor));
1165 + editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) {
1166 + var i = nodes.length;
1167 + var node;
1168 + var realElm;
1169 + var ai;
1170 + var attribs;
1171 + var innerHtml;
1172 + var innerNode;
1173 + var realElmName;
1174 + var className;
1175 + while (i--) {
1176 + node = nodes[i];
1177 + if (!node.parent) {
1178 + continue;
1179 + }
1180 + realElmName = node.attr(name);
1181 + realElm = new global$8(realElmName, 1);
1182 + if (realElmName !== 'audio' && realElmName !== 'script') {
1183 + className = node.attr('class');
1184 + if (className && className.indexOf('mce-preview-object') !== -1) {
1185 + realElm.attr({
1186 + width: node.firstChild.attr('width'),
1187 + height: node.firstChild.attr('height')
1188 + });
1189 + } else {
1190 + realElm.attr({
1191 + width: node.attr('width'),
1192 + height: node.attr('height')
1193 + });
1194 + }
1195 + }
1196 + realElm.attr({ style: node.attr('style') });
1197 + attribs = node.attributes;
1198 + ai = attribs.length;
1199 + while (ai--) {
1200 + var attrName = attribs[ai].name;
1201 + if (attrName.indexOf('data-mce-p-') === 0) {
1202 + realElm.attr(attrName.substr(11), attribs[ai].value);
1203 + }
1204 + }
1205 + if (realElmName === 'script') {
1206 + realElm.attr('type', 'text/javascript');
1207 + }
1208 + innerHtml = node.attr('data-mce-html');
1209 + if (innerHtml) {
1210 + innerNode = new global$8('#text', 3);
1211 + innerNode.raw = true;
1212 + innerNode.value = Sanitize.sanitize(editor, unescape(innerHtml));
1213 + realElm.append(innerNode);
1214 + }
1215 + node.replace(realElm);
1216 + }
1217 + });
1218 + });
1219 + editor.on('setContent', function () {
1220 + editor.$('span.mce-preview-object').each(function (index, elm) {
1221 + var $elm = editor.$(elm);
1222 + if ($elm.find('span.mce-shim', elm).length === 0) {
1223 + $elm.append('<span class="mce-shim"></span>');
1224 + }
1225 + });
1226 + });
1227 + };
1228 + var FilterContent = { setup: setup };
1229 +
1230 + var setup$1 = function (editor) {
1231 + editor.on('ResolveName', function (e) {
1232 + var name;
1233 + if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) {
1234 + e.name = name;
1235 + }
1236 + });
1237 + };
1238 + var ResolveName = { setup: setup$1 };
1239 +
1240 + var setup$2 = function (editor) {
1241 + editor.on('click keyup', function () {
1242 + var selectedNode = editor.selection.getNode();
1243 + if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) {
1244 + if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) {
1245 + selectedNode.setAttribute('data-mce-selected', '2');
1246 + }
1247 + }
1248 + });
1249 + editor.on('ObjectSelected', function (e) {
1250 + var objectType = e.target.getAttribute('data-mce-object');
1251 + if (objectType === 'audio' || objectType === 'script') {
1252 + e.preventDefault();
1253 + }
1254 + });
1255 + editor.on('objectResized', function (e) {
1256 + var target = e.target;
1257 + var html;
1258 + if (target.getAttribute('data-mce-object')) {
1259 + html = target.getAttribute('data-mce-html');
1260 + if (html) {
1261 + html = unescape(html);
1262 + target.setAttribute('data-mce-html', escape(UpdateHtml.updateHtml(html, {
1263 + width: e.width,
1264 + height: e.height
1265 + })));
1266 + }
1267 + }
1268 + });
1269 + };
1270 + var Selection = { setup: setup$2 };
1271 +
1272 + var register$1 = function (editor) {
1273 + editor.addButton('media', {
1274 + tooltip: 'Insert/edit media',
1275 + cmd: 'mceMedia',
1276 + stateSelector: [
1277 + 'img[data-mce-object]',
1278 + 'span[data-mce-object]',
1279 + 'div[data-ephox-embed-iri]'
1280 + ]
1281 + });
1282 + editor.addMenuItem('media', {
1283 + icon: 'media',
1284 + text: 'Media',
1285 + cmd: 'mceMedia',
1286 + context: 'insert',
1287 + prependToContext: true
1288 + });
1289 + };
1290 + var Buttons = { register: register$1 };
1291 +
1292 + global.add('media', function (editor) {
1293 + Commands.register(editor);
1294 + Buttons.register(editor);
1295 + ResolveName.setup(editor);
1296 + FilterContent.setup(editor);
1297 + Selection.setup(editor);
1298 + return Api.get(editor);
1299 + });
1300 + function Plugin () {
1301 + }
1302 +
1303 + return Plugin;
1304 +
1305 + }());
1306 + })();
1307 +