annotate public/javascripts/application.js @ 1465:ab8bd24eeb65 bug_635

Close obsolete branch bug_635
author Chris Cannam
date Fri, 19 Jul 2013 12:13:20 +0100
parents bb32da3bea34
children 4f746d8966dd 51364c0cd58f
rev   line source
Chris@1115 1 /* Redmine - project management software
Chris@1115 2 Copyright (C) 2006-2012 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@1115 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@1115 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@1115 134 if (operators[i] == operator) {option.attr('selected', true)};
Chris@1115 135 select.append(option);
Chris@1115 136 }
Chris@1115 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@1115 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@1115 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@1115 245 case "w":
Chris@1115 246 case "o":
Chris@1115 247 case "c":
Chris@1115 248 enableValues(field, []);
Chris@1115 249 break;
Chris@1115 250 case "><":
Chris@1115 251 enableValues(field, [0,1]);
Chris@1115 252 break;
Chris@1115 253 case "<t+":
Chris@1115 254 case ">t+":
Chris@1115 255 case "><t+":
Chris@1115 256 case "t+":
Chris@1115 257 case ">t-":
Chris@1115 258 case "<t-":
Chris@1115 259 case "><t-":
Chris@1115 260 case "t-":
Chris@1115 261 enableValues(field, [2]);
Chris@1115 262 break;
Chris@1115 263 case "=p":
Chris@1115 264 case "=!p":
Chris@1115 265 case "!p":
Chris@1115 266 enableValues(field, [1]);
Chris@1115 267 break;
Chris@1115 268 default:
Chris@1115 269 enableValues(field, [0]);
Chris@1115 270 break;
Chris@1115 271 }
Chris@1115 272 }
Chris@1115 273
Chris@1115 274 function toggleMultiSelect(el) {
Chris@1115 275 if (el.attr('multiple')) {
Chris@1115 276 el.removeAttr('multiple');
Chris@1115 277 } else {
Chris@1115 278 el.attr('multiple', true);
Chris@1115 279 }
Chris@1115 280 }
Chris@1115 281
Chris@1115 282 function submit_query_form(id) {
Chris@1115 283 selectAllOptions("selected_columns");
Chris@1115 284 $('#'+id).submit();
Chris@245 285 }
Chris@245 286
Chris@0 287 var fileFieldCount = 1;
Chris@0 288 function addFileField() {
Chris@1115 289 var fields = $('#attachments_fields');
Chris@1115 290 if (fields.children().length >= 10) return false;
Chris@909 291 fileFieldCount++;
Chris@1115 292 var s = fields.children('span').first().clone();
Chris@1115 293 s.children('input.file').attr('name', "attachments[" + fileFieldCount + "][file]").val('');
Chris@1115 294 s.children('input.description').attr('name', "attachments[" + fileFieldCount + "][description]").val('');
Chris@1115 295 fields.append(s);
Chris@909 296 }
Chris@0 297
Chris@909 298 function removeFileField(el) {
Chris@1115 299 var fields = $('#attachments_fields');
Chris@1115 300 var s = $(el).parents('span').first();
Chris@1115 301 if (fields.children().length > 1) {
Chris@1115 302 s.remove();
Chris@1115 303 } else {
Chris@1115 304 s.children('input.file').val('');
Chris@1115 305 s.children('input.description').val('');
Chris@1115 306 }
Chris@909 307 }
Chris@909 308
Chris@909 309 function checkFileSize(el, maxSize, message) {
Chris@909 310 var files = el.files;
Chris@909 311 if (files) {
Chris@909 312 for (var i=0; i<files.length; i++) {
Chris@909 313 if (files[i].size > maxSize) {
Chris@909 314 alert(message);
Chris@909 315 el.value = "";
Chris@909 316 }
Chris@909 317 }
Chris@909 318 }
Chris@0 319 }
Chris@0 320
Chris@0 321 function showTab(name) {
Chris@1115 322 $('div#content .tab-content').hide();
Chris@1115 323 $('div.tabs a').removeClass('selected');
Chris@1115 324 $('#tab-content-' + name).show();
Chris@1115 325 $('#tab-' + name).addClass('selected');
Chris@1115 326 return false;
Chris@0 327 }
Chris@0 328
Chris@0 329 function moveTabRight(el) {
Chris@1115 330 var lis = $(el).parents('div.tabs').first().find('ul').children();
Chris@1115 331 var tabsWidth = 0;
Chris@1115 332 var i = 0;
Chris@1115 333 lis.each(function(){
Chris@1115 334 if ($(this).is(':visible')) {
Chris@1115 335 tabsWidth += $(this).width() + 6;
Chris@1115 336 }
Chris@1115 337 });
Chris@1115 338 if (tabsWidth < $(el).parents('div.tabs').first().width() - 60) { return; }
Chris@1115 339 while (i<lis.length && !lis.eq(i).is(':visible')) { i++; }
Chris@1115 340 lis.eq(i).hide();
Chris@0 341 }
Chris@0 342
Chris@0 343 function moveTabLeft(el) {
Chris@1115 344 var lis = $(el).parents('div.tabs').first().find('ul').children();
Chris@1115 345 var i = 0;
Chris@1115 346 while (i<lis.length && !lis.eq(i).is(':visible')) { i++; }
Chris@1115 347 if (i>0) {
Chris@1115 348 lis.eq(i-1).show();
Chris@1115 349 }
Chris@0 350 }
Chris@0 351
Chris@0 352 function displayTabsButtons() {
Chris@1115 353 var lis;
Chris@1115 354 var tabsWidth = 0;
Chris@1115 355 var el;
Chris@1115 356 $('div.tabs').each(function() {
Chris@1115 357 el = $(this);
Chris@1115 358 lis = el.find('ul').children();
Chris@1115 359 lis.each(function(){
Chris@1115 360 if ($(this).is(':visible')) {
Chris@1115 361 tabsWidth += $(this).width() + 6;
Chris@1115 362 }
Chris@1115 363 });
Chris@1115 364 if ((tabsWidth < el.width() - 60) && (lis.first().is(':visible'))) {
Chris@1115 365 el.find('div.tabs-buttons').hide();
Chris@1115 366 } else {
Chris@1115 367 el.find('div.tabs-buttons').show();
Chris@1115 368 }
Chris@1115 369 });
Chris@0 370 }
Chris@0 371
Chris@0 372 function setPredecessorFieldsVisibility() {
Chris@1115 373 var relationType = $('#relation_relation_type');
Chris@1115 374 if (relationType.val() == "precedes" || relationType.val() == "follows") {
Chris@1115 375 $('#predecessor_fields').show();
Chris@1115 376 } else {
Chris@1115 377 $('#predecessor_fields').hide();
Chris@1115 378 }
Chris@0 379 }
Chris@0 380
Chris@909 381 function showModal(id, width) {
Chris@1115 382 var el = $('#'+id).first();
Chris@1115 383 if (el.length == 0 || el.is(':visible')) {return;}
Chris@1115 384 var title = el.find('h3.title').text();
Chris@1115 385 el.dialog({
Chris@1115 386 width: width,
Chris@1115 387 modal: true,
Chris@1115 388 resizable: false,
Chris@1115 389 dialogClass: 'modal',
Chris@1115 390 title: title
Chris@1115 391 });
Chris@1115 392 el.find("input[type=text], input[type=submit]").first().focus();
Chris@909 393 }
Chris@909 394
Chris@909 395 function hideModal(el) {
Chris@1115 396 var modal;
Chris@1115 397 if (el) {
Chris@1115 398 modal = $(el).parents('.ui-dialog-content');
Chris@1115 399 } else {
Chris@1115 400 modal = $('#ajax-modal');
Chris@909 401 }
Chris@1115 402 modal.dialog("close");
Chris@1115 403 }
Chris@1115 404
Chris@1115 405 function submitPreview(url, form, target) {
Chris@1115 406 $.ajax({
Chris@1115 407 url: url,
Chris@1115 408 type: 'post',
Chris@1115 409 data: $('#'+form).serialize(),
Chris@1115 410 success: function(data){
Chris@1115 411 $('#'+target).html(data);
Chris@1115 412 }
Chris@1115 413 });
Chris@909 414 }
Chris@909 415
Chris@0 416 function collapseScmEntry(id) {
Chris@1115 417 $('.'+id).each(function() {
Chris@1115 418 if ($(this).hasClass('open')) {
Chris@1115 419 collapseScmEntry($(this).attr('id'));
Chris@0 420 }
Chris@1115 421 $(this).hide();
Chris@1115 422 });
Chris@1115 423 $('#'+id).removeClass('open');
Chris@0 424 }
Chris@0 425
Chris@0 426 function expandScmEntry(id) {
Chris@1115 427 $('.'+id).each(function() {
Chris@1115 428 $(this).show();
Chris@1115 429 if ($(this).hasClass('loaded') && !$(this).hasClass('collapsed')) {
Chris@1115 430 expandScmEntry($(this).attr('id'));
Chris@0 431 }
Chris@1115 432 });
Chris@1115 433 $('#'+id).addClass('open');
Chris@0 434 }
Chris@0 435
Chris@1115 436 function scmEntryClick(id, url) {
Chris@1115 437 el = $('#'+id);
Chris@1115 438 if (el.hasClass('open')) {
Chris@0 439 collapseScmEntry(id);
Chris@1115 440 el.addClass('collapsed');
Chris@0 441 return false;
Chris@1115 442 } else if (el.hasClass('loaded')) {
Chris@0 443 expandScmEntry(id);
Chris@1115 444 el.removeClass('collapsed');
Chris@0 445 return false;
Chris@0 446 }
Chris@1115 447 if (el.hasClass('loading')) {
Chris@0 448 return false;
Chris@0 449 }
Chris@1115 450 el.addClass('loading');
Chris@1115 451 $.ajax({
Chris@1115 452 url: url,
Chris@1115 453 success: function(data){
Chris@1115 454 el.after(data);
Chris@1115 455 el.addClass('open').addClass('loaded').removeClass('loading');
Chris@1115 456 }
Chris@1115 457 });
Chris@0 458 return true;
Chris@0 459 }
Chris@0 460
Chris@1115 461 function randomKey(size) {
Chris@1115 462 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 463 var key = '';
Chris@1115 464 for (i = 0; i < size; i++) {
Chris@1115 465 key += chars[Math.floor(Math.random() * chars.length)];
Chris@1115 466 }
Chris@1115 467 return key;
Chris@0 468 }
Chris@0 469
Chris@1115 470 // Can't use Rails' remote select because we need the form data
Chris@1115 471 function updateIssueFrom(url) {
Chris@1115 472 $.ajax({
Chris@1115 473 url: url,
Chris@1115 474 type: 'post',
Chris@1115 475 data: $('#issue-form').serialize()
Chris@1115 476 });
Chris@0 477 }
Chris@0 478
Chris@1115 479 function updateBulkEditFrom(url) {
Chris@1115 480 $.ajax({
Chris@1115 481 url: url,
Chris@1115 482 type: 'post',
Chris@1115 483 data: $('#bulk_edit_form').serialize()
Chris@1115 484 });
Chris@0 485 }
Chris@0 486
Chris@1115 487 function observeAutocompleteField(fieldId, url) {
Chris@1115 488 $(document).ready(function() {
Chris@1115 489 $('#'+fieldId).autocomplete({
Chris@1115 490 source: url,
Chris@1115 491 minLength: 2
Chris@1115 492 });
Chris@1115 493 });
Chris@117 494 }
Chris@117 495
Chris@1115 496 function observeSearchfield(fieldId, targetId, url) {
Chris@1115 497 $('#'+fieldId).each(function() {
Chris@1115 498 var $this = $(this);
Chris@1115 499 $this.attr('data-value-was', $this.val());
Chris@1115 500 var check = function() {
Chris@1115 501 var val = $this.val();
Chris@1115 502 if ($this.attr('data-value-was') != val){
Chris@1115 503 $this.attr('data-value-was', val);
Chris@1115 504 $.ajax({
Chris@1115 505 url: url,
Chris@1115 506 type: 'get',
Chris@1115 507 data: {q: $this.val()},
Chris@1115 508 success: function(data){ $('#'+targetId).html(data); },
Chris@1115 509 beforeSend: function(){ $this.addClass('ajax-loading'); },
Chris@1115 510 complete: function(){ $this.removeClass('ajax-loading'); }
Chris@1115 511 });
Chris@1115 512 }
Chris@1115 513 };
Chris@1115 514 var reset = function() {
Chris@1115 515 if (timer) {
Chris@1115 516 clearInterval(timer);
Chris@1115 517 timer = setInterval(check, 300);
Chris@1115 518 }
Chris@1115 519 };
Chris@1115 520 var timer = setInterval(check, 300);
Chris@1115 521 $this.bind('keyup click mousemove', reset);
Chris@1115 522 });
Chris@117 523 }
Chris@117 524
Chris@117 525 function observeProjectModules() {
Chris@117 526 var f = function() {
Chris@117 527 /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
Chris@1115 528 if ($('#project_enabled_module_names_issue_tracking').attr('checked')) {
Chris@1115 529 $('#project_trackers').show();
Chris@1115 530 }else{
Chris@1115 531 $('#project_trackers').hide();
Chris@1115 532 }
Chris@117 533 };
Chris@1115 534
Chris@1115 535 $(window).load(f);
Chris@1115 536 $('#project_enabled_module_names_issue_tracking').change(f);
Chris@117 537 }
Chris@117 538
Chris@1115 539 function initMyPageSortable(list, url) {
Chris@1115 540 $('#list-'+list).sortable({
Chris@1115 541 connectWith: '.block-receiver',
Chris@1115 542 tolerance: 'pointer',
Chris@1115 543 update: function(){
Chris@1115 544 $.ajax({
Chris@1115 545 url: url,
Chris@1115 546 type: 'post',
Chris@1115 547 data: {'blocks': $.map($('#list-'+list).children(), function(el){return $(el).attr('id');})}
Chris@1115 548 });
Chris@1115 549 }
Chris@1115 550 });
Chris@1115 551 $("#list-top, #list-left, #list-right").disableSelection();
Chris@1115 552 }
Chris@245 553
Chris@1115 554 var warnLeavingUnsavedMessage;
Chris@1115 555 function warnLeavingUnsaved(message) {
Chris@1115 556 warnLeavingUnsavedMessage = message;
Chris@117 557
Chris@1115 558 $('form').submit(function(){
Chris@1115 559 $('textarea').removeData('changed');
Chris@1115 560 });
Chris@1115 561 $('textarea').change(function(){
Chris@1115 562 $(this).data('changed', 'changed');
Chris@1115 563 });
Chris@1115 564 window.onbeforeunload = function(){
Chris@1115 565 var warn = false;
Chris@1115 566 $('textarea').blur().each(function(){
Chris@1115 567 if ($(this).data('changed')) {
Chris@1115 568 warn = true;
Chris@1115 569 }
Chris@1115 570 });
Chris@1115 571 if (warn) {return warnLeavingUnsavedMessage;}
Chris@1115 572 };
Chris@1115 573 };
Chris@441 574
Chris@1115 575 $(document).ready(function(){
Chris@1115 576 $('#ajax-indicator').bind('ajaxSend', function(){
Chris@1115 577 if ($('.ajax-loading').length == 0) {
Chris@1115 578 $('#ajax-indicator').show();
Chris@0 579 }
Chris@1115 580 });
Chris@1115 581 $('#ajax-indicator').bind('ajaxStop', function(){
Chris@1115 582 $('#ajax-indicator').hide();
Chris@1115 583 });
Chris@0 584 });
Chris@0 585
Chris@0 586 function hideOnLoad() {
Chris@1115 587 $('.hol').hide();
Chris@0 588 }
Chris@0 589
Chris@1115 590 function addFormObserversForDoubleSubmit() {
Chris@1115 591 $('form[method=post]').each(function() {
Chris@1115 592 if (!$(this).hasClass('multiple-submit')) {
Chris@1115 593 $(this).submit(function(form_submission) {
Chris@1115 594 if ($(form_submission.target).attr('data-submitted')) {
Chris@1115 595 form_submission.preventDefault();
Chris@1115 596 } else {
Chris@1115 597 $(form_submission.target).attr('data-submitted', true);
Chris@1115 598 }
Chris@1115 599 });
Chris@1115 600 }
Chris@1115 601 });
Chris@1115 602 }
luisf@160 603
Chris@1115 604 $(document).ready(hideOnLoad);
Chris@1115 605 $(document).ready(addFormObserversForDoubleSubmit);
luisf@160 606