63a102e4ab69b720085b1c55281ba70907630443
[WebKit-https.git] / Websites / bugs.webkit.org / js / attachment.js
1 /* The contents of this file are subject to the Mozilla Public
2  * License Version 1.1 (the "License"); you may not use this file
3  * except in compliance with the License. You may obtain a copy of
4  * the License at http://www.mozilla.org/MPL/
5  *
6  * Software distributed under the License is distributed on an "AS
7  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
8  * implied. See the License for the specific language governing
9  * rights and limitations under the License.
10  *
11  * The Original Code is the Bugzilla Bug Tracking System.
12  *
13  * The Initial Developer of the Original Code is Netscape Communications
14  * Corporation. Portions created by Netscape are
15  * Copyright (C) 1998 Netscape Communications Corporation. All
16  * Rights Reserved.
17  *
18  * Contributor(s): Myk Melez <myk@mozilla.org>
19  *                 Joel Peshkin <bugreport@peshkin.net>
20  *                 Erik Stambaugh <erik@dasbistro.com>
21  *                 Marc Schumann <wurblzap@gmail.com>
22  *                 Guy Pyrzak <guy.pyrzak@gmail.com>
23  */
24
25 function validateAttachmentForm(theform) {
26     var desc_value = YAHOO.lang.trim(theform.description.value);
27     if (desc_value == '') {
28         alert(BUGZILLA.string.attach_desc_required);
29         return false;
30     }
31     return true;
32 }
33
34 function updateCommentPrivacy(checkbox) {
35     var text_elem = document.getElementById('comment');
36     if (checkbox.checked) {
37         text_elem.className='bz_private';
38     } else {
39         text_elem.className='';
40     }
41 }
42
43 function setContentTypeDisabledState(form)
44 {
45     var isdisabled = false;
46     if (form.ispatch.checked)
47         isdisabled = true;
48
49     for (var i=0 ; i<form.contenttypemethod.length ; i++)
50         form.contenttypemethod[i].disabled = isdisabled;
51
52     form.contenttypeselection.disabled = isdisabled;
53     form.contenttypeentry.disabled = isdisabled;
54
55 // if WEBKIT_CHANGES
56     if (isdisabled) {
57         document.getElementById('legal').style.display = "table-row";
58         var createButton = document.getElementById('create');
59         if (createButton && createButton.value == "Submit")
60             createButton.value = "Agree and Submit";
61         else {
62             var commitButton = document.getElementById('commit');
63             if (commitButton && commitButton.value == "Submit Bug")
64                 commitButton.value = "Agree and Submit Bug";
65         }
66     } else {
67         var createButton = document.getElementById('create');
68         if (createButton && createButton.value == "Agree and Submit")
69             createButton.value = "Submit";
70         else {
71             var commitButton = document.getElementById('commit');
72             if (commitButton && commitButton.value == "Agree and Submit Bug")
73                 commitButton.value = "Submit Bug";
74         }
75         document.getElementById('legal').style.display = "none";
76     }
77 // endif WEBKIT_CHANGES
78 }
79
80 function TextFieldHandler() {
81     var field_text = document.getElementById("attach_text");
82     var greyfields = new Array("data", "ispatch", "autodetect",
83                                "list", "manual", "contenttypeselection",
84                                "contenttypeentry");
85     var i, thisfield;
86     if (field_text.value.match(/^\s*$/)) {
87         for (i = 0; i < greyfields.length; i++) {
88             thisfield = document.getElementById(greyfields[i]);
89             if (thisfield) {
90                 thisfield.removeAttribute("disabled");
91             }
92         }
93     } else {
94         for (i = 0; i < greyfields.length; i++) {
95             thisfield = document.getElementById(greyfields[i]);
96             if (thisfield) {
97                 thisfield.setAttribute("disabled", "disabled");
98             }
99         }
100     }
101 }
102
103 function DataFieldHandler() {
104     var field_data = document.getElementById("data");
105     var greyfields = new Array("attach_text");
106     var i, thisfield;
107     if (field_data.value.match(/^\s*$/)) {
108         for (i = 0; i < greyfields.length; i++) {
109             thisfield = document.getElementById(greyfields[i]);
110             if (thisfield) {
111                 thisfield.removeAttribute("disabled");
112             }
113         }
114     } else {
115         for (i = 0; i < greyfields.length; i++) {
116             thisfield = document.getElementById(greyfields[i]);
117             if (thisfield) {
118                 thisfield.setAttribute("disabled", "disabled");
119             }
120         }
121     }
122 }
123
124 function clearAttachmentFields() {
125     var element;
126
127     document.getElementById('data').value = '';
128     DataFieldHandler();
129     if ((element = document.getElementById('attach_text'))) {
130         element.value = '';
131         TextFieldHandler();
132     }
133     document.getElementById('description').value = '';
134     /* Fire onchange so that the disabled state of the content-type
135      * radio buttons are also reset 
136      */
137     element = document.getElementById('ispatch');
138     element.checked = '';
139     bz_fireEvent(element, 'change');
140     if ((element = document.getElementById('isprivate')))
141         element.checked = '';
142 }
143
144 /* Functions used when viewing patches in Diff mode. */
145
146 function collapse_all() {
147   var elem = document.checkboxform.firstChild;
148   while (elem != null) {
149     if (elem.firstChild != null) {
150       var tbody = elem.firstChild.nextSibling;
151       if (tbody.className == 'file') {
152         tbody.className = 'file_collapse';
153         twisty = get_twisty_from_tbody(tbody);
154         twisty.firstChild.nodeValue = '(+)';
155         twisty.nextSibling.checked = false;
156       }
157     }
158     elem = elem.nextSibling;
159   }
160   return false;
161 }
162
163 function expand_all() {
164   var elem = document.checkboxform.firstChild;
165   while (elem != null) {
166     if (elem.firstChild != null) {
167       var tbody = elem.firstChild.nextSibling;
168       if (tbody.className == 'file_collapse') {
169         tbody.className = 'file';
170         twisty = get_twisty_from_tbody(tbody);
171         twisty.firstChild.nodeValue = '(-)';
172         twisty.nextSibling.checked = true;
173       }
174     }
175     elem = elem.nextSibling;
176   }
177   return false;
178 }
179
180 var current_restore_elem;
181
182 function restore_all() {
183   current_restore_elem = null;
184   incremental_restore();
185 }
186
187 function incremental_restore() {
188   if (!document.checkboxform.restore_indicator.checked) {
189     return;
190   }
191   var next_restore_elem;
192   if (current_restore_elem) {
193     next_restore_elem = current_restore_elem.nextSibling;
194   } else {
195     next_restore_elem = document.checkboxform.firstChild;
196   }
197   while (next_restore_elem != null) {
198     current_restore_elem = next_restore_elem;
199     if (current_restore_elem.firstChild != null) {
200       restore_elem(current_restore_elem.firstChild.nextSibling);
201     }
202     next_restore_elem = current_restore_elem.nextSibling;
203   }
204 }
205
206 function restore_elem(elem, alertme) {
207   if (elem.className == 'file_collapse') {
208     twisty = get_twisty_from_tbody(elem);
209     if (twisty.nextSibling.checked) {
210       elem.className = 'file';
211       twisty.firstChild.nodeValue = '(-)';
212     }
213   } else if (elem.className == 'file') {
214     twisty = get_twisty_from_tbody(elem);
215     if (!twisty.nextSibling.checked) {
216       elem.className = 'file_collapse';
217       twisty.firstChild.nodeValue = '(+)';
218     }
219   }
220 }
221
222 function twisty_click(twisty) {
223   tbody = get_tbody_from_twisty(twisty);
224   if (tbody.className == 'file') {
225     tbody.className = 'file_collapse';
226     twisty.firstChild.nodeValue = '(+)';
227     twisty.nextSibling.checked = false;
228   } else {
229     tbody.className = 'file';
230     twisty.firstChild.nodeValue = '(-)';
231     twisty.nextSibling.checked = true;
232   }
233   return false;
234 }
235
236 function get_tbody_from_twisty(twisty) {
237   return twisty.parentNode.parentNode.parentNode.nextSibling;
238 }
239 function get_twisty_from_tbody(tbody) {
240   return tbody.previousSibling.firstChild.nextSibling.firstChild.firstChild;
241 }
242
243 var prev_mode = 'raw';
244 var current_mode = 'raw';
245 var has_edited = 0;
246 var has_viewed_as_diff = 0;
247 // if WEBKIT_CHANGES
248 var viewing_formatted_diff = false;
249 // endif WEBKIT_CHANGES
250 function editAsComment(patchviewerinstalled)
251 {
252     switchToMode('edit', patchviewerinstalled);
253     has_edited = 1;
254 }
255 function undoEditAsComment(patchviewerinstalled)
256 {
257     switchToMode(prev_mode, patchviewerinstalled);
258 }
259 function redoEditAsComment(patchviewerinstalled)
260 {
261     switchToMode('edit', patchviewerinstalled);
262 }
263
264 // if WEBKIT_CHANGES
265 function viewPrettyPatch(attachment_id)
266 {
267     viewing_formatted_diff = !viewing_formatted_diff;
268     var src = "attachment.cgi?id=" . $attachment_id;
269     var buttonText = "View Formatted Diff";
270     if (viewing_formatted_diff) {
271       src += "&action=prettypatch"
272       buttonText = "View Plain Diff";
273     }
274
275     document.getElementById('viewFrame').src = src;
276     document.getElementById('viewPrettyPatchButton').innerHTML = buttonText;
277 }
278 // endif WEBKIT_CHANGES
279
280 function viewDiff(attachment_id, patchviewerinstalled)
281 {
282     switchToMode('diff', patchviewerinstalled);
283
284     // If we have not viewed as diff before, set the view diff frame URL
285     if (!has_viewed_as_diff) {
286       var viewDiffFrame = document.getElementById('viewDiffFrame');
287       viewDiffFrame.src =
288           'attachment.cgi?id=' + attachment_id + '&action=diff&headers=0';
289       has_viewed_as_diff = 1;
290     }
291 }
292
293 function viewRaw(patchviewerinstalled)
294 {
295     switchToMode('raw', patchviewerinstalled);
296 }
297
298 function switchToMode(mode, patchviewerinstalled)
299 {
300     if (mode == current_mode) {
301       alert('switched to same mode!  This should not happen.');
302       return;
303     }
304
305     // Switch out of current mode
306     if (current_mode == 'edit') {
307       hideElementById('editFrame');
308       hideElementById('undoEditButton');
309     } else if (current_mode == 'raw') {
310       hideElementById('viewFrame');
311 // if WEBKIT_CHANGES
312       hideElementById('viewPrettyPatchButton');
313 // endif WEBKIT_CHANGES
314       if (patchviewerinstalled)
315           hideElementById('viewDiffButton');
316       hideElementById(has_edited ? 'redoEditButton' : 'editButton');
317       hideElementById('smallCommentFrame');
318     } else if (current_mode == 'diff') {
319       if (patchviewerinstalled)
320           hideElementById('viewDiffFrame');
321       hideElementById('viewRawButton');
322       hideElementById(has_edited ? 'redoEditButton' : 'editButton');
323       hideElementById('smallCommentFrame');
324     }
325
326     // Switch into new mode
327     if (mode == 'edit') {
328       showElementById('editFrame');
329       showElementById('undoEditButton');
330     } else if (mode == 'raw') {
331       showElementById('viewFrame');
332 // if WEBKIT_CHANGES
333       showElementById('viewPrettyPatchButton');
334 // endif WEBKIT_CHANGES
335       if (patchviewerinstalled) 
336           showElementById('viewDiffButton');
337
338       showElementById(has_edited ? 'redoEditButton' : 'editButton');
339       showElementById('smallCommentFrame');
340     } else if (mode == 'diff') {
341       if (patchviewerinstalled) 
342         showElementById('viewDiffFrame');
343
344       showElementById('viewRawButton');
345       showElementById(has_edited ? 'redoEditButton' : 'editButton');
346       showElementById('smallCommentFrame');
347     }
348
349     prev_mode = current_mode;
350     current_mode = mode;
351 }
352
353 function hideElementById(id)
354 {
355   var elm = document.getElementById(id);
356   if (elm) {
357     YAHOO.util.Dom.addClass(elm, 'bz_default_hidden');
358   }
359 }
360
361 function showElementById(id)
362 {
363   var elm = document.getElementById(id);
364   if (elm) {
365     YAHOO.util.Dom.removeClass(elm, 'bz_default_hidden');
366   }
367 }
368
369 function normalizeComments()
370 {
371   // Remove the unused comment field from the document so its contents
372   // do not get transmitted back to the server.
373
374   var small = document.getElementById('smallCommentFrame');
375   var big = document.getElementById('editFrame');
376   if ( (small) && YAHOO.util.Dom.hasClass(small, 'bz_default_hidden') )
377   {
378     small.parentNode.removeChild(small);
379   }
380   if ( (big) && YAHOO.util.Dom.hasClass(big, 'bz_default_hidden') )
381   {
382     big.parentNode.removeChild(big);
383   }
384 }
385
386 function toggle_attachment_details_visibility ( ) 
387 {
388     // show hide classes
389     var container = document.getElementById('attachment_info');
390     if( YAHOO.util.Dom.hasClass(container, 'read') ){
391         YAHOO.util.Dom.replaceClass(container, 'read', 'edit');
392     }else{
393         YAHOO.util.Dom.replaceClass(container, 'edit', 'read');
394     }
395 }
396
397 /* Used in bug/create.html.tmpl to show/hide the attachment field. */
398
399 function handleWantsAttachment(wants_attachment) {
400     if (wants_attachment) {
401         hideElementById('attachment_false');
402         showElementById('attachment_true');
403     }
404     else {
405         showElementById('attachment_false');
406         hideElementById('attachment_true');
407         clearAttachmentFields();
408     }
409 }