Merge remote-tracking branch 'upstream/4.6' into 4.6-master-2015-10-21-12-07-36
[civicrm-core.git] / js / wysiwyg / crm.ckeditor.js
1 // https://civicrm.org/licensing
2 (function($, _) {
3 var scriptLoaded = false;
4
5 function getInstance(item) {
6 var name = $(item).attr("name"),
7 id = $(item).attr("id");
8 if (name && CKEDITOR.instances[name]) {
9 return CKEDITOR.instances[name];
10 }
11 if (id && CKEDITOR.instances[id]) {
12 return CKEDITOR.instances[id];
13 }
14 }
15
16 function loadScript(url) {
17 var deferred = $.Deferred(),
18 script = document.createElement('script');
19 script.onload = function() {deferred.resolve();};
20 script.src = url;
21 document.getElementsByTagName("head")[0].appendChild(script);
22 return deferred;
23 }
24
25 CRM.wysiwyg.supportsFileUploads = true;
26
27 CRM.wysiwyg.create = function(item) {
28 var deferred = $.Deferred();
29
30 function onReady() {
31 var debounce,
32 editor = this;
33
34 editor.on('focus', function() {
35 $(item).trigger('focus');
36 });
37 editor.on('blur', function() {
38 editor.updateElement();
39 $(item).trigger("blur");
40 $(item).trigger("change");
41 });
42 editor.on('insertText', function() {
43 $(item).trigger("keypress");
44 });
45 _.each(['key', 'pasteState'], function(evName) {
46 editor.on(evName, function(evt) {
47 if (debounce) clearTimeout(debounce);
48 debounce = setTimeout(function() {
49 editor.updateElement();
50 $(item).trigger("change");
51 }, 50);
52 });
53 });
54 editor.on('pasteState', function() {
55 $(item).trigger("paste");
56 });
57 // Hide CiviCRM menubar when editor is fullscreen
58 editor.on('maximize', function (e) {
59 $('#civicrm-menu').toggle(e.data === 2);
60 });
61 deferred.resolve();
62 }
63
64 function initialize() {
65 var
66 browseUrl = CRM.config.resourceBase + "packages/kcfinder/browse.php?cms=civicrm",
67 uploadUrl = CRM.config.resourceBase + "packages/kcfinder/upload.php?cms=civicrm";
68
69 CKEDITOR.replace($(item)[0], {
70 filebrowserBrowseUrl: browseUrl + '&type=files',
71 filebrowserImageBrowseUrl: browseUrl + '&type=images',
72 filebrowserFlashBrowseUrl: browseUrl + '&type=flash',
73 filebrowserUploadUrl: uploadUrl + '&type=files',
74 filebrowserImageUploadUrl: uploadUrl + '&type=images',
75 filebrowserFlashUploadUrl: uploadUrl + '&type=flash',
76 customConfig: CRM.config.CKEditorCustomConfig,
77 on: {
78 instanceReady: onReady
79 }
80 });
81 }
82
83 if ($(item).length) {
84 // Lazy-load ckeditor.js
85 if (window.CKEDITOR) {
86 initialize();
87 } else {
88 if (scriptLoaded === false) {
89 scriptLoaded = loadScript(CRM.config.resourceBase + 'bower_components/ckeditor/ckeditor.js');
90 }
91 scriptLoaded.done(initialize);
92 }
93 } else {
94 deferred.reject();
95 }
96 return deferred;
97 };
98
99 CRM.wysiwyg.destroy = function(item) {
100 var editor = getInstance(item);
101 if (editor) {
102 editor.destroy();
103 }
104 };
105
106 CRM.wysiwyg.updateElement = function(item) {
107 var editor = getInstance(item);
108 if (editor) {
109 editor.updateElement();
110 }
111 };
112
113 CRM.wysiwyg.getVal = function(item) {
114 var editor = getInstance(item);
115 if (editor) {
116 return editor.getData();
117 } else {
118 return $(item).val();
119 }
120 };
121
122 CRM.wysiwyg.setVal = function(item, val) {
123 var editor = getInstance(item);
124 if (editor) {
125 return editor.setData(val);
126 } else {
127 return $(item).val(val);
128 }
129 };
130
131 CRM.wysiwyg.insert = function(item, text) {
132 var editor = getInstance(item);
133 if (editor) {
134 editor.insertText(text);
135 } else {
136 CRM.wysiwyg._insertIntoTextarea(item, text);
137 }
138 };
139
140 CRM.wysiwyg.focus = function(item) {
141 var editor = getInstance(item);
142 if (editor) {
143 editor.focus();
144 } else {
145 $(item).focus();
146 }
147 };
148
149 })(CRM.$, CRM._);