annotate .svn/pristine/3e/3ed8c1b8169d56ca657416dab8458700070dce49.svn-base @ 1384:b51b5ae3734c luisf

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