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);
16 _.extend(linkElement, {
18 genericElement.init.call(this);
19 _.bindAll(this, 'changeLink', 'deleteLink');
21 var linkText = this.wlxmlNode.getAttr('src') || '',
22 linkUrl = this.getUrl(linkText);
24 this.refreshLink(linkUrl);
26 this.box = $(_.template(boxTemplate)({text: linkText, url: linkUrl}));
27 this.box.find('.change').on('click', this.changeLink);
28 this.box.find('.delete').on('click', this.deleteLink);
30 this.addWidget(this.box);
32 onStateChange: function(changes) {
33 genericElement.onStateChange.call(this, changes);
34 if(_.isBoolean(changes.active)) {
35 this.box.toggle(changes.active);
38 onNodeAttrChange: function(event) {
39 if(event.meta.attr === 'src') {
40 var link = this.box.find('[link]');
41 link.text(event.meta.newVal);
42 var linkUrl = this.getUrl(event.meta.newVal);
43 link.attr('href', linkUrl);
44 this.refreshLink(linkUrl);
48 refreshLink: function(linkUrl) {
49 this._container().text('');
51 this._container().text('');
52 this._container().attr('style', 'background-image: url(\'' + linkUrl + '\');');
54 this._container().text(gettext('No image. Click here to add image'));
58 changeLink: function(e) {
60 //doc = this.wlxmlNode.document,
61 //offset = el.canvas.getSelection().toDocumentFragment().offset,
62 dialog = Dialog.create({
63 title: gettext('Edit image'),
64 executeButtonText: gettext('Apply'),
65 cancelButtonText: gettext('Cancel'),
67 {label: gettext('Image'), name: 'src', type: 'input', initialValue: el.wlxmlNode.getAttr('src'),
68 prePasteHandler: function(text) {
69 return this.wlxmlNode.document.getLinkForUrl(text);
71 description: '<a href="#-" class="attachment-library">' + gettext('attachment library') + '</a>'
78 dialog.on('execute', function(event) {
79 el.wlxmlNode.document.transaction(function() {
80 el.wlxmlNode.setAttr('src', event.formData.src);
84 description: gettext('Edit image')
85 //fragment: doc.createFragment(doc.CaretFragment, {node: el.wlxmlNode.contents()[0], offset:offset})
88 //el.canvas.select(doc.createFragment(doc.CaretFragment, {node: el.wlxmlNode.contents()[0], offset:offset}));
93 $(".attachment-library", dialog.$el).on('click', function() {
94 attachments.select(function(v) {$("input", dialog.$el).val(v);});
99 deleteLink: function() {
101 doc = this.wlxmlNode.document;
103 el.wlxmlNode.document.transaction(function() {
104 //var f = el.canvas.getSelection().toDocumentFragment(),
108 //if(el.wlxmlNode.isPrecededByTextNode()) {
109 // prefLen = el.wlxmlNode.prev().getText().length;
112 //ret = el.wlxmlNode.unwrapContent();
113 //return doc.createFragment(doc.CaretFragment, {node: ret.element1, offset: prefLen + f.offset});
114 el.wlxmlNode.detach();
117 description: gettext('Remove link')
122 getUrl: function(link) {
123 var pattern = /^[a-z]*:\/\//g;
124 if(!pattern.test(link) && !/^\//.test(link)) {
125 link = 'http://' + link;
127 return this.wlxmlNode.document.getUrlForLink(link);