Chris@0
|
1 /* redMine - project management software
|
Chris@0
|
2 Copyright (C) 2006-2008 Jean-Philippe Lang */
|
Chris@0
|
3
|
Chris@0
|
4 function checkAll (id, checked) {
|
Chris@0
|
5 var els = Element.descendants(id);
|
Chris@0
|
6 for (var i = 0; i < els.length; i++) {
|
Chris@0
|
7 if (els[i].disabled==false) {
|
Chris@0
|
8 els[i].checked = checked;
|
Chris@0
|
9 }
|
Chris@0
|
10 }
|
Chris@0
|
11 }
|
Chris@0
|
12
|
Chris@0
|
13 function toggleCheckboxesBySelector(selector) {
|
Chris@0
|
14 boxes = $$(selector);
|
Chris@0
|
15 var all_checked = true;
|
Chris@0
|
16 for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } }
|
Chris@0
|
17 for (i = 0; i < boxes.length; i++) { boxes[i].checked = !all_checked; }
|
Chris@0
|
18 }
|
Chris@0
|
19
|
chris@37
|
20 function setCheckboxesBySelector(checked, selector) {
|
chris@37
|
21 var boxes = $$(selector);
|
chris@37
|
22 boxes.each(function(ele) {
|
chris@37
|
23 ele.checked = checked;
|
chris@37
|
24 });
|
chris@37
|
25 }
|
chris@37
|
26
|
Chris@0
|
27 function showAndScrollTo(id, focus) {
|
Chris@0
|
28 Element.show(id);
|
Chris@0
|
29 if (focus!=null) { Form.Element.focus(focus); }
|
Chris@0
|
30 Element.scrollTo(id);
|
Chris@0
|
31 }
|
Chris@0
|
32
|
Chris@0
|
33 function toggleRowGroup(el) {
|
Chris@0
|
34 var tr = Element.up(el, 'tr');
|
Chris@0
|
35 var n = Element.next(tr);
|
Chris@0
|
36 tr.toggleClassName('open');
|
Chris@0
|
37 while (n != undefined && !n.hasClassName('group')) {
|
Chris@0
|
38 Element.toggle(n);
|
Chris@0
|
39 n = Element.next(n);
|
Chris@0
|
40 }
|
Chris@0
|
41 }
|
Chris@0
|
42
|
Chris@0
|
43 function toggleFieldset(el) {
|
Chris@0
|
44 var fieldset = Element.up(el, 'fieldset');
|
Chris@0
|
45 fieldset.toggleClassName('collapsed');
|
Chris@0
|
46 Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2});
|
Chris@0
|
47 }
|
Chris@0
|
48
|
Chris@0
|
49 var fileFieldCount = 1;
|
Chris@0
|
50
|
Chris@0
|
51 function addFileField() {
|
Chris@0
|
52 if (fileFieldCount >= 10) return false
|
Chris@0
|
53 fileFieldCount++;
|
Chris@0
|
54 var f = document.createElement("input");
|
Chris@0
|
55 f.type = "file";
|
Chris@0
|
56 f.name = "attachments[" + fileFieldCount + "][file]";
|
Chris@0
|
57 f.size = 30;
|
Chris@0
|
58 var d = document.createElement("input");
|
Chris@0
|
59 d.type = "text";
|
Chris@0
|
60 d.name = "attachments[" + fileFieldCount + "][description]";
|
Chris@0
|
61 d.size = 60;
|
Chris@1
|
62 var dLabel = new Element('label');
|
Chris@0
|
63 dLabel.addClassName('inline');
|
Chris@0
|
64 // Pulls the languge value used for Optional Description
|
Chris@0
|
65 dLabel.update($('attachment_description_label_content').innerHTML)
|
Chris@0
|
66 p = document.getElementById("attachments_fields");
|
Chris@0
|
67 p.appendChild(document.createElement("br"));
|
Chris@0
|
68 p.appendChild(f);
|
Chris@0
|
69 p.appendChild(dLabel);
|
Chris@0
|
70 dLabel.appendChild(d);
|
Chris@0
|
71
|
Chris@0
|
72 }
|
Chris@0
|
73
|
Chris@0
|
74 function showTab(name) {
|
Chris@0
|
75 var f = $$('div#content .tab-content');
|
Chris@0
|
76 for(var i=0; i<f.length; i++){
|
Chris@0
|
77 Element.hide(f[i]);
|
Chris@0
|
78 }
|
Chris@0
|
79 var f = $$('div.tabs a');
|
Chris@0
|
80 for(var i=0; i<f.length; i++){
|
Chris@0
|
81 Element.removeClassName(f[i], "selected");
|
Chris@0
|
82 }
|
Chris@0
|
83 Element.show('tab-content-' + name);
|
Chris@0
|
84 Element.addClassName('tab-' + name, "selected");
|
Chris@0
|
85 return false;
|
Chris@0
|
86 }
|
Chris@0
|
87
|
Chris@0
|
88 function moveTabRight(el) {
|
Chris@0
|
89 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
|
Chris@0
|
90 var tabsWidth = 0;
|
Chris@0
|
91 var i;
|
Chris@0
|
92 for (i=0; i<lis.length; i++) {
|
Chris@0
|
93 if (lis[i].visible()) {
|
Chris@0
|
94 tabsWidth += lis[i].getWidth() + 6;
|
Chris@0
|
95 }
|
Chris@0
|
96 }
|
Chris@0
|
97 if (tabsWidth < Element.up(el, 'div.tabs').getWidth() - 60) {
|
Chris@0
|
98 return;
|
Chris@0
|
99 }
|
Chris@0
|
100 i=0;
|
Chris@0
|
101 while (i<lis.length && !lis[i].visible()) {
|
Chris@0
|
102 i++;
|
Chris@0
|
103 }
|
Chris@0
|
104 lis[i].hide();
|
Chris@0
|
105 }
|
Chris@0
|
106
|
Chris@0
|
107 function moveTabLeft(el) {
|
Chris@0
|
108 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
|
Chris@0
|
109 var i = 0;
|
Chris@0
|
110 while (i<lis.length && !lis[i].visible()) {
|
Chris@0
|
111 i++;
|
Chris@0
|
112 }
|
Chris@0
|
113 if (i>0) {
|
Chris@0
|
114 lis[i-1].show();
|
Chris@0
|
115 }
|
Chris@0
|
116 }
|
Chris@0
|
117
|
Chris@0
|
118 function displayTabsButtons() {
|
Chris@0
|
119 var lis;
|
Chris@0
|
120 var tabsWidth = 0;
|
Chris@0
|
121 var i;
|
Chris@0
|
122 $$('div.tabs').each(function(el) {
|
Chris@0
|
123 lis = el.down('ul').childElements();
|
Chris@0
|
124 for (i=0; i<lis.length; i++) {
|
Chris@0
|
125 if (lis[i].visible()) {
|
Chris@0
|
126 tabsWidth += lis[i].getWidth() + 6;
|
Chris@0
|
127 }
|
Chris@0
|
128 }
|
Chris@0
|
129 if ((tabsWidth < el.getWidth() - 60) && (lis[0].visible())) {
|
Chris@0
|
130 el.down('div.tabs-buttons').hide();
|
Chris@0
|
131 } else {
|
Chris@0
|
132 el.down('div.tabs-buttons').show();
|
Chris@0
|
133 }
|
Chris@0
|
134 });
|
Chris@0
|
135 }
|
Chris@0
|
136
|
Chris@0
|
137 function setPredecessorFieldsVisibility() {
|
Chris@0
|
138 relationType = $('relation_relation_type');
|
Chris@0
|
139 if (relationType && (relationType.value == "precedes" || relationType.value == "follows")) {
|
Chris@0
|
140 Element.show('predecessor_fields');
|
Chris@0
|
141 } else {
|
Chris@0
|
142 Element.hide('predecessor_fields');
|
Chris@0
|
143 }
|
Chris@0
|
144 }
|
Chris@0
|
145
|
Chris@0
|
146 function promptToRemote(text, param, url) {
|
Chris@0
|
147 value = prompt(text + ':');
|
Chris@0
|
148 if (value) {
|
Chris@0
|
149 new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
|
Chris@0
|
150 return false;
|
Chris@0
|
151 }
|
Chris@0
|
152 }
|
Chris@0
|
153
|
Chris@0
|
154 function collapseScmEntry(id) {
|
Chris@0
|
155 var els = document.getElementsByClassName(id, 'browser');
|
Chris@0
|
156 for (var i = 0; i < els.length; i++) {
|
Chris@0
|
157 if (els[i].hasClassName('open')) {
|
Chris@0
|
158 collapseScmEntry(els[i].id);
|
Chris@0
|
159 }
|
Chris@0
|
160 Element.hide(els[i]);
|
Chris@0
|
161 }
|
Chris@0
|
162 $(id).removeClassName('open');
|
Chris@0
|
163 }
|
Chris@0
|
164
|
Chris@0
|
165 function expandScmEntry(id) {
|
Chris@0
|
166 var els = document.getElementsByClassName(id, 'browser');
|
Chris@0
|
167 for (var i = 0; i < els.length; i++) {
|
Chris@0
|
168 Element.show(els[i]);
|
Chris@0
|
169 if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) {
|
Chris@0
|
170 expandScmEntry(els[i].id);
|
Chris@0
|
171 }
|
Chris@0
|
172 }
|
Chris@0
|
173 $(id).addClassName('open');
|
Chris@0
|
174 }
|
Chris@0
|
175
|
Chris@0
|
176 function scmEntryClick(id) {
|
Chris@0
|
177 el = $(id);
|
Chris@0
|
178 if (el.hasClassName('open')) {
|
Chris@0
|
179 collapseScmEntry(id);
|
Chris@0
|
180 el.addClassName('collapsed');
|
Chris@0
|
181 return false;
|
Chris@0
|
182 } else if (el.hasClassName('loaded')) {
|
Chris@0
|
183 expandScmEntry(id);
|
Chris@0
|
184 el.removeClassName('collapsed');
|
Chris@0
|
185 return false;
|
Chris@0
|
186 }
|
Chris@0
|
187 if (el.hasClassName('loading')) {
|
Chris@0
|
188 return false;
|
Chris@0
|
189 }
|
Chris@0
|
190 el.addClassName('loading');
|
Chris@0
|
191 return true;
|
Chris@0
|
192 }
|
Chris@0
|
193
|
Chris@0
|
194 function scmEntryLoaded(id) {
|
Chris@0
|
195 Element.addClassName(id, 'open');
|
Chris@0
|
196 Element.addClassName(id, 'loaded');
|
Chris@0
|
197 Element.removeClassName(id, 'loading');
|
Chris@0
|
198 }
|
Chris@0
|
199
|
Chris@0
|
200 function randomKey(size) {
|
Chris@0
|
201 var chars = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
|
Chris@0
|
202 var key = '';
|
Chris@0
|
203 for (i = 0; i < size; i++) {
|
Chris@0
|
204 key += chars[Math.floor(Math.random() * chars.length)];
|
Chris@0
|
205 }
|
Chris@0
|
206 return key;
|
Chris@0
|
207 }
|
Chris@0
|
208
|
Chris@0
|
209 function observeParentIssueField(url) {
|
Chris@0
|
210 new Ajax.Autocompleter('issue_parent_issue_id',
|
Chris@0
|
211 'parent_issue_candidates',
|
Chris@0
|
212 url,
|
Chris@0
|
213 { minChars: 3,
|
Chris@0
|
214 frequency: 0.5,
|
Chris@0
|
215 paramName: 'q',
|
Chris@0
|
216 updateElement: function(value) {
|
Chris@0
|
217 document.getElementById('issue_parent_issue_id').value = value.id;
|
Chris@0
|
218 }});
|
Chris@0
|
219 }
|
Chris@0
|
220
|
Chris@117
|
221 function observeRelatedIssueField(url) {
|
Chris@117
|
222 new Ajax.Autocompleter('relation_issue_to_id',
|
Chris@117
|
223 'related_issue_candidates',
|
Chris@117
|
224 url,
|
Chris@117
|
225 { minChars: 3,
|
Chris@117
|
226 frequency: 0.5,
|
Chris@117
|
227 paramName: 'q',
|
Chris@117
|
228 updateElement: function(value) {
|
Chris@117
|
229 document.getElementById('relation_issue_to_id').value = value.id;
|
Chris@117
|
230 },
|
Chris@117
|
231 parameters: 'scope=all'
|
Chris@117
|
232 });
|
Chris@117
|
233 }
|
Chris@117
|
234
|
Chris@117
|
235 function setVisible(id, visible) {
|
Chris@117
|
236 var el = $(id);
|
Chris@117
|
237 if (el) {if (visible) {el.show();} else {el.hide();}}
|
Chris@117
|
238 }
|
Chris@117
|
239
|
Chris@117
|
240 function observeProjectModules() {
|
Chris@117
|
241 var f = function() {
|
Chris@117
|
242 /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
|
Chris@117
|
243 var c = ($('project_enabled_module_names_issue_tracking').checked == true);
|
Chris@117
|
244 setVisible('project_trackers', c);
|
Chris@117
|
245 setVisible('project_issue_custom_fields', c);
|
Chris@117
|
246 };
|
Chris@117
|
247
|
Chris@117
|
248 Event.observe(window, 'load', f);
|
Chris@117
|
249 Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
|
Chris@117
|
250 }
|
Chris@117
|
251
|
Chris@117
|
252
|
Chris@0
|
253 /* shows and hides ajax indicator */
|
Chris@0
|
254 Ajax.Responders.register({
|
Chris@0
|
255 onCreate: function(){
|
Chris@0
|
256 if ($('ajax-indicator') && Ajax.activeRequestCount > 0) {
|
Chris@0
|
257 Element.show('ajax-indicator');
|
Chris@0
|
258 }
|
Chris@0
|
259 },
|
Chris@0
|
260 onComplete: function(){
|
Chris@0
|
261 if ($('ajax-indicator') && Ajax.activeRequestCount == 0) {
|
Chris@0
|
262 Element.hide('ajax-indicator');
|
Chris@0
|
263 }
|
Chris@0
|
264 }
|
Chris@0
|
265 });
|
Chris@0
|
266
|
Chris@0
|
267 function hideOnLoad() {
|
Chris@0
|
268 $$('.hol').each(function(el) {
|
Chris@0
|
269 el.hide();
|
Chris@0
|
270 });
|
Chris@0
|
271 }
|
Chris@0
|
272
|
Chris@0
|
273 Event.observe(window, 'load', hideOnLoad);
|