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@0
|
20 function showAndScrollTo(id, focus) {
|
Chris@0
|
21 Element.show(id);
|
Chris@0
|
22 if (focus!=null) { Form.Element.focus(focus); }
|
Chris@0
|
23 Element.scrollTo(id);
|
Chris@0
|
24 }
|
Chris@0
|
25
|
Chris@0
|
26 function toggleRowGroup(el) {
|
Chris@0
|
27 var tr = Element.up(el, 'tr');
|
Chris@0
|
28 var n = Element.next(tr);
|
Chris@0
|
29 tr.toggleClassName('open');
|
Chris@0
|
30 while (n != undefined && !n.hasClassName('group')) {
|
Chris@0
|
31 Element.toggle(n);
|
Chris@0
|
32 n = Element.next(n);
|
Chris@0
|
33 }
|
Chris@0
|
34 }
|
Chris@0
|
35
|
Chris@0
|
36 function toggleFieldset(el) {
|
Chris@0
|
37 var fieldset = Element.up(el, 'fieldset');
|
Chris@0
|
38 fieldset.toggleClassName('collapsed');
|
Chris@0
|
39 Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2});
|
Chris@0
|
40 }
|
Chris@0
|
41
|
Chris@0
|
42 var fileFieldCount = 1;
|
Chris@0
|
43
|
Chris@0
|
44 function addFileField() {
|
Chris@0
|
45 if (fileFieldCount >= 10) return false
|
Chris@0
|
46 fileFieldCount++;
|
Chris@0
|
47 var f = document.createElement("input");
|
Chris@0
|
48 f.type = "file";
|
Chris@0
|
49 f.name = "attachments[" + fileFieldCount + "][file]";
|
Chris@0
|
50 f.size = 30;
|
Chris@0
|
51 var d = document.createElement("input");
|
Chris@0
|
52 d.type = "text";
|
Chris@0
|
53 d.name = "attachments[" + fileFieldCount + "][description]";
|
Chris@0
|
54 d.size = 60;
|
Chris@1
|
55 var dLabel = new Element('label');
|
Chris@0
|
56 dLabel.addClassName('inline');
|
Chris@0
|
57 // Pulls the languge value used for Optional Description
|
Chris@0
|
58 dLabel.update($('attachment_description_label_content').innerHTML)
|
Chris@0
|
59
|
Chris@0
|
60 p = document.getElementById("attachments_fields");
|
Chris@0
|
61 p.appendChild(document.createElement("br"));
|
Chris@0
|
62 p.appendChild(f);
|
Chris@0
|
63 p.appendChild(dLabel);
|
Chris@0
|
64 dLabel.appendChild(d);
|
Chris@0
|
65
|
Chris@0
|
66 }
|
Chris@0
|
67
|
Chris@0
|
68 function showTab(name) {
|
Chris@0
|
69 var f = $$('div#content .tab-content');
|
Chris@0
|
70 for(var i=0; i<f.length; i++){
|
Chris@0
|
71 Element.hide(f[i]);
|
Chris@0
|
72 }
|
Chris@0
|
73 var f = $$('div.tabs a');
|
Chris@0
|
74 for(var i=0; i<f.length; i++){
|
Chris@0
|
75 Element.removeClassName(f[i], "selected");
|
Chris@0
|
76 }
|
Chris@0
|
77 Element.show('tab-content-' + name);
|
Chris@0
|
78 Element.addClassName('tab-' + name, "selected");
|
Chris@0
|
79 return false;
|
Chris@0
|
80 }
|
Chris@0
|
81
|
Chris@0
|
82 function moveTabRight(el) {
|
Chris@0
|
83 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
|
Chris@0
|
84 var tabsWidth = 0;
|
Chris@0
|
85 var i;
|
Chris@0
|
86 for (i=0; i<lis.length; i++) {
|
Chris@0
|
87 if (lis[i].visible()) {
|
Chris@0
|
88 tabsWidth += lis[i].getWidth() + 6;
|
Chris@0
|
89 }
|
Chris@0
|
90 }
|
Chris@0
|
91 if (tabsWidth < Element.up(el, 'div.tabs').getWidth() - 60) {
|
Chris@0
|
92 return;
|
Chris@0
|
93 }
|
Chris@0
|
94 i=0;
|
Chris@0
|
95 while (i<lis.length && !lis[i].visible()) {
|
Chris@0
|
96 i++;
|
Chris@0
|
97 }
|
Chris@0
|
98 lis[i].hide();
|
Chris@0
|
99 }
|
Chris@0
|
100
|
Chris@0
|
101 function moveTabLeft(el) {
|
Chris@0
|
102 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
|
Chris@0
|
103 var i = 0;
|
Chris@0
|
104 while (i<lis.length && !lis[i].visible()) {
|
Chris@0
|
105 i++;
|
Chris@0
|
106 }
|
Chris@0
|
107 if (i>0) {
|
Chris@0
|
108 lis[i-1].show();
|
Chris@0
|
109 }
|
Chris@0
|
110 }
|
Chris@0
|
111
|
Chris@0
|
112 function displayTabsButtons() {
|
Chris@0
|
113 var lis;
|
Chris@0
|
114 var tabsWidth = 0;
|
Chris@0
|
115 var i;
|
Chris@0
|
116 $$('div.tabs').each(function(el) {
|
Chris@0
|
117 lis = el.down('ul').childElements();
|
Chris@0
|
118 for (i=0; i<lis.length; i++) {
|
Chris@0
|
119 if (lis[i].visible()) {
|
Chris@0
|
120 tabsWidth += lis[i].getWidth() + 6;
|
Chris@0
|
121 }
|
Chris@0
|
122 }
|
Chris@0
|
123 if ((tabsWidth < el.getWidth() - 60) && (lis[0].visible())) {
|
Chris@0
|
124 el.down('div.tabs-buttons').hide();
|
Chris@0
|
125 } else {
|
Chris@0
|
126 el.down('div.tabs-buttons').show();
|
Chris@0
|
127 }
|
Chris@0
|
128 });
|
Chris@0
|
129 }
|
Chris@0
|
130
|
Chris@0
|
131 function setPredecessorFieldsVisibility() {
|
Chris@0
|
132 relationType = $('relation_relation_type');
|
Chris@0
|
133 if (relationType && (relationType.value == "precedes" || relationType.value == "follows")) {
|
Chris@0
|
134 Element.show('predecessor_fields');
|
Chris@0
|
135 } else {
|
Chris@0
|
136 Element.hide('predecessor_fields');
|
Chris@0
|
137 }
|
Chris@0
|
138 }
|
Chris@0
|
139
|
Chris@0
|
140 function promptToRemote(text, param, url) {
|
Chris@0
|
141 value = prompt(text + ':');
|
Chris@0
|
142 if (value) {
|
Chris@0
|
143 new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
|
Chris@0
|
144 return false;
|
Chris@0
|
145 }
|
Chris@0
|
146 }
|
Chris@0
|
147
|
Chris@0
|
148 function collapseScmEntry(id) {
|
Chris@0
|
149 var els = document.getElementsByClassName(id, 'browser');
|
Chris@0
|
150 for (var i = 0; i < els.length; i++) {
|
Chris@0
|
151 if (els[i].hasClassName('open')) {
|
Chris@0
|
152 collapseScmEntry(els[i].id);
|
Chris@0
|
153 }
|
Chris@0
|
154 Element.hide(els[i]);
|
Chris@0
|
155 }
|
Chris@0
|
156 $(id).removeClassName('open');
|
Chris@0
|
157 }
|
Chris@0
|
158
|
Chris@0
|
159 function expandScmEntry(id) {
|
Chris@0
|
160 var els = document.getElementsByClassName(id, 'browser');
|
Chris@0
|
161 for (var i = 0; i < els.length; i++) {
|
Chris@0
|
162 Element.show(els[i]);
|
Chris@0
|
163 if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) {
|
Chris@0
|
164 expandScmEntry(els[i].id);
|
Chris@0
|
165 }
|
Chris@0
|
166 }
|
Chris@0
|
167 $(id).addClassName('open');
|
Chris@0
|
168 }
|
Chris@0
|
169
|
Chris@0
|
170 function scmEntryClick(id) {
|
Chris@0
|
171 el = $(id);
|
Chris@0
|
172 if (el.hasClassName('open')) {
|
Chris@0
|
173 collapseScmEntry(id);
|
Chris@0
|
174 el.addClassName('collapsed');
|
Chris@0
|
175 return false;
|
Chris@0
|
176 } else if (el.hasClassName('loaded')) {
|
Chris@0
|
177 expandScmEntry(id);
|
Chris@0
|
178 el.removeClassName('collapsed');
|
Chris@0
|
179 return false;
|
Chris@0
|
180 }
|
Chris@0
|
181 if (el.hasClassName('loading')) {
|
Chris@0
|
182 return false;
|
Chris@0
|
183 }
|
Chris@0
|
184 el.addClassName('loading');
|
Chris@0
|
185 return true;
|
Chris@0
|
186 }
|
Chris@0
|
187
|
Chris@0
|
188 function scmEntryLoaded(id) {
|
Chris@0
|
189 Element.addClassName(id, 'open');
|
Chris@0
|
190 Element.addClassName(id, 'loaded');
|
Chris@0
|
191 Element.removeClassName(id, 'loading');
|
Chris@0
|
192 }
|
Chris@0
|
193
|
Chris@0
|
194 function randomKey(size) {
|
Chris@0
|
195 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
|
196 var key = '';
|
Chris@0
|
197 for (i = 0; i < size; i++) {
|
Chris@0
|
198 key += chars[Math.floor(Math.random() * chars.length)];
|
Chris@0
|
199 }
|
Chris@0
|
200 return key;
|
Chris@0
|
201 }
|
Chris@0
|
202
|
Chris@0
|
203 function observeParentIssueField(url) {
|
Chris@0
|
204 new Ajax.Autocompleter('issue_parent_issue_id',
|
Chris@0
|
205 'parent_issue_candidates',
|
Chris@0
|
206 url,
|
Chris@0
|
207 { minChars: 3,
|
Chris@0
|
208 frequency: 0.5,
|
Chris@0
|
209 paramName: 'q',
|
Chris@0
|
210 updateElement: function(value) {
|
Chris@0
|
211 document.getElementById('issue_parent_issue_id').value = value.id;
|
Chris@0
|
212 }});
|
Chris@0
|
213 }
|
Chris@0
|
214
|
Chris@0
|
215 /* shows and hides ajax indicator */
|
Chris@0
|
216 Ajax.Responders.register({
|
Chris@0
|
217 onCreate: function(){
|
Chris@0
|
218 if ($('ajax-indicator') && Ajax.activeRequestCount > 0) {
|
Chris@0
|
219 Element.show('ajax-indicator');
|
Chris@0
|
220 }
|
Chris@0
|
221 },
|
Chris@0
|
222 onComplete: function(){
|
Chris@0
|
223 if ($('ajax-indicator') && Ajax.activeRequestCount == 0) {
|
Chris@0
|
224 Element.hide('ajax-indicator');
|
Chris@0
|
225 }
|
Chris@0
|
226 }
|
Chris@0
|
227 });
|
Chris@0
|
228
|
Chris@0
|
229 function hideOnLoad() {
|
Chris@0
|
230 $$('.hol').each(function(el) {
|
Chris@0
|
231 el.hide();
|
Chris@0
|
232 });
|
Chris@0
|
233 }
|
Chris@0
|
234
|
Chris@0
|
235 Event.observe(window, 'load', hideOnLoad);
|