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 } 275 }); 276}; 277dtable.lock_dtable = function() 278{ 279 var $row = dtable.get_data_rows(jQuery(".dtable")); 280 281 jQuery(document).unbind('mousemove'); 282 $row.find("td, th").unbind('contextmenu'); 283 284 jQuery("#dtable_context_menu").hide(); 285}; 286 287dtable.row_mousedown = function(e) { 288 var $this_cell = jQuery(this); 289 var $this_row = $this_cell.closest("tr"); 290 291 var $context_menu = jQuery("#dtable_context_menu"); 292 293 $context_menu.html(''); 294 switch(this.nodeName.toLowerCase()) 295 { 296 case 'td': 297 //create contextMenu 298 var context_menus = ['insert_before', 'insert_after', 'edit', 'remove']; 299 //'insert_col_left', 'insert_col_right', 'mark_row_as_header', 'mark_col_as_header', 'mark_cell_as_header']; 300 break; 301 case 'th': 302 var context_menus = ['insert_before', 'insert_after', 'edit', 'remove']; 303 //'insert_col_left', 'insert_col_right', 'mark_row_as_cell', 'mark_col_as_cell', 'mark_cell_as_cell']; 304 break; 305 } 306 //remove disabled actions 307 context_menus = jQuery(context_menus).not(JSINFO['disabled']).get(); 308 309 var colspan = $this_cell.attr("colspan"); 310 var rowspan = $this_cell.attr("rowspan"); 311 312 313 for(item_index in context_menus) 314 { 315 var item = context_menus[item_index]; 316 jQuery('<li class="'+item+'">').html('<a href="#'+item+'">'+JSINFO['lang'][item]).appendTo($context_menu); 317 } 318 $context_menu.find("li.edit").addClass("separator"); 319 $context_menu.find("li.insert_col_left").addClass("separator"); 320 $context_menu.find("li.mark_row_as_header").addClass("separator"); 321 322 323 var offsetX = e.pageX + 1; 324 var offsetY = e.pageY + 1; 325 326 327 $context_menu.show(); 328 $context_menu.css('top',offsetY); 329 $context_menu.css('left',offsetX); 330 331 dtable.row = $this_row; 332 e.preventDefault(); 333 334}; 335dtable.clear_all_intervals = function() 336{ 337 for( i in dtable.intervals) 338 { 339 clearInterval(dtable.intervals[i]); 340 } 341}; 342 343dtable.change_rows = function($table, spans) 344{ 345 $table.find("tr").each(function(index) { 346 jQuery(this).find("td, th").each(function(td_ind) { 347 if (spans[index][td_ind][0] !== 1) { 348 jQuery(this).attr("colspan", spans[index][td_ind][0]); 349 } else { 350 jQuery(this).removeAttr("colspan"); 351 } 352 353 if (spans[index][td_ind][1] !== 1) { 354 jQuery(this).attr("rowspan", spans[index][td_ind][1]); 355 } else { 356 jQuery(this).removeAttr("rowspan"); 357 } 358 }); 359 }); 360 361}; 362 363dtable.get_table_id = function($form) 364{ 365 var table = $form.attr("id"); 366 return table.replace(/^dtable_/, ''); 367}; 368 369dtable.new_build_form = function($form, $row, action, value, row_data, colspan_callback, mod_cell_callback) 370{ 371 $form_row = jQuery('<tr class="form_row">').hide().appendTo( $form.find("table") ); 372 373 if ($form.find("input.dtable_field.dtable_action").length > 0) 374 { 375 jQuery($form).find("input.dtable_field.dtable_action").attr("name", action).val(JSON.stringify(value)); 376 jQuery($form).find("input.dtable_field[name=table]").val(dtable.get_table_id($form)); 377 378 } else 379 { 380 //append dtable_action 381 jQuery($form).append('<input type="hidden" class="dtable_action dtable_field" name="'+action+'" value="'+JSON.stringify(value)+'">'); 382 //append table name 383 jQuery($form).append('<input type="hidden" class="dtable_field" name="table" value="'+ dtable.get_table_id($form) +'">'); 384 } 385 386 387 var rowspans = []; 388 var rowspans_keys = []; 389 var rows_after = 0; 390 //found rowspans mother cells 391 $this_row.next().prevAll().each( 392 function() { 393 jQuery(this).find("td, th").each(function() 394 { 395 var rowspan = jQuery(this).attr("rowspan"); 396 if (typeof rowspan !== 'undefined' && rowspan !== false && parseInt(rowspan) > rows_after) { 397 var ind = jQuery(this).index(); 398 rowspans[ind] = jQuery(this); 399 rowspans_keys.push(ind); 400 } 401 }); 402 rows_after++; 403 }); 404 rowspans_keys.sort(); 405 406 407 var td_index = 0; 408 var col = 0; 409 var rowsp_cell_ind = 0; 410 411 412 var cells = row_data[0]; 413 414 for(var i = 0; i < cells.length; i++) 415 { 416 switch (cells[i][2]) { 417 case '^': 418 var tclass = 'tableheader_open'; 419 break; 420 default: 421 var tclass = 'tablecell_open'; 422 break; 423 } 424 var colspan = cells[i][0]; 425 var rowspan = cells[i][1]; 426 var content = cells[i][3]; 427 428 var $father_cell = $row.find("td, th").eq(td_index); 429 //var rowspan = $father_cell.attr('rowspan'); 430 431 if (mod_cell_callback !== undefined) { 432 var mod = mod_cell_callback.call(this, tclass, rowspan, colspan, content); 433 434 tclass = mod[0]; 435 rowspan = mod[1]; 436 colspan = mod[2]; 437 content = mod[3]; 438 } 439 440 if (jQuery.trim(content) == ':::') 441 { 442 var $mother_cell = rowspans[rowspans_keys[rowsp_cell_ind]]; 443 var width = $mother_cell.width(); 444 if (width < 20) 445 width = 20; 446 rowsp_cell_ind++; 447 jQuery('<textarea class="'+tclass+' rowspans dtable_field" name="col' + col +'">').val(content).width(width).css({'position': 'relative', 'display': 'block'}).appendTo($mother_cell); 448 col++; 449 if ($mother_cell.get(0) === $father_cell.get(0)) 450 td_index++; 451 } else 452 { 453 454 if (action === "edit") { 455 var width = $father_cell.width();// + 10; 456 var height = $father_cell.height(); //+ 5; 457 if (height < 40) 458 height = 40; 459 if (width < 80) 460 width = 80; 461 } else 462 { 463 width = $father_cell.width(); 464 height = 50; 465 } 466 467 if (colspan > 1) 468 { 469 col = colspan_callback.call(this, $form_row, colspan, width, height, tclass, col, content); 470 td_index++; 471 472 } else 473 { 474 475 var $form_cell = jQuery('<td>').attr({rowspan: rowspan}); 476 $textarea = jQuery('<textarea class="'+tclass+' dtable_field" name="col' + col +'">').val(content).width(width).height(height).appendTo($form_cell); 477 478 td_index++; 479 col++; 480 481 $form_row.append($form_cell); 482 } 483 } 484 485 } 486 $form.find("textarea.dtable_field").first().attr("id", dtable.textarea_id); 487 488 var $toolbar = jQuery("#"+dtable.toolbar_id); 489 if ($toolbar.is(':empty')) { 490 initToolbar(dtable.toolbar_id, dtable.textarea_id, toolbar); 491 } 492}; 493 494dtable.get_lines = function ($form, id) { 495 var rows_data = $form.data("table"); 496 return JSON.stringify(rows_data[id][1]); 497}; 498 499dtable.remove = function($this_row) { 500 $form = $this_row.closest("form"); 501 $table = $form.find("table"); 502 503 var id = dtable.get_row_id($table, $this_row); 504 jQuery.post(DOKU_BASE + 'lib/exe/ajax.php', 505 { 506 'call': dtable.get_call($form), 507 'table': dtable.get_table_id($form), 508 'remove': dtable.get_lines($form, id) 509 }, 510 function(data) 511 { 512 var res = jQuery.parseJSON(data); 513 if(res.type == 'success') 514 { 515 var rows_data = $form.data("table"); 516 var length = rows_data[id][1][1] - rows_data[id][1][0] + 1; 517 rows_data.splice(id, 1); 518 519 $form.data("table", rows_data); 520 521 $this_row.remove(); 522 523 524 for (var i = id; i < rows_data.length; i++) { 525 rows_data[i][1][0] -= length; 526 rows_data[i][1][1] -= length; 527 } 528 $form.data('table', rows_data); 529 530 //change rows in case of rowspan 531 dtable.change_rows($table, res.spans); 532 533 534 } else 535 { 536 dtable.error(res.msg); 537 } 538 }); 539}; 540 541dtable.contex_handler = function(e) { 542 e.preventDefault(); 543 544 var insert_colspan_callback = 545 function($form_row, colspan, width, height, tclass, col) { 546 width /= colspan; 547 for (var j = 0; j < colspan; j++) 548 { 549 jQuery('<textarea class="'+tclass+' dtable_field" name="col' + col +'">').val('').width(width).height(height).appendTo(jQuery('<td>').appendTo($form_row)); 550 col++; 551 } 552 return col; 553 }; 554 555 $this_row = dtable.row; 556 dtable.id = $this_row.closest(".dtable").attr("id"); 557 558 var row_id = $this_row.attr("id"); 559 var $table = $this_row.closest("table"); 560 var $form = $this_row.closest("form"); 561 562 563 var table = dtable.get_table_id($form); 564 565 //hide current form 566 var ev = jQuery(this).attr("href"); 567 568 //check any form in any table 569 jQuery(".form_row").each(function() { 570 $this_table = jQuery(this).closest("table"); 571 $this_table.find("tr:hidden").show(); 572 dtable.hide_form($this_table); 573 }); 574 575 switch(ev) 576 { 577 case '#remove': 578 dtable.remove($this_row); 579 break; 580 case '#edit': 581 582 var row_id = dtable.get_row_id($table, $this_row); 583 var rows_data = $form.data("table"); 584 var rows = rows_data[row_id]; 585 586 dtable.new_build_form($form, $this_row, "edit", rows[1], rows, 587 function($form_row, colspan, width, height, tclass, col, content) { 588 $form_cell = jQuery('<td>').attr({'colspan': colspan}); 589 590 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); 591 592 $form_row.append($form_cell); 593 594 var textareas = []; 595 jQuery('<textarea class="'+tclass+' dtable_field" name="col' + col +'">').val(content).width(width).height(height).appendTo($form_cell); 596 textareas.push(col); 597 col++; 598 for (var j = 1; j < colspan; j++) 599 { 600 jQuery('<textarea class="'+tclass+' dtable_field" name="col' + col +'">').val('').width(width).height(height).appendTo(jQuery('<td>').hide().appendTo($form_row)); 601 textareas.push(col); 602 col++; 603 } 604 605 $button.data('textareas', textareas); 606 $button.data('colspan', colspan); 607 608 $button.click(function() { 609 var textareas = jQuery(this).data('textareas'); 610 var colspan = jQuery(this).data('colspan'); 611 612 var $mother = $form.find("textarea.dtable_field[name=col"+textareas[0]+"]"); 613 $mother.closest('td').attr('colspan', 0); 614 var width = $mother.width() / colspan; 615 var tdwidth = $mother.closest('td').width() / colspan; 616 var height = $mother.height(); 617 for(var i = 0; i < textareas.length; i++) 618 { 619 var $elm = $form.find("textarea.dtable_field[name=col"+textareas[i]+"]"); 620 $elm.closest('td').show(); 621 $elm.width(width).height(height); 622 } 623 jQuery(this).remove(); 624 }); 625 return col; 626 }); 627 $this_row.after($table.find(".form_row")); 628 629 $this_row.hide(); 630 dtable.show_form($table); 631 632 break; 633 case '#insert_after': 634 635 var row_id = dtable.get_row_id($table, $this_row); 636 var rows_data = $form.data("table"); 637 var rows = rows_data[row_id]; 638 639 dtable.new_build_form($form, $this_row, "add", rows[1][1], rows, 640 insert_colspan_callback, 641 function(cclass, rowspan, colspan, value) 642 { 643 if (jQuery.trim(value) !== ':::') 644 value = ''; 645 if (typeof rowspan !== 'undefined' && rowspan !== false && rowspan > 1) { 646 rowspan = 1; 647 value = ':::' 648 } 649 650 cclass = 'tablecell_open'; 651 return [cclass, rowspan, colspan, value]; 652 }); 653 654 var $form_row = $table.find(".form_row"); 655 656 $this_row.after($form_row); 657 dtable.show_form($table); 658 break; 659 case '#insert_before': 660 661 var $form_row = $table.find(".form_row"); 662 663 var rows_data = $form.data("table"); 664 665 var $before_elm = $this_row.prev(); 666 667 668 if($before_elm.length != 0) { 669 var bef_row_id = dtable.get_row_id($table, $before_elm); 670 var add = rows_data[bef_row_id][1][1]; 671 var first_elm = false; 672 } else { 673 var add = rows_data[0][1][1]; 674 var first_elm = true; 675 } 676 677 var rows = rows_data[dtable.get_row_id($table, $this_row)]; 678 679 if (first_elm == true) { 680 var mod_row_call = 681 function(cclass, rowspan, colspan, value) 682 { 683 if (jQuery.trim(value) !== ':::') 684 value = ''; 685 if (typeof rowspan !== 'undefined' && rowspan !== false && rowspan > 1) { 686 rowspan = 1; 687 value = '' 688 } 689 690 cclass = 'tablecell_open'; 691 return [cclass, rowspan, colspan, value]; 692 }; 693 } else { 694 var mod_row_call = 695 function(cclass, rowspan, colspan, value) 696 { 697 if (jQuery.trim(value) !== ':::') 698 value = ''; 699 if (typeof rowspan !== 'undefined' && rowspan !== false && rowspan > 1) { 700 rowspan = 1; 701 value = ':::' 702 } 703 704 cclass = 'tablecell_open'; 705 return [cclass, rowspan, colspan, value]; 706 }; 707 } 708 709 dtable.new_build_form($form, $this_row, "add", add, rows, 710 insert_colspan_callback, mod_row_call); 711 712 $this_row.before($table.find(".form_row")); 713 dtable.show_form($table); 714 break; 715 } 716 jQuery(this).closest("#dtable_context_menu").hide(); 717}; 718 719dtable.init = function() 720{ 721//create panlock elm 722jQuery('<div class="panlock notify">').html(JSINFO['lang']['lock_notify']).hide().prependTo(".dtable"); 723 724//create panunlock elm 725jQuery('<div class="panunlock notify">').html(JSINFO['lang']['unlock_notify']).hide().prependTo(".dtable"); 726 727 728//update lock expires 729dtable.intervals.push(setInterval(function() 730{ 731 dtable.lock_expires -= 1; 732 if(dtable.lock_expires <= -1) 733 return; 734 735 if(dtable.lock_expires === 0) 736 { 737 //we had own lock 738 if(dtable.page_locked == 1) 739 { 740 //clear all intervals 741 dtable.clear_all_intervals(); 742 743 //page is locked 744 dtable.page_locked = 0; 745 746 var $forms = jQuery('.dtable .form_row:visible').closest('form'); 747 $forms.submit(); 748 749 //after submitting form 750 dtable.lock_dtable(); 751 dtable.panlock_switch('panunlock'); 752 } else 753 { 754 //unblock us if someones lock expires 755 dtable.lock_seeker(); 756 } 757 } 758 dtable.update_lock_timer(dtable.lock_expires); 759}, 1000)); 760 761 762$toolbar = jQuery("body").append('<div id="'+dtable.toolbar_id+'" style="position:absolute;display:none;z-index:999"></div>'); 763 764jQuery.ui.dialog.prototype._oldcreate = jQuery.ui.dialog.prototype._create; 765jQuery.extend(jQuery.ui.dialog.prototype, { 766 _init: function( ) 767 { 768 //This must be done to have correct z-index bahaviour in monobook template 769 var lin_wiz = jQuery("#link__wiz"); 770 lin_wiz.appendTo("body"); 771 this._oldcreate(); 772 } 773}); 774 775//This is the place where was old init Toolbar code 776 777 778//create empty context menu - it will be filled with context before displaying 779var $context_menu = jQuery('<ul id="dtable_context_menu">').prependTo("body"); 780 781 782$context_menu.delegate("a", "click", dtable.contex_handler); 783 784 785var $row = dtable.get_data_rows(jQuery(".dtable")); 786 787 788 789dtable.lock_seeker(dtable.unlock_dtable, dtable.lock_dtable); 790 791dtable.intervals.push(setInterval(function() { 792 dtable.lock_seeker(dtable.unlock_dtable, dtable.lock_dtable); 793}, dtable.lock_seeker_timeout)); 794 795 796//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 797jQuery(".dtable").submit( 798 function() 799 { 800 var $form = jQuery(this); 801 if($form.attr("id") == dtable.id) { 802 /*dtable.form_processing = true;*///Now form_processing is in dblclick func 803 var data = {}; 804 var action = jQuery(this).find("input.dtable_field.dtable_action").attr("name"); 805 var any_data = false; 806 jQuery(this).find("textarea.dtable_field, input.dtable_field").each( 807 function() 808 { 809 //if row is empty it isn't submited during adding and it's deleted during editing 810 if (jQuery(this).attr("class") != null && jQuery(this).attr("name").indexOf("col") == 0) { 811 if (jQuery(this).val() != "" && jQuery.trim(jQuery(this).val()) != ':::') 812 any_data = true; 813 data[jQuery(this).attr("name")] = JSON.stringify([jQuery(this).hasClass("tableheader_open") ? "tableheader_open" : "tablecell_open", jQuery(this).val()]); 814 } else 815 data[jQuery(this).attr("name")] = jQuery(this).val(); 816 }); 817 818 if (any_data == true) { 819 jQuery.post(DOKU_BASE + 'lib/exe/ajax.php', 820 data, 821 function(data) 822 { 823 var res = jQuery.parseJSON(data); 824 if(res.type == 'success') 825 { 826 827 if( res.new_row !== undefined ) 828 { 829 //remove old element 830 if (action == "edit") 831 $form.find(".form_row").prev().remove(); 832 833 var $table = $form.find("table"); 834 835 $new_elm = jQuery('<tr>'); 836 $new_elm.html( res.new_row ); 837 838 $form.find(".form_row").after($new_elm); 839 if(dtable.page_locked == 1) 840 $new_elm.find("td, th").bind("contextmenu", dtable.row_mousedown); 841 842 var index = dtable.get_row_id($table, $new_elm); 843 844 var raw_rows = $form.data('table'); 845 846 if (res.action == 'edit') { 847 old_row = raw_rows[index]; 848 raw_rows[index] = res.raw_row; 849 diff = old_row[1][1] - old_row[1][0]; 850 for (var i = index+1; i < raw_rows.length; i++) { 851 raw_rows[i][1][0] -= diff; 852 raw_rows[i][1][1] -= diff; 853 } 854 } else { 855 raw_rows.splice(index, 0, res.raw_row); 856 diff = res.raw_row[1][1] - res.raw_row[1][0] + 1; 857 for (var i = index+1; i < raw_rows.length; i++) { 858 raw_rows[i][1][0] += diff; 859 raw_rows[i][1][1] += diff; 860 } 861 } 862 $form.data('table', raw_rows); 863 } 864 865 dtable.hide_form($form); 866 867 var $table = $form.find("table"); 868 dtable.change_rows($table, res.spans); 869 870 } else 871 { 872 dtable.error(res.msg); 873 } 874 dtable.form_processing = false; 875 }); 876 } else { 877 if (action == "edit") { 878 $this_row = $form.find(".form_row").prev(); 879 dtable.remove($this_row); 880 $this_row.remove(); 881 } 882 dtable.hide_form($form); 883 dtable.form_processing = false; 884 } 885 } 886 return false; 887 }); 888jQuery(".dtable").delegate('textarea.dtable_field', 'focus', function(e) { 889 890 dtable.id = jQuery(this).closest(".dtable").attr("id"); 891 892 if(jQuery(this).attr("id") != dtable.textarea_id) 893 { 894 $marked_textarea = jQuery("#"+dtable.textarea_id); 895 896 $marked_parent = $marked_textarea.parent(); 897 $this_parent = jQuery(this).parent(); 898 899 this_val = jQuery(this).val(); 900 marked_val = $marked_textarea.val(); 901 jQuery(this).val(marked_val); 902 $marked_textarea.val(this_val); 903 904 this_name = jQuery(this).attr("name"); 905 marked_name = $marked_textarea.attr("name"); 906 jQuery(this).attr("name", marked_name); 907 $marked_textarea.attr("name", this_name); 908 909 this_class = jQuery(this).attr("class"); 910 marked_class = $marked_textarea.attr("class"); 911 jQuery(this).attr("class", marked_class); 912 $marked_textarea.attr("class", this_class); 913 914 this_width = jQuery(this).width(); 915 marked_width = $marked_textarea.width(); 916 917 this_height = jQuery(this).height(); 918 marked_height = $marked_textarea.height(); 919 920 //get styles 921 var this_style = jQuery(this).getStyleObject(['position', 'top', 'left', 'display']); 922 var marked_style = $marked_textarea.getStyleObject(['position', 'top', 'left', 'display']); 923 jQuery(this).css(marked_style); 924 $marked_textarea.css(this_style); 925 926 927 //correct width and height 928 jQuery(this).width(marked_width); 929 $marked_textarea.width(this_width); 930 931 jQuery(this).height(marked_height); 932 $marked_textarea.height(this_height); 933 934 935 $marked_parent.append(jQuery(this)); 936 $this_parent.append($marked_textarea); 937 938 $marked_textarea.show(); 939 940 jQuery("#"+dtable.textarea_id).focus(); 941 942 } 943 944}); 945 946 947 948}; 949 950jQuery(document).ready(function() 951{ 952 //load images 953 new Image('lib/plugins/dtable/images/unmerge.png'); 954 //check permission and if any dtable exists 955 if(JSINFO['write'] === true && jQuery(".dtable").length > 0) 956 dtable.init(); 957}); 958jQuery(window).on('unload', function () { dtable.unlock(); } ); 959