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