CRM-18257: fullPage configuration option
[civicrm-core.git] / js / wysiwyg / crm.ckeditor.js
CommitLineData
b608cfb1
TC
1// https://civicrm.org/licensing
2(function($, _) {
80ab9d76 3 var scriptLoaded = false;
183473a2 4
b608cfb1 5 function getInstance(item) {
f91b1c0c
CW
6 var name = $(item).attr("name"),
7 id = $(item).attr("id");
5f005e5d 8 if (name && window.CKEDITOR && CKEDITOR.instances[name]) {
c62731c3
TC
9 return CKEDITOR.instances[name];
10 }
5f005e5d 11 if (id && window.CKEDITOR && CKEDITOR.instances[id]) {
c62731c3
TC
12 return CKEDITOR.instances[id];
13 }
b608cfb1 14 }
183473a2 15
80ab9d76
CW
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
c90cd6ed 25 CRM.wysiwyg.supportsFileUploads = true;
183473a2 26
f91b1c0c 27 CRM.wysiwyg.create = function(item) {
183473a2 28 var deferred = $.Deferred();
80ab9d76 29
183473a2
CW
30 function onReady() {
31 var debounce,
32 editor = this;
33
13d9bc82
CW
34 editor.on('focus', function() {
35 $(item).trigger('focus');
36 });
c62731c3
TC
37 editor.on('blur', function() {
38 editor.updateElement();
7c523661 39 $(item).trigger("blur");
f91b1c0c 40 $(item).trigger("change");
7c523661 41 });
c62731c3
TC
42 editor.on('insertText', function() {
43 $(item).trigger("keypress");
44 });
e4d81a60 45 _.each(['key', 'pasteState'], function(evName) {
6633d03f
TO
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 });
c62731c3
TC
54 editor.on('pasteState', function() {
55 $(item).trigger("paste");
56 });
9cc08ac2
CW
57 // Hide CiviCRM menubar when editor is fullscreen
58 editor.on('maximize', function (e) {
59 $('#civicrm-menu').toggle(e.data === 2);
60 });
183473a2
CW
61 deferred.resolve();
62 }
63
64 function initialize() {
65 var
dc662c39
CW
66 browseUrl = CRM.config.resourceBase + "packages/kcfinder/browse.php?cms=civicrm",
67 uploadUrl = CRM.config.resourceBase + "packages/kcfinder/upload.php?cms=civicrm";
183473a2 68
9db15279
CW
69 $(item).addClass('crm-wysiwyg-enabled');
70
629fcb04
J
71 var isFullPage = false;
72 if ($(item).hasClass('crm-wysiwyg-fullpage')) {
73 isFullPage = true;
74 }
75
183473a2
CW
76 CKEDITOR.replace($(item)[0], {
77 filebrowserBrowseUrl: browseUrl + '&type=files',
78 filebrowserImageBrowseUrl: browseUrl + '&type=images',
79 filebrowserFlashBrowseUrl: browseUrl + '&type=flash',
80 filebrowserUploadUrl: uploadUrl + '&type=files',
81 filebrowserImageUploadUrl: uploadUrl + '&type=images',
82 filebrowserFlashUploadUrl: uploadUrl + '&type=flash',
c4a27c4a 83 allowedContent: true, // For CiviMail!
629fcb04 84 fullPage: isFullPage,
183473a2
CW
85 customConfig: CRM.config.CKEditorCustomConfig,
86 on: {
87 instanceReady: onReady
88 }
89 });
90 }
9db15279
CW
91
92 if ($(item).hasClass('crm-wysiwyg-enabled')) {
93 deferred.resolve();
94 }
95 else if ($(item).length) {
80ab9d76
CW
96 // Lazy-load ckeditor.js
97 if (window.CKEDITOR) {
98 initialize();
99 } else {
100 if (scriptLoaded === false) {
dc662c39 101 scriptLoaded = loadScript(CRM.config.resourceBase + 'bower_components/ckeditor/ckeditor.js');
80ab9d76
CW
102 }
103 scriptLoaded.done(initialize);
104 }
c63f9bfb
CW
105 } else {
106 deferred.reject();
7c523661 107 }
c63f9bfb 108 return deferred;
7c523661 109 };
183473a2 110
7c523661 111 CRM.wysiwyg.destroy = function(item) {
9db15279 112 $(item).removeClass('crm-wysiwyg-enabled');
7c523661
TC
113 var editor = getInstance(item);
114 if (editor) {
115 editor.destroy();
116 }
117 };
183473a2 118
7c523661
TC
119 CRM.wysiwyg.updateElement = function(item) {
120 var editor = getInstance(item);
121 if (editor) {
122 editor.updateElement();
123 }
124 };
183473a2 125
c62731c3 126 CRM.wysiwyg.getVal = function(item) {
7c523661
TC
127 var editor = getInstance(item);
128 if (editor) {
129 return editor.getData();
130 } else {
131 return $(item).val();
132 }
133 };
183473a2 134
c62731c3
TC
135 CRM.wysiwyg.setVal = function(item, val) {
136 var editor = getInstance(item);
137 if (editor) {
138 return editor.setData(val);
139 } else {
140 return $(item).val(val);
141 }
142 };
183473a2 143
c62731c3 144 CRM.wysiwyg.insert = function(item, text) {
7c523661
TC
145 var editor = getInstance(item);
146 if (editor) {
147 editor.insertText(text);
c62731c3 148 } else {
f91b1c0c 149 CRM.wysiwyg._insertIntoTextarea(item, text);
7c523661
TC
150 }
151 };
80ab9d76 152
c62731c3 153 CRM.wysiwyg.focus = function(item) {
7c523661
TC
154 var editor = getInstance(item);
155 if (editor) {
c62731c3 156 editor.focus();
f91b1c0c
CW
157 } else {
158 $(item).focus();
7c523661 159 }
b608cfb1 160 };
c62731c3 161
b608cfb1 162})(CRM.$, CRM._);