Merge pull request #7063 from monishdeb/CRM-17434
[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 && window.CKEDITOR && CKEDITOR.instances[name]) {
9 return CKEDITOR.instances[name];
10 }
11 if (id && window.CKEDITOR && 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 $(item).addClass('crm-wysiwyg-enabled');
70
71 CKEDITOR.replace($(item)[0], {
72 filebrowserBrowseUrl: browseUrl + '&type=files',
73 filebrowserImageBrowseUrl: browseUrl + '&type=images',
74 filebrowserFlashBrowseUrl: browseUrl + '&type=flash',
75 filebrowserUploadUrl: uploadUrl + '&type=files',
76 filebrowserImageUploadUrl: uploadUrl + '&type=images',
77 filebrowserFlashUploadUrl: uploadUrl + '&type=flash',
78 customConfig: CRM.config.CKEditorCustomConfig,
79 on: {
80 instanceReady: onReady
81 }
82 });
83 }
84
85 if ($(item).hasClass('crm-wysiwyg-enabled')) {
86 deferred.resolve();
87 }
88 else if ($(item).length) {
89 // Lazy-load ckeditor.js
90 if (window.CKEDITOR) {
91 initialize();
92 } else {
93 if (scriptLoaded === false) {
94 scriptLoaded = loadScript(CRM.config.resourceBase + 'bower_components/ckeditor/ckeditor.js');
95 }
96 scriptLoaded.done(initialize);
97 }
98 } else {
99 deferred.reject();
100 }
101 return deferred;
102 };
103
104 CRM.wysiwyg.destroy = function(item) {
105 $(item).removeClass('crm-wysiwyg-enabled');
106 var editor = getInstance(item);
107 if (editor) {
108 editor.destroy();
109 }
110 };
111
112 CRM.wysiwyg.updateElement = function(item) {
113 var editor = getInstance(item);
114 if (editor) {
115 editor.updateElement();
116 }
117 };
118
119 CRM.wysiwyg.getVal = function(item) {
120 var editor = getInstance(item);
121 if (editor) {
122 return editor.getData();
123 } else {
124 return $(item).val();
125 }
126 };
127
128 CRM.wysiwyg.setVal = function(item, val) {
129 var editor = getInstance(item);
130 if (editor) {
131 return editor.setData(val);
132 } else {
133 return $(item).val(val);
134 }
135 };
136
137 CRM.wysiwyg.insert = function(item, text) {
138 var editor = getInstance(item);
139 if (editor) {
140 editor.insertText(text);
141 } else {
142 CRM.wysiwyg._insertIntoTextarea(item, text);
143 }
144 };
145
146 CRM.wysiwyg.focus = function(item) {
147 var editor = getInstance(item);
148 if (editor) {
149 editor.focus();
150 } else {
151 $(item).focus();
152 }
153 };
154
155 })(CRM.$, CRM._);