annotate public/javascripts/.svn/text-base/application.js.svn-base @ 119:8661b858af72

* Update to Redmine trunk rev 4705
author Chris Cannam
date Thu, 13 Jan 2011 14:12:06 +0000
parents 94944d00e43c
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@119 221 function observeRelatedIssueField(url) {
Chris@119 222 new Ajax.Autocompleter('relation_issue_to_id',
Chris@119 223 'related_issue_candidates',
Chris@119 224 url,
Chris@119 225 { minChars: 3,
Chris@119 226 frequency: 0.5,
Chris@119 227 paramName: 'q',
Chris@119 228 updateElement: function(value) {
Chris@119 229 document.getElementById('relation_issue_to_id').value = value.id;
Chris@119 230 },
Chris@119 231 parameters: 'scope=all'
Chris@119 232 });
Chris@119 233 }
Chris@119 234
Chris@119 235 function setVisible(id, visible) {
Chris@119 236 var el = $(id);
Chris@119 237 if (el) {if (visible) {el.show();} else {el.hide();}}
Chris@119 238 }
Chris@119 239
Chris@119 240 function observeProjectModules() {
Chris@119 241 var f = function() {
Chris@119 242 /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
Chris@119 243 var c = ($('project_enabled_module_names_issue_tracking').checked == true);
Chris@119 244 setVisible('project_trackers', c);
Chris@119 245 setVisible('project_issue_custom_fields', c);
Chris@119 246 };
Chris@119 247
Chris@119 248 Event.observe(window, 'load', f);
Chris@119 249 Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
Chris@119 250 }
Chris@119 251
Chris@119 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);