1 define(function(require) {
7 var $ = require('libs/jquery'),
8 _ = require('libs/underscore'),
9 genericElement = require('modules/documentCanvas/canvas/genericElement'),
10 Dialog = require('views/dialog/dialog'),
11 boxTemplate = require('libs/text!./box.html'),
12 attachments = require('views/attachments/attachments'),
13 linkElement = Object.create(genericElement);
15 function videoParser(url) {
16 var youtubeId = youtubeParser(url);
18 return {'videoProvider': 'youtube', 'videoId': youtubeId}
20 var vimeoId = vimeoParser(url);
22 return {'videoProvider': 'vimeo', 'videoId': vimeoId}
26 function youtubeParser(url) {
27 var regExp = /^.*(?:youtu.be\/|v\/|\/u\/\w\/|embed\/|\?v=|&v=|shared\?ci=)([^#&?]*).*/;
28 var match = url.match(regExp);
29 return (match && match[1].length === 11) ? match[1] : false;
32 function vimeoParser(url) {
33 var regExp = /https?:\/\/(www\.)?vimeo.com\/(\d+)($|\/)/;
34 var match = url.match(regExp);
35 return match? match[2]: false;
38 _.extend(linkElement, {
40 genericElement.init.call(this);
41 _.bindAll(this, 'changeLink', 'deleteLink');
43 var linkText = this.wlxmlNode.getAttr('src') || '',
44 linkUrl = this.getUrl(linkText);
46 this.refreshLink(linkUrl);
48 this.box = $(_.template(boxTemplate)({text: linkText, url: linkUrl}));
49 this.box.find('.change').on('click', this.changeLink);
50 this.box.find('.delete').on('click', this.deleteLink);
52 this.addWidget(this.box);
54 onStateChange: function(changes) {
55 genericElement.onStateChange.call(this, changes);
56 if(_.isBoolean(changes.active)) {
57 this.box.toggle(changes.active);
60 onNodeAttrChange: function(event) {
61 if(event.meta.attr === 'src') {
62 var link = this.box.find('[link]');
63 link.text(event.meta.newVal);
64 var linkUrl = this.getUrl(event.meta.newVal);
65 link.attr('href', linkUrl);
66 this.refreshLink(linkUrl);
70 refreshLink: function(linkUrl) {
71 this._container().find('iframe').remove();
72 var videoData = videoParser(linkUrl);
75 if (videoData.videoProvider === 'youtube') {
76 videoFrame = '<iframe width="480" height="270" src="//www.youtube.com/embed/' + videoData.videoId +
77 '?controls=2&rel=0&showinfo=0&theme=light" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>';
78 } else if (videoData.videoProvider === 'vimeo') {
79 videoFrame = '<iframe src="//player.vimeo.com/video/' + videoData.videoId +
80 '" width="480" height="270" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>';
82 this._container().text('');
83 this._container().append($(videoFrame));
85 this._container().text(gettext('No video. Click here to add link to your video'));
89 changeLink: function(e) {
91 dialog = Dialog.create({
92 title: gettext('Edit video url'),
93 executeButtonText: gettext('Apply'),
94 cancelButtonText: gettext('Cancel'),
97 label: gettext('YouTube or Vimeo link'),
100 initialValue: el.wlxmlNode.getAttr('src'),
103 return this.wlxmlNode.document.getLinkForUrl(text);
111 dialog.on('execute', function(event) {
112 var videoData = videoParser(event.formData.src);
113 el.wlxmlNode.document.transaction(function() {
114 el.wlxmlNode.setAttr('src', event.formData.src);
115 el.wlxmlNode.setAttr('videoid', videoData.videoId);
116 el.wlxmlNode.setAttr('provider', videoData.videoProvider);
120 description: gettext('Edit video url')
121 //fragment: doc.createFragment(doc.CaretFragment, {node: el.wlxmlNode.contents()[0], offset:offset})
123 success: function() {
124 //el.canvas.select(doc.createFragment(doc.CaretFragment, {node: el.wlxmlNode.contents()[0], offset:offset}));
129 $(".attachment-library", dialog.$el).on('click', function() {
130 attachments.select(function(v) {$("input", dialog.$el).val(v);});
135 deleteLink: function() {
138 el.wlxmlNode.document.transaction(function() {
139 el.wlxmlNode.detach();
142 description: gettext('Remove link')
147 getUrl: function(link) {
148 var pattern = /^[a-z]*:\/\//g;
149 if(!pattern.test(link) && !/^\//.test(link)) {
150 link = 'http://' + link;
152 return this.wlxmlNode.document.getUrlForLink(link);