annotate public/javascripts/application.js @ 904:0a8317a50fa0 redmine-1.1

Close obsolete branch redmine-1.1
author Chris Cannam
date Fri, 14 Jan 2011 12:53:21 +0000
parents af80e5618e9b
children 051f544170fe
rev   line source
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);