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