]> err.no Git - scalable-opengroupware.org/blob - UI/WebServerResources/UIxMailEditor.js
fd8d1e7da3779379fc3a20a5ef9b12d42675faa6
[scalable-opengroupware.org] / UI / WebServerResources / UIxMailEditor.js
1 var contactSelectorAction = 'mailer-contacts';
2
3 function onContactAdd() {
4   var selector = null;
5   var selectorURL = '?popup=YES&selectorId=mailer-contacts';
6  
7   urlstr = ApplicationBaseURL;
8   if (urlstr[urlstr.length-1] != '/')
9     urlstr += '/';
10   urlstr += ("../../" + UserLogin + "/Contacts/"
11              + contactSelectorAction + selectorURL);
12   var w = window.open(urlstr, "Addressbook",
13                       "width=640,height=400,resizable=1,scrollbars=0");
14   w.selector = selector;
15   w.opener = this;
16   w.focus();
17
18   return false;
19 }
20
21 function addContact(tag, fullContactName, contactId, contactName, contactEmail) {
22   if (!mailIsRecipient(contactEmail)) {
23     var neededOptionValue = 0;
24     if (tag == "cc")
25       neededOptionValue = 1;
26     else if (tag == "bcc")
27       neededOptionValue = 2;
28
29     var stop = false;
30     var counter = 0;
31     var currentRow = $('row_' + counter);
32     while (currentRow && !stop) {
33       var currentValue = $(currentRow.childNodesWithTag("span")[1]).childNodesWithTag("input")[0].value;
34       if (currentValue == neededOptionValue) {
35         stop = true;
36         insertContact($("addr_" + counter), contactName, contactEmail);
37       }
38       counter++;
39       currentRow = $('row_' + counter);
40     }
41
42     if (!stop) {
43       fancyAddRow(false, "");
44       $("row_" + counter).childNodesWithTag("span")[0].childNodesWithTag("select")[0].value
45         = neededOptionValue;
46       insertContact($("addr_" + counter), contactName, contactEmail);
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 (!UIxRecipientSelectorHasRecipients())
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   var toolbar = document.getElementById("toolbar");
236   if (!document.busyAnim)
237     document.busyAnim = startAnimation(toolbar);
238
239   window.shouldPreserve = true;
240   document.pageform.action = "save";
241   document.pageform.submit();
242
243   refreshMailbox();
244   return false;
245 }
246
247 function initMailEditor() {
248   var list = $("attachments");
249   $(list).attachMenu("attachmentsMenu");
250   var elements = list.childNodesWithTag("li");
251   for (var i = 0; i < elements.length; i++) {
252     Event.observe(elements[i], "click",
253                   onRowClick.bindAsEventListener(elements[i]));
254   }
255
256   var listContent = $("attachments").childNodesWithTag("li");
257   if (listContent.length > 0)
258     $("attachmentsArea").setStyle({ display: "block" });
259
260   onWindowResize(null);
261   Event.observe(window, "resize", onWindowResize);
262   Event.observe(window, "beforeunload", onMailEditorClose);
263 }
264
265 function getMenus() {
266   return { "attachmentsMenu": new Array(null, onRemoveAttachments,
267                                         onSelectAllAttachments,
268                                         "-",
269                                         onAddAttachment, null) };
270 }
271
272 function onRemoveAttachments() {
273   var list = $("attachments");
274   var nodes = list.getSelectedNodes();
275   for (var i = nodes.length-1; i > -1; i--) {
276     var input = $(nodes[i]).node;
277     if (input) {
278       input.parentNode.removeChild(input);
279       list.removeChild(nodes[i]);
280     }
281     else {
282       var filename = "";
283       var childNodes = nodes[i].childNodes;
284       for (var j = 0; j < childNodes.length; j++) {
285         if (childNodes[j].nodeType == 3)
286           filename += childNodes[j].nodeValue;
287       }
288       var url = "" + window.location;
289       var parts = url.split("/");
290       parts[parts.length-1] = "deleteAttachment?filename=" + encodeURIComponent(filename);
291       url = parts.join("/");
292       triggerAjaxRequest(url, attachmentDeleteCallback,
293                          nodes[i]);
294     }
295   }
296 }
297
298 function attachmentDeleteCallback(http) {
299   if (http.readyState == 4) {
300     if (isHttpStatus204(http.status)) {
301       var node = http.callbackData;
302       node.parentNode.removeChild(node);
303     }
304     else
305       log("attachmentDeleteCallback: an error occured: " + http.responseText);
306   }
307 }
308
309 function onSelectAllAttachments() {
310   var list = $("attachments");
311   var nodes = list.childNodesWithTag("li");
312   for (var i = 0; i < nodes.length; i++)
313     nodes[i].select();
314 }
315
316 function onWindowResize(event) {
317   var textarea = document.pageform.text;
318   var rowheight = (Element.getHeight(textarea) / textarea.rows);
319   var headerarea = $("headerArea");
320
321   // Set textarea position
322   textarea.setStyle({ 'top': (headerarea.getHeight() + headerarea.offsetTop) + 'px' });
323
324   var textareaoffset = textarea.offsetTop;
325
326   // Resize the textarea (message content)
327   textarea.rows = Math.round((window.height() - textareaoffset) / rowheight);
328   
329   var attachmentsarea = $("attachmentsArea");
330   var attachmentswidth = 0;
331   if (attachmentsarea.style.display)
332     attachmentswidth = attachmentsarea.getWidth();
333   var subjectfield = $(document).getElementsByClassName('headerField',
334                                                         $('subjectRow'))[0];
335   var subjectinput = $(document).getElementsByClassName('textField',
336                                                         $('subjectRow'))[0];
337
338   // Resize subject field
339   subjectinput.setStyle({ width: (window.width()
340                                   - $(subjectfield).getWidth()
341                                   - attachmentswidth
342                                   - 4 - 30) + 'px' });
343
344   // Resize address fields
345   var addresslist = $('addressList');
346   var firstselect = document.getElementsByClassName('headerField', addresslist)[0];
347   var inputwidth = ($(this).width() - $(firstselect).getWidth()
348                     - attachmentswidth - 24 - 30);
349   var addresses = document.getElementsByClassName('textField', addresslist);
350   for (var i = 0; i < addresses.length; i++)
351     addresses[i].setStyle({ width: inputwidth + 'px' });
352 }
353
354 function onMailEditorClose(event) {
355   if (window.shouldPreserve)
356     window.shouldPreserve = false;
357   else {
358     var url = "" + window.location;
359     var parts = url.split("/");
360     parts[parts.length-1] = "delete";
361     url = parts.join("/");
362     http = createHTTPClient();
363     http.open("POST", url, false /* not async */);
364     http.send("");
365   }
366
367   Event.stopObserving(window, "beforeunload", onMailEditorClose);
368 }
369
370 addEvent(window, 'load', initMailEditor);