]> err.no Git - scalable-opengroupware.org/blob - UI/WebServerResources/UIxMailEditor.js
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1271 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / WebServerResources / UIxMailEditor.js
1 var contactSelectorAction = 'mailer-contacts';
2 var signatureLength = 0;
3
4 function onContactAdd() {
5   var selector = null;
6   var selectorURL = '?popup=YES&selectorId=mailer-contacts';
7  
8   urlstr = ApplicationBaseURL 
9     + "../Contacts/"
10     + contactSelectorAction + selectorURL;
11   var w = window.open(urlstr, "Addressbook",
12                       "width=640,height=400,resizable=1,scrollbars=0");
13   w.selector = selector;
14   w.opener = this;
15   w.focus();
16
17   return false;
18 }
19
20 function addContact(tag, fullContactName, contactId, contactName, contactEmail) {
21   if (!mailIsRecipient(contactEmail)) {
22     var neededOptionValue = 0;
23     if (tag == "cc")
24       neededOptionValue = 1;
25     else if (tag == "bcc")
26       neededOptionValue = 2;
27
28     var stop = false;
29     var counter = 0;
30     var currentRow = $('row_' + counter);
31     while (currentRow && !stop) {
32       var currentValue = $(currentRow.childNodesWithTag("td")[1]).childNodesWithTag("input")[0].value;
33       if (currentValue == neededOptionValue) {
34         stop = true;
35         insertContact($("addr_" + counter), contactName, contactEmail);
36       }
37       counter++;
38       currentRow = $('row_' + counter);
39     }
40
41     if (!stop) {
42       fancyAddRow(false, "");
43       $($("row_" + counter).childNodesWithTag("td")[0]).childNodesWithTag("select")[0].value
44         = neededOptionValue;
45       insertContact($("addr_" + counter), contactName, contactEmail);
46       onWindowResize(null);
47     }
48   }
49 }
50
51 function mailIsRecipient(mailto) {
52   var isRecipient = false;
53
54   var counter = 0;
55   var currentRow = $('row_' + counter);
56
57   var email = extractEmailAddress(mailto).toUpperCase();
58
59   while (currentRow && !isRecipient) {
60     var currentValue = $("addr_"+counter).value.toUpperCase();
61     if (currentValue.indexOf(email) > -1)
62       isRecipient = true;
63     else
64       {
65         counter++;
66         currentRow = $('row_' + counter);
67       }
68   }
69
70   return isRecipient;
71 }
72
73 function insertContact(inputNode, contactName, contactEmail) {
74   var value = '' + inputNode.value;
75
76   var newContact = contactName;
77   if (newContact.length > 0)
78     newContact += ' <' + contactEmail + '>';
79   else
80     newContact = contactEmail;
81
82   if (value.length > 0)
83     value += ", ";
84   value += newContact;
85
86   inputNode.value = value;
87 }
88
89 function toggleAttachments() {
90   var div = $("attachmentsArea");
91   if (div.style.display)
92     div.style.display = "";
93   else
94     div.style.display = "block;";
95
96   return false;
97 }
98
99 function updateInlineAttachmentList(sender, attachments) {
100   var count = 0;
101
102   var div = $("attachmentsArea");
103   if (attachments)
104     count = attachments.length;
105   if (count)
106     {
107       var text  = "";
108       for (var i = 0; i < count; i++) {
109         text = text + attachments[i];
110         text = text + '<br />';
111       }
112
113       var e = $('compose_attachments_list');
114       e.innerHTML = text;
115       if (!div.style.display)
116         div.style.display = "block;";
117     }
118   else
119     div.style.display = "";
120 }
121 /* mail editor */
122
123 function validateEditorInput(sender) {
124   var errortext = "";
125   var field;
126    
127   field = document.pageform.subject;
128   if (field.value == "")
129     errortext = errortext + labels["error_missingsubject"] + "\n";
130
131   if (!hasRecipients())
132     errortext = errortext + labels["error_missingrecipients"] + "\n";
133    
134   if (errortext.length > 0) {
135     alert(labels["error_validationfailed"] + ":\n" + errortext);
136     return false;
137   }
138
139   return true;
140 }
141
142 function clickedEditorSend(sender) {
143   if (!validateEditorInput(sender))
144     return false;
145
146   var input = currentAttachmentInput();
147   if (input)
148     input.parentNode.removeChild(input);
149
150   var toolbar = document.getElementById("toolbar");
151   if (!document.busyAnim)
152     document.busyAnim = startAnimation(toolbar);
153    
154   window.shouldPreserve = true;
155   document.pageform.action = "send";
156   document.pageform.submit();
157
158   return false;
159 }
160
161 function currentAttachmentInput() {
162   var input = null;
163
164   var inputs = $("attachmentsArea").getElementsByTagName("input");
165   var i = 0;
166   while (!input && i < inputs.length)
167     if ($(inputs[i]).hasClassName("currentAttachment"))
168       input = inputs[i];
169     else
170       i++;
171
172   return input;
173 }
174
175 function clickedEditorAttach(sender) {
176   var input = currentAttachmentInput();
177   if (!input) {
178     var area = $("attachmentsArea");
179
180     if (!area.style.display) {
181       area.setStyle({ display: "block" });
182       onWindowResize(null);
183     }
184     var inputs = area.getElementsByTagName("input");
185     var attachmentName = "attachment" + inputs.length;
186     var newAttachment = createElement("input", attachmentName,
187                                       "currentAttachment", null,
188                                       { type: "file",
189                                         name: attachmentName },
190                                       area);
191     Event.observe(newAttachment, "change",
192                   onAttachmentChange.bindAsEventListener(newAttachment));
193   }
194
195   return false;
196 }
197
198 function onAddAttachment() {
199   return clickedEditorAttach(null);
200 }
201
202 function onAttachmentChange(event) {
203   if (this.value == "")
204     this.parentNode.removeChild(this);
205   else {
206     this.addClassName("attachment");
207     this.removeClassName("currentAttachment");
208     var list = $("attachments");
209     createAttachment(this, list);
210   }
211 }
212
213 function createAttachment(node, list) {
214   var attachment = createElement("li", null, null, { node: node }, null, list);
215   createElement("img", null, null, { src: ResourcesURL + "/attachment.gif" },
216                 null, attachment);
217   Event.observe(attachment, "click", onRowClick);
218
219   var filename = node.value;
220   var separator;
221   if (navigator.appVersion.indexOf("Windows") > -1)
222     separator = "\\";
223   else
224     separator = "/";
225   var fileArray = filename.split(separator);
226   var attachmentName = document.createTextNode(fileArray[fileArray.length-1]);
227   attachment.appendChild(attachmentName);
228 }
229
230 function clickedEditorSave(sender) {
231   var input = currentAttachmentInput();
232   if (input)
233     input.parentNode.removeChild(input);
234
235   window.shouldPreserve = true;
236   document.pageform.action = "save";
237   document.pageform.submit();
238
239   if (window.opener && window.open && !window.closed)
240     window.opener.refreshFolderByType('draft');
241   return false;
242 }
243
244 function onTextFocus() {
245   this.insertBefore(document.createTextNode("\r\n"),
246                     this.lastChild);
247   if (signatureLength > 0) {
248     var length = this.getValue().length - signatureLength - 1;
249     this.setSelectionRange(length, length);
250   }
251   Event.stopObserving(this, "focus", onTextFocus);
252 }
253
254 function initMailEditor() {
255   var list = $("attachments");
256   $(list).attachMenu("attachmentsMenu");
257   var elements = list.childNodesWithTag("li");
258   for (var i = 0; i < elements.length; i++) {
259     Event.observe(elements[i], "click",
260                   onRowClick.bindAsEventListener(elements[i]));
261   }
262
263   var listContent = $("attachments").childNodesWithTag("li");
264   if (listContent.length > 0)
265     $("attachmentsArea").setStyle({ display: "block" });
266
267   var list = $("addressList");
268   TableKit.Resizable.init(list, {'trueResize' : true, 'keepWidth' : true});
269
270   var textarea = $("text");
271   var textContent = textarea.getValue();
272   var sigLimit = textContent.lastIndexOf("--");
273   if (sigLimit > -1)
274     signatureLength = (textContent.length - sigLimit);
275   Event.observe(textarea, "focus",
276                 onTextFocus.bindAsEventListener(textarea));
277
278   onWindowResize(null);
279   Event.observe(window, "resize", onWindowResize);
280   Event.observe(window, "beforeunload", onMailEditorClose);
281 }
282
283 function getMenus() {
284   return { "attachmentsMenu": new Array(null, onRemoveAttachments,
285                                         onSelectAllAttachments,
286                                         "-",
287                                         onAddAttachment, null) };
288 }
289
290 function onRemoveAttachments() {
291   var list = $("attachments");
292   var nodes = list.getSelectedNodes();
293   for (var i = nodes.length-1; i > -1; i--) {
294     var input = $(nodes[i]).node;
295     if (input) {
296       input.parentNode.removeChild(input);
297       list.removeChild(nodes[i]);
298     }
299     else {
300       var filename = "";
301       var childNodes = nodes[i].childNodes;
302       for (var j = 0; j < childNodes.length; j++) {
303         if (childNodes[j].nodeType == 3)
304           filename += childNodes[j].nodeValue;
305       }
306       var url = "" + window.location;
307       var parts = url.split("/");
308       parts[parts.length-1] = "deleteAttachment?filename=" + encodeURIComponent(filename);
309       url = parts.join("/");
310       triggerAjaxRequest(url, attachmentDeleteCallback,
311                          nodes[i]);
312     }
313   }
314 }
315
316 function attachmentDeleteCallback(http) {
317   if (http.readyState == 4) {
318     if (isHttpStatus204(http.status)) {
319       var node = http.callbackData;
320       node.parentNode.removeChild(node);
321     }
322     else
323       log("attachmentDeleteCallback: an error occured: " + http.responseText);
324   }
325 }
326
327 function onSelectAllAttachments() {
328   var list = $("attachments");
329   var nodes = list.childNodesWithTag("li");
330   for (var i = 0; i < nodes.length; i++)
331     nodes[i].select();
332 }
333
334 function onWindowResize(event) {
335   var textarea = document.pageform.text;
336   var rowheight = (Element.getHeight(textarea) / textarea.rows);
337   var headerarea = $("headerArea");
338   
339   var attachmentsarea = $("attachmentsArea");
340   var attachmentswidth = 0;
341   if (attachmentsarea.style.display) {
342     attachmentswidth = attachmentsarea.getWidth();
343     // Resize of attachment list is b0rken under IE7
344 //    fromfield = $(document).getElementsByClassName('headerField',
345 //                                                 headerarea)[0];
346 //    $("attachments").setStyle({ height: (headerarea.getHeight() - fromfield.getHeight() - 10) + 'px' });
347   }
348 //  var subjectfield = $(document).getElementsByClassName('headerField',
349 //                                                      $('subjectRow'))[0];
350 //  var subjectinput = $(document).getElementsByClassName('textField',
351 //                                                      $('subjectRow'))[0];
352 //
353   // Resize subject field
354 //  subjectinput.setStyle({ width: (window.width()
355 //                                - $(subjectfield).getWidth()
356 //                                - attachmentswidth
357 //                                - 4 - 30) + 'px' });
358
359   // Resize address fields
360   var addresslist = $('addressList');
361   addresslist.setStyle({ width: ($(this).width() - attachmentswidth - 10) + 'px' });
362
363   // Set textarea position
364   textarea.setStyle({ 'top': (headerarea.getHeight() + headerarea.offsetTop) + 'px' });
365
366   var textareaoffset = textarea.offsetTop;
367
368   // Resize the textarea (message content)
369   textarea.rows = Math.round((window.height() - textareaoffset) / rowheight);
370 }
371
372 function onMailEditorClose(event) {
373   if (window.shouldPreserve)
374     window.shouldPreserve = false;
375   else {
376     if (window.opener && window.opener.open && !window.opener.closed) {
377       var url = "" + window.location;
378       var parts = url.split("/");
379       parts[parts.length-1] = "delete";
380       url = parts.join("/");
381       window.opener.deleteDraft(url);
382     }
383   }
384
385   Event.stopObserving(window, "beforeunload", onMailEditorClose);
386 }
387
388 FastInit.addOnLoad(initMailEditor);