annotate public/javascripts/application.js @ 1295:622f24f53b42 redmine-2.3

Update to Redmine SVN revision 11972 on 2.3-stable branch
author Chris Cannam
date Fri, 14 Jun 2013 09:02:21 +0100
parents 433d4f72a19b
children 4f746d8966dd
rev   line source
Chris@1115 1 /* Redmine - project management software
Chris@1295 2 Copyright (C) 2006-2013 Jean-Philippe Lang */
Chris@0 3
Chris@1115 4 function checkAll(id, checked) {
Chris@1115 5 if (checked) {
Chris@1115 6 $('#'+id).find('input[type=checkbox]').attr('checked', true);
Chris@1115 7 } else {
Chris@1115 8 $('#'+id).find('input[type=checkbox]').removeAttr('checked');
Chris@1115 9 }
Chris@0 10 }
Chris@0 11
Chris@0 12 function toggleCheckboxesBySelector(selector) {
Chris@1115 13 var all_checked = true;
Chris@1115 14 $(selector).each(function(index) {
Chris@1115 15 if (!$(this).is(':checked')) { all_checked = false; }
Chris@1115 16 });
Chris@1295 17 $(selector).attr('checked', !all_checked);
Chris@0 18 }
Chris@0 19
Chris@1115 20 function showAndScrollTo(id, focus) {
Chris@1115 21 $('#'+id).show();
Chris@1295 22 if (focus !== null) {
Chris@1115 23 $('#'+focus).focus();
Chris@1115 24 }
Chris@1115 25 $('html, body').animate({scrollTop: $('#'+id).offset().top}, 100);
Chris@1115 26 }
Chris@1115 27
Chris@1115 28 function toggleRowGroup(el) {
Chris@1115 29 var tr = $(el).parents('tr').first();
Chris@1115 30 var n = tr.next();
Chris@1115 31 tr.toggleClass('open');
Chris@1115 32 while (n.length && !n.hasClass('group')) {
Chris@1115 33 n.toggle();
Chris@1115 34 n = n.next('tr');
Chris@1115 35 }
Chris@1115 36 }
Chris@1115 37
Chris@1115 38 function collapseAllRowGroups(el) {
Chris@1115 39 var tbody = $(el).parents('tbody').first();
Chris@1115 40 tbody.children('tr').each(function(index) {
Chris@1115 41 if ($(this).hasClass('group')) {
Chris@1115 42 $(this).removeClass('open');
Chris@1115 43 } else {
Chris@1115 44 $(this).hide();
Chris@1115 45 }
chris@37 46 });
chris@37 47 }
chris@37 48
Chris@1115 49 function expandAllRowGroups(el) {
Chris@1115 50 var tbody = $(el).parents('tbody').first();
Chris@1115 51 tbody.children('tr').each(function(index) {
Chris@1115 52 if ($(this).hasClass('group')) {
Chris@1115 53 $(this).addClass('open');
Chris@441 54 } else {
Chris@1115 55 $(this).show();
Chris@441 56 }
Chris@1115 57 });
Chris@441 58 }
Chris@441 59
Chris@441 60 function toggleAllRowGroups(el) {
Chris@1115 61 var tr = $(el).parents('tr').first();
Chris@1115 62 if (tr.hasClass('open')) {
Chris@441 63 collapseAllRowGroups(el);
Chris@441 64 } else {
Chris@441 65 expandAllRowGroups(el);
Chris@441 66 }
Chris@441 67 }
Chris@441 68
Chris@0 69 function toggleFieldset(el) {
Chris@1115 70 var fieldset = $(el).parents('fieldset').first();
Chris@1115 71 fieldset.toggleClass('collapsed');
Chris@1115 72 fieldset.children('div').toggle();
Chris@0 73 }
Chris@0 74
Chris@245 75 function hideFieldset(el) {
Chris@1115 76 var fieldset = $(el).parents('fieldset').first();
Chris@1115 77 fieldset.toggleClass('collapsed');
Chris@1115 78 fieldset.children('div').hide();
Chris@1115 79 }
Chris@1115 80
Chris@1115 81 function initFilters(){
Chris@1115 82 $('#add_filter_select').change(function(){
Chris@1115 83 addFilter($(this).val(), '', []);
Chris@1115 84 });
Chris@1115 85 $('#filters-table td.field input[type=checkbox]').each(function(){
Chris@1115 86 toggleFilter($(this).val());
Chris@1115 87 });
Chris@1115 88 $('#filters-table td.field input[type=checkbox]').live('click',function(){
Chris@1115 89 toggleFilter($(this).val());
Chris@1115 90 });
Chris@1115 91 $('#filters-table .toggle-multiselect').live('click',function(){
Chris@1115 92 toggleMultiSelect($(this).siblings('select'));
Chris@1115 93 });
Chris@1115 94 $('#filters-table input[type=text]').live('keypress', function(e){
Chris@1115 95 if (e.keyCode == 13) submit_query_form("query_form");
Chris@1115 96 });
Chris@1115 97 }
Chris@1115 98
Chris@1115 99 function addFilter(field, operator, values) {
Chris@1115 100 var fieldId = field.replace('.', '_');
Chris@1115 101 var tr = $('#tr_'+fieldId);
Chris@1115 102 if (tr.length > 0) {
Chris@1115 103 tr.show();
Chris@1115 104 } else {
Chris@1115 105 buildFilterRow(field, operator, values);
Chris@1115 106 }
Chris@1115 107 $('#cb_'+fieldId).attr('checked', true);
Chris@1115 108 toggleFilter(field);
Chris@1115 109 $('#add_filter_select').val('').children('option').each(function(){
Chris@1115 110 if ($(this).attr('value') == field) {
Chris@1115 111 $(this).attr('disabled', true);
Chris@1115 112 }
Chris@1115 113 });
Chris@1115 114 }
Chris@1115 115
Chris@1115 116 function buildFilterRow(field, operator, values) {
Chris@1115 117 var fieldId = field.replace('.', '_');
Chris@1115 118 var filterTable = $("#filters-table");
Chris@1115 119 var filterOptions = availableFilters[field];
Chris@1115 120 var operators = operatorByType[filterOptions['type']];
Chris@1115 121 var filterValues = filterOptions['values'];
Chris@1115 122 var i, select;
Chris@1115 123
Chris@1115 124 var tr = $('<tr class="filter">').attr('id', 'tr_'+fieldId).html(
Chris@1115 125 '<td class="field"><input checked="checked" id="cb_'+fieldId+'" name="f[]" value="'+field+'" type="checkbox"><label for="cb_'+fieldId+'"> '+filterOptions['name']+'</label></td>' +
Chris@1115 126 '<td class="operator"><select id="operators_'+fieldId+'" name="op['+field+']"></td>' +
Chris@1115 127 '<td class="values"></td>'
Chris@1115 128 );
Chris@1115 129 filterTable.append(tr);
Chris@1115 130
Chris@1115 131 select = tr.find('td.operator select');
Chris@1115 132 for (i=0;i<operators.length;i++){
Chris@1115 133 var option = $('<option>').val(operators[i]).text(operatorLabels[operators[i]]);
Chris@1295 134 if (operators[i] == operator) { option.attr('selected', true); }
Chris@1115 135 select.append(option);
Chris@1115 136 }
Chris@1295 137 select.change(function(){ toggleOperator(field); });
Chris@1115 138
Chris@1115 139 switch (filterOptions['type']){
Chris@1115 140 case "list":
Chris@1115 141 case "list_optional":
Chris@1115 142 case "list_status":
Chris@1115 143 case "list_subprojects":
Chris@1115 144 tr.find('td.values').append(
Chris@1115 145 '<span style="display:none;"><select class="value" id="values_'+fieldId+'_1" name="v['+field+'][]"></select>' +
Chris@1115 146 ' <span class="toggle-multiselect">&nbsp;</span></span>'
Chris@1115 147 );
Chris@1115 148 select = tr.find('td.values select');
Chris@1295 149 if (values.length > 1) { select.attr('multiple', true); }
Chris@1115 150 for (i=0;i<filterValues.length;i++){
Chris@1115 151 var filterValue = filterValues[i];
Chris@1115 152 var option = $('<option>');
Chris@1115 153 if ($.isArray(filterValue)) {
Chris@1115 154 option.val(filterValue[1]).text(filterValue[0]);
Chris@1115 155 if ($.inArray(filterValue[1], values) > -1) {option.attr('selected', true);}
Chris@1115 156 } else {
Chris@1115 157 option.val(filterValue).text(filterValue);
Chris@1115 158 if ($.inArray(filterValue, values) > -1) {option.attr('selected', true);}
Chris@1115 159 }
Chris@1115 160 select.append(option);
Chris@1115 161 }
Chris@1115 162 break;
Chris@1115 163 case "date":
Chris@1115 164 case "date_past":
Chris@1115 165 tr.find('td.values').append(
Chris@1115 166 '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="10" class="value date_value" /></span>' +
Chris@1115 167 ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="10" class="value date_value" /></span>' +
Chris@1115 168 ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="3" class="value" /> '+labelDayPlural+'</span>'
Chris@1115 169 );
Chris@1115 170 $('#values_'+fieldId+'_1').val(values[0]).datepicker(datepickerOptions);
Chris@1115 171 $('#values_'+fieldId+'_2').val(values[1]).datepicker(datepickerOptions);
Chris@1115 172 $('#values_'+fieldId).val(values[0]);
Chris@1115 173 break;
Chris@1115 174 case "string":
Chris@1115 175 case "text":
Chris@1115 176 tr.find('td.values').append(
Chris@1115 177 '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="30" class="value" /></span>'
Chris@1115 178 );
Chris@1115 179 $('#values_'+fieldId).val(values[0]);
Chris@1115 180 break;
Chris@1115 181 case "relation":
Chris@1115 182 tr.find('td.values').append(
Chris@1115 183 '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="6" class="value" /></span>' +
Chris@1115 184 '<span style="display:none;"><select class="value" name="v['+field+'][]" id="values_'+fieldId+'_1"></select></span>'
Chris@1115 185 );
Chris@1115 186 $('#values_'+fieldId).val(values[0]);
Chris@1115 187 select = tr.find('td.values select');
Chris@1115 188 for (i=0;i<allProjects.length;i++){
Chris@1115 189 var filterValue = allProjects[i];
Chris@1115 190 var option = $('<option>');
Chris@1115 191 option.val(filterValue[1]).text(filterValue[0]);
Chris@1295 192 if (values[0] == filterValue[1]) { option.attr('selected', true); }
Chris@1115 193 select.append(option);
Chris@1115 194 }
Chris@1115 195 case "integer":
Chris@1115 196 case "float":
Chris@1115 197 tr.find('td.values').append(
Chris@1115 198 '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="6" class="value" /></span>' +
Chris@1115 199 ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="6" class="value" /></span>'
Chris@1115 200 );
Chris@1115 201 $('#values_'+fieldId+'_1').val(values[0]);
Chris@1115 202 $('#values_'+fieldId+'_2').val(values[1]);
Chris@1115 203 break;
Chris@1115 204 }
Chris@1115 205 }
Chris@1115 206
Chris@1115 207 function toggleFilter(field) {
Chris@1115 208 var fieldId = field.replace('.', '_');
Chris@1115 209 if ($('#cb_' + fieldId).is(':checked')) {
Chris@1115 210 $("#operators_" + fieldId).show().removeAttr('disabled');
Chris@1115 211 toggleOperator(field);
Chris@1115 212 } else {
Chris@1115 213 $("#operators_" + fieldId).hide().attr('disabled', true);
Chris@1115 214 enableValues(field, []);
Chris@1115 215 }
Chris@1115 216 }
Chris@1115 217
Chris@1115 218 function enableValues(field, indexes) {
Chris@1115 219 var fieldId = field.replace('.', '_');
Chris@1115 220 $('#tr_'+fieldId+' td.values .value').each(function(index) {
Chris@1115 221 if ($.inArray(index, indexes) >= 0) {
Chris@1115 222 $(this).removeAttr('disabled');
Chris@1115 223 $(this).parents('span').first().show();
Chris@1115 224 } else {
Chris@1115 225 $(this).val('');
Chris@1115 226 $(this).attr('disabled', true);
Chris@1115 227 $(this).parents('span').first().hide();
Chris@1115 228 }
Chris@1115 229
Chris@1115 230 if ($(this).hasClass('group')) {
Chris@1115 231 $(this).addClass('open');
Chris@1115 232 } else {
Chris@1115 233 $(this).show();
Chris@1115 234 }
Chris@1115 235 });
Chris@1115 236 }
Chris@1115 237
Chris@1115 238 function toggleOperator(field) {
Chris@1115 239 var fieldId = field.replace('.', '_');
Chris@1115 240 var operator = $("#operators_" + fieldId);
Chris@1115 241 switch (operator.val()) {
Chris@1115 242 case "!*":
Chris@1115 243 case "*":
Chris@1115 244 case "t":
Chris@1295 245 case "ld":
Chris@1115 246 case "w":
Chris@1295 247 case "lw":
Chris@1295 248 case "l2w":
Chris@1295 249 case "m":
Chris@1295 250 case "lm":
Chris@1295 251 case "y":
Chris@1115 252 case "o":
Chris@1115 253 case "c":
Chris@1115 254 enableValues(field, []);
Chris@1115 255 break;
Chris@1115 256 case "><":
Chris@1115 257 enableValues(field, [0,1]);
Chris@1115 258 break;
Chris@1115 259 case "<t+":
Chris@1115 260 case ">t+":
Chris@1115 261 case "><t+":
Chris@1115 262 case "t+":
Chris@1115 263 case ">t-":
Chris@1115 264 case "<t-":
Chris@1115 265 case "><t-":
Chris@1115 266 case "t-":
Chris@1115 267 enableValues(field, [2]);
Chris@1115 268 break;
Chris@1115 269 case "=p":
Chris@1115 270 case "=!p":
Chris@1115 271 case "!p":
Chris@1115 272 enableValues(field, [1]);
Chris@1115 273 break;
Chris@1115 274 default:
Chris@1115 275 enableValues(field, [0]);
Chris@1115 276 break;
Chris@1115 277 }
Chris@1115 278 }
Chris@1115 279
Chris@1115 280 function toggleMultiSelect(el) {
Chris@1115 281 if (el.attr('multiple')) {
Chris@1115 282 el.removeAttr('multiple');
Chris@1115 283 } else {
Chris@1115 284 el.attr('multiple', true);
Chris@1115 285 }
Chris@1115 286 }
Chris@1115 287
Chris@1115 288 function submit_query_form(id) {
Chris@1115 289 selectAllOptions("selected_columns");
Chris@1115 290 $('#'+id).submit();
Chris@245 291 }
Chris@245 292
Chris@0 293 function showTab(name) {
Chris@1115 294 $('div#content .tab-content').hide();
Chris@1115 295 $('div.tabs a').removeClass('selected');
Chris@1115 296 $('#tab-content-' + name).show();
Chris@1115 297 $('#tab-' + name).addClass('selected');
Chris@1115 298 return false;
Chris@0 299 }
Chris@0 300
Chris@0 301 function moveTabRight(el) {
Chris@1115 302 var lis = $(el).parents('div.tabs').first().find('ul').children();
Chris@1115 303 var tabsWidth = 0;
Chris@1115 304 var i = 0;
Chris@1115 305 lis.each(function(){
Chris@1115 306 if ($(this).is(':visible')) {
Chris@1115 307 tabsWidth += $(this).width() + 6;
Chris@1115 308 }
Chris@1115 309 });
Chris@1115 310 if (tabsWidth < $(el).parents('div.tabs').first().width() - 60) { return; }
Chris@1115 311 while (i<lis.length && !lis.eq(i).is(':visible')) { i++; }
Chris@1115 312 lis.eq(i).hide();
Chris@0 313 }
Chris@0 314
Chris@0 315 function moveTabLeft(el) {
Chris@1115 316 var lis = $(el).parents('div.tabs').first().find('ul').children();
Chris@1115 317 var i = 0;
Chris@1115 318 while (i<lis.length && !lis.eq(i).is(':visible')) { i++; }
Chris@1115 319 if (i>0) {
Chris@1115 320 lis.eq(i-1).show();
Chris@1115 321 }
Chris@0 322 }
Chris@0 323
Chris@0 324 function displayTabsButtons() {
Chris@1115 325 var lis;
Chris@1115 326 var tabsWidth = 0;
Chris@1115 327 var el;
Chris@1115 328 $('div.tabs').each(function() {
Chris@1115 329 el = $(this);
Chris@1115 330 lis = el.find('ul').children();
Chris@1115 331 lis.each(function(){
Chris@1115 332 if ($(this).is(':visible')) {
Chris@1115 333 tabsWidth += $(this).width() + 6;
Chris@1115 334 }
Chris@1115 335 });
Chris@1115 336 if ((tabsWidth < el.width() - 60) && (lis.first().is(':visible'))) {
Chris@1115 337 el.find('div.tabs-buttons').hide();
Chris@1115 338 } else {
Chris@1115 339 el.find('div.tabs-buttons').show();
Chris@1115 340 }
Chris@1115 341 });
Chris@0 342 }
Chris@0 343
Chris@0 344 function setPredecessorFieldsVisibility() {
Chris@1115 345 var relationType = $('#relation_relation_type');
Chris@1115 346 if (relationType.val() == "precedes" || relationType.val() == "follows") {
Chris@1115 347 $('#predecessor_fields').show();
Chris@1115 348 } else {
Chris@1115 349 $('#predecessor_fields').hide();
Chris@1115 350 }
Chris@0 351 }
Chris@0 352
Chris@909 353 function showModal(id, width) {
Chris@1115 354 var el = $('#'+id).first();
Chris@1295 355 if (el.length === 0 || el.is(':visible')) {return;}
Chris@1115 356 var title = el.find('h3.title').text();
Chris@1115 357 el.dialog({
Chris@1115 358 width: width,
Chris@1115 359 modal: true,
Chris@1115 360 resizable: false,
Chris@1115 361 dialogClass: 'modal',
Chris@1115 362 title: title
Chris@1115 363 });
Chris@1115 364 el.find("input[type=text], input[type=submit]").first().focus();
Chris@909 365 }
Chris@909 366
Chris@909 367 function hideModal(el) {
Chris@1115 368 var modal;
Chris@1115 369 if (el) {
Chris@1115 370 modal = $(el).parents('.ui-dialog-content');
Chris@1115 371 } else {
Chris@1115 372 modal = $('#ajax-modal');
Chris@909 373 }
Chris@1115 374 modal.dialog("close");
Chris@1115 375 }
Chris@1115 376
Chris@1115 377 function submitPreview(url, form, target) {
Chris@1115 378 $.ajax({
Chris@1115 379 url: url,
Chris@1115 380 type: 'post',
Chris@1115 381 data: $('#'+form).serialize(),
Chris@1115 382 success: function(data){
Chris@1115 383 $('#'+target).html(data);
Chris@1115 384 }
Chris@1115 385 });
Chris@909 386 }
Chris@909 387
Chris@0 388 function collapseScmEntry(id) {
Chris@1115 389 $('.'+id).each(function() {
Chris@1115 390 if ($(this).hasClass('open')) {
Chris@1115 391 collapseScmEntry($(this).attr('id'));
Chris@0 392 }
Chris@1115 393 $(this).hide();
Chris@1115 394 });
Chris@1115 395 $('#'+id).removeClass('open');
Chris@0 396 }
Chris@0 397
Chris@0 398 function expandScmEntry(id) {
Chris@1115 399 $('.'+id).each(function() {
Chris@1115 400 $(this).show();
Chris@1115 401 if ($(this).hasClass('loaded') && !$(this).hasClass('collapsed')) {
Chris@1115 402 expandScmEntry($(this).attr('id'));
Chris@0 403 }
Chris@1115 404 });
Chris@1115 405 $('#'+id).addClass('open');
Chris@0 406 }
Chris@0 407
Chris@1115 408 function scmEntryClick(id, url) {
Chris@1115 409 el = $('#'+id);
Chris@1115 410 if (el.hasClass('open')) {
Chris@0 411 collapseScmEntry(id);
Chris@1115 412 el.addClass('collapsed');
Chris@0 413 return false;
Chris@1115 414 } else if (el.hasClass('loaded')) {
Chris@0 415 expandScmEntry(id);
Chris@1115 416 el.removeClass('collapsed');
Chris@0 417 return false;
Chris@0 418 }
Chris@1115 419 if (el.hasClass('loading')) {
Chris@0 420 return false;
Chris@0 421 }
Chris@1115 422 el.addClass('loading');
Chris@1115 423 $.ajax({
Chris@1115 424 url: url,
Chris@1115 425 success: function(data){
Chris@1115 426 el.after(data);
Chris@1115 427 el.addClass('open').addClass('loaded').removeClass('loading');
Chris@1115 428 }
Chris@1115 429 });
Chris@0 430 return true;
Chris@0 431 }
Chris@0 432
Chris@1115 433 function randomKey(size) {
Chris@1115 434 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@1115 435 var key = '';
Chris@1115 436 for (i = 0; i < size; i++) {
Chris@1115 437 key += chars[Math.floor(Math.random() * chars.length)];
Chris@1115 438 }
Chris@1115 439 return key;
Chris@0 440 }
Chris@0 441
Chris@1115 442 // Can't use Rails' remote select because we need the form data
Chris@1115 443 function updateIssueFrom(url) {
Chris@1115 444 $.ajax({
Chris@1115 445 url: url,
Chris@1115 446 type: 'post',
Chris@1115 447 data: $('#issue-form').serialize()
Chris@1115 448 });
Chris@0 449 }
Chris@0 450
Chris@1115 451 function updateBulkEditFrom(url) {
Chris@1115 452 $.ajax({
Chris@1115 453 url: url,
Chris@1115 454 type: 'post',
Chris@1115 455 data: $('#bulk_edit_form').serialize()
Chris@1115 456 });
Chris@0 457 }
Chris@0 458
Chris@1295 459 function observeAutocompleteField(fieldId, url, options) {
Chris@1115 460 $(document).ready(function() {
Chris@1295 461 $('#'+fieldId).autocomplete($.extend({
Chris@1115 462 source: url,
Chris@1295 463 minLength: 2,
Chris@1295 464 search: function(){$('#'+fieldId).addClass('ajax-loading');},
Chris@1295 465 response: function(){$('#'+fieldId).removeClass('ajax-loading');}
Chris@1295 466 }, options));
Chris@1295 467 $('#'+fieldId).addClass('autocomplete');
Chris@1115 468 });
Chris@119 469 }
Chris@119 470
Chris@1115 471 function observeSearchfield(fieldId, targetId, url) {
Chris@1115 472 $('#'+fieldId).each(function() {
Chris@1115 473 var $this = $(this);
Chris@1295 474 $this.addClass('autocomplete');
Chris@1115 475 $this.attr('data-value-was', $this.val());
Chris@1115 476 var check = function() {
Chris@1115 477 var val = $this.val();
Chris@1115 478 if ($this.attr('data-value-was') != val){
Chris@1115 479 $this.attr('data-value-was', val);
Chris@1115 480 $.ajax({
Chris@1115 481 url: url,
Chris@1115 482 type: 'get',
Chris@1115 483 data: {q: $this.val()},
Chris@1295 484 success: function(data){ if(targetId) $('#'+targetId).html(data); },
Chris@1115 485 beforeSend: function(){ $this.addClass('ajax-loading'); },
Chris@1115 486 complete: function(){ $this.removeClass('ajax-loading'); }
Chris@1115 487 });
Chris@1115 488 }
Chris@1115 489 };
Chris@1115 490 var reset = function() {
Chris@1115 491 if (timer) {
Chris@1115 492 clearInterval(timer);
Chris@1115 493 timer = setInterval(check, 300);
Chris@1115 494 }
Chris@1115 495 };
Chris@1115 496 var timer = setInterval(check, 300);
Chris@1115 497 $this.bind('keyup click mousemove', reset);
Chris@1115 498 });
Chris@119 499 }
Chris@119 500
Chris@119 501 function observeProjectModules() {
Chris@119 502 var f = function() {
Chris@119 503 /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
Chris@1115 504 if ($('#project_enabled_module_names_issue_tracking').attr('checked')) {
Chris@1115 505 $('#project_trackers').show();
Chris@1115 506 }else{
Chris@1115 507 $('#project_trackers').hide();
Chris@1115 508 }
Chris@119 509 };
Chris@1115 510
Chris@1115 511 $(window).load(f);
Chris@1115 512 $('#project_enabled_module_names_issue_tracking').change(f);
Chris@119 513 }
Chris@119 514
Chris@1115 515 function initMyPageSortable(list, url) {
Chris@1115 516 $('#list-'+list).sortable({
Chris@1115 517 connectWith: '.block-receiver',
Chris@1115 518 tolerance: 'pointer',
Chris@1115 519 update: function(){
Chris@1115 520 $.ajax({
Chris@1115 521 url: url,
Chris@1115 522 type: 'post',
Chris@1115 523 data: {'blocks': $.map($('#list-'+list).children(), function(el){return $(el).attr('id');})}
Chris@1115 524 });
Chris@1115 525 }
Chris@1115 526 });
Chris@1115 527 $("#list-top, #list-left, #list-right").disableSelection();
Chris@1115 528 }
Chris@245 529
Chris@1115 530 var warnLeavingUnsavedMessage;
Chris@1115 531 function warnLeavingUnsaved(message) {
Chris@1115 532 warnLeavingUnsavedMessage = message;
Chris@119 533
Chris@1115 534 $('form').submit(function(){
Chris@1115 535 $('textarea').removeData('changed');
Chris@1115 536 });
Chris@1115 537 $('textarea').change(function(){
Chris@1115 538 $(this).data('changed', 'changed');
Chris@1115 539 });
Chris@1115 540 window.onbeforeunload = function(){
Chris@1115 541 var warn = false;
Chris@1115 542 $('textarea').blur().each(function(){
Chris@1115 543 if ($(this).data('changed')) {
Chris@1115 544 warn = true;
Chris@1115 545 }
Chris@1115 546 });
Chris@1115 547 if (warn) {return warnLeavingUnsavedMessage;}
Chris@1115 548 };
Chris@1295 549 }
Chris@441 550
Chris@1295 551 function setupAjaxIndicator() {
Chris@1295 552
Chris@1295 553 $('#ajax-indicator').bind('ajaxSend', function(event, xhr, settings) {
Chris@1295 554
Chris@1295 555 if ($('.ajax-loading').length === 0 && settings.contentType != 'application/octet-stream') {
Chris@1115 556 $('#ajax-indicator').show();
Chris@0 557 }
Chris@1115 558 });
Chris@1295 559
Chris@1295 560 $('#ajax-indicator').bind('ajaxStop', function() {
Chris@1115 561 $('#ajax-indicator').hide();
Chris@1115 562 });
Chris@1295 563 }
Chris@0 564
Chris@0 565 function hideOnLoad() {
Chris@1115 566 $('.hol').hide();
Chris@0 567 }
Chris@0 568
Chris@1115 569 function addFormObserversForDoubleSubmit() {
Chris@1115 570 $('form[method=post]').each(function() {
Chris@1115 571 if (!$(this).hasClass('multiple-submit')) {
Chris@1115 572 $(this).submit(function(form_submission) {
Chris@1115 573 if ($(form_submission.target).attr('data-submitted')) {
Chris@1115 574 form_submission.preventDefault();
Chris@1115 575 } else {
Chris@1115 576 $(form_submission.target).attr('data-submitted', true);
Chris@1115 577 }
Chris@1115 578 });
Chris@1115 579 }
Chris@1115 580 });
Chris@1115 581 }
Chris@1115 582
Chris@1295 583 function blockEventPropagation(event) {
Chris@1295 584 event.stopPropagation();
Chris@1295 585 event.preventDefault();
Chris@1295 586 }
Chris@1295 587
Chris@1295 588 $(document).ready(setupAjaxIndicator);
Chris@1115 589 $(document).ready(hideOnLoad);
Chris@1115 590 $(document).ready(addFormObserversForDoubleSubmit);