(function($){ jQuery.fn.getStyleObject = function(styles){ var ret_style = {}; for (var i = 0; i < styles.length; i++) { ret_style[styles[i]] = jQuery(this).css(styles[i]); } return ret_style; } })(jQuery); dtable = {}; //acl >= 2 - użytkownik może modyfikować tabelkę //dtable.init = function(acl, self_url, wiki_url, page_id) dtable.toolbar_id = "dtable_tool__bar"; //I need it to use dokuwiki toolbar dtable.textarea_id = "dtable_wiki__text"; //Set it to true if we are waiting fro form to send dtable.form_processing = false; //Store informatino about actual clicked row dtable.row = {}; //Id of processed dtable dtable.id = ""; //if page locked dtable.page_locked = 0; //state of lock //0 -> we don't know anything //1 -> someone lock the page and we waiting until we could refresh it //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. dtable.lock_state = 0; //use to determine if user doing something dtable.pageX = 0; dtable.pageY = 0; dtable.prev_pageX = 0; dtable.prev_pageY = 0; //check if forms in dtable are changed dtable.prev_val = ''; //When my or someones else lock expires dtable.lock_expires = -1; //All intervals dtable.intervals = []; dtable.lock_seeker_timeout = 5*1000; dtable.error = function(msg) { alert(msg); }; dtable.show_form = function($table) { var $form = $table.find(".form_row"); var $toolbar = jQuery("#"+dtable.toolbar_id); //display fix jquery 1.6 bug $form.css("display", "table-row"); var rowspan_text_height = -1; $form.find("textarea.dtable_field").each(function() { //this is merged cell var button = jQuery(this).closest('td').find('button'); if (button.length > 0) { var button_width = 31; var text_off = jQuery(this).offset(); var scroller_width = 20; var button_off = button.offset(); button.css({'position': 'absolute', 'top': text_off.top , 'left': button_off.left + jQuery(this).width() - button_width - scroller_width}).appendTo("body"); } }); //calculate texarea.rowspans positions var textarea_offset = $form.find("textarea.dtable_field").first().offset(); $table.find("textarea.dtable_field:not(.form_row textarea.dtable_field)").each(function() { var this_texta_offset = jQuery(this).offset(); jQuery(this).css('top', textarea_offset.top - this_texta_offset.top); }); var offset = $form.offset(); $toolbar.css({ "left": offset.left, "top": offset.top-$toolbar.height() }); $toolbar.show(); }; dtable.hide_form = function($table) { var $form = $table.find(".form_row"); //remove form $form.remove(); //remove textareas in rowspans $table.find("textarea.dtable_field").remove(); jQuery(".dtable_unmerge").remove(); var $toolbar = jQuery("#"+dtable.toolbar_id); $form.hide(); $toolbar.hide(); }; dtable.get_data_rows = function($table) { //.not(".form_row") is nesssesery return $table.find("tr").not(".form_row");//.not(":hidden"); }; dtable.get_row_id = function($table, $row) { return dtable.get_data_rows($table).index($row); }; dtable.get_call = function($form) { return $form.find("input.dtable_field[name=call]").val(); }; //Lock actuall page dtable.lock = function() { jQuery.post(DOKU_BASE + 'lib/exe/ajax.php', { 'call': 'dtable_page_lock', 'page': JSINFO['id'], },function() { dtable.page_locked = 1 }); }; dtable.unlock = function() { if(dtable.page_locked == 1) { jQuery.post(DOKU_BASE + 'lib/exe/ajax.php', { 'call': 'dtable_page_unlock', 'page': JSINFO['id'], },function() { dtable.page_locked = 0 }); } }; dtable.panlock_switch = function(state) { if(state == undefined) state = 'hide'; if(state == 'panlock') { jQuery(".dtable .panunlock").hide(); jQuery(".dtable .panlock").show(); } else if(state == 'panunlock') { jQuery(".dtable .panlock").hide(); jQuery(".dtable .panunlock").show(); } else { jQuery(".dtable .panlock").hide(); jQuery(".dtable .panunlock").hide(); } }; dtable.lock_seeker = function(nolock, lock) { jQuery.post(DOKU_BASE + 'lib/exe/ajax.php', { 'call': 'dtable_is_page_locked', 'page': JSINFO['id'], }, function(data) { var res = jQuery.parseJSON(data); dtable.lock_expires = res.time_left; if(res.locked === 1) { if(dtable.lock_state == 2) lock(); jQuery(".dtable .panlock .who").text(res.who); dtable.update_lock_timer(dtable.lock_expires); dtable.panlock_switch('panlock'); dtable.lock_state = 1; } else { dtable.panlock_switch('hide'); if(dtable.lock_state === 0) nolock(); else if(dtable.lock_state === 1) { dtable.panlock_switch('panunlock'); dtable.clear_all_intervals(); } dtable.lock_state = 2; //refresh lock if user do something var form_val_str = ''; jQuery('.dtable .form_row').find('textarea.dtable_field').each(function() { form_val_str += jQuery(this).val(); }); if(dtable.pageX != dtable.prev_pageX || dtable.pageY != dtable.prev_pageY || dtable.prev_val != form_val_str) { dtable.prev_pageX = dtable.pageX; dtable.prev_pageY = dtable.pageY; dtable.prev_val = form_val_str; dtable.lock(); } } }); }; dtable.update_lock_timer = function(seconds) { var date = new Date(); date.setSeconds(date.getSeconds()+seconds); jQuery(".dtable .panlock .time_left").text(date.toLocaleString()); }; dtable.unlock_dtable = function() { var $row = dtable.get_data_rows(jQuery(".dtable")); var $context_menu = jQuery("#dtable_context_menu"); dtable.lock(); //track mouse in order to check if user do somenhing jQuery(document).bind('mousemove', function(e){ dtable.pageX = e.pageX; dtable.pageY = e.pageY; }); $row.find("td, th").bind("contextmenu", dtable.row_mousedown); jQuery(document).bind("mouseup", function(e) { if (e.which == 1) { $context_menu.hide(); } }); //prevent unmerge button from sending form jQuery("body").delegate(".dtable_unmerge", "dblclick", function(e) { e.stopPropagation(); }); //prevent outer texarea from sending form jQuery(".dtable").delegate("textarea.dtable_field", "dblclick", function(e) { e.stopPropagation(); }); //This was previously at the bottom of init function jQuery(".dtable").delegate(".form_row", "dblclick", function(e) { e.stopPropagation(); }); jQuery("body").delegate("#"+dtable.toolbar_id, "dblclick", function(e) { e.stopPropagation(); }); jQuery(document).dblclick(function(e){ //sent form only once if(dtable.form_processing == false) { dtable.form_processing = true; //$context_menu.hide(); if(jQuery(".dtable .form_row").find(":visible").length > 0) { jQuery(".dtable").submit(); } else { dtable.form_processing = false; } } }); }; dtable.lock_dtable = function() { var $row = dtable.get_data_rows(jQuery(".dtable")); jQuery(document).unbind('mousemove'); $row.find("td, th").unbind('contextmenu'); jQuery("#dtable_context_menu").hide(); }; dtable.row_mousedown = function(e) { var $this_cell = jQuery(this); var $this_row = $this_cell.closest("tr"); var $context_menu = jQuery("#dtable_context_menu"); $context_menu.html(''); switch(this.nodeName.toLowerCase()) { case 'td': //create contextMenu var context_menus = ['insert_before', 'insert_after', 'edit', 'remove']; //'insert_col_left', 'insert_col_right', 'mark_row_as_header', 'mark_col_as_header', 'mark_cell_as_header']; break; case 'th': var context_menus = ['insert_before', 'insert_after', 'edit', 'remove']; //'insert_col_left', 'insert_col_right', 'mark_row_as_cell', 'mark_col_as_cell', 'mark_cell_as_cell']; break; } //remove disabled actions context_menus = jQuery(context_menus).not(JSINFO['disabled']).get(); var colspan = $this_cell.attr("colspan"); var rowspan = $this_cell.attr("rowspan"); for(item_index in context_menus) { var item = context_menus[item_index]; jQuery('
  • ').html(''+JSINFO['lang'][item]).appendTo($context_menu); } $context_menu.find("li.edit").addClass("separator"); $context_menu.find("li.insert_col_left").addClass("separator"); $context_menu.find("li.mark_row_as_header").addClass("separator"); var offsetX = e.pageX + 1; var offsetY = e.pageY + 1; $context_menu.show(); $context_menu.css('top',offsetY); $context_menu.css('left',offsetX); dtable.row = $this_row; e.preventDefault(); }; dtable.clear_all_intervals = function() { for( i in dtable.intervals) { clearInterval(dtable.intervals[i]); } }; dtable.change_rows = function($table, spans) { $table.find("tr").each(function(index) { jQuery(this).find("td, th").each(function(td_ind) { if (spans[index][td_ind][0] !== 1) { jQuery(this).attr("colspan", spans[index][td_ind][0]); } else { jQuery(this).removeAttr("colspan"); } if (spans[index][td_ind][1] !== 1) { jQuery(this).attr("rowspan", spans[index][td_ind][1]); } else { jQuery(this).removeAttr("rowspan"); } }); }); }; dtable.get_table_id = function($form) { var table = $form.attr("id"); return table.replace(/^dtable_/, ''); }; dtable.new_build_form = function($form, $row, action, value, row_data, colspan_callback, mod_cell_callback) { $form_row = jQuery('').hide().appendTo( $form.find("table") ); if ($form.find("input.dtable_field.dtable_action").length > 0) { jQuery($form).find("input.dtable_field.dtable_action").attr("name", action).val(JSON.stringify(value)); jQuery($form).find("input.dtable_field[name=table]").val(dtable.get_table_id($form)); } else { //append dtable_action jQuery($form).append(''); //append table name jQuery($form).append(''); } var rowspans = []; var rowspans_keys = []; var rows_after = 0; //found rowspans mother cells $this_row.next().prevAll().each( function() { jQuery(this).find("td, th").each(function() { var rowspan = jQuery(this).attr("rowspan"); if (typeof rowspan !== 'undefined' && rowspan !== false && parseInt(rowspan) > rows_after) { var ind = jQuery(this).index(); rowspans[ind] = jQuery(this); rowspans_keys.push(ind); } }); rows_after++; }); rowspans_keys.sort(); var td_index = 0; var col = 0; var rowsp_cell_ind = 0; var cells = row_data[0]; for(var i = 0; i < cells.length; i++) { switch (cells[i][2]) { case '^': var tclass = 'tableheader_open'; break; default: var tclass = 'tablecell_open'; break; } var colspan = cells[i][0]; var rowspan = cells[i][1]; var content = cells[i][3]; var $father_cell = $row.find("td, th").eq(td_index); //var rowspan = $father_cell.attr('rowspan'); if (mod_cell_callback !== undefined) { var mod = mod_cell_callback.call(this, tclass, rowspan, colspan, content); tclass = mod[0]; rowspan = mod[1]; colspan = mod[2]; content = mod[3]; } if (jQuery.trim(content) == ':::') { var $mother_cell = rowspans[rowspans_keys[rowsp_cell_ind]]; var width = $mother_cell.width(); if (width < 20) width = 20; rowsp_cell_ind++; jQuery('