1(function($){ 2 jQuery.fn.getStyleObject = function(styles){ 3 var ret_style = {}; 4 for (var i = 0; i < styles.length; i++) 5 { 6 ret_style[styles[i]] = jQuery(this).css(styles[i]); 7 } 8 return ret_style; 9 } 10})(jQuery); 11 12dtable = {}; 13 14//acl >= 2 - użytkownik może modyfikować tabelkę 15//dtable.init = function(acl, self_url, wiki_url, page_id) 16 17dtable.toolbar_id = "dtable_tool__bar"; 18//I need it to use dokuwiki toolbar 19dtable.textarea_id = "dtable_wiki__text"; 20//Set it to true if we are waiting fro form to send 21dtable.form_processing = false; 22//Store informatino about actual clicked row 23dtable.row = {}; 24//Id of processed dtable 25dtable.id = ""; 26//if page locked 27dtable.page_locked = 0; 28 29//state of lock 30//0 -> we don't know anything 31//1 -> someone lock the page and we waiting until we could refresh it 32//2 -> we can edit page for some time but we left browser alone and our lock expires and someone else came end start to edit page, so we need to lock our page and optionally send the form. 33dtable.lock_state = 0; 34 35//use to determine if user doing something 36dtable.pageX = 0; 37dtable.pageY = 0; 38dtable.prev_pageX = 0; 39dtable.prev_pageY = 0; 40 41//check if forms in dtable are changed 42dtable.prev_val = ''; 43 44//When my or someones else lock expires 45dtable.lock_expires = -1; 46 47//All intervals 48dtable.intervals = []; 49 50dtable.lock_seeker_timeout = 5*1000; 51 52dtable.error = function(msg) 53{ 54 alert(msg); 55}; 56dtable.show_form = function($table) 57{ 58 var $form = $table.find(".form_row"); 59 var $toolbar = jQuery("#"+dtable.toolbar_id); 60 61 //display fix jquery 1.6 bug 62 $form.css("display", "table-row"); 63 64 var rowspan_text_height = -1; 65 66 $form.find("textarea.dtable_field").each(function() { 67 68 //this is merged cell 69 var button = jQuery(this).closest('td').find('button'); 70 if (button.length > 0) 71 { 72 var button_width = 31; 73 var text_off = jQuery(this).offset(); 74 var scroller_width = 20; 75 76 var button_off = button.offset(); 77 button.css({'position': 'absolute', 'top': text_off.top , 'left': button_off.left + jQuery(this).width() - button_width - scroller_width}).appendTo("body"); 78 } 79 }); 80 81 //calculate texarea.rowspans positions 82 var textarea_offset = $form.find("textarea.dtable_field").first().offset(); 83 84 $table.find("textarea.dtable_field:not(.form_row textarea.dtable_field)").each(function() { 85 var this_texta_offset = jQuery(this).offset(); 86 jQuery(this).css('top', textarea_offset.top - this_texta_offset.top); 87 }); 88 89 90 91 var offset = $form.offset(); 92 $toolbar.css({ 93 "left": offset.left, 94 "top": offset.top-$toolbar.height() 95 }); 96 $toolbar.show(); 97}; 98dtable.hide_form = function($table) 99{ 100 var $form = $table.find(".form_row"); 101 //remove form 102 $form.remove(); 103 //remove textareas in rowspans 104 $table.find("textarea.dtable_field").remove(); 105 106 jQuery(".dtable_unmerge").remove(); 107 108 var $toolbar = jQuery("#"+dtable.toolbar_id); 109 $form.hide(); 110 $toolbar.hide(); 111}; 112dtable.get_data_rows = function($table) 113{ 114 //.not(".form_row") is nesssesery 115 return $table.find("tr").not(".form_row");//.not(":hidden"); 116}; 117dtable.get_row_id = function($table, $row) 118{ 119 return dtable.get_data_rows($table).index($row); 120}; 121dtable.get_call = function($form) 122{ 123 return $form.find("input.dtable_field[name=call]").val(); 124}; 125//Lock actuall page 126dtable.lock = function() 127{ 128 jQuery.post(DOKU_BASE + 'lib/exe/ajax.php', 129 { 130 'call': 'dtable_page_lock', 131 'page': JSINFO['id'], 132 },function() { dtable.page_locked = 1 }); 133}; 134dtable.unlock = function() 135{ 136 if(dtable.page_locked == 1) 137 { 138 jQuery.post(DOKU_BASE + 'lib/exe/ajax.php', 139 { 140 'call': 'dtable_page_unlock', 141 'page': JSINFO['id'], 142 },function() { dtable.page_locked = 0 }); 143 } 144}; 145dtable.panlock_switch = function(state) 146{ 147 if(state == undefined) 148 state = 'hide'; 149 150 151 if(state == 'panlock') 152 { 153 jQuery(".dtable .panunlock").hide(); 154 jQuery(".dtable .panlock").show(); 155 } else if(state == 'panunlock') 156 { 157 jQuery(".dtable .panlock").hide(); 158 jQuery(".dtable .panunlock").show(); 159 } else 160 { 161 jQuery(".dtable .panlock").hide(); 162 jQuery(".dtable .panunlock").hide(); 163 } 164}; 165 166dtable.lock_seeker = function(nolock, lock) 167{ 168 jQuery.post(DOKU_BASE + 'lib/exe/ajax.php', 169 { 170 'call': 'dtable_is_page_locked', 171 'page': JSINFO['id'], 172 }, function(data) 173 { 174 var res = jQuery.parseJSON(data); 175 176 dtable.lock_expires = res.time_left; 177 178 if(res.locked === 1) 179 { 180 if(dtable.lock_state == 2) 181 lock(); 182 183 jQuery(".dtable .panlock .who").text(res.who); 184 dtable.update_lock_timer(dtable.lock_expires); 185 dtable.panlock_switch('panlock'); 186 187 188 dtable.lock_state = 1; 189 190 } else 191 { 192 dtable.panlock_switch('hide'); 193 if(dtable.lock_state === 0) 194 nolock(); 195 else if(dtable.lock_state === 1) 196 { 197 dtable.panlock_switch('panunlock'); 198 dtable.clear_all_intervals(); 199 } 200 201 dtable.lock_state = 2; 202 203 204 //refresh lock if user do something 205 var form_val_str = ''; 206 jQuery('.dtable .form_row').find('textarea.dtable_field').each(function() { 207 form_val_str += jQuery(this).val(); 208 }); 209 if(dtable.pageX != dtable.prev_pageX || dtable.pageY != dtable.prev_pageY || dtable.prev_val != form_val_str) 210 { 211 dtable.prev_pageX = dtable.pageX; 212 dtable.prev_pageY = dtable.pageY; 213 dtable.prev_val = form_val_str; 214 dtable.lock(); 215 } 216 } 217 218 }); 219}; 220dtable.update_lock_timer = function(seconds) 221{ 222 var date = new Date(); 223 date.setSeconds(date.getSeconds()+seconds); 224 jQuery(".dtable .panlock .time_left").text(date.toLocaleString()); 225}; 226dtable.unlock_dtable = function() 227{ 228 229 var $row = dtable.get_data_rows(jQuery(".dtable")); 230 var $context_menu = jQuery("#dtable_context_menu"); 231 232 dtable.lock(); 233 234 //track mouse in order to check if user do somenhing 235 jQuery(document).bind('mousemove', function(e){ 236 dtable.pageX = e.pageX; 237 dtable.pageY = e.pageY; 238 }); 239 240 241 242 $row.find("td, th").bind("contextmenu", dtable.row_mousedown); 243 244 jQuery(document).bind("mouseup", function(e) { 245 if (e.which == 1) { $context_menu.hide(); } 246 }); 247 248 //prevent unmerge button from sending form 249 jQuery("body").delegate(".dtable_unmerge", "dblclick", function(e) { 250 e.stopPropagation(); 251 }); 252 253 //prevent outer texarea from sending form 254 jQuery(".dtable").delegate("textarea.dtable_field", "dblclick", function(e) { 255 e.stopPropagation(); 256 }); 257 258 //This was previously at the bottom of init function 259 jQuery(".dtable").delegate(".form_row", "dblclick", function(e) { 260 e.stopPropagation(); 261 }); 262 263 jQuery("body").delegate("#"+dtable.toolbar_id, "dblclick", function(e) { 264 e.stopPropagation(); 265 }); 266 267 jQuery(document).dblclick(function(e){ 268 //sent form only once 269 if(dtable.form_processing == false) { 270 dtable.form_processing = true; 271 //$context_menu.hide(); 272 if(jQuery(".dtable .form_row").find(":visible").length > 0) { 273 jQuery(".dtable").submit(); 274 } else { 275 dtable.form_processing = false; 276 } 277 } 278 }); 279}; 280dtable.lock_dtable = function() 281{ 282 var $row = dtable.get_data_rows(jQuery(".dtable")); 283 284 jQuery(document).unbind('mousemove'); 285 $row.find("td, th").unbind('contextmenu'); 286 287 jQuery("#dtable_context_menu").hide(); 288}; 289 290dtable.row_mousedown = function(e) { 291 var $this_cell = jQuery(this); 292 var $this_row = $this_cell.closest("tr"); 293 294 var $context_menu = jQuery("#dtable_context_menu"); 295 296 $context_menu.html(''); 297 switch(this.nodeName.toLowerCase()) 298 { 299 case 'td': 300 //create contextMenu 301 var context_menus = ['insert_before', 'insert_after', 'edit', 'remove']; 302 //'insert_col_left', 'insert_col_right', 'mark_row_as_header', 'mark_col_as_header', 'mark_cell_as_header']; 303 break; 304 case 'th': 305 var context_menus = ['insert_before', 'insert_after', 'edit', 'remove']; 306 //'insert_col_left', 'insert_col_right', 'mark_row_as_cell', 'mark_col_as_cell', 'mark_cell_as_cell']; 307 break; 308 } 309 //remove disabled actions 310 context_menus = jQuery(context_menus).not(JSINFO['disabled']).get(); 311 312 var colspan = $this_cell.attr("colspan"); 313 var rowspan = $this_cell.attr("rowspan"); 314 315 316 for(item_index in context_menus) 317 { 318 var item = context_menus[item_index]; 319 jQuery('<li class="'+item+'">').html('<a href="#'+item+'">'+JSINFO['lang'][item]).appendTo($context_menu); 320 } 321 $context_menu.find("li.edit").addClass("separator"); 322 $context_menu.find("li.insert_col_left").addClass("separator"); 323 $context_menu.find("li.mark_row_as_header").addClass("separator"); 324 325 326 var offsetX = e.pageX + 1; 327 var offsetY = e.pageY + 1; 328 329 330 $context_menu.show(); 331 $context_menu.css('top',offsetY); 332 $context_menu.css('left',offsetX); 333 334 dtable.row = $this_row; 335 e.preventDefault(); 336 337}; 338dtable.clear_all_intervals = function() 339{ 340 for( i in dtable.intervals) 341 { 342 clearInterval(dtable.intervals[i]); 343 } 344}; 345 346dtable.change_rows = function($table, spans) 347{ 348 $table.find("tr").each(function(index) { 349 jQuery(this).find("td, th").each(function(td_ind) { 350 if (spans[index][td_ind][0] !== 1) { 351 jQuery(this).attr("colspan", spans[index][td_ind][0]); 352 } else { 353 jQuery(this).removeAttr("colspan"); 354 } 355 356 if (spans[index][td_ind][1] !== 1) { 357 jQuery(this).attr("rowspan", spans[index][td_ind][1]); 358 } else { 359 jQuery(this).removeAttr("rowspan"); 360 } 361 }); 362 }); 363 364}; 365 366dtable.get_table_id = function($form) 367{ 368 var table = $form.attr("id"); 369 return table.replace(/^dtable_/, ''); 370}; 371 372dtable.new_build_form = function($form, $row, action, value, row_data, colspan_callback, mod_cell_callback) 373{ 374 $form_row = jQuery('<tr class="form_row">').hide().appendTo( $form.find("table") ); 375 376 if ($form.find("input.dtable_field.dtable_action").length > 0) 377 { 378 jQuery($form).find("input.dtable_field.dtable_action").attr("name", action).val(JSON.stringify(value)); 379 jQuery($form).find("input.dtable_field[name=table]").val(dtable.get_table_id($form)); 380 381 } else 382 { 383 //append dtable_action 384 jQuery($form).append('<input type="hidden" class="dtable_action dtable_field" name="'+action+'" value="'+JSON.stringify(value)+'">'); 385 //append table name 386 jQuery($form).append('<input type="hidden" class="dtable_field" name="table" value="'+ dtable.get_table_id($form) +'">'); 387 } 388 389 390 var rowspans = []; 391 var rowspans_keys = []; 392 var rows_after = 0; 393 //found rowspans mother cells 394 $this_row.next().prevAll().each( 395 function() { 396 jQuery(this).find("td, th").each(function() 397 { 398 var rowspan = jQuery(this).attr("rowspan"); 399 if (typeof rowspan !== 'undefined' && rowspan !== false && parseInt(rowspan) > rows_after) { 400 var ind = jQuery(this).index(); 401 rowspans[ind] = jQuery(this); 402 rowspans_keys.push(ind); 403 } 404 }); 405 rows_after++; 406 }); 407 rowspans_keys.sort(); 408 409 410 var td_index = 0; 411 var col = 0; 412 var rowsp_cell_ind = 0; 413 414 415 var cells = row_data[0]; 416 417 for(var i = 0; i < cells.length; i++) 418 { 419 switch (cells[i][2]) { 420 case '^': 421 var tclass = 'tableheader_open'; 422 break; 423 default: 424 var tclass = 'tablecell_open'; 425 break; 426 } 427 var colspan = cells[i][0]; 428 var rowspan = cells[i][1]; 429 var content = cells[i][3]; 430 431 var $father_cell = $row.find("td, th").eq(td_index); 432 //var rowspan = $father_cell.attr('rowspan'); 433 434 if (mod_cell_callback !== undefined) { 435 var mod = mod_cell_callback.call(this, tclass, rowspan, colspan, content); 436 437 tclass = mod[0]; 438 rowspan = mod[1]; 439 colspan = mod[2]; 440 content = mod[3]; 441 } 442 443 if (jQuery.trim(content) == ':::') 444 { 445 var $mother_cell = rowspans[rowspans_keys[rowsp_cell_ind]]; 446 var width = $mother_cell.width(); 447 if (width < 20) 448 width = 20; 449 rowsp_cell_ind++; 450 jQuery('<textarea class="'+tclass+' rowspans dtable_field" name="col' + col +'">').val(content).width(width).css({'position': 'relative', 'display': 'block'}).appendTo($mother_cell); 451 col++; 452 if ($mother_cell.get(0) === $father_cell.get(0)) 453 td_index++; 454 } else 455 { 456 457 if (action === "edit") { 458 var width = $father_cell.width();// + 10; 459 var height = $father_cell.height(); //+ 5; 460 if (height < 40) 461 height = 40; 462 if (width < 80) 463 width = 80; 464 } else 465 { 466 width = $father_cell.width(); 467 height = 50; 468 } 469 470 if (colspan > 1) 471 { 472 col = colspan_callback.call(this, $form_row, colspan, width, height, tclass, col, content); 473 td_index++; 474 475 } else 476 { 477 478 var $form_cell = jQuery('<td>').attr({rowspan: rowspan}); 479 $textarea = jQuery('<textarea class="'+tclass+' dtable_field" name="col' + col +'">').val(content).width(width).height(height).appendTo($form_cell); 480 481 td_index++; 482 col++; 483 484 $form_row.append($form_cell); 485 } 486 } 487 488 } 489 $form.find("textarea.dtable_field").first().attr("id", dtable.textarea_id); 490 491 var $toolbar = jQuery("#"+dtable.toolbar_id); 492 if ($toolbar.is(':empty')) { 493 initToolbar(dtable.toolbar_id, dtable.textarea_id, toolbar); 494 } 495}; 496 497dtable.get_lines = function ($form, id) { 498 var rows_data = $form.data("table"); 499 return JSON.stringify(rows_data[id][1]); 500}; 501 502dtable.remove = function($this_row) { 503 $form = $this_row.closest("form"); 504 $table = $form.find("table"); 505 506 var id = dtable.get_row_id($table, $this_row); 507 jQuery.post(DOKU_BASE + 'lib/exe/ajax.php', 508 { 509 'call': dtable.get_call($form), 510 'table': dtable.get_table_id($form), 511 'remove': dtable.get_lines($form, id) 512 }, 513 function(data) 514 { 515 var res = jQuery.parseJSON(data); 516 if(res.type == 'success') 517 { 518 var rows_data = $form.data("table"); 519 var length = rows_data[id][1][1] - rows_data[id][1][0] + 1; 520 rows_data.splice(id, 1); 521 522 $form.data("table", rows_data); 523 524 $this_row.remove(); 525 526 527 for (var i = id; i < rows_data.length; i++) { 528 rows_data[i][1][0] -= length; 529 rows_data[i][1][1] -= length; 530 } 531 $form.data('table', rows_data); 532 533 //change rows in case of rowspan 534 dtable.change_rows($table, res.spans); 535 536 537 } else 538 { 539 dtable.error(res.msg); 540 } 541 }); 542}; 543 544dtable.contex_handler = function(e) { 545 e.preventDefault(); 546 547 var insert_colspan_callback = 548 function($form_row, colspan, width, height, tclass, col) { 549 width /= colspan; 550 for (var j = 0; j < colspan; j++) 551 { 552 jQuery('<textarea class="'+tclass+' dtable_field" name="col' + col +'">').val('').width(width).height(height).appendTo(jQuery('<td>').appendTo($form_row)); 553 col++; 554 } 555 return col; 556 }; 557 558 $this_row = dtable.row; 559 dtable.id = $this_row.closest(".dtable").attr("id"); 560 561 var row_id = $this_row.attr("id"); 562 var $table = $this_row.closest("table"); 563 var $form = $this_row.closest("form"); 564 565 566 var table = dtable.get_table_id($form); 567 568 //hide current form 569 var ev = jQuery(this).attr("href"); 570 571 //check any form in any table 572 jQuery(".form_row").each(function() { 573 $this_table = jQuery(this).closest("table"); 574 $this_table.find("tr:hidden").show(); 575 dtable.hide_form($this_table); 576 }); 577 578 switch(ev) 579 { 580 case '#remove': 581 dtable.remove($this_row); 582 break; 583 case '#edit': 584 585 var row_id = dtable.get_row_id($table, $this_row); 586 var rows_data = $form.data("table"); 587 var rows = rows_data[row_id]; 588 589 dtable.new_build_form($form, $this_row, "edit", rows[1], rows, 590 function($form_row, colspan, width, height, tclass, col, content) { 591 $form_cell = jQuery('<td>').attr({'colspan': colspan}); 592 593 var $button = jQuery('<button class="toolbutton dtable_unmerge" title="'+((JSINFO['lang']['show_merged_rows']).replace("%d", colspan-1))+'"><img width="16" height="16" src="lib/plugins/dtable/images/unmerge.png"></button>').appendTo($form_cell); 594 595 $form_row.append($form_cell); 596 597 var textareas = []; 598 jQuery('<textarea class="'+tclass+' dtable_field" name="col' + col +'">').val(content).width(width).height(height).appendTo($form_cell); 599 textareas.push(col); 600 col++; 601 for (var j = 1; j < colspan; j++) 602 { 603 jQuery('<textarea class="'+tclass+' dtable_field" name="col' + col +'">').val('').width(width).height(height).appendTo(jQuery('<td>').hide().appendTo($form_row)); 604 textareas.push(col); 605 col++; 606 } 607 608 $button.data('textareas', textareas); 609 $button.data('colspan', colspan); 610 611 $button.click(function() { 612 var textareas = jQuery(this).data('textareas'); 613 var colspan = jQuery(this).data('colspan'); 614 615 var $mother = $form.find("textarea.dtable_field[name=col"+textareas[0]+"]"); 616 $mother.closest('td').attr('colspan', 0); 617 var width = $mother.width() / colspan; 618 var tdwidth = $mother.closest('td').width() / colspan; 619 var height = $mother.height(); 620 for(var i = 0; i < textareas.length; i++) 621 { 622 var $elm = $form.find("textarea.dtable_field[name=col"+textareas[i]+"]"); 623 $elm.closest('td').show(); 624 $elm.width(width).height(height); 625 } 626 jQuery(this).remove(); 627 }); 628 return col; 629 }); 630 $this_row.after($table.find(".form_row")); 631 632 $this_row.hide(); 633 dtable.show_form($table); 634 635 break; 636 case '#insert_after': 637 638 var row_id = dtable.get_row_id($table, $this_row); 639 var rows_data = $form.data("table"); 640 var rows = rows_data[row_id]; 641 642 dtable.new_build_form($form, $this_row, "add", rows[1][1], rows, 643 insert_colspan_callback, 644 function(cclass, rowspan, colspan, value) 645 { 646 if (jQuery.trim(value) !== ':::') 647 value = ''; 648 if (typeof rowspan !== 'undefined' && rowspan !== false && rowspan > 1) { 649 rowspan = 1; 650 value = ':::' 651 } 652 653 cclass = 'tablecell_open'; 654 return [cclass, rowspan, colspan, value]; 655 }); 656 657 var $form_row = $table.find(".form_row"); 658 659 $this_row.after($form_row); 660 dtable.show_form($table); 661 break; 662 case '#insert_before': 663 664 var $form_row = $table.find(".form_row"); 665 666 var rows_data = $form.data("table"); 667 668 var $before_elm = $this_row.prev(); 669 670 671 if($before_elm.length != 0) { 672 var bef_row_id = dtable.get_row_id($table, $before_elm); 673 var add = rows_data[bef_row_id][1][1]; 674 var first_elm = false; 675 } else { 676 var add = rows_data[0][1][1]; 677 var first_elm = true; 678 } 679 680 var rows = rows_data[dtable.get_row_id($table, $this_row)]; 681 682 if (first_elm == true) { 683 var mod_row_call = 684 function(cclass, rowspan, colspan, value) 685 { 686 if (jQuery.trim(value) !== ':::') 687 value = ''; 688 if (typeof rowspan !== 'undefined' && rowspan !== false && rowspan > 1) { 689 rowspan = 1; 690 value = '' 691 } 692 693 cclass = 'tablecell_open'; 694 return [cclass, rowspan, colspan, value]; 695 }; 696 } else { 697 var mod_row_call = 698 function(cclass, rowspan, colspan, value) 699 { 700 if (jQuery.trim(value) !== ':::') 701 value = ''; 702 if (typeof rowspan !== 'undefined' && rowspan !== false && rowspan > 1) { 703 rowspan = 1; 704 value = ':::' 705 } 706 707 cclass = 'tablecell_open'; 708 return [cclass, rowspan, colspan, value]; 709 }; 710 } 711 712 dtable.new_build_form($form, $this_row, "add", add, rows, 713 insert_colspan_callback, mod_row_call); 714 715 $this_row.before($table.find(".form_row")); 716 dtable.show_form($table); 717 break; 718 } 719 jQuery(this).closest("#dtable_context_menu").hide(); 720}; 721 722dtable.init = function() 723{ 724//create panlock elm 725jQuery('<div class="panlock notify">').html(JSINFO['lang']['lock_notify']).hide().prependTo(".dtable"); 726 727//create panunlock elm 728jQuery('<div class="panunlock notify">').html(JSINFO['lang']['unlock_notify']).hide().prependTo(".dtable"); 729 730 731//update lock expires 732dtable.intervals.push(setInterval(function() 733{ 734 dtable.lock_expires -= 1; 735 if(dtable.lock_expires <= -1) 736 return; 737 738 if(dtable.lock_expires === 0) 739 { 740 //we had own lock 741 if(dtable.page_locked == 1) 742 { 743 //clear all intervals 744 dtable.clear_all_intervals(); 745 746 //page is locked 747 dtable.page_locked = 0; 748 749 var $forms = jQuery('.dtable .form_row:visible').closest('form'); 750 $forms.submit(); 751 752 //after submitting form 753 dtable.lock_dtable(); 754 dtable.panlock_switch('panunlock'); 755 } else 756 { 757 //unblock us if someones lock expires 758 dtable.lock_seeker(); 759 } 760 } 761 dtable.update_lock_timer(dtable.lock_expires); 762}, 1000)); 763 764 765$toolbar = jQuery("body").append('<div id="'+dtable.toolbar_id+'" style="position:absolute;display:none;z-index:999"></div>'); 766 767jQuery.ui.dialog.prototype._oldcreate = jQuery.ui.dialog.prototype._create; 768jQuery.extend(jQuery.ui.dialog.prototype, { 769 _init: function( ) 770 { 771 //This must be done to have correct z-index bahaviour in monobook template 772 var lin_wiz = jQuery("#link__wiz"); 773 lin_wiz.appendTo("body"); 774 this._oldcreate(); 775 } 776}); 777 778//This is the place where was old init Toolbar code 779 780 781//create empty context menu - it will be filled with context before displaying 782var $context_menu = jQuery('<ul id="dtable_context_menu">').prependTo("body"); 783 784 785$context_menu.delegate("a", "click", dtable.contex_handler); 786 787 788var $row = dtable.get_data_rows(jQuery(".dtable")); 789 790 791 792dtable.lock_seeker(dtable.unlock_dtable, dtable.lock_dtable); 793 794dtable.intervals.push(setInterval(function() { 795 dtable.lock_seeker(dtable.unlock_dtable, dtable.lock_dtable); 796}, dtable.lock_seeker_timeout)); 797 798 799//Add is set on id of element after we want to add new element if set to -1 we adding element at the top of the table 800jQuery(".dtable").submit( 801 function() 802 { 803 var $form = jQuery(this); 804 if($form.attr("id") == dtable.id) { 805 /*dtable.form_processing = true;*///Now form_processing is in dblclick func 806 var data = {}; 807 var action = jQuery(this).find("input.dtable_field.dtable_action").attr("name"); 808 var any_data = false; 809 jQuery(this).find("textarea.dtable_field, input.dtable_field").each( 810 function() 811 { 812 //if row is empty it isn't submited during adding and it's deleted during editing 813 if (jQuery(this).attr("class") != null && jQuery(this).attr("name").indexOf("col") == 0) { 814 if (jQuery(this).val() != "" && jQuery.trim(jQuery(this).val()) != ':::') 815 any_data = true; 816 data[jQuery(this).attr("name")] = JSON.stringify([jQuery(this).hasClass("tableheader_open") ? "tableheader_open" : "tablecell_open", jQuery(this).val()]); 817 } else 818 data[jQuery(this).attr("name")] = jQuery(this).val(); 819 }); 820 821 if (any_data == true) { 822 jQuery.post(DOKU_BASE + 'lib/exe/ajax.php', 823 data, 824 function(data) 825 { 826 var res = jQuery.parseJSON(data); 827 if(res.type == 'success') 828 { 829 830 if( res.new_row !== undefined ) 831 { 832 //remove old element 833 if (action == "edit") 834 $form.find(".form_row").prev().remove(); 835 836 var $table = $form.find("table"); 837 838 $new_elm = jQuery('<tr>'); 839 $new_elm.html( res.new_row ); 840 841 $form.find(".form_row").after($new_elm); 842 if(dtable.page_locked == 1) 843 $new_elm.find("td, th").bind("contextmenu", dtable.row_mousedown); 844 845 var index = dtable.get_row_id($table, $new_elm); 846 847 var raw_rows = $form.data('table'); 848 849 if (res.action == 'edit') { 850 old_row = raw_rows[index]; 851 raw_rows[index] = res.raw_row; 852 diff = old_row[1][1] - old_row[1][0]; 853 for (var i = index+1; i < raw_rows.length; i++) { 854 raw_rows[i][1][0] -= diff; 855 raw_rows[i][1][1] -= diff; 856 } 857 } else { 858 raw_rows.splice(index, 0, res.raw_row); 859 diff = res.raw_row[1][1] - res.raw_row[1][0] + 1; 860 for (var i = index+1; i < raw_rows.length; i++) { 861 raw_rows[i][1][0] += diff; 862 raw_rows[i][1][1] += diff; 863 } 864 } 865 $form.data('table', raw_rows); 866 } 867 868 dtable.hide_form($form); 869 870 var $table = $form.find("table"); 871 dtable.change_rows($table, res.spans); 872 873 } else 874 { 875 dtable.error(res.msg); 876 } 877 dtable.form_processing = false; 878 }); 879 } else { 880 if (action == "edit") { 881 $this_row = $form.find(".form_row").prev(); 882 dtable.remove($this_row); 883 $this_row.remove(); 884 } 885 dtable.hide_form($form); 886 dtable.form_processing = false; 887 } 888 } 889 dtable.form_processing = false; 890 return false; 891 }); 892jQuery(".dtable").delegate('textarea.dtable_field', 'focus', function(e) { 893 894 dtable.id = jQuery(this).closest(".dtable").attr("id"); 895 896 if(jQuery(this).attr("id") != dtable.textarea_id) 897 { 898 $marked_textarea = jQuery("#"+dtable.textarea_id); 899 900 $marked_parent = $marked_textarea.parent(); 901 $this_parent = jQuery(this).parent(); 902 903 this_val = jQuery(this).val(); 904 marked_val = $marked_textarea.val(); 905 jQuery(this).val(marked_val); 906 $marked_textarea.val(this_val); 907 908 this_name = jQuery(this).attr("name"); 909 marked_name = $marked_textarea.attr("name"); 910 jQuery(this).attr("name", marked_name); 911 $marked_textarea.attr("name", this_name); 912 913 this_class = jQuery(this).attr("class"); 914 marked_class = $marked_textarea.attr("class"); 915 jQuery(this).attr("class", marked_class); 916 $marked_textarea.attr("class", this_class); 917 918 this_width = jQuery(this).width(); 919 marked_width = $marked_textarea.width(); 920 921 this_height = jQuery(this).height(); 922 marked_height = $marked_textarea.height(); 923 924 //get styles 925 var this_style = jQuery(this).getStyleObject(['position', 'top', 'left', 'display']); 926 var marked_style = $marked_textarea.getStyleObject(['position', 'top', 'left', 'display']); 927 jQuery(this).css(marked_style); 928 $marked_textarea.css(this_style); 929 930 931 //correct width and height 932 jQuery(this).width(marked_width); 933 $marked_textarea.width(this_width); 934 935 jQuery(this).height(marked_height); 936 $marked_textarea.height(this_height); 937 938 939 $marked_parent.append(jQuery(this)); 940 $this_parent.append($marked_textarea); 941 942 $marked_textarea.show(); 943 944 jQuery("#"+dtable.textarea_id).focus(); 945 946 } 947 948}); 949 950 951 952}; 953 954jQuery(document).ready(function() 955{ 956 //load images 957 new Image('lib/plugins/dtable/images/unmerge.png'); 958 //check permission and if any dtable exists 959 if(JSINFO['write'] === true && jQuery(".dtable").length > 0) 960 dtable.init(); 961}); 962jQuery(window).on('unload', function () { dtable.unlock(); } ); 963